一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲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)不再提示

基于HarmonyOS的黑白翻棋手機(jī)版本

電子發(fā)燒友開(kāi)源社區(qū) ? 來(lái)源:HarmonyOS官方合作社區(qū) ? 作者:木棉花_潘穎琳 ? 2021-10-13 09:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言
之前發(fā)過(guò)兩篇黑白翻棋游戲的手表版本,這次給大家?guī)?lái)的小分享是黑白翻棋的手機(jī)版本,也是JS寫(xiě)的,功能代碼基本一致(采用第二篇的算法),只是布局會(huì)作相應(yīng)修改。

概述

該游戲會(huì)隨機(jī)生成一個(gè)題目,最終當(dāng)棋盤(pán)上的方格都為白色的時(shí)候游戲成功,效果如下

正文


1.創(chuàng)建一個(gè)空白的工程
DevEco Studio下載安裝成功后,打開(kāi)DevEco Studio,點(diǎn)擊左上角的File,點(diǎn)擊New,再選擇New Project,選擇Empty Ability,然后點(diǎn)擊Next,給項(xiàng)目命名PhoneGame_BW,選擇設(shè)備類(lèi)型Phone,選擇語(yǔ)言類(lèi)型JS最后點(diǎn)擊Finish。

2.界面布局


2.1 代碼刪除的部分

先在entry>src>main>js>default>pages.index>index.hml文件里把以下代碼刪掉

class="title">    {{ $t('strings.hello') }} {{ title }}  

entry>src>main>js>default>pages.index>index.js文件里把以下代碼刪掉

title:" "  onInit() {    this.title = this.$t('strings.world');  }

entry>src>main>js>default>pages.index>index.css文件里把container部分以下的代碼刪掉

2.2 棋盤(pán)設(shè)置
這里以畫(huà)布組件canvas來(lái)描繪棋盤(pán)

index.hml

class="canvas" ref="canvas"> 

index.css

.canvas{  width:320px;  height:320px;  background-color: #BBADA0;}

打開(kāi)模擬

2.3 棋子設(shè)置
棋子是通過(guò)canvas組件的方法來(lái)繪制填充多個(gè)正方形,這里我設(shè)置的棋盤(pán)是7x7的,每個(gè)方格的邊長(zhǎng)SIDELEN為40,方格間的間距MARGIN為5,以一個(gè)數(shù)組來(lái)表示每個(gè)方格,并初始化賦值為0,用0表示白色,1代表黑色,這樣我們就能定義一個(gè)用0和1表示鍵,顏色表示值的字典COLORS

index.js,在export default上方添加以下代碼

var grids=[[0, 0, 0, 0, 0, 0, 0],      [0, 0, 0, 0, 0, 0, 0],      [0, 0, 0, 0, 0, 0, 0],      [0, 0, 0, 0, 0, 0, 0],      [0, 0, 0, 0, 0, 0, 0],      [0, 0, 0, 0, 0, 0, 0],      [0, 0, 0, 0, 0, 0, 0],      [0, 0, 0, 0, 0, 0, 0]];var context;const SIDELEN=40;const MARGIN=5;
const COLORS = {  "0": "#FFFFFF",  "1": "#000000"}

在export default下方添加以下代碼,遍歷數(shù)組grids的每一個(gè)元素,將其轉(zhuǎn)換成String型,對(duì)應(yīng)的是COLORS中的顏色,然后調(diào)用畫(huà)布組件中的方法fillRect填充方格的顏色,參數(shù)為方格的左上角的坐標(biāo)及方格的長(zhǎng)寬

  drawGrids(){    context=this.$refs.canvas.getContext('2d');    for (let row = 0 ;row < 7 ;row++){      for (let column = 0; column < 7;column++){        let gridStr = grids[row][column].toString();
        context.fillStyle = COLORS[gridStr];        let leftTopX = column * (MARGIN + SIDELEN) + MARGIN;        let leftTopY = row * (MARGIN + SIDELEN) + MARGIN;        context.fillRect(leftTopX, leftTopY, SIDELEN, SIDELEN);      }    }  },

最后在drawGrids函數(shù)上方添加以下代碼調(diào)用drawGrids

onShow(){    this.drawGrids();  },

打開(kāi)模擬器,就能有如下效果

3.游戲規(guī)則的設(shè)置

3.1.獲取點(diǎn)擊位置的坐標(biāo)并對(duì)應(yīng)方格

給畫(huà)布組件添加點(diǎn)擊事件onclick和觸摸事件touchstart

index.hml

    class="canvas" ref="canvas" onclick="click" @touchstart='touchstartfunc'> 

事件touchstart,在手指剛觸摸屏幕時(shí)就觸發(fā)該事件,其參數(shù)為T(mén)ouchEvent,其對(duì)象屬性touches包含屏幕觸摸點(diǎn)的信息數(shù)組,而我們需要的坐標(biāo)信息就包含在這個(gè)數(shù)組里;這里我們需要獲取到的坐標(biāo)是相對(duì)于組件左上角的,即localX和localY,這樣也方便我們?cè)O(shè)置點(diǎn)擊范圍來(lái)觸發(fā)色塊的翻轉(zhuǎn)(獲取坐標(biāo)這塊詳細(xì)可看我上一篇文章)其次,參數(shù)a和b分別代表傳遞的方格的行列值。

