0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于HarmonyOS的黑白翻棋手机版本

电子发烧友开源社区 来源:HarmonyOS官方合作社区 作者:木棉花_潘颖琳 2021-10-13 09:38 次阅读

前言
之前发过两篇黑白翻棋游戏的手表版本,这次给大家带来的小分享是黑白翻棋的手机版本,也是JS写的,功能代码基本一致(采用第二篇的算法),只是布局会作相应修改。

概述

该游戏会随机生成一个题目,最终当棋盘上的方格都为白色的时候游戏成功,效果如下

正文


1.创建一个空白的工程
DevEco Studio下载安装成功后,打开DevEco Studio,点击左上角的File,点击New,再选择New Project,选择Empty Ability,然后点击Next,给项目命名PhoneGame_BW,选择设备类型Phone,选择语言类型JS最后点击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 棋盘设置
这里以画布组件canvas来描绘棋盘

index.hml

class="canvas" ref="canvas"> 

index.css

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

打开模拟器

2.3 棋子设置
棋子是通过canvas组件的方法来绘制填充多个正方形,这里我设置的棋盘是7x7的,每个方格的边长SIDELEN为40,方格间的间距MARGIN为5,以一个数组来表示每个方格,并初始化赋值为0,用0表示白色,1代表黑色,这样我们就能定义一个用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下方添加以下代码,遍历数组grids的每一个元素,将其转换成String型,对应的是COLORS中的颜色,然后调用画布组件中的方法fillRect填充方格的颜色,参数为方格的左上角的坐标及方格的长宽

  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函数上方添加以下代码调用drawGrids

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

打开模拟器,就能有如下效果

3.游戏规则的设置

3.1.获取点击位置的坐标并对应方格

给画布组件添加点击事件onclick和触摸事件touchstart

index.hml

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

事件touchstart,在手指刚触摸屏幕时就触发该事件,其参数为TouchEvent,其对象属性touches包含屏幕触摸点的信息数组,而我们需要的坐标信息就包含在这个数组里;这里我们需要获取到的坐标是相对于组件左上角的,即localX和localY,这样也方便我们设置点击范围来触发色块的翻转(获取坐标这块详细可看我上一篇文章)其次,参数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 点击的方格及其上下左右都变色

change控制变色,若值为0则变为1,若为1则变为0。方格的横纵坐标都是0~6,changeOneGrids第一个判断是被点击的方格的变色,第二个判断是右边的格子是否在棋盘上,假如被点击的格子是右边界,则判断为假,右格子不会变色。以此类推对左格,上格,下格作判断,最后调用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();}

最后在点击事件上调用getgrid和changeOneGrids

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

到此,效果如下

3.3 生成随机打乱的棋盘(游戏题目)

先将数组以坐标形式存储在array,共49组坐标,然后随机生成0~48的整数,取该组坐标中第一个元素作为横坐标,第二个元素作为纵坐标,这里设置的是随机生成点击10下后的题目(后期为在此基础上以不同次数来设置不同难度)

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上调用initGrids,注意initGrids要放在drawGrids之前

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

4.设置步数显示及游戏的重新开始

4.1 步数显示
步数这个文本组件显示在棋盘上方,故在index.hml文件里,将以下代码放在canvas上方,其中由于步数是个变量,故以currentSteps的值的变动来动态更新步数

index.hml

class="steps">    当前步数:{{currentSteps}}  

index.css

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

由于initGrids会随机点击10下,为了使步数清零,在data里给它赋初值-10

index.js

data: {    currentSteps:-10,  },

在changeOneGrids上添加以下代码,使每次点击步数加一

this.currentSteps+=1;

4.2 游戏的重新开始
重新开始的按钮在棋盘的下方,故index.hml文件中在canvas下方添加代码

"button" value="重新开始" class="bit" onclick="restartGame"/>

index.css

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

游戏重新开始时,会再次随机生成游戏题目,并且步数重置为0

index.js

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

5.游戏成功的设置

游戏成功的弹窗是显示在棋盘(canvas)上方的,该实现可通过添加一个堆叠容器stack,将游戏成功的文本组件放在画布组件之后;其次,“游戏成功”的显示在初始时不会显示,所以要设置属性show,对应设一个布尔型变量isShow,并令isShow的初始值为假,游戏成功时其值为真,当为真时就可以显示了

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中给“步数增加”添加判断条件

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

在restartGame中添加代码

 this.isShow = false;

恭喜你!!完成以上步骤后你就可以开始玩啦!!O(∩_∩)O

结语

以上就是我这次的小分享啦❀❀!后续会有该游戏的进阶版,我会不断完善的(ง •_•)ง
责任编辑:haq


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 操作系统
    +关注

    关注

    37

    文章

    6282

    浏览量

    121870
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2601

    浏览量

    65266
  • HarmonyOS
    +关注

    关注

    79

    文章

    1814

    浏览量

    29257

原文标题:基于HarmonyOS的手机游戏——黑白翻棋

