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

    文章

    6712

    浏览量

    123163
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2634

    浏览量

    66189
  • HarmonyOS
    +关注

    关注

    79

    文章

    1966

    浏览量

    29982

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

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

收藏 人收藏

    评论

    相关推荐

    华为“纯血”鸿蒙系统 HarmonyOS NEXT 将于9月底推出正式版

    HarmonyOS NEXT 将于今年 9 月底推出正式版本。 “从发布第一个版本到今年的 9 月份,这个(9 月)月底我们会正式发布 HarmonyOS NEXT,这一
    的头像 发表于 09-14 14:27 839次阅读

    板液位计怎么用磁铁校正

    板液位计是一种常用的液位测量装置,它利用磁铁和磁板的相互作用来实现液位的测量。在使用过程中,有时需要对磁板液位计进行磁铁校正,以确保测量的准确性。以下是关于磁板液位计磁铁校正
    的头像 发表于 07-31 09:40 706次阅读

    华为HarmonyOS NEXT鸿蒙星河版正式开启Beta计划

    在刚刚落幕的华为开发者大会(HDC 2024)盛会上,华为震撼宣布HarmonyOS NEXT鸿蒙星河版正式迈入Beta测试阶段,并预告其商用版本将于今年第四季度璀璨登场,预示着今年10月,搭载全新鸿蒙星河系统的华为手机即将与消
    的头像 发表于 07-15 15:59 824次阅读

    带你快速认识 HarmonyOS

    国产操作系统HarmonyOS(鸿蒙操作系统)开始进入到大众的视野。鸿蒙寓意为“万物起源”,发展至今已经经过了好几个迭代版本。1.1.1.早期鸿蒙雏形LiteOS2015年5月20日,华为大会上
    的头像 发表于 07-06 08:04 1043次阅读
    带你快速认识 <b class='flag-5'>HarmonyOS</b>

    HUAWEI Pura 70系列搭载HarmonyOS 4.2,玩转小艺AI智慧体验!

    也有显著增强。首款搭载HarmonyOS 4.2的产品——HUAWEI Pura 70系列手机上市以来,深受消费者喜爱。     其中H
    的头像 发表于 05-16 17:49 442次阅读

    HarmonyOS开发案例:【首选项】

    基于HarmonyOS的首选项能力实现的一个简单示例。
    的头像 发表于 04-19 16:20 1188次阅读
    <b class='flag-5'>HarmonyOS</b>开发案例:【首选项】

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

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

    PS-2205ST-M系列折屏手机扭力测试仪:原理、作用及应用

    PS-2205ST-M系列折屏手机扭力测试仪:原理、作用及应用?|深圳磐石测控仪器
    的头像 发表于 02-27 09:12 387次阅读
    PS-2205ST-M系列<b class='flag-5'>翻</b>折屏<b class='flag-5'>手机</b>扭力测试仪:原理、作用及应用

    苹果上架近500元龙年手机壳 苹果Vision Pro加价3倍

    苹果上架近500元龙年手机壳 苹果Vision Pro加价3倍 苹果手机最近大事是什么?那就莫过于苹果开售iphone15龙年款手机壳;苹果也真的敢开价,一个
    的头像 发表于 01-22 17:56 477次阅读
    苹果上架近500元龙年<b class='flag-5'>手机</b>壳 苹果Vision Pro加价<b class='flag-5'>翻</b>3倍

    harmonyos和安卓的区别

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

    HarmonyOS应用兼容稳定性云测试

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

    鸿蒙原生应用/元服务开发-AGC分发如何上架HarmonyOS应用

    点击“下一步”,在弹窗中点击“确认”,进入“准备提交”页面,开始设置版本信息。 本文根据HarmonyOS官方文档材料整理
    发表于 11-24 14:44

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

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

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

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

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

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