使用Xamarin開發移動應用示例——數獨遊戲(四)產生新遊戲演算法改進

尋找無名的特質發表於2022-01-27

專案程式碼可以從Github下載:https://github.com/zhenl/ZL.Shudu 。程式碼隨專案進度更新。

前面我們使用一個陣列儲存預製的遊戲,然後隨機從中抽取一個遊戲作為新遊戲,如果我們陣列中有10個遊戲,那麼很快就會遇到重複的遊戲,有沒有辦法在現有的基礎上生成更多的遊戲呢?我們看一下下面兩個遊戲:

使用Xamarin開發移動應用示例——數獨遊戲(四)產生新遊戲演算法改進 使用Xamarin開發移動應用示例——數獨遊戲(四)產生新遊戲演算法改進

看上去是不同的遊戲,但仔細分析一下就會發現如果從計算機角度看,其實是相同的遊戲。如果我們仔細分析一下,就會發現,在數獨遊戲中1-9的數字都是獨立的符號,沒有數學中數字的意義,如果將這些數字換成A-H的字母,同樣可以按照相同的規則進行遊戲,或者換成九種水果、動物什麼的,都可以。那麼如果我們有九種局面,通過替換各種局面中的數字,就可以得到更多的遊戲局面,對人類玩家是不太容易分辨出不同的。我們在現有演算法的基礎上進行改進,再取一個0到9的隨機數,將這個數加到現有局面的每個數字上,如果所得大於9,就減去9,這樣就可以根據每個局面,產生9個不同的遊戲。修改後的程式碼如下:

     private async Task SetNewGame()
        {
            int k,m;
            var lst = chesses;
            var leng = lst.GetLength(0);
            
            if (ra == null)
            {
                ra = new Random();
            }

            k = ra.Next(0, leng);
            m = ra.Next(0, 9);
            var sudoku = lst[k].Sudoku;
            var mychess = new int[9, 9];
            for (var i = 0; i < 9; i++)
                for (var j = 0; j < 9; j++)
                {
                    mychess[i, j] = int.Parse(sudoku.Substring(i * 9 + j, 1)) > 0 ? int.Parse(sudoku.Substring(i * 9 + j, 1)) + m : 0;
                    if (mychess[i, j] > 9) mychess[i, j] = mychess[i, j] - 9;
                }

            SetGame(mychess);
        }

上面演算法中k是從現有列表中隨機選擇一組資料,m是生成0到9的隨機數,在現有的數字上加上m,如果大於9,就減去9。
下一步我們增加儲存狀態的功能。

相關文章