帮我写一段2048小游戏C语言代码
时间: 2023-07-10 17:40:56 浏览: 54
以下是一个简单的2048小游戏的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 4 // 游戏界面大小
#define TARGET 2048 // 游戏目标分数
// 游戏状态结构体
typedef struct {
int board[SIZE][SIZE]; // 游戏界面
int score; // 当前分数
} Game;
// 初始化游戏界面
void initBoard(Game *game) {
game->score = 0;
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
game->board[i][j] = 0;
}
}
}
// 在空白格子中随机生成一个数字
void generateRandomTile(Game *game) {
int emptyTiles[SIZE*SIZE][2];
int count = 0;
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (game->board[i][j] == 0) {
emptyTiles[count][0] = i;
emptyTiles[count][1] = j;
count++;
}
}
}
if (count == 0) { // 没有空白格子
return;
}
int index = rand() % count;
int value = (rand() % 2 + 1) * 2; // 随机生成 2 或 4
game->board[emptyTiles[index][0]][emptyTiles[index][1]] = value;
}
// 显示游戏界面
void displayBoard(Game *game) {
printf("当前分数:%d\n", game->score);
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
printf("%-6d", game->board[i][j]);
}
printf("\n");
}
}
// 判断游戏是否结束
int isGameOver(Game *game) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (game->board[i][j] == 0) { // 还有空白格子
return 0;
}
if (j < SIZE - 1 && game->board[i][j] == game->board[i][j+1]) { // 横向相邻格子有相同数字
return 0;
}
if (i < SIZE - 1 && game->board[i][j] == game->board[i+1][j]) { // 纵向相邻格子有相同数字
return 0;
}
}
}
return 1;
}
// 合并相邻的相同数字
void mergeTiles(Game *game) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE - 1; j++) {
if (game->board[i][j] == game->board[i][j+1]) {
game->board[i][j] *= 2;
game->score += game->board[i][j];
game->board[i][j+1] = 0;
}
}
}
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE - 1; j++) {
if (game->board[i][j] == 0) {
for (int k = j + 1; k < SIZE; k++) {
if (game->board[i][k] != 0) {
game->board[i][j] = game->board[i][k];
game->board[i][k] = 0;
break;
}
}
}
}
}
}
// 处理玩家输入
void processInput(Game *game, char input) {
switch (input) {
case 'w': // 上移
for (int j = 0; j < SIZE; j++) {
for (int i = 0; i < SIZE - 1; i++) {
if (game->board[i][j] == 0) {
for (int k = i + 1; k < SIZE; k++) {
if (game->board[k][j] != 0) {
game->board[i][j] = game->board[k][j];
game->board[k][j] = 0;
break;
}
}
}
}
}
mergeTiles(game);
break;
case 's': // 下移
for (int j = 0; j < SIZE; j++) {
for (int i = SIZE - 1; i > 0; i--) {
if (game->board[i][j] == 0) {
for (int k = i - 1; k >= 0; k--) {
if (game->board[k][j] != 0) {
game->board[i][j] = game->board[k][j];
game->board[k][j] = 0;
break;
}
}
}
}
}
mergeTiles(game);
break;
case 'a': // 左移
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE - 1; j++) {
if (game->board[i][j] == 0) {
for (int k = j + 1; k < SIZE; k++) {
if (game->board[i][k] != 0) {
game->board[i][j] = game->board[i][k];
game->board[i][k] = 0;
break;
}
}
}
}
}
mergeTiles(game);
break;
case 'd': // 右移
for (int i = 0; i < SIZE; i++) {
for (int j = SIZE - 1; j > 0; j--) {
if (game->board[i][j] == 0) {
for (int k = j - 1; k >= 0; k--) {
if (game->board[i][k] != 0) {
game->board[i][j] = game->board[i][k];
game->board[i][k] = 0;
break;
}
}
}
}
}
mergeTiles(game);
break;
default:
printf("无效的输入。\n");
break;
}
}
int main() {
srand(time(NULL));
Game game;
initBoard(&game);
generateRandomTile(&game);
generateRandomTile(&game);
displayBoard(&game);
char input;
while (!isGameOver(&game)) {
printf("请输入操作方向(w:上,s:下,a:左,d:右):");
scanf(" %c", &input);
processInput(&game, input);
generateRandomTile(&game);
displayBoard(&game);
}
if (game.score >= TARGET) {
printf("恭喜你达到了目标分数%d,游戏胜利!\n", TARGET);
} else {
printf("游戏结束,再接再厉!\n");
}
return 0;
}
```
这段代码定义了一个 `Game` 结构体,包含游戏界面和当前分数两个属性。在 `initBoard()` 函数中初始化游戏界面,`generateRandomTile()` 函数用于在空白格子中随机生成一个数字,`displayBoard()` 函数用于显示游戏界面,`isGameOver()` 函数用于判断游戏是否结束,`mergeTiles()` 函数用于合并相邻的相同数字并移动其他数字,`processInput()` 函数用于处理玩家输入并更新游戏状态。在 `main()` 函数中,我们先初始化游戏界面并随机生成两个数字,接着进入游戏循环,等待玩家输入并处理,直到游戏结束。如果分数达到了目标分数,则游戏胜利。