91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

玩嗨OpenHarmony:基于OpenHarmony的貪吃蛇小游戲

共熵服務(wù)中心 ? 來(lái)源:未知 ? 2022-11-28 20:50 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

51CTO 開(kāi)源基礎(chǔ)軟件社區(qū) #夏日挑戰(zhàn)賽# 《OpenHarmony基于JS實(shí)現(xiàn)的貪吃蛇

1. 項(xiàng)目簡(jiǎn)介

貪吃蛇是一款非常經(jīng)典的小游戲,概念起源于1976年由美國(guó)一家街機(jī)游戲Blockade(參見(jiàn)下圖),后來(lái)經(jīng)過(guò)無(wú)數(shù)次迭代,在1998年,成為諾基亞手機(jī)預(yù)裝的小游戲,相信也能激起很多人的回憶。這次,我將在OpenHarmony操作系統(tǒng)基礎(chǔ)上通過(guò)JS來(lái)實(shí)現(xiàn)貪吃蛇。

最終,我必須承認(rèn),自己做的貪吃蛇,卻被自己菜哭了,自己寫(xiě)的貪吃蛇自己都不會(huì)玩(ps:我曾經(jīng)可是在不會(huì)死亡的情況下完了好長(zhǎng)時(shí)間>_<)。實(shí)現(xiàn)的效果如下:

基本實(shí)現(xiàn)思路
貪吃蛇的基本操作規(guī)則是:玩家操控一條細(xì)長(zhǎng)的直線(俗稱(chēng)蛇或蟲(chóng),起始可能是一個(gè)點(diǎn)),它會(huì)不停前進(jìn),玩家只能操控蛇的頭部朝向(上下左右),蛇身體后面的部分會(huì)跟隨頭部移動(dòng)的軌跡。頭一路拾起觸碰到之食物(或稱(chēng)作“豆”/“果”),并要避免觸碰到自身或者其他障礙物(包括游戲界面的邊界墻壁)。每次貪吃蛇吃掉一件食物,它的身體便增長(zhǎng)一節(jié)。吃掉一些食物后會(huì)使蛇的移動(dòng)速度逐漸加快,讓游戲的難度漸漸變大。
要實(shí)現(xiàn)以上的要求,有幾個(gè)關(guān)鍵點(diǎn)需要考慮:
  • 要有個(gè)游戲的容器空間設(shè)計(jì)
  • 定義蛇的身體

  • 要隨機(jī)生成食物

  • 要人工控制蛇的移動(dòng)

  • 吃掉食物身體變長(zhǎng)

  • 撞到障礙物(包括自身)會(huì)死亡,游戲重啟或結(jié)束

下面就針對(duì)以上情況來(lái)分別描述。

參數(shù)屬性:

名稱(chēng)類(lèi)型備注
resultnumber分?jǐn)?shù)
conWnumber容器寬度
conHnumber容器高度
snakeBodynumber蛇身體單位
hnumber網(wǎng)格的y長(zhǎng)度
wnumber網(wǎng)格的x長(zhǎng)度
gridArray網(wǎng)格地圖
foodobject食物
timeIdnumber定時(shí)器id
levelnumber游戲難度級(jí)別
desObject蛇的四個(gè)方向
isStartBoolean判斷是否開(kāi)始
snakeObject
currDesobject當(dāng)前蛇前進(jìn)的方向
isEndPBoolean判斷游戲是否結(jié)

函數(shù)咯列表:

名稱(chēng)參數(shù)備注
init無(wú)初始化函數(shù)
onShow無(wú)框架生命周期鉤子函數(shù)
isEndnewHead : object判斷游戲是否結(jié)束
setIsEnd無(wú)設(shè)置游戲結(jié)束相關(guān)數(shù)據(jù)
randomFood無(wú)隨機(jī)生成食物
addHeaddes : object增加新頭
movedes : object蛇的移動(dòng)
intervalMoved :object蛇自動(dòng)移動(dòng)
isCuurDesvalue:object ,x1:string,x2:string定時(shí)器id
clickButm:object操作蛇的移動(dòng)的點(diǎn)擊事件
reInit無(wú)重新開(kāi)始游戲
容器初始化

在onShow鉤子函數(shù)那里獲取到游戲容器的寬高,其實(shí)我是不想在這里獲取的,但沒(méi)辦法,好像getBoundingClientRect()需要掛載后才能拿到值,在這之前的鉤子函數(shù)中都拿不到具體的屬性值。

