用控制檯寫類窗體2048小遊戲

原文地址:用控制檯寫類窗體2048小遊戲做者:余文html

2048是一個很簡單的小遊戲,這是我本身實現的一個版本。git

這個版本有兩個特點github

  • 這是一個高仿窗體程序的控制檯程序。
  • 經過使用指針將四個方向的移動簡化成了一個方向的移動。

當初剛出來2048小遊戲的時候,玩的不亦樂乎。以後根據遊戲規則本身花了一下午時間用控制檯寫了一個玩,沒有參考源碼。數組

當時只實現了遊戲的移動邏輯和勝負斷定邏輯,界面很簡單,但已經能夠玩玩了。多線程

這是當初剛寫完發空間說說得瑟的時候。spa

 

今年5月有段時候比較閒,對程序作了較大更新。線程

  • 實時顯示當前得分
  • 將原來行列的依次移動變爲多線程並行移動,經過鎖機制保證分數不會多加。
  • 模仿原界面的方塊輸出
  • 背景顏色和前景顏色隨數字變化
  • 遊戲結束後以螺旋樣式清理界面

以下,更新後的小遊戲雖然仍是控制檯程序,但已經很像是一個窗體程序了。3d

這個程序本質只是對一個長寬爲4的二維數組進行操做,並不很難。指針

public static readonly int[,] _cells = new int[4, 4];

本身以爲比較有意思的是關於移動的,因此特地拉出來單獨說一下。code

由於四個方向的移動,本質都是同樣的,只是方向不一樣。若是爲四個方向各寫一套方法,沒有必要,也很繁瑣。因此想將四個方向的移動轉化爲一個方向的移動。

爲實現這個目的,定義了四套指針

private static Dictionary<DirectionEnum, int*[,]> _directionDic = new Dictionary<DirectionEnum, int*[,]>()
{
    {DirectionEnum.Up, new int*[4, 4]},
    {DirectionEnum.Down, new int*[4, 4]},
    {DirectionEnum.Left, new int*[4, 4]},
    {DirectionEnum.Right, new int*[4, 4]}
};

每套指針分別指向數組旋轉0度,90度,180度,270度的位置。

 

static MatrixHelper()
{
    for (var i = 0; i < 4; i++)
    {
        for (var j = 0; j < 4; j++)
        {
            fixed (int* intPoint = &Matrix._cells[i, j])
            {
                _directionDic[DirectionEnum.Up][i, j] = intPoint;
                _directionDic[DirectionEnum.Down][i, 3 - j] = intPoint;
                _directionDic[DirectionEnum.Left][j, i] = intPoint;
                _directionDic[DirectionEnum.Right][3 - j, 3 - i] = intPoint;
            }
        }
    }
}

 

以後的各個方向的移動只須要轉化爲對應指針向上的移動便可。由於各個指針指向的實際是旋轉後的方向,實際中指針向上移動天然會分別變成實際數組的向左,向右,向上,向下移動。

public static bool Move(DirectionEnum directionEnum)
{
    return MoveUp(_directionDic[directionEnum]);
}

MoveUp方法比較長,就不貼出來了。

另外一個比較特點的就是將控制檯程序作成了窗體的形式。但這個雖然繁瑣,但沒什麼複雜的,只是繁瑣而已。比較麻煩的突破控制檯程序默認16種顏色的辦法,是從網上找來的,在ColorSetter這個文件中。感興趣的找來看看。其餘的就徹底是本身實現了。

 程序已經上傳到GitHub上,具體地址以下

GitHub地址

若是你以爲看了有所收穫,請戳右邊的推薦→ →

相關文章
相關標籤/搜索