数独游戏的设计与实现
数独游戏的规则:
1.游戏会从⼀个部分带有数字的九宫格开始。在9×9的⼤九宫格(即3格宽×3格⾼)⽅阵⾥,每⼀格⼜细分为⼀个⼩九宫格。
2.游戏开始,已给定若⼲数字,其它宫位留⽩,玩家需要⾃⼰按照逻辑推敲出剩下的空格⾥是什么数字。
3.填数字时必须满⾜以下条件:在空⽩的⼩格⼦⾥填上1~9中的数字,使得每个数字在“九宫格”的每⾏、每列、每个⼩九宫格中均只出现⼀次。
数独游戏的分析与实现:
 1.游戏中的每个格⼦可能的数字有1-9。
2. 游戏开始显⽰的数字,通过⼀份完整的数独,将部分格⼦设为空⽩,得到游戏初始值。
3.游戏中的每个空⽩格⼦可以填写的数字是:同⼀⾏未出现的数字,同⼀列未出现的数字,同⼀个3x3的九宫格中未出现的数字三部分的交集。
4.游戏中的每个格⼦的三种状态:答案数字(即正确的数字),初始化数字(即游戏开始是数字,显⽰有数字或者空⽩),当前数字(即玩家填写前,
后的数字)。
5.游戏完成的条件是满⾜规则中说明的情况。
游戏设计:
1.绘制游戏界⾯。【l】
2.绘制游戏框架,⼤九宫格和⼩九宫格。【Kuangjia.java中】
(1)⽤屏幕的宽width和⾼height分别除于9即可得到九宫格中每个单元格的宽度和⾼度。
(2)⽤ onDraw⽅法⽣成⽤于绘制背景⾊的画笔并设置画笔的颜⾊和设置横向、纵向的单元格线的颜⾊、背景⾊并绘制横向单元格线和纵向单元格线。
(3)在values⽂件夹中新建color的XML⽂件并设置好四种颜⾊,以后的颜⾊设置就可以直接调⽤这⾥的颜⾊。【l】
3.游戏格⼦中数字绘制,且字体在格⼦中居中显⽰。【Kuangjia.java中】
(1)⽤paint中的⽅法绘制数字,设置数字的颜⾊为⿊⾊并把数字设置居中显⽰。游戏xml文件修改
(2)⽤FontMetrics fm = FontMetrics();即FontMetrics⽅法真正实现⽂字在矩形框当中居中显⽰。
4.游戏交互事件处理,点击⼩格⼦,提⽰玩家选择填写的数字,并将选择的数字绘制到所点击的格⼦中。【Kuangjia.java和Shuzi.java 中】
(1)⽤onTouchEvent();函数实现单点触摸事件,即⿏标(⼿)触动⼿机屏幕事件,当⼿触动该view时该函数会被调⽤onTouchEvent
(MotionEvent event)中的⽅法获取当前点击的单元格坐标。
    (2)调⽤Shuzi⽅法实现提⽰玩家选择填写的数字的⾃定义对话框,⽤setListeners();⽅法为对话框当中所有的按钮设置,即可实现
将选择的数字绘制到所点击的格⼦中。
5.⾃定义对话框的实现过程,从提⽰到消失。【Shuji.java中】
(1)新建Shuzi类,实现⾃定义的对话框功能。
(2)⽤Shuzi();构造函数保存着对话框当前单元格已经使⽤过的数字,当⼀个对话框第⼀次显⽰的时候调⽤其onCreate⽅法实现提⽰功能,
最后⽤dismiss();⽅法取消对话框的显⽰。
6.具体的逻辑处理的实现过程。【Jiugong.java】
(1)新建String str存储字符串数据,存储数独游戏中要⽤到的数字。
(2)⽤fromPuzzleString(String src)⽅法根据⼀个字符串数据,⽣成⼀个整形数组(将字符串常量转换为数字存⼊数组中),即所谓的数独
游戏的初始化数据。
(3)⽤calculateAllUsedTiles()⽅法计算所有单元格对应的不可⽤数据;⽤calculateUsedTiles(int x, int y)⽅法计算某⼀单元格当中已经
不可⽤的数据;⽤getUsedTilesByCoor(int x,int y)⽅法取出某⼀单元格当中已经不可⽤的数据;⽤setTileIfValid(int x, int y, int value)⽅法接收KeyDialog中点击的数字。
(4)⽤setTile(x, y, value)⽅法将对应的值value绘制在xy对应的格⼦中,最后⽤calculateAllUsedTiles()⽅法重新计算所有格⼦的不可⽤
数据。
7.最后根据游戏完成的条件判断游戏是否完成。【MainActivity.java】
(1)在主类MainActivity中调⽤Kuangjia对象。
(2)根据规则完成数独游戏。
结果截图:
问题及解决办法:
(1)⽤paint中的⽅法绘制数字时,设置字体居中的⽅法很容易,但却⽆法实现⽂字在矩形框当中居中显⽰。后来⼀些Android数独开发视频观看,才学习到原来是⽤FontMetrics⽅法才能真正实现⽂字在矩形框当中居中显⽰。
(2)最后在⾃定义对话框中,也不知道如何显⽰当前单元格要提⽰输⼊的备选数字。上⽹也不到,结果询问了⼀下师兄,师。才能
实现出来。
其实也不难就是先放9个按钮上⾯分别是数字1-9,然后遍历整个九宫格分别在横向和纵向到出现过的数字,最后把对话框中出现过的数字按
钮屏蔽不显⽰,这样就得到对话框中提⽰的备选数字。
⼼得与体会:
  在该数独游戏的开发过程中遇到过不少困难,虽然解决起来不是那么容易,但是在这其中学到了很多知识,同时也提升了我对Android 程序开
发的兴趣,希望能够在这⽅⾯有更进⼀步的发展。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。