拿到容器寬高后,根據(jù)蛇的身體長(zhǎng)度(就是每個(gè)小圓點(diǎn))來(lái)確定要?jiǎng)澐侄嗌賯€(gè)格子,形成一個(gè)坐標(biāo)軸,后面食物,蛇的移動(dòng)都根據(jù)這坐標(biāo)軸來(lái)確定。

  onShow(){ // 第一次初始化
this.conH = this.$refs["con"].getBoundingClientRect().height ;
this.conW = this.$refs["con"].getBoundingClientRect().width ;
this.h = Math.floor(this.conH / this.snakeBody);
this.w = Math.floor(this.conW / this.snakeBody);
for (var i = 0; i < this.w; i++) { //繪制網(wǎng)格
this.grid.push([])
for (var j = 0; j < this.h; j++) {
this.grid[i].push({
x: i,
y: j
});
}
}
this.init(); //初始化函數(shù)


}

用一個(gè)數(shù)組實(shí)現(xiàn),數(shù)組索引0為蛇的尾巴,索引length-1為頭。

 init(){
const snakePos = [ //蛇的初始化的身體
{
x : 0,
y : 0,
flag : 'b',
id : Math.random()
},
{
x : 1,
y : 0,
flag : 'b',
id : Math.random()
},
{
x : 2,
y : 0,
flag : 'h',
id : Math.random()
}
];
this.snake.snakePos = snakePos; //把初始化的身體賦給蛇
this.randomFood(); //隨機(jī)生成食物
}
食物

食物隨機(jī)生成,位置在網(wǎng)格中任意位置,但不能生成在蛇的身體位置中。

 randomFood(){ //隨機(jī)生成食物
while(true){
let x = Math.floor(Math.random() * this.conW);
let y = Math.floor(Math.random() * this.conH);
x = x - (x % this.snakeBody); //x,y化為和蛇身體倍數(shù)的坐標(biāo)
y = y - (y % this.snakeBody);
let is = this.snake.snakePos.find((item)=>{
return item.x == x && item.y == y;
})
this.food.x = x;
this.food.y = y;
if(!is) { //當(dāng)食物的位置不為蛇不和蛇的位置重疊就跳出結(jié)束死循環(huán)
break;
}
}
}
蛇的移動(dòng)

蛇的移動(dòng)是通過(guò)對(duì)數(shù)組的push和shift實(shí)現(xiàn),蛇有移動(dòng)的方向,根據(jù)方向來(lái)修改新增蛇頭的x和y的值。移動(dòng)圖如下:

des:{//蛇的方向
"-20":{ // 向上移動(dòng)一位
x:0,
y:-1,
flag: ''
},
"20":{//向下
x:0,
y:1,
flag: ''
},
"10":{ //右
x:1,
y:0,
flag: ''
},
"-10":{ //左
x:-1,
y:0,
flag: ''
}
},
addHead(des){
//添加蛇頭 des為蛇的方向,一共有四個(gè)方向上下左右,每次移動(dòng)是都會(huì)傳一個(gè)方向過(guò)來(lái)
const oHead = this.snake.snakePos[this.snake.snakePos.length -1];
const newHead ={
x : oHead.x + des.x,
y : oHead.y + des.y,
flag : 'h',
id : Math.random()
}
this.isEnd(newHead);
this.snake.snakePos.push(newHead);


oHead.flag = 'b';
},
move(des){ // 蛇移動(dòng)時(shí),原頭變身體,原尾巴去掉,也就是push一個(gè)頭,shift一個(gè)尾巴
this.addHead(des);
this.snake.snakePos.shift();


},
蛇的死亡判定

當(dāng)蛇頭的x >= 地圖的x最大值 || x < 0 || 蛇頭的Y >= 地圖的Y最大值 || Y < 0 || 蛇頭的(x,y) == 蛇身體任意一個(gè) (x,y)。

isEnd(newHead){//判定蛇是是否死亡
if(newHead.x >= this.w || newHead.x < 0 || newHead.y >= this.h || newHead.y < 0){
this.setIsEnd();
}


let is = this.snake.snakePos.find((item)=>{ //循環(huán)查詢(xún)是否撞到自己
return item.x == newHead.x && item.y == newHead.y;
})
if(is){
this.setIsEnd(); //結(jié)束游戲
}
},
setIsEnd(){
clearInterval(this.timeId); //清除蛇的移動(dòng)定時(shí)器
this.isEndP = true; //這個(gè)屬性是用來(lái)是否顯示游戲結(jié)果界面
}
操作蛇的移動(dòng)

