C语言实现2048游戏
时间: 2023-07-11 09:25:53 浏览: 43
C语言实现2048游戏的方法有很多,下面是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 4
#define COL 4
int board[ROW][COL];
void init_board() {
// 初始化棋盘
for(int i=0; i<ROW; i++) {
for(int j=0; j<COL; j++) {
board[i][j] = 0;
}
}
// 随机生成两个初始数字
srand((unsigned)time(NULL));
int x1 = rand()%ROW;
int y1 = rand()%COL;
int x2, y2;
do {
x2 = rand()%ROW;
y2 = rand()%COL;
} while(x1==x2 && y1==y2);
board[x1][y1] = 2;
board[x2][y2] = 2;
}
void print_board() {
// 打印棋盘
for(int i=0; i<ROW; i++) {
for(int j=0; j<COL; j++) {
printf("%d\t", board[i][j]);
}
printf("\n");
}
}
int move_left() {
// 向左移动
int moved = 0;
for(int i=0; i<ROW; i++) {
int last = -1;
for(int j=0; j<COL; j++) {
if(board[i][j] != 0) {
if(last != -1 && board[i][j] == board[i][last]) {
// 合并
board[i][last] *= 2;
board[i][j] = 0;
moved = 1;
} else {
// 移动
if(board[i][last+1] == 0) {
board[i][last+1] = board[i][j];
board[i][j] = 0;
moved = 1;
}
last++;
}
}
}
}
return moved;
}
int move_right() {
// 向右移动
int moved = 0;
for(int i=0; i<ROW; i++) {
int last = COL;
for(int j=COL-1; j>=0; j--) {
if(board[i][j] != 0) {
if(last != COL && board[i][j] == board[i][last]) {
// 合并
board[i][last] *= 2;
board[i][j] = 0;
moved = 1;
} else {
// 移动
if(board[i][last-1] == 0) {
board[i][last-1] = board[i][j];
board[i][j] = 0;
moved = 1;
}
last--;
}
}
}
}
return moved;
}
int move_up() {
// 向上移动
int moved = 0;
for(int j=0; j<COL; j++) {
int last = -1;
for(int i=0; i<ROW; i++) {
if(board[i][j] != 0) {
if(last != -1 && board[i][j] == board[last][j]) {
// 合并
board[last][j] *= 2;
board[i][j] = 0;
moved = 1;
} else {
// 移动
if(board[last+1][j] == 0) {
board[last+1][j] = board[i][j];
board[i][j] = 0;
moved = 1;
}
last++;
}
}
}
}
return moved;
}
int move_down() {
// 向下移动
int moved = 0;
for(int j=0; j<COL; j++) {
int last = ROW;
for(int i=ROW-1; i>=0; i--) {
if(board[i][j] != 0) {
if(last != ROW && board[i][j] == board[last][j]) {
// 合并
board[last][j] *= 2;
board[i][j] = 0;
moved = 1;
} else {
// 移动
if(board[last-1][j] == 0) {
board[last-1][j] = board[i][j];
board[i][j] = 0;
moved = 1;
}
last--;
}
}
}
}
return moved;
}
int is_game_over() {
// 判断游戏是否结束
for(int i=0; i<ROW; i++) {
for(int j=0; j<COL; j++) {
if(board[i][j] == 0) {
return 0;
}
if(i>0 && board[i][j]==board[i-1][j]) {
return 0;
}
if(i<ROW-1 && board[i][j]==board[i+1][j]) {
return 0;
}
if(j>0 && board[i][j]==board[i][j-1]) {
return 0;
}
if(j<COL-1 && board[i][j]==board[i][j+1]) {
return 0;
}
}
}
return 1;
}
int main() {
init_board();
print_board();
while(!is_game_over()) {
char c = getchar();
getchar();
int moved = 0;
switch(c) {
case 'a': moved = move_left(); break;
case 'd': moved = move_right(); break;
case 'w': moved = move_up(); break;
case 's': moved = move_down(); break;
case 'q': exit(0);
}
if(moved) {
// 生成新的数字
int count = 0;
for(int i=0; i<ROW; i++) {
for(int j=0; j<COL; j++) {
if(board[i][j] == 0) {
count++;
}
}
}
srand((unsigned)time(NULL));
int index = rand()%count;
count = 0;
for(int i=0; i<ROW; i++) {
for(int j=0; j<COL; j++) {
if(board[i][j] == 0) {
if(count == index) {
board[i][j] = 2;
break;
}
count++;
}
}
}
print_board();
}
}
printf("Game over!\n");
return 0;
}
```
这个示例代码实现了基本的移动和合并功能,可以通过控制台输入操作指令来进行游戏。另外还实现了生成新数字和判断游戏是否结束的功能。