zoukankan      html  css  js  c++  java
  • 用控制台写类窗体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地址

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

  • 相关阅读:
    话题: 工人重度烧伤 厂方疑暗示“安乐死”后再赔偿
    Linux下使用mail命令发送邮件
    跨境电商优秀网站
    smarty模版使用php标签,如何获取模版变量
    弹窗效果处理和改进
    Keepalived + MySQLfailover + GTIDs 高可用
    linux的常用命令
    linux简单介绍,helloworld,vi使用,用户管理
    linux语言设置i18n(转)
    丢手帕问题
  • 原文地址:https://www.cnblogs.com/yuwen/p/4767601.html
Copyright © 2011-2022 走看看