原文地址:用控制台写类窗体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上,具体地址以下
若是你以为看了有所收获,请戳右边的推荐→ →