Swift版数独小游戏总结

最近在玩数独游戏,觉得很有意思,正好在温习Swift,就试着写个数独练练手。介绍下经典数独游戏和我实现数独的方法。

经典数独游戏

经典数独游戏共有81格,分为9个小九宫格。每行、每列、每个小九宫格内为1~9的无重复数字。

数独盘面生成方案

  1. 将1~9内的随机数按满足数独的条件(行、列、小九宫格均无重复数字)填充盘面数组(二维数组)
  2. 随机交换任意小九宫格内的两行或两列(demo中有三次行交换、三次列交换)

挖坑方案

  1. 按照不同level,确定每个level的挖坑数量
  2. 循环生成两个0~8(index)内的随机数,将盘面数组中索引符合这两个随机数的位置替换为0

盘面UI实现

  1. 用UICollectionView生成81格,并将二维数组按顺序填充进去,值为0的位置默认隐藏数字
  2. 用户填充数字后,检查行、列、小九宫格是否有重复,有重复则报错(红色标记)

数独正解方案

检查输入的解正确与否的标准不是比较输入得到的矩阵与我们开始产生的初试矩阵是否相同,而是判断用户的矩阵是否满足数独的游戏规则。这是因为一个初始矩阵被挖掉一些空格后,可能会有不止一种正确解。

demo中的其他细节

  1. 针对不同level,做了倒计时挑战
  2. 在一个AlertController调起时,如果一个AlertAction的动作是调起另一个AlertController,会持续报警告并且不能正常调起,demo中模拟系统的AlertController的功能实现了一个自定义的AlertView,需要手动调用dismiss。
  3. “重来”功能相当于复盘

demo地址

https://github.com/zhengry/ZZSudoku