在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

51CTO 開源基礎軟件社區 #夏日挑戰賽# 《OpenHarmony基于JS實現的貪吃蛇

1. 項目簡介

貪吃蛇是一款非常經典的小游戲,概念起源于1976年由美國一家街機游戲Blockade(參見下圖),后來經過無數次迭代,在1998年,成為諾基亞手機預裝的小游戲,相信也能激起很多人的回憶。這次,我將在OpenHarmony操作系統基礎上通過JS來實現貪吃蛇。

最終,我必須承認,自己做的貪吃蛇,卻被自己菜哭了,自己寫的貪吃蛇自己都不會玩(ps:我曾經可是在不會死亡的情況下完了好長時間>_<)。實現的效果如下:

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

  • 要隨機生成食物

  • 要人工控制蛇的移動

  • 吃掉食物身體變長

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

下面就針對以上情況來分別描述。

參數屬性:

名稱類型備注
resultnumber分數
conWnumber容器寬度
conHnumber容器高度
snakeBodynumber蛇身體單位
hnumber網格的y長度
wnumber網格的x長度
gridArray網格地圖
foodobject食物
timeIdnumber定時器id
levelnumber游戲難度級別
desObject蛇的四個方向
isStartBoolean判斷是否開始
snakeObject
currDesobject當前蛇前進的方向
isEndPBoolean判斷游戲是否結

函數咯列表:

名稱參數備注
init初始化函數
onShow框架生命周期鉤子函數
isEndnewHead : object判斷游戲是否結束
setIsEnd設置游戲結束相關數據
randomFood隨機生成食物
addHeaddes : object增加新頭
movedes : object蛇的移動
intervalMoved :object蛇自動移動
isCuurDesvalue:object ,x1:string,x2:string定時器id
clickButm:object操作蛇的移動的點擊事件
reInit重新開始游戲
容器初始化

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

拿到容器寬高后,根據蛇的身體長度(就是每個小圓點)來確定要劃分多少個格子,形成一個坐標軸,后面食物,蛇的移動都根據這坐標軸來確定。

  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++) { //繪制網格
this.grid.push([])
for (var j = 0; j < this.h; j++) {
this.grid[i].push({
x: i,
y: j
});
}
}
this.init(); //初始化函數


}

用一個數組實現,數組索引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(); //隨機生成食物
}
食物

食物隨機生成,位置在網格中任意位置,但不能生成在蛇的身體位置中。

 randomFood(){ //隨機生成食物
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化為和蛇身體倍數的坐標
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) { //當食物的位置不為蛇不和蛇的位置重疊就跳出結束死循環
break;
}
}
}
蛇的移動

蛇的移動是通過對數組的push和shift實現,蛇有移動的方向,根據方向來修改新增蛇頭的x和y的值。移動圖如下:

des:{//蛇的方向
"-20":{ // 向上移動一位
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為蛇的方向,一共有四個方向上下左右,每次移動是都會傳一個方向過來
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){ // 蛇移動時,原頭變身體,原尾巴去掉,也就是push一個頭,shift一個尾巴
this.addHead(des);
this.snake.snakePos.shift();


},
蛇的死亡判定

當蛇頭的x >= 地圖的x最大值 || x < 0 || 蛇頭的Y >= 地圖的Y最大值 || Y < 0 || 蛇頭的(x,y) == 蛇身體任意一個 (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)=>{ //循環查詢是否撞到自己
return item.x == newHead.x && item.y == newHead.y;
})
if(is){
this.setIsEnd(); //結束游戲
}
},
setIsEnd(){
clearInterval(this.timeId); //清除蛇的移動定時器
this.isEndP = true; //這個屬性是用來是否顯示游戲結果界面
}
操作蛇的移動

