c++实现2048小游戏
时间: 2023-08-27 10:07:00 浏览: 169
基于C++和QT开发实现的2048小游戏.zip
5星 · 资源好评率100%
好的,下面是一个简单的C++实现2048小游戏的示例代码:
```c++
#include <iostream>
#include <ctime>
#include <conio.h>
#include <Windows.h>
using namespace std;
const int ROW = 4, COL = 4; // 定义方格行数和列数
int game[ROW][COL]; // 存储游戏数据的二维数组
// 游戏初始化函数
void initGame()
{
// 初始化游戏数据,将所有元素置为0
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
game[i][j] = 0;
}
}
// 随机生成两个初始值为2的方块
srand(time(NULL)); // 随机数种子
int count = 0;
while (count < 2)
{
int x = rand() % ROW;
int y = rand() % COL;
if (game[x][y] == 0)
{
game[x][y] = 2;
count++;
}
}
}
// 显示游戏界面函数
void showGame()
{
system("cls"); // 清屏
// 显示游戏界面
cout << "-----------------------------" << endl;
for (int i = 0; i < ROW; i++)
{
cout << "|";
for (int j = 0; j < COL; j++)
{
if (game[i][j] == 0)
{
cout << " |";
}
else
{
cout << " " << game[i][j] << " |";
}
}
cout << endl;
cout << "-----------------------------" << endl;
}
}
// 判断游戏是否结束函数
bool isGameOver()
{
// 判断是否还有空位
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if (game[i][j] == 0)
{
return false;
}
}
}
// 判断相邻的方块是否相等
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL - 1; j++)
{
if (game[i][j] == game[i][j + 1])
{
return false;
}
}
}
for (int i = 0; i < ROW - 1; i++)
{
for (int j = 0; j < COL; j++)
{
if (game[i][j] == game[i + 1][j])
{
return false;
}
}
}
return true;
}
// 向左移动函数
void moveLeft()
{
for (int i = 0; i < ROW; i++)
{
// 先将非零元素移到左边
int k = 0;
for (int j = 0; j < COL; j++)
{
if (game[i][j] != 0)
{
game[i][k++] = game[i][j];
}
}
// 将左边空白处置为0
for (; k < COL; k++)
{
game[i][k] = 0;
}
// 合并相邻的相同元素
for (int j = 0; j < COL - 1; j++)
{
if (game[i][j] == game[i][j + 1])
{
game[i][j] *= 2;
game[i][j + 1] = 0;
}
}
// 再次移动非零元素
k = 0;
for (int j = 0; j < COL; j++)
{
if (game[i][j] != 0)
{
game[i][k++] = game[i][j];
}
}
// 将左边空白处置为0
for (; k < COL; k++)
{
game[i][k] = 0;
}
}
}
// 向右移动函数
void moveRight()
{
for (int i = 0; i < ROW; i++)
{
// 先将非零元素移到右边
int k = COL - 1;
for (int j = COL - 1; j >= 0; j--)
{
if (game[i][j] != 0)
{
game[i][k--] = game[i][j];
}
}
// 将右边空白处置为0
for (; k >= 0; k--)
{
game[i][k] = 0;
}
// 合并相邻的相同元素
for (int j = COL - 1; j > 0; j--)
{
if (game[i][j] == game[i][j - 1])
{
game[i][j] *= 2;
game[i][j - 1] = 0;
}
}
// 再次移动非零元素
k = COL - 1;
for (int j = COL - 1; j >= 0; j--)
{
if (game[i][j] != 0)
{
game[i][k--] = game[i][j];
}
}
// 将右边空白处置为0
for (; k >= 0; k--)
{
game[i][k] = 0;
}
}
}
// 向上移动函数
void moveUp()
{
for (int j = 0; j < COL; j++)
{
// 先将非零元素移到上面
int k = 0;
for (int i = 0; i < ROW; i++)
{
if (game[i][j] != 0)
{
game[k++][j] = game[i][j];
}
}
// 将上面空白处置为0
for (; k < ROW; k++)
{
game[k][j] = 0;
}
// 合并相邻的相同元素
for (int i = 0; i < ROW - 1; i++)
{
if (game[i][j] == game[i + 1][j])
{
game[i][j] *= 2;
game[i + 1][j] = 0;
}
}
// 再次移动非零元素
k = 0;
for (int i = 0; i < ROW; i++)
{
if (game[i][j] != 0)
{
game[k++][j] = game[i][j];
}
}
// 将上面空白处置为0
for (; k < ROW; k++)
{
game[k][j] = 0;
}
}
}
// 向下移动函数
void moveDown()
{
for (int j = 0; j < COL; j++)
{
// 先将非零元素移到下面
int k = ROW - 1;
for (int i = ROW - 1; i >= 0; i--)
{
if (game[i][j] != 0)
{
game[k--][j] = game[i][j];
}
}
// 将下面空白处置为0
for (; k >= 0; k--)
{
game[k][j] = 0;
}
// 合并相邻的相同元素
for (int i = ROW - 1; i > 0; i--)
{
if (game[i][j] == game[i - 1][j])
{
game[i][j] *= 2;
game[i - 1][j] = 0;
}
}
// 再次移动非零元素
k = ROW - 1;
for (int i = ROW - 1; i >= 0; i--)
{
if (game[i][j] != 0)
{
game[k--][j] = game[i][j];
}
}
// 将下面空白处置为0
for (; k >= 0; k--)
{
game[k][j] = 0;
}
}
}
int main()
{
initGame(); // 初始化游戏
showGame(); // 显示游戏界面
while (!isGameOver())
{
char ch = getch(); // 获取键盘输入
switch (ch)
{
case 'a':
moveLeft();
break;
case 'd':
moveRight();
break;
case 'w':
moveUp();
break;
case 's':
moveDown();
break;
}
// 随机生成一个新的方块
int x, y;
do
{
x = rand() % ROW;
y = rand() % COL;
} while (game[x][y] != 0);
game[x][y] = 2;
showGame(); // 显示游戏界面
}
cout << "Game Over!" << endl;
return 0;
}
```
该示例代码使用了Windows API中的`system()`函数和`getch()`函数,因此只能在Windows环境下编译运行。如果需要在其他环境下运行,需要使用相应的替代函数。
阅读全文