【木棉花】#夏日挑战赛# 鸿蒙小游戏项目——数独Sudoku(4) 原创 精华
前言
在上期的分享中,笔者阐述了数字填入功能的开发流程。而在本期的分享中,笔者将分享一个非常有趣的内容。
上期的内容回顾——>>https://ost.51cto.com/posts/14551
正文
在数字填入的功能实现之后,我们下一步要做的就是写入判断游戏成功的相关逻辑代码。
关于数独游戏成功的判定,笔者思考过两种办法,一种是写递归算法来判断用户填入的答案是否满足游戏的胜利规则,另一种则是预先准备数独游戏的正确答案,然后将读者输入的答案与正确答案进行校对。这两种方法都有一点难度,而笔者尝试的方法是后者。
在第二期的分享中,笔者定义了一个二维数组grid_c0,作为数独游戏的一道题目。本期我们就以这道题目为例,来探索数独游戏成功的判定方法。
首先,我们给出grid_c0对应的答案的二维数组grid_v0,grid_v0所对应的矩阵如下:
4 3 5 6 1 2
1 5 2 4 6 3
6 2 3 1 4 5
5 4 1 2 3 6
2 6 4 3 5 1
3 1 6 5 2 4
当用户在网格区域的某个白色方格填入数字时,比如,在第二行第一列填入数字5时,我们可以在标有数字“5”的圆形Button组件的点击监听器中增加一个指令:grid_c0[j1][k1]=5(其中,j1=2,k1=1);
那么grid_c0对应的矩阵就会由原来的:
0 1 6 5 0 3
0 0 2 0 6 1
0 2 3 0 4 0
0 4 0 2 3 5
1 0 0 3 5 0
0 0 5 6 0 4
变成:(第二行第一列变成了5)
0 1 6 5 0 3
5 0 2 0 6 1
0 2 3 0 4 0
0 4 0 2 3 5
1 0 0 3 5 0
0 0 5 6 0 4
类似这样,我们可以在Button组件的点击监听器上增加指令,使得玩家每填入一次数字,grid_v0对应的矩阵都会发生变化;之后,我们再加入一个游戏判断的函数,用于判断grid_v0与grid_c0是否相等,若相等则游戏胜利。
不过我们现在面临一个问题——点击网格区域的某个白色Button组件的时候,我们需要获取这个白色Button组件在for循环中对应的x和y的值(以确定j1和k1),这样我们才能知道此Button组件是位于第几行第几列的,我们才能精准地传输指令。
在本期的内容中,笔者将具体阐述得到网格区域中每个Button组件所在的行和列的方法
首先,我们先定义两个整型数据j1,k1:
接着,我们找到之前写入的二重for循环(如下):
我们对代码进行如下修改:
在这次的修改中,我们先是在for循环内创建了Text组件。我们知道,之前的二重for循环能创建36个Button组件,而在本次的修改后,二重for循环每创建一个Button组件的同时都会附属性地创建一个Text组件,也是一共会创建36个Text组件。
为什么说这个Text组件能存储x和y的信息呢?事实上,这个通过代码布局所创建的Text组件并不会在UI界面中展示出来,因为我们并没有定义Text组件的与视觉相关的必要属性(如组件大小,字体大小),但这个Text组件既然被创建了出来,它仍是会占用内存的。在上面加入的代码中,我们先是将每个Text组件在for循环中对应的x和y转换成字符串后,用于定义Text组件的显示文本内容,然后在白色Button组件的监听器中,通过getText.()函数将Text组件的文本信息提取出来,最后再写36个if来判断和输出这些文本信息,得到Text组件在for循环中x和y的信息(即j1和k1)。
由于每个Text组件都“附属于”一个网格区域中的Button组件,所以获得Text组件在for循环中的x和y的信息相当于获得Button组件在for循环中的x和y的信息,由此,我们在点击网格区域中的任一白色Button组件时,我们能获得它的行和列的信息(即j1和k1),进而可以通过grid_c0[j1][k1]=t(1<=t<=6,t为整数)的指令修改grid_c0。
上述的代码思路,实质上是一个将整形数据转化为字符串数据存储在Text组件中后,再将Text组件中携带的字符串数据重新转化为整形数据的过程。
结尾
本期的内容就先分享到这里,更多关于数独小游戏项目精彩的内容我将在下期继续为大家揭晓。
本期的内容大家可能会比较难get到笔者想表达的点
mark
感受到了规则制定的不易。