-20,20,10,-10,原本是一開用來判定是否當前移動的方向是否和原來的方向沖突,后來發現還是用坐標軸香,也就懶得改了。

    intervalMove(d){ // 自動跑
if(!this.isStart) return;//判定是否開始
clearInterval(this.timeId); //清除以前的定時時器
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); //新增蛇頭,這個不去除尾巴
this.randomFood(); //再次重新生成食物
this.result++; //分數
}
},1000/this.level); //this.level級別,決定蛇移動的速度
},
isCuurDes(value = '',x1,x2){
// 判斷當前蛇的方向,x1 為新方向,x2為以前的方向,主要是判斷點擊的按鈕是否左右,上下沖突
if((+x1 + +x2) == 0 ) return false; //這里+x1,+x2 是用來把字符串轉成數字
if(this.isEndP) return;//當游戲結束無法再修改方向
this.currDes = value; //存下方向
return true;
},
clickBut(m){// 點擊按鈕
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": { //開始或暫停
if(this.isEndP) return
this.isStart = !this.isStart;
if(this.isStart && !this.isEndP){
this.intervalMove(this.currDes);
}else{
clearInterval(this.timeId);
}
break;
}
}
}
本文完
寫在最后
我們最近正帶著大家玩嗨OpenHarmony。如果你有好玩的東東,歡迎投稿,讓我們一起嗨起來!有點子,有想法,有Demo,立刻聯系我們:
合作郵箱:zzliang@atomsource.org




原文標題:玩嗨OpenHarmony:基于OpenHarmony的貪吃蛇小游戲

文章出處:【微信公眾號:開源技術服務中心】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 開源技術
    +關注

    關注

    0

    文章

    389

    瀏覽量

    8151
  • OpenHarmony
    +關注

    關注

    29

    文章

    3847

    瀏覽量

    18395

原文標題:玩嗨OpenHarmony:基于OpenHarmony的貪吃蛇小游戲