-20,20,10,-10,原本是一開(kāi)用來(lái)判定是否當(dāng)前移動(dòng)的方向是否和原來(lái)的方向沖突,后來(lái)發(fā)現(xiàn)還是用坐標(biāo)軸香,也就懶得改了。

    intervalMove(d){ // 自動(dòng)跑
if(!this.isStart) return;//判定是否開(kāi)始
clearInterval(this.timeId); //清除以前的定時(shí)時(shí)器
this.timeId = setInterval(()=>{
const head = this.snake.snakePos[this.snake.snakePos.length - 1];
this.move(d);
if(this.snakeBody * head.x == this.food.x && this.food.y == this.snakeBody * head.y ){ //蛇吃到食物
this.addHead(d); //新增蛇頭,這個(gè)不去除尾巴
this.randomFood(); //再次重新生成食物
this.result++; //分?jǐn)?shù)
}
},1000/this.level); //this.level級(jí)別,決定蛇移動(dòng)的速度
},
isCuurDes(value = '',x1,x2){
// 判斷當(dāng)前蛇的方向,x1 為新方向,x2為以前的方向,主要是判斷點(diǎn)擊的按鈕是否左右,上下沖突
if((+x1 + +x2) == 0 ) return false; //這里+x1,+x2 是用來(lái)把字符串轉(zhuǎn)成數(shù)字
if(this.isEndP) return;//當(dāng)游戲結(jié)束無(wú)法再修改方向
this.currDes = value; //存下方向
return true;
},
clickBut(m){// 點(diǎn)擊按鈕
const value = m.target.dataSet.value;
switch(value){
case "-20":{ //上
//判斷方向是否相反,如果相反則不切換方向
this.isCuurDes(this.des[value],this.des[value].y,this.currDes.y)
&& this.intervalMove(this.des[value]);
break;
}
case "20":{// 下
this.isCuurDes(this.des[value],this.des[value].y,this.currDes.y)
&& this.intervalMove(this.des[value]);
break;
}
case "-10":{ //左
this.isCuurDes(this.des[value],this.des[value].x,this.currDes.x)
&& this.intervalMove(this.des[value]);
break;
}
case "10":{ // 右
this.isCuurDes(this.des[value],this.des[value].x,this.currDes.x)
&& this.intervalMove(this.des[value]);
break;
}
case "1": { //開(kāi)始或暫停
if(this.isEndP) return
this.isStart = !this.isStart;
if(this.isStart && !this.isEndP){
this.intervalMove(this.currDes);
}else{
clearInterval(this.timeId);
}
break;
}
}
}
本文完
寫(xiě)在最后
我們最近正帶著大家玩嗨OpenHarmony。如果你有好玩的東東,歡迎投稿,讓我們一起嗨起來(lái)!有點(diǎn)子,有想法,有Demo,立刻聯(lián)系我們:
合作郵箱:zzliang@atomsource.org




原文標(biāo)題:玩嗨OpenHarmony:基于OpenHarmony的貪吃蛇小游戲

文章出處:【微信公眾號(hào):開(kāi)源技術(shù)服務(wù)中心】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 開(kāi)源技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    389

    瀏覽量

    8745
  • OpenHarmony
    +關(guān)注

    關(guān)注

    33

    文章

    3952

    瀏覽量

    21101

原文標(biāo)題:玩嗨OpenHarmony:基于OpenHarmony的貪吃蛇小游戲

