前言

  之前做过一个JavaScript版本的2048游戏,最近在学习C++,昨天晚上突然心血来潮,想用C++来实现,因为核心算法已十分理解,所以两个小时撸出来一个C++的简易版本。


简介

  二维数组遍历,C++基本数据类型,string类,控制结构,函数。

  本方法不涉及指针以及面向对象思想,所以可作为刚入门C++的新人的第一个小project。


效果图


实现思路

1.背景

  游戏的背景即一个4*4的二维数组,通过每次运动中二维数组中值的变化以及数字的位置的变化,完成该游戏。

2.随机数字及位置

  游戏的开始阶段需要随机出两个数字,之后每次移动都需要在空白处随机出一个新的数字(2 / 4)。


    //随机一个位置
int randX = rand()%4;
int randY = rand()%4;
int times = 0;
while (times < 50)
{
if (0 == board[randX][randY])
break;
randX = rand()%4;
randY = rand()%4;
times++;
}
if (50 == times)
{
for (int i=0; i<4; i++)
for (int j=0; j<4; j++)
if (0 == board[i][j])
{
randX = i;
randY = j;
}
}

  首先随机得到一个空白处(即二维数组等于0),在算法方面做了优化,先由系统随意选择50次,若没能找到空白处,则手动找到一个位置,可一定程度地加快位置随机的速度。


    //随机一个数字
int randomNumber = rand()%100*0.01 < 0.5 ? 2 : 4;

  在0~1之间任意取值,如果小于0.5即随机得到2,反之随机得到4,保证出现2和4的可能性相同。

3.运动算法

  四个方向上的运动大致相同,只不过在临界处有细微区别,下面以向左移动进行解释。


//判断水平路径上是否有障碍物
bool noBlock1(int row, int col1, int col2, int board[][4])
{
for (int i=col1+1; i<col2; i++)
if (0 != board[row][i])
return false; return true;
}

  对每个物体进行判断,在第row排,从col1到col2的范围内是否有障碍物。


//判断能否向左移动
bool canMoveLeft(int board[][4])
{
for (int i=0; i<4; i++)
for (int j=1; j<4; j++)
if (0 != board[i][j])
if (0 == board[i][j-1] || board[i][j-1] == board[i][j])
return true; return false;
}

  按下←时,判断整个画布是否可以向左移动。


//左移函数
bool moveLeft()
{
if (!canMoveLeft(board))
return false;
//moveLeft
//落脚位置是否为空
//落脚位置数字是否相等
//移动路径中是否有障碍物
for (int i=0; i<4; i++)
for (int j=0; j<4; j++)
if (0 != board[i][j])
for (int k=0; k<j; k++)
if (0 == board[i][k] && noBlock1(i, k, j, board))
{
//move
board[i][k] = board[i][j];
board[i][j] = 0;
continue;
}
else if (board[i][k] == board[i][j] && noBlock1(i, k, j, board))
{
//move and add
board[i][k] *= 2;
board[i][j] = 0;
continue;
} initial();
}

  由以上两种判断为基础,构建左移核心算法。


完整代码

  https://github.com/henuzyx/Cplusplus2048


  C++版本意在复习基本游戏算法,熟悉C++语法,并没有在细节方面考虑,比如没有添加游戏结束的判定等。

  不过,我的JavaScript版本功能完善,包括游戏结束显示,动画效果,记录当前步数,记录当前分数,保存最高分,撤销回上一步。

  希望可以交流讨论。

  JavaScript版本github链接:

  https://github.com/henuzyx/2048-by-JavaScript

