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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM