用c语言写一个2048
时间: 2024-05-13 14:15:34 浏览: 40
C语言写的2048
好的,下面是用C语言实现的2048游戏:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#define SIZE 4
int board[SIZE][SIZE];
// 初始化棋盘
void initBoard() {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
board[i][j] = 0;
}
}
}
// 在棋盘上随机生成一个新的数字
void generateNewNumber() {
int x, y;
do {
x = rand() % SIZE;
y = rand() % SIZE;
} while (board[x][y] != 0);
board[x][y] = (rand() % 2 + 1) * 2; // 生成 2 或 4
}
// 判断棋盘是否已满
int isFull() {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (board[i][j] == 0) {
return 0;
}
}
}
return 1;
}
// 判断是否可以移动棋子
int canMove() {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (board[i][j] == 0) {
return 1;
}
if (i > 0 && board[i][j] == board[i - 1][j]) {
return 1;
}
if (i < SIZE - 1 && board[i][j] == board[i + 1][j]) {
return 1;
}
if (j > 0 && board[i][j] == board[i][j - 1]) {
return 1;
}
if (j < SIZE - 1 && board[i][j] == board[i][j + 1]) {
return 1;
}
}
}
return 0;
}
// 合并棋子
void merge(int* line, int len) {
int i, j;
for (i = 0, j = 0; j < len; j++) {
if (line[j] != 0) {
if (i > 0 && line[i - 1] == line[j]) { // 合并相邻的相同数字
line[i - 1] *= 2;
} else {
line[i++] = line[j];
}
}
}
while (i < len) { // 将后面的数字置零
line[i++] = 0;
}
}
// 按照方向移动棋子
void move(int direction) {
int i, j, k, line[SIZE];
switch (direction) {
case 1: // 上
for (j = 0; j < SIZE; j++) {
for (i = 0, k = 0; i < SIZE; i++) {
line[k++] = board[i][j];
}
merge(line, SIZE);
for (i = 0, k = 0; i < SIZE; i++) {
board[i][j] = line[k++];
}
}
break;
case 2: // 下
for (j = 0; j < SIZE; j++) {
for (i = SIZE - 1, k = 0; i >= 0; i--) {
line[k++] = board[i][j];
}
merge(line, SIZE);
for (i = SIZE - 1, k = 0; i >= 0; i--) {
board[i][j] = line[k++];
}
}
break;
case 3: // 左
for (i = 0; i < SIZE; i++) {
for (j = 0, k = 0; j < SIZE; j++) {
line[k++] = board[i][j];
}
merge(line, SIZE);
for (j = 0, k = 0; j < SIZE; j++) {
board[i][j] = line[k++];
}
}
break;
case 4: // 右
for (i = 0; i < SIZE; i++) {
for (j = SIZE - 1, k = 0; j >= 0; j--) {
line[k++] = board[i][j];
}
merge(line, SIZE);
for (j = SIZE - 1, k = 0; j >= 0; j--) {
board[i][j] = line[k++];
}
}
break;
}
}
// 绘制棋盘
void drawBoard() {
system("cls");
printf("2048 Game\n\n");
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
printf("%5d", board[i][j]);
}
printf("\n");
}
}
int main() {
srand((unsigned)time(NULL));
initBoard();
generateNewNumber();
generateNewNumber();
drawBoard();
while (1) {
if (isFull() && !canMove()) {
printf("\nGame Over!\n");
break;
}
switch (getch()) {
case 'w':
case 'W':
move(1);
break;
case 's':
case 'S':
move(2);
break;
case 'a':
case 'A':
move(3);
break;
case 'd':
case 'D':
move(4);
break;
default:
continue;
}
generateNewNumber();
drawBoard();
}
return 0;
}
```
这个版本的2048游戏可以在Windows系统下运行,使用了`conio.h`库中的`getch()`函数来获取用户输入。在Linux或MacOS系统上运行需要修改输入方式。
阅读全文