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

时间: 2024-08-04 14:03:40

用控制台写类窗体2048小游戏的相关文章

JQuery实现2048小游戏

最近用Jqery写了一个2048小游戏,由于是第一次写小游戏,所以就选了一个基础的没什么难度游戏.具体实现如下: 首先在开发时将整个游戏分成两层(自认为),底层是游戏的数据结构以及对数据的操作,上层是显示出来的用户界面.底层选择使用一个4x4的二维数组,整个游戏的数据操作都围绕着这个二维数组进行. [一]游戏基础界面 1 <div id="game"> 2 <div id="header"> 3 <h1>1024</h1&g

Swift实战之2048小游戏

上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完善,就这么整理一下过程中一些值得记录的点吧. 用的Swift版本是2.0,原书中的Swift版本会低一些,所以实践起来有些地方语法并不一样. 一.开始页面   在程序的第一张页面(Main.storyboard)上,只放了一个“开始游戏”按钮,点击按钮,弹出一个提示对话框,确认后,进入游戏页面. 1

.NET手撸2048小游戏

.NET手撸2048小游戏 2048是一款益智小游戏,得益于其规则简单,又和2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎"FlysEngine,从空白窗口开始,演示如何"手撸"2048小游戏,并在编码过程中感受C#的魅力和.NET编程的快乐. 说明:FlysEngine是封装于Direct2D,重复本文示例,只需在.NET Core 3.0下安装NuGet包FlysEngine.Desktop即可. 并不一定非要做一层封装

2048小游戏-JS实现(BUG调试中)

刚刚学习JS的菜鸟,游戏没有实现滑动效果.希望有前辈能指点一下······ 定义的主要方法: 1.fuzhi()生成一对随机数,然后根据这对随机数取得一个随机单元格,先判断其是否为空,不为空,对其进行赋值为2的操作:为空,则再次调用fuzhi(). 2.secai()遍历表格,根据单元格的数值改变单元格的背景颜色. 3.score()遍历单元格,计算实时总得分. 4.keyDown()主要方法,根据用户按上下左右键来进行不同的数值相加.消除动作.这一段代码写得很冗余····· 1 <!DOCTY

2048小游戏(变态版哦)

近日,由于博主同学暑假有个作业是写个2048小游戏,我一听挺好玩的..然后就开始了.. 首先,2048在移动过程中的规则其实也没有特别难,但是感觉也不是一句话就能说完的.(不过玩的多--感觉总是有的) 废话不多说,其实博主同学提供了pdf描述了2048的算法. 各位筒子入坑前请先过几眼这个规则,以及其算法(当然我觉得算法第二点有点问题,后述) 那么在游戏的编写前,可以先对细枝末节做一些准备. 1.出现数字2/4的概率 int getRand() { int i = rand() % 10; if

结对编程2048小游戏

作业要求: 自选题目(不少于500行代码),进行结对编程 轮流担任领航员和驾驶员 记录结对编程的过程,写成结对博客 1.结对题目,写清需求 2.上传代码(截图),两人合作的合影 3.约定的规范 4.记录时间 5.心得和体会 Deadline 9月18日 23:59:59 小组成员 019任帅昌 020禹继跃 1.结对题目:2048小游戏 需求分析:在人们学习工作之余,小游戏成为了人们打发时间做的必不可少的事情了,而2048这款小游戏它不仅能在你工作学习疲惫之后使你身心放松,还能益智 2.游戏代码

【2048小游戏】——原生js爬坑之遍历算法显示二维数组内容

引言:做2048小游戏会将横纵方向的数字内容,存储在一个二维数组中,要将这个二维数组中的内容显示在页面上,就一定要用遍历算法来实现了. 一.二维数组存储    首先考虑用二维数组存储所有行数,列数  →  var  RN=4,CN=4; 然后再定义一个变量data 来保存这个二维数组  →  var  data; 游戏的所有主要执行程序都保存在start()函数下 → 启动游戏 保存存有行数,列数的二维数组到data中    关键代码 ↓ function start(){ data=[]; /

js、jQuery实现2048小游戏

一.游戏简介:  2048是一款休闲益智类的数字叠加小游戏 二. 游戏玩法: 在4*4的16宫格中,您可以选择上.下.左.右四个方向进行操作,数字会按方向移动,相邻的两个数字相同就会合并,组成更大的数字,每次移动或合并后会增加一个数字. 当16宫格中没有空格子,且四个方向都无法操作时,游戏结束. 三. 游戏目的: 目的是合并出2048这个数字,获得更高的分数. 四. 游戏截图:  五.先来玩一下: 开始游戏 查看源码 六.游戏实现原理: 使用js.jQuery实现了PC版及手机版,实现原理是一样

Qt 制作2048小游戏

相信大家都玩过2048把,下面是我用qt写得2048小游戏. 2048.pro HEADERS += Widget.h SOURCES += Widget.cpp main.cpp QT += widgets gui RESOURCES += ico.qrc RC_ICONS = 2048.ico widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QKeyEvent> #include &