21xrx.com
2024-11-22 07:32:34 Friday
登录
文章检索 我的文章 写文章
C语言实现贪吃蛇游戏-详细代码实现
2023-06-15 11:22:58 深夜i     --     --
C语言 贪吃蛇 二维数组 结构体 图形库 边界 移动 得分 食物 游戏画面 代码实现

贪吃蛇是一款简单、经典的小游戏,作为程序员,当然要亲手写出这样一个小游戏。本篇文章将详细介绍如何使用C语言来实现贪吃蛇游戏,并提供详细的代码实现。

首先,我们要明确一个概念,那就是:贪吃蛇游戏本质上是一个二维的数组。我们可以使用C语言中的二维数组来实现这个游戏。另外,为了让游戏的画面更加美观,我们还可以使用C语言中的图形库。

下面是贪吃蛇游戏的一些基本要素:

1. 游戏的边界

在游戏中,我们需要一个边界来限制贪吃蛇的活动范围。在C语言中,我们可以使用二维数组来表示整个游戏画面,将二维数组的边缘作为游戏的边界。

2. 贪吃蛇

贪吃蛇应该由若干个节点组成,每个节点都具有相同的形状和大小。在C语言中,我们可以使用结构体来表示一个节点,节点的信息可以包括坐标、方向等。贪吃蛇的移动可以通过改变节点的坐标来实现。

3. 食物

贪吃蛇需要吃食物来成长,我们需要将食物放置在游戏画面中。在C语言中,可以使用随机产生的坐标来表示食物的位置。

下面就是C语言实现贪吃蛇游戏的详细代码实现:

1. 定义头文件

#include

#include

#include

#include

#include

2. 定义常量

#define WIDTH 50  // 游戏画面的宽度

#define HEIGHT 25  // 游戏画面的高度

#define SNAKE_MAX_LENGTH 100  // 贪吃蛇的最大长度

#define SNAKE_INIT_LENGTH 3 // 贪吃蛇的初始长度

#define SNAKE_NODE_SHAPE '+' // 贪吃蛇节点的形状

#define FOOD_SHAPE '@' // 食物的形状

#define SLEEP_MS 200  // 每次移动后等待的毫秒数

3. 定义结构体

typedef struct

  int x;

  int y;

Point;

typedef struct {

  Point nodes[SNAKE_MAX_LENGTH];

  int length;

  char direction;

} Snake;

4. 定义全局变量

Point food; // 食物的坐标

int score; // 得分

char screen[HEIGHT][WIDTH]; // 游戏画面

5. 初始化游戏

void initialize() {

  // 隐藏光标

  HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);

  CONSOLE_CURSOR_INFO CursorInfo;

  GetConsoleCursorInfo(handle, &CursorInfo);

  CursorInfo.bVisible = false;

  SetConsoleCursorInfo(handle, &CursorInfo);

  // 初始化游戏画面

  for (int i = 0; i < HEIGHT; i++) {

    for (int j = 0; j < WIDTH; j++) {

      if (i == 0 || i == HEIGHT - 1 || j == 0 || j == WIDTH - 1) {

        screen[i][j] = '*'; // 边界

      } else {

        screen[i][j] = ' '; // 空白区域

      }

    }

  }

  // 初始化贪吃蛇

  Snake snake;

  snake.direction = 'r'; // 初始方向向右

  snake.nodes[0].x = WIDTH / 2;  // 初始位置位于游戏画面的中央

  snake.nodes[0].y = HEIGHT / 2;

  for (int i = 1; i < SNAKE_INIT_LENGTH; i++) {

    snake.nodes[i].x = snake.nodes[i - 1].x - 1; // 将贪吃蛇放置在初始位置的左侧

    snake.nodes[i].y = snake.nodes[i - 1].y;

  }

  snake.length = SNAKE_INIT_LENGTH;

  for (int i = 0; i < snake.length; i++) {

    screen[snake.nodes[i].y][snake.nodes[i].x] = SNAKE_NODE_SHAPE; // 在游戏画面中绘制贪吃蛇

  }

  // 初始化食物

  srand(time(NULL));

  int x;

  int y;

  do {

    x = rand() % (WIDTH - 2) + 1;  // 食物不在边界上

    y = rand() % (HEIGHT - 2) + 1;

  } while (screen[y][x] != ' ');   // 食物不应该重叠在贪吃蛇身体上

  food.x = x;

  food.y = y;

  screen[y][x] = FOOD_SHAPE;

}

6. 主函数

int main() {

  initialize();

  while (1) {

    // 判断是否吃到食物

    if (snake.nodes[0].x == food.x && snake.nodes[0].y == food.y) {

      screen[food.y][food.x] = ' ';

      score++;

      snake.length++;

      food.x = rand() % (WIDTH - 2) + 1;

      food.y = rand() % (HEIGHT - 2) + 1;

      screen[food.y][food.x] = FOOD_SHAPE;

    }

    // 判断是否游戏结束

    if (snake.nodes[0].x <= 0 || snake.nodes[0].x >= WIDTH - 1 || snake.nodes[0].y <= 0 || snake.nodes[0].y >= HEIGHT - 1)

      break;

    for (int i = 1; i < snake.length; i++) {

      if (snake.nodes[0].x == snake.nodes[i].x && snake.nodes[0].y == snake.nodes[i].y)

        break;

    }

    // 判断方向是否改变

    if (kbhit()) {

      char ch = getch();

      if ((snake.direction == 'u' || snake.direction == 'd') && (ch == 'a' || ch == 'd'))

        snake.direction = ch;

      if ((snake.direction == 'l' || snake.direction == 'r') && (ch == 'w' || ch == 's')) {

        snake.direction = ch == 'w' ? 'u' : 'd';

      }

    }

    // 移动贪吃蛇

    for (int i = snake.length - 1; i > 0; i--) {

      snake.nodes[i] = snake.nodes[i - 1];

    }

    if (snake.direction == 'u') {

      snake.nodes[0].y--;

    }

    if (snake.direction == 'd') {

      snake.nodes[0].y++;

    }

    if (snake.direction == 'l') {

      snake.nodes[0].x--;

    }

    if (snake.direction == 'r') {

      snake.nodes[0].x++;

    }

    // 更新画面

    for (int i = 0; i < HEIGHT; i++) {

      for (int j = 0; j < WIDTH; j++) {

        printf("%c", screen[i][j]);

      }

      printf("\n");

    }

    printf("得分:%d\n", score);

    Sleep(SLEEP_MS);

    system("cls");

  }

  printf("游戏结束,得分:%d", score);

  return 0;

}

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复