21xrx.com
2025-06-12 15:10:58 Thursday
文章检索 我的文章 写文章
C++贪吃蛇游戏代码
2023-07-12 22:06:29 深夜i     17     0
C++ 贪吃蛇 游戏 代码 编程

贪吃蛇作为一个经典的休闲游戏,在计算机编程中也是非常经典的编程案例之一。在这里,我们将介绍一个使用C++实现的贪吃蛇游戏代码。

首先,我们需要了解贪吃蛇游戏的基本规则。贪吃蛇是一个由一条蛇组成的游戏,它需要在一个有边界的游戏区域内移动,并不断地吃入食物,使得蛇的长度不断增加,而如果蛇撞到了边界或者自身,则游戏失败。玩家通过键盘控制蛇的移动,包括向上、向下、向左、向右四个方向。当蛇头与食物接触时,食物会消失并重新出现在游戏区域内,而蛇的长度会增加。

接下来,让我们来看一下C++贪吃蛇游戏代码的实现。首先,我们需要定义一些基本的变量和常量:

const int WIDTH = 800; // 游戏区域宽度
const int HEIGHT = 600; // 游戏区域高度
const int BLOCK_SIZE = 20; // 每个方块的大小
const int SNAKE_INIT_LEN = 3; // 初始蛇的长度
const int SNAKE_MAX_LEN = 100; // 蛇的最大长度
int snake_x[SNAKE_MAX_LEN], snake_y[SNAKE_MAX_LEN]; // 蛇的坐标
int food_x, food_y; // 食物的坐标
int snake_len; // 蛇的长度
int direction; // 蛇的运动方向
bool game_over; // 游戏是否结束

接下来,我们需要实现一个初始化函数,用于初始化游戏区域、蛇以及食物的初始位置:

void init() {
  // 初始化游戏区域
  glClearColor(0.0, 0.0, 0.0, 1.0);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluOrtho2D(0, WIDTH, HEIGHT, 0);
  glMatrixMode(GL_MODELVIEW);
  // 初始化蛇
  snake_len = SNAKE_INIT_LEN;
  for (int i = 0; i < snake_len; i++) {
    snake_x[i] = WIDTH / 2 - i * BLOCK_SIZE;
    snake_y[i] = HEIGHT / 2;
  }
  // 初始化食物
  random_food();
}

其中,`glClearColor`、`glMatrixMode`、`glLoadIdentity`和`gluOrtho2D`函数都是OpenGL的基本函数,用于初始化OpenGL的显示区域。`random_food`函数用于随机生成食物的初始位置。

接着,我们需要实现一个绘制函数,用于绘制游戏区域、蛇以及食物:

void draw() {
  // 绘制游戏区域
  glClear(GL_COLOR_BUFFER_BIT);
  glBegin(GL_LINES);
  glColor3f(1.0, 1.0, 1.0);
  glVertex2i(0, 0);
  glVertex2i(WIDTH, 0);
  glVertex2i(WIDTH, 0);
  glVertex2i(WIDTH, HEIGHT);
  glVertex2i(WIDTH, HEIGHT);
  glVertex2i(0, HEIGHT);
  glVertex2i(0, HEIGHT);
  glVertex2i(0, 0);
  glEnd();
  // 绘制蛇
  glColor3f(0.0, 0.0, 1.0);
  for (int i = 0; i < snake_len; i++) {
    glRecti(snake_x[i], snake_y[i], snake_x[i] + BLOCK_SIZE, snake_y[i] + BLOCK_SIZE);
  }
  // 绘制食物
  glColor3f(1.0, 0.0, 0.0);
  glRecti(food_x, food_y, food_x + BLOCK_SIZE, food_y + BLOCK_SIZE);
  // 更新屏幕
  glutSwapBuffers();
}

其中,`glClear`函数用于清除屏幕内容,`glBegin`和`glEnd`函数用于绘制游戏区域的边界。`glRecti`函数用于绘制蛇和食物所在的方块,绘制的颜色、大小和位置都可以自由设置。

接着,我们需要实现一个处理键盘操作的函数,用于控制蛇的运动方向:

void process_key(unsigned char key, int x, int y) {
  switch (key) {
  case 'w':
    if (direction != 1) direction = 0; // 向上
    break;
  case 's':
    if (direction != 0) direction = 1; // 向下
    break;
  case 'a':
    if (direction != 3) direction = 2; // 向左
    break;
  case 'd':
    if (direction != 2) direction = 3; // 向右
    break;
  }
}

其中,`switch`语句用于判断按下的键盘按键,根据按键的不同,设置蛇的运动方向。

接下来,我们需要实现一个函数,用于更新蛇的位置和状态:

void update() {
  // 更新蛇的位置
  for (int i = snake_len - 1; i > 0; i--) {
    snake_x[i] = snake_x[i - 1];
    snake_y[i] = snake_y[i - 1];
  }
  switch (direction) {
  case 0: // 向上
    snake_y[0] -= BLOCK_SIZE;
    break;
  case 1: // 向下
    snake_y[0] += BLOCK_SIZE;
    break;
  case 2: // 向左
    snake_x[0] -= BLOCK_SIZE;
    break;
  case 3: // 向右
    snake_x[0] += BLOCK_SIZE;
    break;
  }
  // 判断是否吃到食物
  if (snake_x[0] == food_x && snake_y[0] == food_y) {
    snake_len++;
    random_food();
  }
  // 判断游戏是否结束
  if (snake_x[0] < 0 || snake_x[0] >= WIDTH ||
    snake_y[0] < 0 || snake_y[0] >= HEIGHT)
    game_over = true;
  
  for (int i = 1; i < snake_len; i++) {
    if (snake_x[0] == snake_x[i] && snake_y[0] == snake_y[i])
      game_over = true;
    
  }
}

其中,`for`循环用于更新蛇的位置,根据蛇的当前方向进行移动。`random_food`函数用于随机生成新的食物位置。游戏是否结束的判断则是根据蛇是否越界,以及蛇是否碰到了自身完成的。

最后,我们需要实现一个主函数,用于启动游戏的循环:

int main(int argc, char** argv) {
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  glutInitWindowSize(WIDTH, HEIGHT);
  glutCreateWindow("Snake");
  init();
  glutDisplayFunc(draw);
  glutIdleFunc(game_loop);
  glutKeyboardFunc(process_key);
  glutMainLoop();
}

其中,`glutInitDisplayMode`用于设置OpenGL的显示模式,`glutInitWindowSize`用于设置游戏窗口的大小,`glutCreateWindow`用于创建游戏窗口,`glutDisplayFunc`用于指定绘制函数,`glutIdleFunc`用于指定游戏主循环函数,`glutKeyboardFunc`用于指定键盘操作函数。`glutMainLoop`用于启动游戏循环,在游戏结束之前不会返回。

现在,我们已经完成了一个使用C++实现的贪吃蛇游戏代码。这个游戏不仅具有基本的游戏功能,还可以自由调整游戏区域、蛇和食物的大小和位置,甚至可以添加更多的游戏元素,比如障碍物、加速器等。希望这个例子能够帮助大家理解C++编程的基本思路和方法,并且为自己的编程实践提供一些启发和参考。

  
  

评论区