index.js

var localx;var localy;var a;var b;
touchstartfunc(msg) {    localx=msg.touches[0].localX;    localy=msg.touches[0].localY;  },getgrid() {  if (MARGIN < localx && localx < (MARGIN + SIDELEN)) {    b = 0;  }  if (1 * (MARGIN + SIDELEN) + MARGIN < localx && localx < 2 * (MARGIN + SIDELEN)) {    b = 1;  }  if (2 * (MARGIN + SIDELEN) + MARGIN < localx && localx < 3 * (MARGIN + SIDELEN)) {    b = 2;  }  if (3 * (MARGIN + SIDELEN) + MARGIN < localx && localx < 4 * (MARGIN + SIDELEN)) {    b = 3;  }  if (4 * (MARGIN + SIDELEN) + MARGIN < localx && localx < 5 * (MARGIN + SIDELEN)) {    b = 4;  }  if (5 * (MARGIN + SIDELEN) + MARGIN < localx && localx < 6 * (MARGIN + SIDELEN)) {    b = 5;  }  if (6 * (MARGIN + SIDELEN) + MARGIN < localx && localx < 7 * (MARGIN + SIDELEN)) {    b = 6;  }  if (MARGIN < localy && localy < (MARGIN + SIDELEN)) {    a = 0;  }  if (1 * (MARGIN + SIDELEN) + MARGIN < localy && localy < 2 * (MARGIN + SIDELEN)) {    a = 1;  }  if (2 * (MARGIN + SIDELEN) + MARGIN < localy && localy < 3 * (MARGIN + SIDELEN)) {    a = 2;  }  if (3 * (MARGIN + SIDELEN) + MARGIN < localy && localy < 4 * (MARGIN + SIDELEN)) {    a = 3;  }  if (4 * (MARGIN + SIDELEN) + MARGIN < localy && localy < 5 * (MARGIN + SIDELEN)) {    a = 4;  }  if (5 * (MARGIN + SIDELEN) + MARGIN < localy && localy < 6 * (MARGIN + SIDELEN)) {    a = 5;  }  if (6 * (MARGIN + SIDELEN) + MARGIN < localy && localy < 7 * (MARGIN + SIDELEN)) {    a = 6;  }}

3.2 點(diǎn)擊的方格及其上下左右都變色

change控制變色,若值為0則變?yōu)?,若為1則變?yōu)?。方格的橫縱坐標(biāo)都是0~6,changeOneGrids第一個(gè)判斷是被點(diǎn)擊的方格的變色,第二個(gè)判斷是右邊的格子是否在棋盤(pán)上,假如被點(diǎn)擊的格子是右邊界,則判斷為假,右格子不會(huì)變色。以此類(lèi)推對(duì)左格,上格,下格作判斷,最后調(diào)用drawGrids繪制方格。

index.js

change(x,y){       if(grids[x][y] == 0){       grids[x][y] = 1;     }else{       grids[x][y] = 0;     }   },changeOneGrids(x,y){   if(x>-1 && y>-1 && x<7 && y<7){     this.change(x,y);   }   if(x+1>-1 && y>-1 && x+1<7 && y<7){     this.change(x+1,y);   }   if(x-1>-1 && y>-1 && x-1<7 && y<7){     this.change(x-1,y);   }   if(x>-1 && y+1>-1 && x<7 && y+1<7){     this.change(x,y+1);   }   if(x>-1 && y-1>-1 && x<7 && y-1<7){     this.change(x,y-1);   }   this.drawGrids();}

最后在點(diǎn)擊事件上調(diào)用getgrid和changeOneGrids

click(){   this.getgrid();   this.changeOneGrids(a,b); }

到此,效果如下

3.3 生成隨機(jī)打亂的棋盤(pán)(游戲題目)

