原文地址:用控制檯寫類窗體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上,具體地址以下
若是你以爲看了有所收穫,請戳右邊的推薦→ →