天天看點

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

項目代碼可以從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。

下一步我們增加儲存狀态的功能。

本文來自部落格園,作者:尋找無名的特質,轉載請注明原文連結:https://www.cnblogs.com/zhenl/p/15848219.html