用c++写一个2048小游戏
时间: 2023-07-01 21:12:12 浏览: 65
好的,下面是一个简单的2048小游戏的C++代码示例:
```cpp
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
const int ROWS = 4;
const int COLS = 4;
void init(int board[][COLS])
{
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
board[i][j] = 0;
}
}
}
void print(int board[][COLS])
{
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
cout << board[i][j] << "\t";
}
cout << endl;
}
cout << endl;
}
void addRandom(int board[][COLS])
{
srand(time(NULL));
int r, c;
do {
r = rand() % ROWS;
c = rand() % COLS;
} while (board[r][c] != 0);
board[r][c] = (rand() % 2 + 1) * 2;
}
bool canMove(int board[][COLS], int dir)
{
bool result = false;
switch (dir) {
case 0: // up
for (int i = 1; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
if (board[i][j] != 0 && (board[i - 1][j] == 0 || board[i - 1][j] == board[i][j])) {
result = true;
break;
}
}
}
break;
case 1: // down
for (int i = ROWS - 2; i >= 0; i--) {
for (int j = 0; j < COLS; j++) {
if (board[i][j] != 0 && (board[i + 1][j] == 0 || board[i + 1][j] == board[i][j])) {
result = true;
break;
}
}
}
break;
case 2: // left
for (int i = 0; i < ROWS; i++) {
for (int j = 1; j < COLS; j++) {
if (board[i][j] != 0 && (board[i][j - 1] == 0 || board[i][j - 1] == board[i][j])) {
result = true;
break;
}
}
}
break;
case 3: // right
for (int i = 0; i < ROWS; i++) {
for (int j = COLS - 2; j >= 0; j--) {
if (board[i][j] != 0 && (board[i][j + 1] == 0 || board[i][j + 1] == board[i][j])) {
result = true;
break;
}
}
}
break;
}
return result;
}
void move(int board[][COLS], int dir)
{
switch (dir) {
case 0: // up
for (int j = 0; j < COLS; j++) {
int i = 1;
while (i < ROWS) {
if (board[i][j] == 0) {
i++;
continue;
}
int k = i;
while (k > 0 && board[k - 1][j] == 0) {
k--;
}
if (k == i) {
i++;
continue;
}
if (board[k - 1][j] != board[i][j]) {
board[k][j] = board[i][j];
} else {
board[k - 1][j] *= 2;
board[i][j] = 0;
}
board[i][j] = 0;
i = k;
}
}
break;
case 1: // down
for (int j = 0; j < COLS; j++) {
int i = ROWS - 2;
while (i >= 0) {
if (board[i][j] == 0) {
i--;
continue;
}
int k = i;
while (k < ROWS - 1 && board[k + 1][j] == 0) {
k++;
}
if (k == i) {
i--;
continue;
}
if (board[k + 1][j] != board[i][j]) {
board[k][j] = board[i][j];
} else {
board[k + 1][j] *= 2;
board[i][j] = 0;
}
board[i][j] = 0;
i = k;
}
}
break;
case 2: // left
for (int i = 0; i < ROWS; i++) {
int j = 1;
while (j < COLS) {
if (board[i][j] == 0) {
j++;
continue;
}
int k = j;
while (k > 0 && board[i][k - 1] == 0) {
k--;
}
if (k == j) {
j++;
continue;
}
if (board[i][k - 1] != board[i][j]) {
board[i][k] = board[i][j];
} else {
board[i][k - 1] *= 2;
board[i][j] = 0;
}
board[i][j] = 0;
j = k;
}
}
break;
case 3: // right
for (int i = 0; i < ROWS; i++) {
int j = COLS - 2;
while (j >= 0) {
if (board[i][j] == 0) {
j--;
continue;
}
int k = j;
while (k < COLS - 1 && board[i][k + 1] == 0) {
k++;
}
if (k == j) {
j--;
continue;
}
if (board[i][k + 1] != board[i][j]) {
board[i][k] = board[i][j];
} else {
board[i][k + 1] *= 2;
board[i][j] = 0;
}
board[i][j] = 0;
j = k;
}
}
break;
}
}
int main()
{
int board[ROWS][COLS];
init(board);
addRandom(board);
addRandom(board);
print(board);
while (canMove(board, 0) || canMove(board, 1) || canMove(board, 2) || canMove(board, 3)) {
char ch;
cin >> ch;
switch (ch) {
case 'w':
if (canMove(board, 0)) {
move(board, 0);
addRandom(board);
print(board);
}
break;
case 's':
if (canMove(board, 1)) {
move(board, 1);
addRandom(board);
print(board);
}
break;
case 'a':
if (canMove(board, 2)) {
move(board, 2);
addRandom(board);
print(board);
}
break;
case 'd':
if (canMove(board, 3)) {
move(board, 3);
addRandom(board);
print(board);
}
break;
}
}
cout << "Game Over!" << endl;
return 0;
}
```
在这个示例中,我们使用了一个二维数组来表示2048游戏的棋盘,其中0表示空格,2、4、8、16等数字表示方块。
初始化函数`init`用来将棋盘上所有方块都设置为0,输出函数`print`用来打印当前的棋盘状态。`addRandom`函数用来随机在棋盘上的空格中添加一个新的方块。`canMove`函数用来判断当前的棋盘状态是否还能够继续移动,`move`函数用来实现方块的移动和合并。
在主函数中,我们首先初始化棋盘并随机添加两个方块,然后不断读取用户的输入,如果可以移动,就执行相应的操作,并在移动后随机添加一个新的方块。如果无法移动,就输出“Game Over!”并退出游戏。
为了控制方块的移动,我们使用了W、S、A、D四个方向键来表示上、下、左、右四个方向,当用户按下相应的方向键时,我们检查是否可以移动,如果可以,就执行移动和合并操作,然后随机添加一个新的方块并打印当前的棋盘状态。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)