个人主页:PingdiGuo_guo
收录专栏:C++干货专栏
大家好呀,我是PingdiGuo_guo,今天我们来学习如何用C++编写一个2048小游戏。
文章目录
[2.1: 初始化游戏界面](#2.1: 初始化游戏界面)
[2.1.2: 创建游戏界面](#2.1.2: 创建游戏界面)
[2.2: 随机生成数字](#2.2: 随机生成数字)
[2.2.2: 随机生成两个数字](#2.2.2: 随机生成两个数字)
[2.3: 处理用户输入](#2.3: 处理用户输入)
[2.3.2: 处理用户输入](#2.3.2: 处理用户输入)
[2.4: 更新游戏界面](#2.4: 更新游戏界面)
[2.4.2: 合并相同数字](#2.4.2: 合并相同数字)
[2.4.3: 移动数字](#2.4.3: 移动数字)
[2.5: 判断游戏结束](#2.5: 判断游戏结束)
[2.5.2: 判断是否达到2048](#2.5.2: 判断是否达到2048)
[2.5.3: 判断是否无法移动](#2.5.3: 判断是否无法移动)
1.2048的规则
在进行编写游戏时,我们首先要知道2048游戏的规则:
开始时,游戏棋盘内会随机出现两个数字,这两个数字通常是2或4。
玩家可以通过滑动屏幕来控制棋盘上的数字方块,每次滑动都会使数字方块向滑动的方向移动,直到遇到障碍物(如其他数字方块或棋盘边缘)。
当两个相同数字的方块相遇时,它们会合并成一个新的方块,这个新方块的大小是原来两个方块大小的和。
游戏的目标是合并数字方块,直到得到"2048"这个数字,一旦棋盘被数字填满,且相邻的格子数字不同,游戏就结束了。
在游戏过程中,系统会在空白的方格处随机生成新的数字方块,这些新方块的大小可能是2或4。
因此,我们可以退出一下几个步骤:
1.初始化游戏界面
2.随机生成数字(只能是2或4)
3.处理用户输入(W,A,S,D键)
4.更新游戏界面
5.判断游戏结束(达到2048或无法移动)
2.步骤实现
2.1: 初始化游戏界面
我们首先需要创建一个游戏界面,使用一个二维数组来表示。每个元素代表一个格子,初始值为0。
2.1.1知识点
- 数组的定义和初始化
2.1.2: 创建游戏界面
首先,我们需要定义一个4x4的二维数组gameBoard,用来表示游戏界面。然后,将所有元素的值初始化为0。
cpp
int gameBoard[4][4] = {0};
2.2: 随机生成数字
游戏开始时,我们需要在游戏界面的两个格子中随机生成两个数字,可以是2或4。
2.2.1知识点:
- 伪随机数的生成
2.2.2: 随机生成两个数字
使用rand()函数来生成伪随机数,并使用取模运算将其限定在特定范围内。然后,将生成的数字放入游戏界面的随机位置。
cpp
#include <cstdlib>
#include <ctime>
void generateRandomNumbers() {
int x1 = rand() % 4;
int y1 = rand() % 4;
int x2 = rand() % 4;
int y2 = rand() % 4;
int num1 = (rand() % 2 + 1) * 2;
int num2 = (rand() % 2 + 1) * 2;
gameBoard[x1][y1] = num1;
gameBoard[x2][y2] = num2;
}
2.3: 处理用户输入
捕捉用户的输入,根据用户的操作来移动格子。
2.3.1知识点
- 标准输入的处理
2.3.2: 处理用户输入
使用getchar()函数来获取用户的键盘输入,并根据输入来移动或操作格子。
cpp
void processUserInput() {
char userInput = getchar();
switch (userInput) {
case 'w':
// 处理上键操作
break;
case 's':
// 处理下键操作
break;
case 'a':
// 处理左键操作
break;
case 'd':
// 处理右键操作
break;
default:
break;
}
}
2.4: 更新游戏界面
将数字向指定方向移动,并填充空白格子。
2.4.1知识点
- 循环结构的使用
2.4.2: 合并相同数字
当用户移动格子时,如果相邻的两个格子的数字相同,我们需要将它们合并为一个,并将结果放入新的位置。
2.4.3: 移动数字
将所有数字向用户指定的方向移动,并填充空白格子。
cpp
bool moveUp(int board[SIZE][SIZE]) {
bool moved = false;
for (int j = 0; j < SIZE; j++) {
for (int i = 1; i < SIZE; i++) {
if (board[i][j] != 0) {
int k = i;
while (k > 0 && board[k-1][j] == 0) {
board[k-1][j] = board[k][j];
board[k][j] = 0;
k--;
moved = true;
}
if (k > 0 && board[k-1][j] == board[k][j]) {
board[k-1][j] *= 2;
board[k][j] = 0;
moved = true;
}
}
}
}
return moved;
}
bool moveDown(int board[SIZE][SIZE]) {
bool moved = false;
for (int j = 0; j < SIZE; j++) {
for (int i = SIZE - 2; i >= 0; i--) {
if (board[i][j] != 0) {
int k = i;
while (k < SIZE - 1 && board[k+1][j] == 0) {
board[k+1][j] = board[k][j];
board[k][j] = 0;
k++;
moved = true;
}
if (k < SIZE - 1 && board[k+1][j] == board[k][j]) {
board[k+1][j] *= 2;
board[k][j] = 0;
moved = true;
}
}
}
}
return moved;
}
bool moveLeft(int board[SIZE][SIZE]) {
bool moved = false;
for (int i = 0; i < SIZE; i++) {
for (int j = 1; j < SIZE; j++) {
if (board[i][j] != 0) {
int k = j;
while (k > 0 && board[i][k-1] == 0) {
board[i][k-1] = board[i][k];
board[i][k] = 0;
k--;
moved = true;
}
if (k > 0 && board[i][k-1] == board[i][k]) {
board[i][k-1] *= 2;
board[i][k] = 0;
moved = true;
}
}
}
}
return moved;
}
bool moveRight(int board[SIZE][SIZE]) {
bool moved = false;
for (int i = 0; i < SIZE; i++) {
for (int j = SIZE - 2; j >= 0; j--) {
if (board[i][j] != 0) {
int k = j;
while (k < SIZE - 1 && board[i][k+1] == 0) {
board[i][k+1] = board[i][k];
board[i][k] = 0;
k++;
moved = true;
}
if (k < SIZE - 1 && board[i][k+1] == board[i][k]) {
board[i][k+1] *= 2;
board[i][k] = 0;
moved = true;
}
}
}
}
return moved;
}
2.5: 判断游戏结束
判断游戏是否结束,可以是达到2048或者无法移动。
2.5.1知识点
- 条件语句的使用
2.5.2: 判断是否达到2048
判断游戏界面是否达到了2048,如果达到则游戏获胜。
2.5.3: 判断是否无法移动
判断游戏界面是否已经无法进行任何移动,即所有格子已满且相邻格子的值都不相同,如果是则游戏失败。
cpp
bool isGameWon() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (gameBoard[i][j] == 2048) {
return true;
}
}
}
return false;
}
bool isGameOver() {
bool canMove = false;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (gameBoard[i][j] == 0) {
canMove = true;
break;
}
if (i < 3 && gameBoard[i][j] == gameBoard[i + 1][j]) {
canMove = true;
break;
}
if (j < 3 && gameBoard[i][j] == gameBoard[i][j + 1]) {
canMove = true;
break;
}
}
}
return !canMove;
}
通过以上步骤及代码,我们实现了2048这个小游戏,以下是运行代码时显示的:
3.总结
本篇博客教大家如何实现一个2048小游戏,希望大家有所收获,如果有好的建议欢迎留言,谢谢大家啦!