C++实现控制台版2048的更多相关文章

  1. c#撸的控制台版2048小游戏

    1.分析 最近心血来潮,突然想写一个2048小游戏.于是搜索了一个在线2048玩玩,熟悉熟悉规则. 只谈核心规则:(以左移为例) 1.1合并 以行为单位,忽略0位,每列依次向左进行合并,且每列只能合并 ...

  2. 2048 控制台版(C#)

    开篇 2048游戏现在很火啊,很多人应该已经玩过了.在博客园上也看见有人模仿做的GDI+版 2048游戏,鄙人暂且不做那么多动画的东西,毕竟是个小东东,在此奉上一个<控制台版2048>. ...

  3. Linux控制台版本号2048

    在Github上看到一个荷兰人写的linux控制台版的2048,用的C语言.感觉非常有意思. 原网址在这里. 读了一下他的源代码,感觉写的不错.就厚着脸皮加了一些中文凝视,源代码例如以下: /* == ...

  4. jQuery实践-网页版2048小游戏

    ▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...

  5. 从零開始开发Android版2048 (一)初始化界面

    自学Android一个月多了,一直在工作之余零零散散地看一些东西.感觉经常使用的东西都有些了解了,可是一開始写代码总会出各种奇葩的问题.感觉还是代码写得太少.这样继续杂乱地学习下去进度也太慢了,并且学 ...

  6. 一个用 C 语言写的迷你版 2048 游戏,仅仅有 500个字符

    Jay Chan 用 C 语言写的一个迷你版 2048 游戏,仅仅有 487 个字符. 来围观吧 M[16],X=16,W,k;main(){T(system("stty cbreak&qu ...

  7. c/c++ 贪吃蛇控制台版

    贪吃蛇控制台版(操作系统win7 64位:编译环境gcc, vs2017通过,其它环境未测试 不保证一定通过) 运行效果: #include <iomanip> #include < ...

  8. 微信小程序版2048

    最近流行微信"跳一跳"小游戏,我也心血来潮写了一个微信小程序版2048,本篇文章主要分享实现2048的算法以及注意的点,一起来学习吧!(源码地址见文章末尾)   算法 1.生成4* ...

  9. 基于TCP协议的聊天室控制台版

    我之前写过一篇博客,主要是基于TCP协议实现的聊天室swing版,在此再写一个基于TCP协议实现的聊天室控制台版,便于学习和比较. package 聊天室console版.utils; import ...

随机推荐

  1. python多版本以及各种包管理

    python多版本以及各种包管理 python 包管理 各个版本 python版本管理 由于Python有2.x和3.x两个大的版本,而且每一个工程建立所用的各种包的版本也不尽相同(如flask1.x ...

  2. 端到端测试工具--testcafe

    写在前面 随着业务的增加,复杂性的增加,我们更需要保证页面不能出错,之前需要每次上线之前需要每次人工测试,如果有好多改动,为保证业务不出错,需要耗费更多的时间来测试,所以我们需要写一些测试来保证业务的 ...

  3. R语言-时间序列

    时间序列:可以用来预测未来的参数, 1.生成时间序列对象 sales <- c(18, 33, 41, 7, 34, 35, 24, 25, 24, 21, 25, 20, 22, 31, 40 ...

  4. Raft论文学习笔记

    先附上论文链接  https://pdos.csail.mit.edu/6.824/papers/raft-extended.pdf 最近在自学MIT的6.824分布式课程,找到两个比较好的githu ...

  5. linux链接

    ( 1 )软连接可以跨文件系统,硬连接不可以 ( 2 )硬连接不管有多少个,都指向的是同一个 I 节点,会把结点连接数增加,只要结点的连接数不是 0 ,文件就一直存在不管你删除的是源文件还是连接的文件 ...

  6. H3C虚拟化之IRF

    SA system-view irf domain 10 irf member 1 ren 1 y int ten 1/0/50 shu qu irf-port 1/1 port group int ...

  7. 新手福音︱正则表达式小工具RegExr

    由于之前在做NLP的内容,势必会接触正则表达式,但是呢,又觉得这个学不明白- 于是,这个工具还是蛮不错的,相当于在线正则速查+验证小工具,对于我这样的新手值得去玩玩. github:https://g ...

  8. mongodb去除重复的数据

    里边的内容在某些情况下不可行,可以参考下一篇. 今天出现了一个新的需求,有个部门需要拿到mongodb中的数据,要求去掉其中一个字段内容相同的数据. 虽然mongodb中有distinct来去重,但是 ...

  9. 在DirectShow的视频图像上叠加线条和文字

    在DirectShow的视频图像上叠加线条和文字 最近一直在从事工业测量方面的开发工作,难免会用到各种各样的相机,其中支持DX的USB相机开发起来比较方便,由于工作需要经常要在视频图像上叠加线条和文字 ...

  10. Anaroid WebView API详解

    android提供了webView控件专门用来浏览网页 使用WebView时,在程序中装载WebView控件,可以把WebView写到布局中,也可以动态New出WebView实例,可以设置属性,比如: ...