先將數(shù)組以坐標(biāo)形式存儲(chǔ)在array,共49組坐標(biāo),然后隨機(jī)生成0~48的整數(shù),取該組坐標(biāo)中第一個(gè)元素作為橫坐標(biāo),第二個(gè)元素作為縱坐標(biāo),這里設(shè)置的是隨機(jī)生成點(diǎn)擊10下后的題目(后期為在此基礎(chǔ)上以不同次數(shù)來(lái)設(shè)置不同難度)

initGrids(){    let array = [];    for (let row = 0; row < 7; row++) {      for (let column = 0; column < 7; column++) {        if (grids[row][column] == 0) {          array.push([row, column])                       }      }    }    for (let i = 0; i < 10; i++){      let randomIndex = Math.floor(Math.random() * array.length);        let row = array[randomIndex][0];                     let column = array[randomIndex][1];                    this.changeOneGrids(row,column);    }  }

然后在onshow上調(diào)用initGrids,注意initGrids要放在drawGrids之前

  onShow(){    this.initGrids();    this.drawGrids();  },

4.設(shè)置步數(shù)顯示及游戲的重新開(kāi)始

4.1 步數(shù)顯示
步數(shù)這個(gè)文本組件顯示在棋盤(pán)上方,故在index.hml文件里,將以下代碼放在canvas上方,其中由于步數(shù)是個(gè)變量,故以currentSteps的值的變動(dòng)來(lái)動(dòng)態(tài)更新步數(shù)

index.hml

class="steps">    當(dāng)前步數(shù):{{currentSteps}}  

index.css

