21xrx.com
2024-12-22 17:10:29 Sunday
登录
文章检索 我的文章 写文章
C++贪吃蛇游戏代码
2023-07-12 22:06:29 深夜i     --     --
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++编程的基本思路和方法,并且为自己的编程实践提供一些启发和参考。

  
  

评论区

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