文章出處:【微信號(hào):開(kāi)源技術(shù)服務(wù)中心,微信公眾號(hào):共熵服務(wù)中心】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【原創(chuàng)】OpenHarmony系統(tǒng)投屏工具軟件 - OpenHarmony_OHScrcpy使用推薦

    OpenHarmony_OHScrcpy - OpenHarmony投屏工具軟件 OpenHarmony_OHScrcpy是一款為OpenHarmony系統(tǒng)設(shè)計(jì)的投屏工具軟件,功能類(lèi)似
    發(fā)表于 01-22 18:34

    #OpenHarmony HDC調(diào)試

    OpenHarmony
    視美泰
    發(fā)布于 :2026年01月16日 09:46:28

    #OpenHarmony 開(kāi)發(fā)環(huán)境準(zhǔn)備

    OpenHarmony
    視美泰
    發(fā)布于 :2026年01月16日 09:44:31

    #OpenHarmony 鏡像燒錄

    OpenHarmony
    視美泰
    發(fā)布于 :2026年01月16日 09:42:36

    #OpenHarmony 系統(tǒng)概述

    OpenHarmony
    視美泰
    發(fā)布于 :2026年01月16日 09:39:20

    #OpenHarmony Hello World應(yīng)用以及部署

    OpenHarmony
    視美泰
    發(fā)布于 :2026年01月16日 09:32:52

    OpenHarmony系統(tǒng)】本期視頻將為您介紹怎樣將鏡像燒錄到板卡中。

    OpenHarmony
    視美泰
    發(fā)布于 :2026年01月15日 14:29:55

    OpenHarmony年度課題管理辦法

    OpenHarmony年度課題管理辦法V1.0 第一章 總則 第一條 宗旨 圍繞終端操作系統(tǒng)所面臨的技術(shù)挑戰(zhàn),OpenHarmony項(xiàng)目群技術(shù)指導(dǎo)委員會(huì)(TSC)聯(lián)合產(chǎn)學(xué)研各界,以
    的頭像 發(fā)表于 11-12 16:55 ?653次閱讀

    2025 OpenHarmony TSC年中技術(shù)與生態(tài)研討會(huì)圓滿(mǎn)舉辦

    2025 OpenHarmony TSC 年中技術(shù)與生態(tài)研討會(huì) 圓滿(mǎn)舉辦 8月1日,2025 OpenHarmony TSC年中技術(shù)與生態(tài)研討會(huì)于中國(guó)上海順利召開(kāi)。 本次會(huì)議由OpenHarmony
    的頭像 發(fā)表于 08-07 12:24 ?2045次閱讀
    2025 <b class='flag-5'>OpenHarmony</b> TSC年中技術(shù)與生態(tài)研討會(huì)圓滿(mǎn)舉辦

    OpenHarmony2025年度競(jìng)賽訓(xùn)練營(yíng)重磅開(kāi)啟

    ? OpenHarmony2025年度競(jìng)賽訓(xùn)練營(yíng) ? ? ? 活動(dòng)介紹 OpenHarmony競(jìng)賽訓(xùn)練營(yíng) 旨在引導(dǎo)高校學(xué)生進(jìn)行OpenHarmony產(chǎn)學(xué)研用,培養(yǎng)更多應(yīng)用型人才和產(chǎn)業(yè)需求有效鏈接
    的頭像 發(fā)表于 07-16 11:51 ?914次閱讀

    請(qǐng)問(wèn)下,openharmony支持哪一款龍芯的開(kāi)發(fā)板?有沒(méi)有開(kāi)源的龍芯的openharmony源碼?

    想買(mǎi)個(gè)2k0300的開(kāi)發(fā)板學(xué)習(xí)龍芯和openharmony,愣是沒(méi)有看到提供openharmony源碼的,也沒(méi)與看到開(kāi)源的代碼。gitee上,openharmony的龍芯sig倉(cāng)庫(kù)也是關(guān)閉的,有沒(méi)有人知道現(xiàn)在是什么情況?
    發(fā)表于 04-26 13:06

    2024年OpenHarmony社區(qū)年度激勵(lì)公示

    在過(guò)去一年里,OpenHarmony項(xiàng)目群技術(shù)指導(dǎo)委員會(huì)(TSC)向所有參與者致以最誠(chéng)摯的感謝!大家的積極參與和鼎力支持推動(dòng)了OpenHarmony社區(qū)的持續(xù)繁榮與高質(zhì)量發(fā)展。OpenHarmony
    的頭像 發(fā)表于 04-21 18:17 ?1150次閱讀

    讓人欲罷不能樹(shù)莓派貪吃蛇掌機(jī)!

    經(jīng)典游戲貪吃蛇》的掌機(jī),并為其設(shè)計(jì)了定制的3D打印外殼。這款掌機(jī)基于配備RP2350處理器的最新型號(hào)RaspberryPiPico2打造。與常規(guī)LCD或OLED
    的頭像 發(fā)表于 03-25 09:21 ?765次閱讀
    讓人欲罷不能樹(shù)莓派<b class='flag-5'>貪吃蛇</b>掌機(jī)!