.steps {  font-size: 21px;  text-align:center;  width:200px;  height:39px;  letter-spacing:0px;  margin-top:10px;  background-color: #BBAD20;}

由于initGrids會(huì)隨機(jī)點(diǎn)擊10下,為了使步數(shù)清零,在data里給它賦初值-10

index.js

data: {    currentSteps:-10,  },

在changeOneGrids上添加以下代碼,使每次點(diǎn)擊步數(shù)加一

this.currentSteps+=1;

4.2 游戲的重新開(kāi)始
重新開(kāi)始的按鈕在棋盤(pán)的下方,故index.hml文件中在canvas下方添加代碼

"button" value="重新開(kāi)始" class="bit" onclick="restartGame"/>

index.css

.bit {  top: 20px;  width: 220px;  height: 40px;  background-color: #AD9D8F;  font-size: 25px;  margin-top: 10px;}

游戲重新開(kāi)始時(shí),會(huì)再次隨機(jī)生成游戲題目,并且步數(shù)重置為0

index.js

  restartGame(){    this.initGrids();    this.drawGrids();    this.currentSteps = 0;  }

5.游戲成功的設(shè)置

游戲成功的彈窗是顯示在棋盤(pán)(canvas)上方的,該實(shí)現(xiàn)可通過(guò)添加一個(gè)堆疊容器stack,將游戲成功的文本組件放在畫(huà)布組件之后;其次,“游戲成功”的顯示在初始時(shí)不會(huì)顯示,所以要設(shè)置屬性show,對(duì)應(yīng)設(shè)一個(gè)布爾型變量isShow,并令isShow的初始值為假,游戲成功時(shí)其值為真,當(dāng)為真時(shí)就可以顯示了

index.hml

  class="stack">    class="canvas" ref="canvas" onclick="click" @touchstart='touchstartfunc'>     
class="subcontainer" show="{{isShow}}"> class="gameover"> 游戲成功

index.css

.stack{  width: 320px;  height: 320px;  margin-top: 10px;}
.subcontainer{  left: 50px;  top: 95px;  width: 220px;  height: 130px;  justify-content: center;  align-content: center;  background-color: #E9C2A6;}
.gameover{  font-size: 38px;  color:black;  justify-content: center;  margin-top: 30px;}

index.js

data: {    currentSteps:-10,    isShow:false  },
  gameover(){    for (let row = 0 ;row < 7 ;row++){      for (let column = 0; column < 7;column++){        if (grids[row][column]==1){          return false;        }      }    }    return true;  },

在changeOneGrids中給“步數(shù)增加”添加判斷條件

if(this.isShow==false){      this.currentSteps+=1;    }    if(this.gameover()){      this.isShow=true;    }

在restartGame中添加代碼

 this.isShow = false;

恭喜你!!完成以上步驟后你就可以開(kāi)始玩啦??!O(∩_∩)O

結(jié)語(yǔ)

以上就是我這次的小分享啦??!后續(xù)會(huì)有該游戲的進(jìn)階版,我會(huì)不斷完善的(? ?_?)?
責(zé)任編輯:haq


聲明:本文內(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)投訴
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7152

    瀏覽量

    125601
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2642

    瀏覽量

    68125
  • HarmonyOS
    +關(guān)注

    關(guān)注

    80

    文章

    2126

    瀏覽量

    33091

原文標(biāo)題:基于HarmonyOS的手機(jī)游戲——黑白翻棋

文章出處:【微信號(hào):HarmonyOS_Community,微信公眾號(hào):電子發(fā)燒友開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    HarmonyOS 5】鴻蒙應(yīng)用隱私保護(hù)詳解

    HarmonyOS 5】鴻蒙應(yīng)用隱私保護(hù)詳解 ##鴻蒙開(kāi)發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##鴻蒙金融類(lèi)應(yīng)用 (金融理財(cái)# 一、前言 在今天這個(gè)手機(jī)不離手的時(shí)代,我們每天用手機(jī)
    的頭像 發(fā)表于 07-11 18:30 ?302次閱讀

    HarmonyOS 5】鴻蒙星閃NearLink詳解

    HarmonyOS 提供的短距離通信服務(wù),支持星閃設(shè)備間的連接、數(shù)據(jù)交互。例如,手機(jī)可作為中心設(shè)備與外圍設(shè)備(如鼠標(biāo)、手寫(xiě)筆、智能家電、車(chē)鑰匙等)通過(guò)星閃進(jìn)行連接。 二、NearLink Kit 的接入
    的頭像 發(fā)表于 07-11 18:24 ?323次閱讀
    【<b class='flag-5'>HarmonyOS</b> 5】鴻蒙星閃NearLink詳解

    HarmonyOS 5】金融應(yīng)用開(kāi)發(fā)鴻蒙組件實(shí)踐

    原生鴻蒙操作系統(tǒng)星河版,面向開(kāi)發(fā)者開(kāi)放申請(qǐng),余承東宣布鴻蒙生態(tài)設(shè)備數(shù)達(dá) 8 億臺(tái);建設(shè)銀行、郵儲(chǔ)銀行等完成鴻蒙原生應(yīng)用 Beta 版本開(kāi)發(fā)。 2024 年 10 月 22 日: HarmonyOS
    的頭像 發(fā)表于 07-11 18:20 ?289次閱讀
    【<b class='flag-5'>HarmonyOS</b> 5】金融應(yīng)用開(kāi)發(fā)鴻蒙組件實(shí)踐

    HarmonyOS 5 入門(mén)系列 】鴻蒙HarmonyOS示例項(xiàng)目講解

    HarmonyOS 5 入門(mén)系列 】鴻蒙HarmonyOS示例項(xiàng)目講解 ##鴻蒙開(kāi)發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##鴻蒙金融類(lèi)應(yīng)用 (金融理財(cái)# 一、前言:移動(dòng)開(kāi)發(fā)聲明式 UI
    的頭像 發(fā)表于 07-07 11:57 ?154次閱讀
    【 <b class='flag-5'>HarmonyOS</b> 5 入門(mén)系列 】鴻蒙<b class='flag-5'>HarmonyOS</b>示例項(xiàng)目講解

    針對(duì)“您的應(yīng)用使用了HarmonyOS beta版本的API”的解決方法##HarmonyOS應(yīng)用上架##

    ? 今天我更新了項(xiàng)目的一些UI,然后按照之前的流程正常的進(jìn)行打包、提審,結(jié)果在預(yù)審階段就收到了駁回的郵件,其中的內(nèi)容包括: 未通過(guò)原因:經(jīng)檢測(cè)發(fā)現(xiàn),您的應(yīng)用使用了HarmonyOS beta版本
    發(fā)表于 06-30 17:30

    HarmonyOS入門(mén)指南

    1、文檔與教程 HarmonyOS開(kāi)發(fā)文檔-應(yīng)用開(kāi)發(fā)導(dǎo)讀 OpenHarmony--應(yīng)用開(kāi)發(fā)導(dǎo)讀 倉(cāng)頡編程語(yǔ)言官網(wǎng) 華為開(kāi)發(fā)者博客 華為開(kāi)發(fā)者問(wèn)答專(zhuān)區(qū) 華為生態(tài)市場(chǎng)-鴻蒙生態(tài)市場(chǎng)
    的頭像 發(fā)表于 06-27 00:11 ?120次閱讀

    京東開(kāi)源Taro on HarmonyOS C-API版本

    近日,京東正式開(kāi)源了Taro on HarmonyOS C-API 版本,為鴻蒙應(yīng)用跨端開(kāi)發(fā)提供高性能框架。這次版本的發(fā)布,帶來(lái)了更豐富的樣式適配、更高效的渲染性能、更全面的組件支持,讓開(kāi)發(fā)者以Web范式的方式來(lái)開(kāi)發(fā)出媲美鴻蒙性
    的頭像 發(fā)表于 06-09 09:19 ?589次閱讀
    京東開(kāi)源Taro on <b class='flag-5'>HarmonyOS</b> C-API<b class='flag-5'>版本</b>

    HarmonyOS5云服務(wù)技術(shù)分享--手機(jī)號(hào)登錄教程

    一、為什么選擇手機(jī)號(hào)認(rèn)證? 在開(kāi)始代碼之前,先說(shuō)說(shuō)它的優(yōu)勢(shì): ??用戶友好??:不需要記憶復(fù)雜用戶名 ??安全性強(qiáng)??:雙重驗(yàn)證機(jī)制(短信+密碼) ??快速接入??:HarmonyOS Auth
    發(fā)表于 05-22 15:37

    HarmonyOS5云服務(wù)技術(shù)分享--認(rèn)證文檔問(wèn)題

    ,還是需要優(yōu)化現(xiàn)有流程,本文均可提供完整指引。 一、開(kāi)發(fā)流程詳解 1. 創(chuàng)建項(xiàng)目與應(yīng)用?? ??作用??:項(xiàng)目是AGC資源的組織實(shí)體,支持同一應(yīng)用的多平臺(tái)版本(如手機(jī)、平板)集中管理。 ??場(chǎng)景建議
    發(fā)表于 05-22 13:20

    DLP3010在使用過(guò)程中有黑白點(diǎn),是什么原因?

    型號(hào):DLP3010:后綴AFQK或者 FQK 兩個(gè)版本的器件,在使用過(guò)程中有黑白點(diǎn),是什么原因
    發(fā)表于 02-18 08:05

    HarmonyOS開(kāi)發(fā)指導(dǎo)類(lèi)文檔更新速遞(下)

    伴隨著HarmonyOS 5.0.0 Release、HarmonyOS 5.0.1 Release版本的發(fā)布,HarmonyOS官網(wǎng)文檔也帶來(lái)了不少上新內(nèi)容。本期
    的頭像 發(fā)表于 12-30 09:54 ?1163次閱讀
    <b class='flag-5'>HarmonyOS</b>開(kāi)發(fā)指導(dǎo)類(lèi)文檔更新速遞(下)

    HarmonyOS開(kāi)發(fā)指導(dǎo)類(lèi)文檔更新速遞(上)

    伴隨著HarmonyOS 5.0.0 Release版本的發(fā)布,HarmonyOS官網(wǎng)文檔也帶來(lái)了不少上新內(nèi)容。本期HarmonyOS NEXT開(kāi)發(fā)者資料直通車(chē)將從文檔更新角度為開(kāi)發(fā)者
    的頭像 發(fā)表于 12-30 09:50 ?1047次閱讀
    <b class='flag-5'>HarmonyOS</b>開(kāi)發(fā)指導(dǎo)類(lèi)文檔更新速遞(上)

    【「HarmonyOS NEXT啟程:零基礎(chǔ)構(gòu)建純血鴻蒙應(yīng)用」閱讀體驗(yàn)】+1-7章有感

    的支持,對(duì)此我建議大家一定要注意真機(jī)環(huán)境與手機(jī)系統(tǒng)版本IDE,SDK版本必須要一致。 然后在第2章講解了ArkTS語(yǔ)言,上來(lái)就說(shuō)明了ArkTS語(yǔ)言與JavaScript的關(guān)系,這也是我說(shuō)
    發(fā)表于 11-24 19:27

    華為“純血”鴻蒙系統(tǒng) HarmonyOS NEXT 將于9月底推出正式版

    HarmonyOS NEXT 將于今年 9 月底推出正式版本。 “從發(fā)布第一個(gè)版本到今年的 9 月份,這個(gè)(9 月)月底我們會(huì)正式發(fā)布 HarmonyOS NEXT,這一
    的頭像 發(fā)表于 09-14 14:27 ?2546次閱讀

    板液位計(jì)怎么用磁鐵校正

    板液位計(jì)是一種常用的液位測(cè)量裝置,它利用磁鐵和磁板的相互作用來(lái)實(shí)現(xiàn)液位的測(cè)量。在使用過(guò)程中,有時(shí)需要對(duì)磁板液位計(jì)進(jìn)行磁鐵校正,以確保測(cè)量的準(zhǔn)確性。以下是關(guān)于磁板液位計(jì)磁鐵校正
    的頭像 發(fā)表于 07-31 09:40 ?2051次閱讀