標籤:
原文地址:用控制台寫類表單2048小遊戲餘文
2048是一個很簡單的小遊戲,這是我自己實現的一個版本。
這個版本有兩個特色
- 這是一個高仿表單程式的控制台程式。
- 通過使用指標將四個方向的移動簡化成了一個方向的移動。
當初剛出來2048小遊戲的時候,玩的不亦樂乎。之後根據遊戲規則自己花了一下午時間用控制台寫了一個玩,沒有參考源碼。
當時只實現了遊戲的移動邏輯和勝負判定邏輯,介面很簡單,但已經可以玩玩了。
這是當初剛寫完發空間說說得瑟的時候。
今年5月有段時候比較閑,對程式做了較大更新。
- 即時顯示當前得分
- 將原來行列的依次移動變為多線程並行移動,通過鎖機制保證分數不會多加。
- 模仿原介面的方塊輸出
- 背景顏色和前景顏色隨數字變化
- 遊戲結束後以螺旋樣式清理介面
如下,更新後的小遊戲雖然還是控制台程式,但已經很像是一個表單程式了。
這個程式本質只是對一個長寬為4的二維數組進行操作,並不很難。
public static readonly int[,] _cells = new int[4, 4];
自己覺得比較有意思的是關於移動的,所以特意拉出來單獨說一下。
因為四個方向的移動,本質都是一樣的,只是方向不同。如果為四個方向各寫一套方法,沒有必要,也很繁瑣。所以想將四個方向的移動轉化為一個方向的移動。
為實現這個目的,定義了四套指標
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地址
用控制台寫類表單2048小遊戲