鸿蒙上实现数字华容道小游戏
本篇文章教大家如何在鸿蒙上实现数字华容道小游戏。
打开引用首先为数字华容道的初始界面,点击开始游戏即会切换到数字华容道的游戏界面。
进入数字华容道的游戏界面显示33的方阵,方阵中分布有随意打乱的1至8的数字和一个空白方格,方阵下方显示一个重新开始的按钮和一个返回按钮。
点击重新开始按钮即会重新生成随意打乱的1至8的数字和一个空白方格的方阵,点击返回按钮即会切换到数字华容道的初始界面,最下方有四个指示不同方向箭头的按钮,点击任一按钮或向上、下、左、右任一方向滑动,空白方格周围对应位置的方格便会随之向对应的方向移动一格。
经过若干次滑动或点击后,当所有的数字按顺序排列后,则会弹出游戏成功的界面,再滑动或点击也不会有任何变化。
创建项目
DevEcoStudio下载安装成功后,打开DevEcoStudio,点击左上角的File,点击New,再选择NewProject,选择Phone选项,选择默认的模板,然后选择保存路径。
将文件命名为MyPhoneApplication(文件名不能出现中文或者特殊字符,否则将无法成功创建项目文件),最后点击Finish。
实现初始界面布局
首先,我们要先实现数字华容道的初始界面,点击开始游戏即会切换到另一页面。
先在entrysrcmainconfig。json文件中最下方launchType:standard的后面添加以下代码。
并且将上方的label:MyPhoneApplication修改成label:数字华容道,这样就实现去掉应用上方的标题栏和将应用名称改为数字华容道了。
config。json最下面部分代码:orientation:unspecified,name:com。example。myphoneapplication。MainAbility,icon:media:icon,description:string:mainabilitydescription,label:数字华容道,type:page,launchType:standard,metaData:{customizeData:〔{name:hwctheme,value:androidhwext:styleTheme。Emui。Light。NoTitleBar,extra:}〕}
先将我们事先准备好的图片复制粘贴到entrysrcmainresourcesbasemedia文件夹中,并且命名为game,点击OK。
在entrysrcmainresourcesbaselayoutabilitymain。xml中添加布局。
先将事先存在的Text组件删去,添加Image图片组件,引入我们刚才复制粘贴的图片,再添加一个Button按钮组件,加入唯一标识符id并配置好其他相应的属性。lt;?xmlversinotallow1。0encodingutf8?DirectionalLayoutxmlns:ohoshttp:schemas。huawei。comresohosohos:heightmatchparentohos:widthmatchparentohos:orientationverticalImageohos:heightmatchparentohos:widthmatchparentohos:imagesrcmedia:gameohos:layoutalignmentcenterButtonohos:idid:buttongameohos:height150ohos:width515ohos:textalignmentcenterohos:topmargin810ohos:leftmargin250DirectionalLayout
在entrysrcmainjavacom。example。myphoneapplicationslice中右键选择NewJavaClass增加一个空白的类以用来后面编写数字。
华容道的游戏界面,并且命名为SecondAbilitySlice在这里插入图片描述。
将entrysrcmainjavacom。example。myphoneapplicationsliceSecondAbilitySlice
中的代码修改成如下:packagecom。example。myphoneapplication。slice;importcom。example。myphoneapplication。ResourceTable;importohos。aafwk。ability。AbilitySlice;importohos。aafwk。content。Intent;publicclassSecondAbilitySliceextendsAbilitySlice{publicvoidonStart(Intentintent){super。onStart(intent);}OverridepublicvoidonActive(){super。onActive();}OverridepublicvoidonForeground(Intentintent){super。onForeground(intent);}}
在下面代码中的onStart函数中添加一个按钮指向我们(2)中添加的按钮。entrysrcmainjavacom。example。myphoneapplicationsliceMainAbilitySlice
按钮添加一个响应点击事件的函数,用parsent函数跳转到SecondAbilitySlice。packagecom。example。myphoneapplication。slice;importcom。example。myphoneapplication。ResourceTable;importohos。aafwk。content。Intent;importohos。agp。components。Button;importohos。agp。components。Component;publicclassMainAbilitySliceextendsohos。aafwk。ability。AbilitySlice{OverridepublicvoidonStart(Intentintent){super。onStart(intent);super。setUIContent(ResourceTable。Layoutabilitymain);Buttonbutton(Button)findComponentById(ResourceTable。Idbuttongame);button。setClickedListener(newComponent。ClickedListener(){OverridepublicvoidonClick(Componentcomponent){present(newSecondAbilitySlice(),newIntent());}});}OverridepublicvoidonActive(){super。onActive();}OverridepublicvoidonForeground(Intentintent){super。onForeground(intent);}}
实现数字的随机打乱
然后我们要在数字华容道的游戏界面生成随意打乱的1至15的数字和一个空白方格的方阵。
在这里编写代码:entrysrcmainjavacom。example。myphoneapplicationsliceSecondAbilitySlice
先定义个一个位置布局layout和一个二维数组grids,创建函数initializeinitialize()分别对其初始化,在onStart函数中调用函数initializeinitialize()。privatefloatstarX,starY,distanceX,distanceY;privateDirectionalLayoutlayout;privateint〔〕〔〕grids;publicvoidonStart(Intentintent){super。onStart(intent);initialize();}publicvoidinitialize(){layoutnewDirectionalLayout(this);gridsnewint〔〕〔〕{{1,2,3,4},{5,6,7,8,},{9,10,11,12},{13,14,15,0}};}
然后定义函数drawGrids(int〔〕〔〕grids)用于绘制44方阵和其二维数组对应的数字。publicvoiddrawGrids(int〔〕〔〕grids){layout。setLayoutConfig((newComponentContainer。LayoutConfig(ComponentContainer。LayoutConfig。MATCHPARENT,ComponentContainer。LayoutConfig。MATCHPARENT)));Component。DrawTasktasknewComponent。DrawTask(){publicvoidonDraw(Componentcomponent,Canvascanvas){PaintmPaintnewPaint();mPaint。setColor(Color。GRAY);RectFloatrectnewRectFloat(2,230,1078,1306);canvas。drawRect(rect,mPaint);for(introw0;row4;row){for(intcolumn0;column4;column){mPaint。setColor(Color。CYAN);RectFloatrectFloatnewRectFloat(22column262,250row262,272column262,500row262);canvas。drawRect(rectFloat,mPaint);mPaint。setColor(Color。YELLOW);mPaint。setTextSize(125);if(grids〔row〕〔column〕!0){if(grids〔row〕〔column〕10){canvas。drawText(mPaint,String。valueOf(grids〔row〕〔column〕),105column262,425row262);}else{canvas。drawText(mPaint,String。valueOf(grids〔row〕〔column〕),65column262,425row262);}}}}}};layout。addDrawTask(task);setUIContent(layout);}
再定义函数changeGrids(int〔〕〔〕grids,intdirection),每次接收一个方向,2表示上移,1表示左移,1表示右移,2表示下移,找出空白方格所在位置对应的二维数组下标,对应的方格和空白方格对应的二维数组的数值对调。publicvoidchangeGrids(int〔〕〔〕grids,intdirection){introw03;intcolumn03;inttemp;for(introw0;row4;row){for(intcolumn0;column4;column){if(grids〔row〕〔column〕0){row0row;column0column;}}}if(direction1(column01)3){tempgrids〔row0〕〔column01〕;grids〔row0〕〔column01〕grids〔row0〕〔column0〕;grids〔row0〕〔column0〕temp;}elseif(direction1(column01)0){tempgrids〔row0〕〔column01〕;grids〔row0〕〔column01〕grids〔row0〕〔column0〕;grids〔row0〕〔column0〕temp;}elseif(direction2(row01)3){tempgrids〔row01〕〔column0〕;grids〔row01〕〔column0〕grids〔row0〕〔column0〕;grids〔row0〕〔column0〕temp;}elseif(direction2(row01)0){tempgrids〔row01〕〔column0〕;grids〔row01〕〔column0〕grids〔row0〕〔column0〕;grids〔row0〕〔column0〕temp;}}
定义函数createGrids(int〔〕〔〕grids)用于随机生成一个表示方向的数字,循环调用函数changeGrids(grids,direction)用于随机打乱二维数组对应的数字。publicvoidcreateGrids(int〔〕〔〕grids){int〔〕array{1,2,1,2};for(inti0;i100;i){intrandom(int)Math。floor(Math。random()4);intdirectionarray〔random〕;changeGrids(grids,direction);}}最后在initialize()函数中调用createGrids(grids)函数和drawGrids(grids)函数publicvoidinitialize(){layoutnewDirectionalLayout(this);gridsnewint〔〕〔〕{{1,2,3,4},{5,6,7,8,},{9,10,11,12},{13,14,15,0}};createGrids(grids);drawGrids(grids);}
实现滑动或点击调换数字
添加重新开始和返回按钮,在每个方块下面添加不同方向箭头的按钮,点击方块并向上、下、左、右任一方向滑动,空白方格周围对应位置的方格便会随之向对应的方向移动一格。
在这里编写代码:entrysrcmainjavacom。example。myphoneapplicationsliceSecondAbilitySlice
先定义一个函数drawButton()用于绘制所有的按钮,四个指示不同方向箭头的按钮分别添加四个响应点击事件的函数。
分别调用对应的changeGrids(grids,direction)函数实现空白方格周围对应位置的方格便会随之向对应的方向移动一格,并调用drawGrids(grids)函数用于绘制新的方阵。publicvoiddrawButton(){ButtonbuttnotallownewButton(this);button。setText(重新开始);button。setTextSize(100);button。setTextAlignment(TextAlignment。CENTER);button。setTextColor(Color。WHITE);button。setMarginTop(1400);button。setMarginLeft(80);button。setPadding(20,20,20,20);ShapeElementbackgroundnewShapeElement();background。setRgbColor(newRgbColor(174,158,143));background。setCornerRadius(100);button。setBackground(background);layout。addComponent(button);Buttonbutton0newButton(this);button0。setText(返回);button0。setTextSize(100);button0。setTextAlignment(TextAlignment。CENTER);button0。setTextColor(Color。WHITE);button0。setMarginTop(170);button0。setMarginLeft(680);button0。setPadding(20,20,20,20);button0。setBackground(background);layout。addComponent(button0);ShapeElementbackground0newShapeElement();background0。setRgbColor(newRgbColor(174,158,143));background0。setCornerRadius(100);Buttonbutton1newButton(this);button1。setText();button1。setTextAlignment(TextAlignment。CENTER);button1。setTextColor(Color。WHITE);button1。setTextSize(100);button1。setMarginLeft(500);button1。setMarginTop(70);button1。setPadding(10,0,10,0);button1。setBackground(background0);button1。setClickedListener(newComponent。ClickedListener(){OverridepublicvoidonClick(Componentcomponent){changeGrids(grids,2);}});layout。addComponent(button1);Buttonbutton2newButton(this);button2。setText();button2。setTextAlignment(TextAlignment。CENTER);button2。setTextColor(Color。WHITE);button2。setTextSize(100);button2。setMarginTop(10);button2。setMarginLeft(400);button2。setPadding(10,0,10,0);button2。setBackground(background0);button2。setClickedListener(newComponent。ClickedListener(){OverridepublicvoidonClick(Componentcomponent){changeGrids(grids,1);}});layout。addComponent(button2);Buttonbutton3newButton(this);button3。setText();button3。setTextAlignment(TextAlignment。CENTER);button3。setTextColor(Color。WHITE);button3。setTextSize(100);button3。setMarginLeft(600);button3。setMarginTop(130);button3。setPadding(10,0,10,0);button3。setBackground(background0);button3。setClickedListener(newComponent。ClickedListener(){OverridepublicvoidonClick(Componentcomponent){changeGrids(grids,1);}});layout。addComponent(button3);Buttonbutton4newButton(this);button4。setText();button4。setTextAlignment(TextAlignment。CENTER);button4。setTextColor(Color。WHITE);button4。setTextSize(100);button4。setMarginLeft(500);button4。setMarginTop(10);button4。setPadding(10,0,10,0);button4。setBackground(background0);button4。setClickedListener(newComponent。ClickedListener(){OverridepublicvoidonClick(Componentcomponent){changeGrids(grids,2);}});layout。addComponent(button4);drawGrids(grids);}
然后添加一个函数slideGrids()为布局layout添加一个滑动事件,并获取滑动开始与结束的坐标,并计算出大致的滑动方向。
分别调用对应的changeGrids(grids,direction)函数实现空白方格周围对应位置的方格便会随之向对应的方向移动一格,并调用drawGrids(grids)函数用于绘制新的方阵,并在开头添加相应的变量。privatefloatstarX,starY,distanceX,distanceY;publicvoidslideGrids(){layout。setTouchEventListener(newComponent。TouchEventListener(){OverridepublicbooleanonTouchEvent(Componentcomponent,TouchEventtouchEvent){MmiPointpointtouchEvent。getPointerScreenPosition(0);switch(touchEvent。getAction()){caseTouchEvent。PRIMARYPOINTDOWN:starXpoint。getX();starYpoint。getY();break;caseTouchEvent。PRIMARYPOINTUP:distanceXpoint。getX()starX;distanceYpoint。getY()starY;break;}if(gameover()false){if(Math。abs(distanceX)Math。abs(distanceY)){if(distanceX200){changeGrids(grids,1);}elseif(distanceX200){changeGrids(grids,1);}}elseif(Math。abs(distanceX)Math。abs(distanceY)){if(distanceY200){changeGrids(grids,2);}elseif(distanceY200){changeGrids(grids,2);}}}drawGrids(grids);returnfalse;}});}
最后在initialize()函数中调用slideGrids()函数和drawButton()函数。publicvoidinitialize(){layoutnewDirectionalLayout(this);gridsnewint〔〕〔〕{{1,2,3,4},{5,6,7,8,},{9,10,11,12},{13,14,15,0}};createGrids(grids);slideGrids();drawButton();drawGrids(grids);}
实现游戏成功界面
点击重新开始按钮即会重新生成随意打乱的1至15的数字和一个空白方格的方阵,点击返回按钮即会切换到数字华容道的初始界面。
经过若干次滑动或点击后,当所有的数字按顺序排列后,则会弹出游戏成功的界面,再滑动或点击也不会有任何变化。
在这里编写代码:entrysrcmainjavacom。example。myphoneapplicationsliceSecondAbilitySlice
首先定义一个函数drawText()用于绘制游戏成功字样。publicvoiddrawText(){TexttextnewText(this);text。setText(游戏成功);text。setTextSize(100);text。setTextColor(Color。BLUE);text。setTextAlignment(TextAlignment。CENTER);text。setMarginsTopAndBottom(2000,0);text。setMarginsLeftAndRight(350,0);layout。addComponent(text);setUIContent(layout);}
然后定义一个函数gameover()用于判断二维数组的数字是否按顺序排列,当二维数组的数字按顺序排列时返回true,否则返回false。publicbooleangameover(){int〔〕〔〕gameoverGrids{{1,2,3,4},{5,6,7,8,},{9,10,11,12},{13,14,15,0}};for(introw0;row4;row){for(intcolumn0;column4;column){if(grids〔row〕〔column〕!gameoverGrids〔row〕〔column〕){returnfalse;}}}returntrue;}
再在drawButton()函数中重新开始按钮中添加一个响应点击事件的函数,用于调用函数initialize()实现重新生成随意打乱的1至15的数字和一个空白方格的方阵,返回按钮中添加一个响应点击事件的函数。
用parsen函数返回数字华容道的初始界面,四个指示不同方向箭头的按钮的响应点击事件的函数中增加一个判断。
当函数gameover()返回为false时才调用各自的changeGrids(grids,direction)函数。
最后增加一个判断,当函数gameover()返回为true时调用函数drawText()。publicvoiddrawButton(){部分代码没有贴出,可自行下载源代码查看button。setClickedListener(newComponent。ClickedListener(){OverridepublicvoidonClick(Componentcomponent){initialize();}});button0。setClickedListener(newComponent。ClickedListener(){OverridepublicvoidonClick(Componentcomponent){present(newSecondAbilitySlice(),newIntent());}});button1。setClickedListener(newComponent。ClickedListener(){OverridepublicvoidonClick(Componentcomponent){if(gameover()false){changeGrids(grids,2);}}});button2。setClickedListener(newComponent。ClickedListener(){OverridepublicvoidonClick(Componentcomponent){if(gameover()false){changeGrids(grids,1);}}});button3。setClickedListener(newComponent。ClickedListener(){OverridepublicvoidonClick(Componentcomponent){if(gameover()false){changeGrids(grids,1);}}});button4。setClickedListener(newComponent。ClickedListener(){OverridepublicvoidonClick(Componentcomponent){if(gameover()false){changeGrids(grids,2);}}});if(gameover()){drawText();}}
在函数slideGrids()函数中增加一个判断,当函数gameover()返回为false时才调用changeGrids(grids,direction)函数,最后增加一个判断,当函数gameover()返回为true时调用函数drawText()。publicvoidslideGrids(){部分代码没有贴出,可自行下载源代码查看if(gameover()false){{。。。}}if(gameover()){drawText();}}
你现在是一个父亲了吗1,父亲的爱,深沉如山,温煦如风。真正的伟大,藏在父亲如山的爱中。2,我第一次拥抱天空,是您将我举过头顶。感谢您不是超人,却为我变成了万能。3,父爱沉酿不识意,一朝初醒才知味。他很
一周军评横空出世的福建舰文观察者网专栏作者王世纯本周最重要的新闻,无疑是我们的航母下水了。6月17日上午,我国第三艘航空母舰下水命名仪式在中国船舶集团有限公司江南造船厂举行。经中央军委批准,我国第三艘航空
广东医保新动态!提高医保最低缴费年限个人账户划入金额会减少(点击上方蓝色按钮可同步收听有声书)广东医保7月有最新动态!将要逐步提高医保退休所需的最低缴费年限同时还将减少医保个人账户划入金额,这个会如何影响我们的生活呢?待遇会降低吗?一起来
斯基拉透露米兰巴黎竞价桑谢斯合同总价1500万欧vs2000万欧直播吧6月19日讯斯基拉透露AC米兰巴黎竞购里尔中场桑谢斯的报价方案。AC米兰报价方案转会费1000万欧500万欧浮动球员个人合同年薪300500万欧100万欧奖金,签约4年巴黎报
越南翻旧账欲找茬,假如中越再次开战,以其目前实力能撑几天?文烁史今忆编辑烁史今忆01越南欲翻旧账找茬?在6月10日开幕的香格里拉对话中,一个越南记者提出,中国在历史上曾经入侵过越南,在2022年的今天,居然还会有人提出这样的问题!这样不怀
塔图姆的父亲为你感到骄傲,在我看来你已经赢了凯尔特人前锋杰森塔图姆的父亲贾斯汀塔图姆今日更新Instagram。贾斯汀写道欣赏帖杰森塔图姆,过去两个月你给了令我一个父亲最满意的父亲节礼物。看到你在最高的水平比赛创造历史,是我
2022铁路局扩招,工资待遇不比公务员差,这3类人别错过随着大学的毕业生越来越多,社会上的工作岗位也是供不应求,竞争可以说是非常激烈。体制内的工作是最受毕业生青睐的,但是想要顺利上岸难度也是不小的,事实上,还有一些铁饭碗的职位,对大专生
为什么女生的内衣扣是从后面解开的?导语内衣是帮助女性展示前凸后翘的身材的利器,但是由于其塑身效果,所以一天下来,让女性还是很不舒适的,但穿内衣也是有好处的。首先,穿内衣可以承托胸部,如果没有内衣的支撑,在活动的时候
董明珠怒斥粉丝太傻,30万人直播间卖39台手机!网友叫明珠牌吧一年一度的618购物狂欢节到了,格力铁娘子董明珠来到直播间视察工作,看到30万人的直播间仅卖出39台格力手机,还有20人没付款,气不打一处来,怒斥网友太傻,不识货,这么好的格力手机
俄乌战火在烧谁二月二十四日,俄罗斯军队进入乌克兰,开始特别军事行动,大国博弈的大幕由此拉开,一众演员纷纷登台表演。两个多月过去了,全世界吃瓜的人们看得眼花缭乱,战争最初的几天后,全世界发现苦哈哈
关于父亲节的作文范文大全,祝天下的父亲们节日快乐欢迎关注我,我是小学教师,自由撰稿人,热爱读书与写作。父爱是一棵郁郁葱葱的大树,给我们带来浓密的树荫,自己却承受着烈日的炙烤父爱是一盏明亮的灯,指引着我们一路向前父爱是一根拐杖,让