C# 数独游戏(一)——构造数独矩阵

  其实一直都很想写个数独的游戏,最近刚好看了《编程之美》,得到了一些启发。

  好,这时第一节,构造数独矩阵。主要用到深度搜索算法,先往下一个格子填数字(依次填入1~9),在9*9表格的行中检验数字有没有出现过,在9*9表格的列中检验数字有没有出现过,最后在3*3的表格中检验数字是否出现过。如果最后1~9中所有的数字都不符合,则开始回溯。重复以上过程,最终我们可以得到一个数独矩阵。

核心代码:

 //得到一个数独矩阵
        public bool GenerateValidMatrix()
        {
            //初始化之后坐标为(0,0)
            Coord currentCoord = new Coord();

            while (true)
            {
                Cell currentCell = table[currentCoord.X, currentCoord.Y];

                if (!currentCell.IsProcessed)
                {
                    currentCell.validList = GetValidValueList(currentCoord);
                }

                if (currentCell.validList.Count>0)
                {
                    currentCell.PickNextValidValue();
                    if (currentCoord.X == TableSize - 1 && currentCoord.Y == TableSize - 1)
                        break;
                    else
                        currentCoord = NextCoord(currentCoord);
                }
                else
                {
                    if (currentCoord.X == 0 && currentCoord.Y == 0)
                        break;
                    else
                    {
                        currentCell.Clear();
                        currentCoord = PrevCoord(currentCoord);
                    }
                }

                //Console.WriteLine("X: " + currentCell.X.ToString() +
                //              " Y: " + currentCell.Y.ToString() +
                //              " Number: " + currentCell.Number.ToString());
            }
            return true;
        }

        private List<int> GetValidValueList(Coord coord)
        {
            List<int> nextNumberList = new List<int>();

            for (int i = 1; i <= TableSize;i++ )
            {
                if (ValidLine(i,coord.X,coord.Y) && ValidColumn(i,coord.X,coord.Y) &&
                    ValidSmallTable(i,coord.X,coord.Y))
                {
                    nextNumberList.Add(i);
                }
            }
            return nextNumberList;
        }

OK我们现在可以得到一个数独矩阵了:

但是,这只是一个可行解,只是一个,这样的话用来做游戏就没有什么趣味性了,我们应该得到一些随机的可行解。

下面提供三种思路

1、行列交换

交换黄色那部分,我们得到另外一个可行解,同理,还可以交换列(如果没算错的话,应该可以得到6*6=36种可行解,应该也够玩一阵子了)

2、旋转

  可以在上面行列交换的基础上再旋转(每次将矩阵旋转90°也可以)

3、在currentCell.PickNextValidValue();这个函数做手脚

  Cell里面储存了下次可用的数字列表,只要随机的取列表中的这些数字就可以得到一个随机的矩阵了

  

最后再随机地把表格中的数字变为0,我们就得到一个可以玩的数独矩阵了

  

行,下次再做一个界面,然后再写解数独的那部分,欲知后事如何,请听下回分解……

本文为原创博文,转载请在注明作者博客地址:http://www.cnblogs.com/-Lei/

转载于:https://www.cnblogs.com/-Lei/archive/2012/05/08/2490571.html

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值