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