2048c语言程序,C语言实现2048小游戏
时间: 2023-08-27 07:05:36 浏览: 48
以下是一个简单的 C 语言实现 2048 小游戏的示例程序。注意这只是一个基本的实现,还可以进行优化和改进。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 4
#define TARGET 2048
int board[SIZE][SIZE];
void initialize() {
int i, j;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
board[i][j] = 0;
}
}
}
void print_board() {
int i, j;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
printf("%d\t", board[i][j]);
}
printf("\n");
}
}
int add_random_num() {
int i, j, count = 0, r, c;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
if (board[i][j] == 0) {
count++;
}
}
}
if (count == 0) {
return 0;
}
r = rand() % SIZE;
c = rand() % SIZE;
while (board[r][c] != 0) {
r = rand() % SIZE;
c = rand() % SIZE;
}
board[r][c] = (rand() % 2 + 1) * 2;
return 1;
}
void transpose() {
int i, j, temp;
for (i = 0; i < SIZE; i++) {
for (j = i + 1; j < SIZE; j++) {
temp = board[i][j];
board[i][j] = board[j][i];
board[j][i] = temp;
}
}
}
void reverse() {
int i, j, temp;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE / 2; j++) {
temp = board[i][j];
board[i][j] = board[i][SIZE - j - 1];
board[i][SIZE - j - 1] = temp;
}
}
}
int move_left() {
int i, j, k, moved = 0;
for (i = 0; i < SIZE; i++) {
for (j = 1; j < SIZE; j++) {
if (board[i][j] == 0) {
continue;
}
for (k = j - 1; k >= 0; k--) {
if (board[i][k] == 0) {
board[i][k] = board[i][k + 1];
board[i][k + 1] = 0;
moved = 1;
} else if (board[i][k] == board[i][k + 1]) {
board[i][k] *= 2;
board[i][k + 1] = 0;
moved = 1;
break;
} else {
break;
}
}
}
}
return moved;
}
int move_right() {
int i, j, k, moved = 0;
reverse();
moved = move_left();
reverse();
return moved;
}
int move_up() {
int i, j, k, moved = 0;
transpose();
moved = move_left();
transpose();
return moved;
}
int move_down() {
int i, j, k, moved = 0;
transpose();
reverse();
moved = move_left();
reverse();
transpose();
return moved;
}
int game_over() {
int i, j;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
if (board[i][j] == 0) {
return 0;
}
if (j < SIZE - 1 && board[i][j] == board[i][j + 1]) {
return 0;
}
if (i < SIZE - 1 && board[i][j] == board[i + 1][j]) {
return 0;
}
}
}
return 1;
}
int game_won() {
int i, j;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
if (board[i][j] == TARGET) {
return 1;
}
}
}
return 0;
}
int main() {
int moved, won = 0;
char ch;
srand(time(0));
initialize();
add_random_num();
add_random_num();
print_board();
while (1) {
printf("Enter move (u/d/l/r): ");
ch = getchar();
moved = 0;
switch (ch) {
case 'u':
moved = move_up();
break;
case 'd':
moved = move_down();
break;
case 'l':
moved = move_left();
break;
case 'r':
moved = move_right();
break;
case 'q':
printf("Quitting game...\n");
exit(0);
break;
default:
printf("Invalid move\n");
}
if (moved) {
add_random_num();
print_board();
}
if (game_won()) {
printf("Congratulations! You won!\n");
won = 1;
break;
}
if (game_over()) {
printf("Game over. Try again.\n");
break;
}
while ((ch = getchar()) != '\n' && ch != EOF);
}
if (!won) {
printf("Better luck next time!\n");
}
return 0;
}
```
这个程序使用了一个 4x4 的数组来表示游戏板,其中数字 0 表示空格。程序开始时,调用 initialize() 函数初始化游戏板,然后调用 add_random_num() 函数添加两个随机的数字。之后,程序进入一个循环,在每次循环中,程序读取用户输入的移动方向,然后调用相应的函数来移动数字。如果移动了数字,程序调用 add_random_num() 函数添加一个随机数字,然后打印游戏板。当玩家达到目标数字 2048 时,程序会打印出“Congratulations! You won!”的消息并退出游戏。如果玩家不能再移动数字,程序会打印出“Game over. Try again.”的消息并退出游戏。