前言
之前做过一个 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://files.cnblogs.com/files/henuzyx/2048.zip
C++ 版本意在复习基本游戏算法, 熟悉 C++ 语法, 并没有在细节方面考虑, 比如没有添加游戏结束的判定等
不过, 我的 JavaScript 版本功能完善, 包括游戏结束显示, 动画效果, 记录当前步数, 记录当前分数, 保存最高分, 撤销回上一步
希望可以交流讨论
JavaScript 版本 github 链接:
https://github.com/henuzyx/2048-by-JavaScript
来源: https://www.cnblogs.com/henuzyx/p/8586526.html