linux中C语言2048
时间: 2024-01-06 18:55:08 浏览: 41
2048是一个非常流行的数字游戏,也可以在Linux中使用C语言编写。下面是一个简单的2048游戏示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROWS 4
#define COLS 4
// 初始化数组
void init(int board[][COLS])
{
int i, j;
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
board[i][j] = 0;
}
}
}
// 随机生成一个数字
void generate_number(int board[][COLS])
{
int i, j;
int count = 0;
int num;
int empty[ROWS * COLS][2];
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
if (board[i][j] == 0) {
empty[count][0] = i;
empty[count][1] = j;
count++;
}
}
}
if (count == 0) { // 没有空位,不能生成
return;
}
srand(time(NULL));
num = rand() % 2 + 1; // 随机生成1或2
i = rand() % count;
board[empty[i][0]][empty[i][1]] = num;
}
// 打印数组
void print_board(int board[][COLS])
{
int i, j;
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
printf("%4d", board[i][j]);
}
printf("\n");
}
printf("\n");
}
// 合并相同的数字
void merge(int board[][COLS])
{
int i, j, k;
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
if (board[i][j] != 0) {
for (k = j + 1; k < COLS; k++) {
if (board[i][k] == board[i][j]) {
board[i][j] *= 2;
board[i][k] = 0;
break;
} else if (board[i][k] != 0) {
break;
}
}
}
}
}
}
// 移动数字
void move(int board[][COLS], char dir)
{
int i, j, k;
switch (dir) {
case 'w': // 上
for (j = 0; j < COLS; j++) {
for (i = 1; i < ROWS; i++) {
if (board[i][j] != 0) {
for (k = i - 1; k >= 0; k--) {
if (board[k][j] == 0) {
board[k][j] = board[i][j];
board[i][j] = 0;
i = k;
} else {
break;
}
}
}
}
}
break;
case 's': // 下
for (j = 0; j < COLS; j++) {
for (i = ROWS - 2; i >= 0; i--) {
if (board[i][j] != 0) {
for (k = i + 1; k < ROWS; k++) {
if (board[k][j] == 0) {
board[k][j] = board[i][j];
board[i][j] = 0;
i = k;
} else {
break;
}
}
}
}
}
break;
case 'a': // 左
for (i = 0; i < ROWS; i++) {
for (j = 1; j < COLS; j++) {
if (board[i][j] != 0) {
for (k = j - 1; k >= 0; k--) {
if (board[i][k] == 0) {
board[i][k] = board[i][j];
board[i][j] = 0;
j = k;
} else {
break;
}
}
}
}
}
break;
case 'd': // 右
for (i = 0; i < ROWS; i++) {
for (j = COLS - 2; j >= 0; j--) {
if (board[i][j] != 0) {
for (k = j + 1; k < COLS; k++) {
if (board[i][k] == 0) {
board[i][k] = board[i][j];
board[i][j] = 0;
j = k;
} else {
break;
}
}
}
}
}
break;
}
}
// 判断是否结束
int is_game_over(int board[][COLS])
{
int i, j;
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
if (board[i][j] == 0) { // 还有空位,游戏未结束
return 0;
}
if (i > 0 && board[i][j] == board[i - 1][j]) { // 上方有相同数字,游戏未结束
return 0;
}
if (i < ROWS - 1 && board[i][j] == board[i + 1][j]) { // 下方有相同数字,游戏未结束
return 0;
}
if (j > 0 && board[i][j] == board[i][j - 1]) { // 左侧有相同数字,游戏未结束
return 0;
}
if (j < COLS - 1 && board[i][j] == board[i][j + 1]) { // 右侧有相同数字,游戏未结束
return 0;
}
}
}
return 1; // 游戏结束
}
int main()
{
int board[ROWS][COLS];
char dir;
int game_over = 0;
init(board);
generate_number(board);
generate_number(board);
print_board(board);
while (!game_over) {
printf("请输入移动方向(w,s,a,d):");
scanf("%c", &dir);
getchar(); // 读取回车键
move(board, dir);
merge(board);
move(board, dir);
generate_number(board);
print_board(board);
game_over = is_game_over(board);
}
printf("游戏结束!\n");
return 0;
}
```
在Linux中使用gcc编译运行:
```
gcc -o 2048 2048.c
./2048
```