zoukankan      html  css  js  c++  java
  • 用控制台写类窗体2048小游戏

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

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

  • 相关阅读:
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark RDD(Resilient Distributed Datasets)论文
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    【机器学习实战】第10章 K-Means(K-均值)聚类算法
    [译]flexbox全揭秘
  • 原文地址:https://www.cnblogs.com/grj001/p/12223522.html
Copyright © 2011-2022 走看看