文章出处:【微信号:HarmonyOS_Community,微信公众号:电子发烧友开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    2024款鸿蒙OS 最新HarmonyOS Next_HarmonyOS4.0系列教程分享

    鸿蒙的出现,标志着中国科技的崛起。HarmonyOS就是我们说的华为鸿蒙系统,截止到2023年8月4日已有超过7亿台设备搭载了鸿蒙OS系统。据多家媒体报道,2024年国内有21所985大学都开设
    发表于 02-28 10:29

    harmonyos和安卓的区别

    和安卓的比较分析。 一、架构设计: HarmonyOS采用了分布式架构设计,可以应用于多种终端设备,从手机到智能家居、汽车等,实现设备之间的协同工作和资源共享。而安卓主要是面向手机和平板等消费电子设备设计的操作系统。 在架构设计
    的头像 发表于 01-10 17:55 1103次阅读

    HarmonyOS应用兼容稳定性云测试

    兼容性测试 兼容性测试主要验证 HarmonyOS 应用在华为真机设备上运行的兼容性问题,包括首次安装、再次安装、启动、卸载、崩溃、黑白屏、闪退、运行错误、无法回退、无响应、设计约束场景。具体兼容性
    发表于 12-25 10:56

    华为表示海外暂无使用HarmonyOS的计划

     近日,华为表示,目前海外手机暂无使用HarmonyOS的计划,海外消费者可通过搭载EMUI版本的华为手机继续放心使用安卓应用。
    的头像 发表于 11-21 17:25 527次阅读

    鸿蒙原生应用/元服务开发-AGC分发如何配置版本信息(上)

    1.配置HarmonyOS应用的“发布国家或地区”。 2.设置是否为开放式测试版本。 注意:HarmonyOS应用开放式测试当前仅支持手机、平板、智能手表。如开发者想发布为开放式测试
    发表于 11-21 13:54

    今日看点丨华为:海外手机暂无使用鸿蒙 HarmonyOS 的计划;蔚来宣布建设汽车充电桩超 20000 根

    1. 华为:海外手机暂无使用鸿蒙 HarmonyOS 的计划   据报道,华为方面表示,目前海外手机暂无使用 HarmonyOS 的计划,海外消费者可通过搭载 EMUI
    发表于 11-21 11:21 575次阅读

    HarmonyOS/OpenHarmony应用开发-ArkTSAPI系统能力SystemCapability

    、 设备与支持能力集 每个设备根据其硬件能力,对应不同的支持能力集。3.1 Developer Preview版本仅支持远程模拟器的手机设备,设备的支持能力集由HarmonyOS系统定义。 三
    发表于 08-10 16:39

    RK3588能够驱动分辨率12K30hz的黑白屏吗?或者RK3399能够驱动分辨率8K30HZ的黑白屏吗?

    RK3588能够驱动分辨率12K30hz的黑白屏吗?或者RK3399能够驱动分辨率8K30HZ的黑白屏吗? 主要和以下因素有关系? 确认硬件支持: 确保RK3399的硬件能够支持8K分辨率和30Hz
    发表于 08-09 19:24

    HarmonyOS NEXT新能力,一站式高效开发HarmonyOS应用

    2023年8月4日的华为开发者大会2023(HDC.Together)拉开帷幕,伴随着HarmonyOS 4的发布,华为向开发者发布了汇聚所有最新开发能力的HarmonyOS NEXT开发者预览版
    的头像 发表于 08-09 17:16 784次阅读

    HarmonyOS 4车机体验大升级,中控屏可操控无人机?

    新的车机系统在超级桌面上进一步提升。HarmonyOS 3为车机带来了超级桌面功能,与智慧屏超级桌面一样,手机上的应用会自动同步至车机,丰富了车机应用生态。HarmonyOS 4车机的超级桌面进一步优化了
    的头像 发表于 08-08 15:44 433次阅读
    <b class='flag-5'>HarmonyOS</b> 4车机体验大升级,中控屏可操控无人机?

    当华为WATCH 4系列遇上HarmonyOS 4,更精彩的腕上鸿蒙世界

    7亿台,覆盖手机、平板、穿戴、智慧屏、汽车座舱、耳机、全屋智能等,HarmonyOS开发者人数超过220万,HarmonyOS将以更多设备、更多应用、更多元服务完成生态建设布局。 余承东表示,
    的头像 发表于 08-07 09:28 1151次阅读

    HDC.Together2023 HarmonyOS学生公开课议程抢先看!

    ,让我们同心而行 和HarmonyOS一起创造无限可能 文章推荐 点击下方链接,查看更多技术文章 定了!12支队伍进入HarmonyOS极客马拉松决赛 【有奖互动】开发者版本新特性,你期待哪些更新
    的头像 发表于 07-27 09:15 271次阅读
    HDC.Together2023 <b class='flag-5'>HarmonyOS</b>学生公开课议程抢先看!

    超强阵容!HarmonyOS极客马拉松2023专家评审团来袭

    文章推荐 点击下方链接,查看更多技术文章 定了!12支队伍进入HarmonyOS极客马拉松决赛 【有奖互动】开发者版本新特性,你期待哪些更新? HarmonyOS课程尝鲜计划,优享特权大礼包 对应
    的头像 发表于 07-26 11:05 345次阅读

    【直播预告】HarmonyOS极客松赋能直播第四期:HarmonyOS开发经验分享

    Release新版发布 HarmonyOS Connect认证测试 原文标题:【直播预告】HarmonyOS极客松赋能直播第四期:HarmonyOS开发经验分享 文章出处:【微信公众号:Ha
    的头像 发表于 07-03 09:05 338次阅读
    【直播预告】<b class='flag-5'>HarmonyOS</b>极客松赋能直播第四期:<b class='flag-5'>HarmonyOS</b>开发经验分享

    HarmonyOS云开发:舒尔特方格游戏

    为丰富 HarmonyOS 对云端开发的支持、实现 HarmonyOS 生态端云联动,DevEco Studio 推出了云开发功能,开发者在创建工程时选择云开发模板。
    的头像 发表于 06-19 15:05 491次阅读
    <b class='flag-5'>HarmonyOS</b>云开发:舒尔特方格游戏