一.实验题目
数独 APP
二.实验内容(请详细描述你是如何设计和实现的)
首先是数独生成的部分,是这游戏的内核,要生成一个数独棋盘,首先生成一个全棋盘,然后挖掉其中某些数字就形成了数独。而生成全棋盘(所有数字都生成)这里利用的是时回溯法。
1.先往棋盘中随机放 9 个数字(位置随机,数字随机)但是必须满足数独的规则。
2.然后从第一个格子开始填数字,判断是否是随机的那九个数字,如果不是就随机放一个数字,如果这个数字不满足就重新随机一个数字,但是保证不要和上一个数字重复不然就浪费了时间了。如果在这个格子所有数字都尝试过了都不满足就回溯到上一格修改数字。
2.然后从第一格子开始填数字每填一个都是随机的但是这个格子 1-9 都填了后都不满足数独的规则的话,那么就回溯到上一个重新取值。
isContradict()是判断是否满足数独规则的。
setArrayInfo()是判断是否可以添加这个数字,比如是否已经填过了 9 个数字,是否需要回溯等。
接下来则是挖洞,挖洞后要验证数独的唯一性,不然挖的不好就有多个解了。需要挖去的格子的 flag 置为 true。
back 供用户不确定的数据放进去 (候选数字) userNum 是用户确定的数据 systemNum 是系统生成的数据 flag 是否是抹去的数字 true 是抹去的。false 是没有抹去的每个格子系统都会在生成棋盘的时候生成一个数字这个数字就放在 systemNum 中。
挖去的格子就是让用户输入的使用 flag 判断是否挖去。
挖去的格子会让用户输入,有候选数字 back ,和用户确定的数字用 userNum。
最后判断是否成功就是用 userNum 来判断用户是否完成游戏。
三.实验的结果展示
四.实验心得体会
写数独游戏得时候大部分时间都在捋逻辑,再加上网上的代码都是许久之前了的,调用的包和方法和方法都和现在有了一定的差距,就这样一边改 bug,一边捋逻辑重写复现大佬的代码,期间还出现了些奇奇怪怪的报错,任我怎么修改也运行不起来,但当我删了大部分注释之后,又莫名的可以运行了。第一次跑成功的时候,内心也是十分的激动,虽然数独游戏的代码不是我一行行独立敲出来的,但在我移植重写大佬的代码时,也用了自己的理解去改写了相当一部分的代码,而且由于时间久远的原因,debug 也让我感觉不比自己重新写一份简单多少。