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

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

GitHub地址

若是你以为看了有所收获,请戳右边的推荐→ →

相关文章
相关标签/搜索