用控制台写类窗体2048小游戏

原文地址:用控制台写类窗体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地址

如果你觉得看了有所收获,请戳右边的推荐→ →

原文地址:https://www.cnblogs.com/yuwen/p/4767601.html