用c语言写一个2048
时间: 2023-11-16 17:05:34 浏览: 31
2048是一款十分经典的数字益智游戏。下面是一个简单的用C语言实现的2048游戏的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 4
#define COL 4
int board[ROW][COL];
void init_board() {
int i, j;
srand((unsigned int)time(NULL));
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
board[i][j] = 0;
}
}
int r1 = rand() % ROW;
int c1 = rand() % COL;
int r2, c2;
do {
r2 = rand() % ROW;
c2 = rand() % COL;
} while (r1 == r2 && c1 == c2);
board[r1][c1] = 2;
board[r2][c2] = 2;
}
void show_board() {
int i, j;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
printf("%4d", board[i][j]);
}
printf("\n");
}
}
void add_random() {
int i, j;
int r, c;
do {
r = rand() % ROW;
c = rand() % COL;
} while (board[r][c] != 0);
board[r][c] = 2;
}
int is_full() {
int i, j;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (board[i][j] == 0) {
return 0;
}
}
}
return 1;
}
int is_gameover() {
int i, j;
if (!is_full()) {
return 0;
}
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if ((i < ROW - 1 && board[i][j] == board[i + 1][j]) ||
(j < COL - 1 && board[i][j] == board[i][j + 1])) {
return 0;
}
}
}
return 1;
}
void shift_left() {
int i, j, k;
for (i = 0; i < ROW; i++) {
k = 0;
for (j = 1; j < COL; j++) {
if (board[i][j] != 0) {
if (board[i][j] == board[i][k]) {
board[i][k] *= 2;
board[i][j] = 0;
} else if (board[i][k] == 0) {
board[i][k] = board[i][j];
board[i][j] = 0;
} else {
k++;
board[i][k] = board[i][j];
if (k != j) {
board[i][j] = 0;
}
}
}
}
}
}
void shift_right() {
int i, j, k;
for (i = 0; i < ROW; i++) {
k = COL - 1;
for (j = COL - 2; j >= 0; j--) {
if (board[i][j] != 0) {
if (board[i][j] == board[i][k]) {
board[i][k] *= 2;
board[i][j] = 0;
} else if (board[i][k] == 0) {
board[i][k] = board[i][j];
board[i][j] = 0;
} else {
k--;
board[i][k] = board[i][j];
if (k != j) {
board[i][j] = 0;
}
}
}
}
}
}
void shift_up() {
int i, j, k;
for (j = 0; j < COL; j++) {
k = 0;
for (i = 1; i < ROW; i++) {
if (board[i][j] != 0) {
if (board[i][j] == board[k][j]) {
board[k][j] *= 2;
board[i][j] = 0;
} else if (board[k][j] == 0) {
board[k][j] = board[i][j];
board[i][j] = 0;
} else {
k++;
board[k][j] = board[i][j];
if (k != i) {
board[i][j] = 0;
}
}
}
}
}
}
void shift_down() {
int i, j, k;
for (j = 0; j < COL; j++) {
k = ROW - 1;
for (i = ROW - 2; i >= 0; i--) {
if (board[i][j] != 0) {
if (board[i][j] == board[k][j]) {
board[k][j] *= 2;
board[i][j] = 0;
} else if (board[k][j] == 0) {
board[k][j] = board[i][j];
board[i][j] = 0;
} else {
k--;
board[k][j] = board[i][j];
if (k != i) {
board[i][j] = 0;
}
}
}
}
}
}
int main() {
char ch;
init_board();
while (1) {
show_board();
if (is_gameover()) {
printf("游戏结束!\n");
break;
}
printf("请输入操作:");
ch = getchar();
while (ch == '\n') {
ch = getchar();
}
switch (ch) {
case 'a':
shift_left();
break;
case 'd':
shift_right();
break;
case 'w':
shift_up();
break;
case 's':
shift_down();
break;
case 'q':
exit(0);
default:
printf("无效操作,请重新输入:");
continue;
}
if (!is_full()) {
add_random();
}
}
return 0;
}
```
这个程序中,我们通过 `init_board()` 函数生成一个随机的初始盘面,并通过 `show_board()` 函数将其显示在命令行窗口中。然后我们通过 `add_random()` 函数实现在空白位置上随机添加数字2,通过 `is_full()` 函数判断盘面是否已满,通过 `is_gameover()` 函数判断游戏是否结束。最后,我们通过 `shift_left()`、`shift_right()`、`shift_up()`、`shift_down()` 函数实现盘面的移动,让玩家可以通过输入操作来控制移动方向。