2048小游戏C语言代码
时间: 2023-08-28 08:06:24 浏览: 35
以下是一个简单的 2048 小游戏的 C 语言代码实现,只供参考:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 4
#define TARGET 2048
int board[SIZE][SIZE];
// 初始化棋盘
void init_board() {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
board[i][j] = 0;
}
}
}
// 在空余位置随机生成数字2或4
void spawn_random() {
int empty_count = 0;
int empty_cells[SIZE * SIZE][2];
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (board[i][j] == 0) {
empty_cells[empty_count][0] = i;
empty_cells[empty_count][1] = j;
empty_count++;
}
}
}
if (empty_count == 0) {
return;
}
int random_index = rand() % empty_count;
int x = empty_cells[random_index][0];
int y = empty_cells[random_index][1];
board[x][y] = (rand() % 2 + 1) * 2;
}
// 判断游戏是否结束
int is_game_over() {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (board[i][j] == 0) {
return 0;
}
if (i > 0 && board[i][j] == board[i - 1][j]) {
return 0;
}
if (j > 0 && board[i][j] == board[i][j - 1]) {
return 0;
}
}
}
return 1;
}
// 向左移动
void move_left() {
for (int i = 0; i < SIZE; i++) {
int write_index = 0;
for (int j = 0; j < SIZE; j++) {
if (board[i][j] != 0) {
if (write_index != j) {
board[i][write_index] = board[i][j];
board[i][j] = 0;
}
write_index++;
}
}
}
}
// 向右移动
void move_right() {
for (int i = 0; i < SIZE; i++) {
int write_index = SIZE - 1;
for (int j = SIZE - 1; j >= 0; j--) {
if (board[i][j] != 0) {
if (write_index != j) {
board[i][write_index] = board[i][j];
board[i][j] = 0;
}
write_index--;
}
}
}
}
// 向上移动
void move_up() {
for (int j = 0; j < SIZE; j++) {
int write_index = 0;
for (int i = 0; i < SIZE; i++) {
if (board[i][j] != 0) {
if (write_index != i) {
board[write_index][j] = board[i][j];
board[i][j] = 0;
}
write_index++;
}
}
}
}
// 向下移动
void move_down() {
for (int j = 0; j < SIZE; j++) {
int write_index = SIZE - 1;
for (int i = SIZE - 1; i >= 0; i--) {
if (board[i][j] != 0) {
if (write_index != i) {
board[write_index][j] = board[i][j];
board[i][j] = 0;
}
write_index--;
}
}
}
}
// 合并相邻的相同数字
void merge() {
for (int i = 0; i < SIZE; i++) {
for (int j = 1; j < SIZE; j++) {
if (board[i][j] != 0 && board[i][j - 1] == board[i][j]) {
board[i][j - 1] *= 2;
board[i][j] = 0;
}
}
}
}
// 打印棋盘
void print_board() {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
printf("%d\t", board[i][j]);
}
printf("\n");
}
printf("\n");
}
// 主函数
int main() {
srand(time(NULL));
init_board();
spawn_random();
spawn_random();
print_board();
while (!is_game_over()) {
char input = getchar();
getchar();
switch (input) {
case 'a':
move_left();
merge();
move_left();
break;
case 'd':
move_right();
merge();
move_right();
break;
case 'w':
move_up();
merge();
move_up();
break;
case 's':
move_down();
merge();
move_down();
break;
default:
break;
}
spawn_random();
print_board();
}
printf("Game over!\n");
return 0;
}
```
注意:此代码仅供学习参考,实现并不完善,可能存在一些问题和不足之处,如有需要请自行调整。