文章出處:【微信號:開源技術服務中心,微信公眾號:共熵服務中心】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    請問下,openharmony支持哪一款龍芯的開發板?有沒有開源的龍芯的openharmony源碼?

    想買個2k0300的開發板學習龍芯和openharmony,愣是沒有看到提供openharmony源碼的,也沒與看到開源的代碼。gitee上,openharmony的龍芯sig倉庫也是關閉的,有沒有人知道現在是什么情況?
    發表于 04-26 13:06

    讓人欲罷不能樹莓派貪吃蛇掌機!

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

    OpenHarmony在應用與游戲開發領域的前沿成果

    展示了OpenHarmony在應用與游戲開發領域的前沿成果。這些凝聚智慧與協作的參賽作品,不僅在技術層面實現了多項突破,更在商業化應用層面驗證了開源生態的無限潛力。賽事不僅彰顯了開發者群體的創新活力,也凸顯了OpenHarmony
    的頭像 發表于 03-03 15:04 ?573次閱讀

    如何安裝模擬器nes小游戲-基于米爾瑞芯微RK3576開發板

    本篇源自:優秀創作者 小手涼涼本文將介紹基于米爾電子MYD-LR3576開發板(米爾基于瑞芯微 RK3576開發板)的安裝模擬器nes小游戲方案測試。 核心板系統 操作系統鏡像文件說明
    發表于 02-08 12:10

    OpenHarmony程序分析框架論文入選ICSE 2025

      近日,ICSE 2025軟件工程實踐Track放榜,面向OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)的ArkTS程序分析基礎框架--方舟程序分析器(論文題目為
    的頭像 發表于 01-02 13:41 ?1078次閱讀
    <b class='flag-5'>OpenHarmony</b>程序分析框架論文入選ICSE 2025

    FPGA打磚塊小游戲設計思路

    ? 交流問題 ? Q :FPGA打磚塊小游戲,如何基于FPGA用verilog語言在Vivado平臺上寫打磚塊小游戲,最好能用到PS2與VGA。 A :以下是一個基于 FPGA? Verilog
    的頭像 發表于 12-09 16:57 ?902次閱讀

    OpenHarmony首次亮相歐洲開源會議

    OpenHarmony項目群技術指導委員會(TSC)主席陳海波受邀參加大會主論壇分享,由OpenHarmony 與Eclipse Oniro聯合籌劃的“Think Global, Code Local”分論壇
    的頭像 發表于 10-26 11:48 ?944次閱讀
    <b class='flag-5'>OpenHarmony</b>首次亮相歐洲開源會議

    50萬獎金池!開放原子大賽——第二屆OpenHarmony創新應用挑戰賽正式啟動

    基于OpenHarmony4.1及以上版本開展創新應用開發,開發者可自主選擇OpenHarmony創新應用賽題或Cocos游戲創新應用賽題。無論你是天馬行空的創意達人,還是有豐富游戲
    發表于 10-24 15:40

    第三屆OpenHarmony技術大會星光璀璨、致謝OpenHarmony社區貢獻者

    10月12日,在上海舉辦的第三屆OpenHarmony技術大會上,32家高校OpenHarmony技術俱樂部璀璨亮相,30家高校OpenHarmony開發者協會盛大啟幕。還分別致謝了年度星光TSG
    的頭像 發表于 10-21 14:10 ?521次閱讀

    第三屆OpenHarmony技術大會 “OpenHarmony開發者激勵計劃”授牌儀式圓滿舉行

    10月12日,以“技術引領筑生態,萬物智聯創未來”為主題的第三屆OpenHarmony技術大會隆重舉行,“OpenHarmony開發者激勵計劃”授牌儀式在大會期間同步進行。該計劃旨在增加
    的頭像 發表于 10-21 11:48 ?621次閱讀
    第三屆<b class='flag-5'>OpenHarmony</b>技術大會 “<b class='flag-5'>OpenHarmony</b>開發者激勵計劃”授牌儀式圓滿舉行

    OpenHarmony年度技術俱樂部、個人及活動評選結果公示

    2024年度技術俱樂部評選活動已經圓滿結束。在此,OpenHarmony項目群技術指導委員會(TSC)對所有參與者的積極參與和辛勤付出表示感謝。經過嚴格的評選和審核,現將名單予以公示: 評選
    的頭像 發表于 10-05 08:07 ?588次閱讀

    基于ArkTS語言的OpenHarmony APP應用開發:HelloOpenharmony

    1、程序簡介該程序是基于OpenHarmony標準系統編寫的UI應用類:HelloOpenHarmony。本案例是基于API9接口開發。本案例已在OpenHarmony凌蒙派-RK3568開發
    的頭像 發表于 09-15 08:09 ?818次閱讀
    基于ArkTS語言的<b class='flag-5'>OpenHarmony</b> APP應用開發:Hello<b class='flag-5'>Openharmony</b>

    基于ArkTS語言的OpenHarmony APP應用開發:HelloOpenharmony

    1、程序簡介 該程序是基于OpenHarmony標準系統編寫的UI應用類:HelloOpenHarmony。 本案例是基于API 9接口開發。 本案例已在OpenHarmony凌蒙派-RK3568
    發表于 09-14 12:47

    河南大學OpenHarmony技術俱樂部正式揭牌成立

    8月30日,由OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)項目群技術指導委員會與河南大學共同舉辦的“河南大學OpenHarmony技術俱樂部成立大會”在鄭州校區友蘭
    的頭像 發表于 09-03 16:12 ?709次閱讀
    河南大學<b class='flag-5'>OpenHarmony</b>技術俱樂部正式揭牌成立

    openharmony移植AT32F407編譯時錯誤

    openharmony上移植AT32F407,hb build后出現鏈接錯誤 [OHOS ERROR] /home/sven/openharmony/env_setup
    發表于 08-18 17:04
    主站蜘蛛池模板: 视频在线视频免费观看 | 免费视频在线观看1 | 成人亚洲电影 | 99成人 | 视频在线精品 | 国产亚洲精品aaa大片 | 日韩专区一区 | 伊人久久亚洲综合天堂 | 国产香蕉精品视频在 | 91大神在线观看视频 | 亚洲免费一 | 夜夜夜操| 男女一进一出抽搐免费视频 | 久久6免费视频 | 天堂网a | 天天色天天综合 | 免费的三及片 | 一级a爱片久久毛片 | 在线视频观看你懂的 | 综合网在线观看 | 国产午夜三级 | 乱好看的的激情伦小说 | 色多多最新地址福利地址 | 毛片爽爽爽免费看 | 欧美天天性影院 | 操美女的视频网站 | 天天爱综合| 在线天堂中文有限公司 | 天天拍天天操 | 嫩草影院入口一二三免费 | 乱色伦肉小说 | 热久久这里只有精品 | 女人被狂躁视频网站免费 | 欧美一级高清免费播放 | 欧美精品xx | 中国一级特黄特色真人毛片 | 欧美日本一区二区三区生 | 毛片视频免费网站 | 亚洲综合色婷婷中文字幕 | 国产一级做a爱免费视频 | 久久久久久天天夜夜天天 |