c语言2048游戏代码
时间: 2023-08-06 21:05:50 浏览: 47
以下是一个简单的C语言2048游戏代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 定义游戏面板大小
#define BOARD_SIZE 4
// 定义游戏状态
typedef enum {
GAME_NOT_OVER = 0,
GAME_WIN,
GAME_LOSE
} GAME_STATE;
// 初始化游戏面板
void init_board(int board[][BOARD_SIZE]) {
int i, j;
for (i = 0; i < BOARD_SIZE; i++) {
for (j = 0; j < BOARD_SIZE; j++) {
board[i][j] = 0;
}
}
}
// 在空格位置随机生成一个数字
void generate_number(int board[][BOARD_SIZE]) {
int i, j, num;
int empty_count = 0;
int empty_index[BOARD_SIZE*BOARD_SIZE][2];
// 统计空格数量和位置
for (i = 0; i < BOARD_SIZE; i++) {
for (j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == 0) {
empty_index[empty_count][0] = i;
empty_index[empty_count][1] = j;
empty_count++;
}
}
}
// 随机在空格位置生成数字
if (empty_count > 0) {
num = (rand() % 2 + 1) * 2;
i = empty_index[rand() % empty_count][0];
j = empty_index[rand() % empty_count][1];
board[i][j] = num;
}
}
// 判断游戏是否结束
GAME_STATE check_game_state(int board[][BOARD_SIZE]) {
int i, j;
int empty_count = 0;
// 判断是否有空格
for (i = 0; i < BOARD_SIZE; i++) {
for (j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == 0) {
return GAME_NOT_OVER;
}
}
}
// 判断是否有相邻的相同数字
for (i = 0; i < BOARD_SIZE; i++) {
for (j = 0; j < BOARD_SIZE-1; j++) {
if (board[i][j] == board[i][j+1] || board[j][i] == board[j+1][i]) {
return GAME_NOT_OVER;
}
}
}
// 判断是否达到2048
for (i = 0; i < BOARD_SIZE; i++) {
for (j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == 2048) {
return GAME_WIN;
}
}
}
// 游戏失败
return GAME_LOSE;
}
// 在屏幕上显示游戏面板
void display_board(int board[][BOARD_SIZE]) {
int i, j;
printf("\n");
for (i = 0; i < BOARD_SIZE; i++) {
for (j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == 0) {
printf(" .");
} else {
printf("%5d", board[i][j]);
}
}
printf("\n\n");
}
}
// 处理移动操作
void move(int board[][BOARD_SIZE], int dir) {
int i, j, k, num;
int merged[BOARD_SIZE][BOARD_SIZE] = {0};
// 根据移动方向进行操作
switch (dir) {
case 1: // 上
for (j = 0; j < BOARD_SIZE; j++) {
for (i = 1; i < BOARD_SIZE; i++) {
if (board[i][j] != 0) {
num = board[i][j];
k = i - 1;
while (k >= 0 && board[k][j] == 0) {
k--;
}
if (k >= 0 && board[k][j] == num && merged[k][j] == 0) {
board[k][j] *= 2;
board[i][j] = 0;
merged[k][j] = 1;
} else {
board[i][j] = 0;
board[k+1][j] = num;
}
}
}
}
break;
case 2: // 下
for (j = 0; j < BOARD_SIZE; j++) {
for (i = BOARD_SIZE-2; i >= 0; i--) {
if (board[i][j] != 0) {
num = board[i][j];
k = i + 1;
while (k < BOARD_SIZE && board[k][j] == 0) {
k++;
}
if (k < BOARD_SIZE && board[k][j] == num && merged[k][j] == 0) {
board[k][j] *= 2;
board[i][j] = 0;
merged[k][j] = 1;
} else {
board[i][j] = 0;
board[k-1][j] = num;
}
}
}
}
break;
case 3: // 左
for (i = 0; i < BOARD_SIZE; i++) {
for (j = 1; j < BOARD_SIZE; j++) {
if (board[i][j] != 0) {
num = board[i][j];
k = j - 1;
while (k >= 0 && board[i][k] == 0) {
k--;
}
if (k >= 0 && board[i][k] == num && merged[i][k] == 0) {
board[i][k] *= 2;
board[i][j] = 0;
merged[i][k] = 1;
} else {
board[i][j] = 0;
board[i][k+1] = num;
}
}
}
}
break;
case 4: // 右
for (i = 0; i < BOARD_SIZE; i++) {
for (j = BOARD_SIZE-2; j >= 0; j--) {
if (board[i][j] != 0) {
num = board[i][j];
k = j + 1;
while (k < BOARD_SIZE && board[i][k] == 0) {
k++;
}
if (k < BOARD_SIZE && board[i][k] == num && merged[i][k] == 0) {
board[i][k] *= 2;
board[i][j] = 0;
merged[i][k] = 1;
} else {
board[i][j] = 0;
board[i][k-1] = num;
}
}
}
}
break;
default:
break;
}
}
int main() {
int board[BOARD_SIZE][BOARD_SIZE];
GAME_STATE state = GAME_NOT_OVER;
int dir;
srand(time(NULL));
init_board(board);
generate_number(board);
generate_number(board);
display_board(board);
while (state == GAME_NOT_OVER) {
printf("请输入移动方向(1-上,2-下,3-左,4-右):");
scanf("%d", &dir);
move(board, dir);
generate_number(board);
display_board(board);
state = check_game_state(board);
}
if (state == GAME_WIN) {
printf("恭喜你获得胜利!\n");
} else {
printf("游戏结束!\n");
}
return 0;
}
```
该代码实现了一个简单的命令行版2048游戏,运行时需要在命令行中输入指令进行操作。其中,数字1表示向上移动,2表示向下移动,3表示向左移动,4表示向右移动。在每次移动后,程序会随机在空格位置生成一个数字,并在屏幕上显示游戏面板。当游戏结束时,程序会输出相应的提示信息。