21xrx.com
2025-06-20 04:25:57 Friday
登录
文章检索 我的文章 写文章
C++编写贪吃蛇游戏代码
2023-07-06 19:44:30 深夜i     72     0
C++ 贪吃蛇 游戏代码 编写 操作系统

贪吃蛇是一款非常受欢迎的游戏,可以通过C++编写来实现。本文将介绍如何使用C++编写贪吃蛇游戏代码,帮助读者了解游戏设计和代码实现。

首先,我们需要了解贪吃蛇游戏的基本规则。游戏中有一只蛇,它会在一个二维平面上移动,并吃掉食物来延长自己的身体。如果蛇头碰到了自己的身体或者边缘,则游戏结束。玩家需要控制蛇的移动方向,以保持蛇头不会和身体碰撞。

接下来,我们需要设计程序的基本架构。我们的程序需要实现蛇的运动、食物的生成和判断蛇是否死亡等功能。这些功能可以通过类和函数来实现。我们可以定义一个Snake类来表示蛇的属性,包括蛇头位置和身体长度等。然后,我们需要定义一个Game类来处理游戏的逻辑,包括生成食物、检测碰撞和更新界面等功能。

下面是代码的基本实现:

#include <iostream>
#include <vector>
#include <cstdlib>
#include <conio.h>
#include <windows.h>
using namespace std;
// 定义二维坐标
struct Coordinate {
  int x, y;
  Coordinate(int x=0, int y=0): x(x), y(y) {}
};
// 定义蛇的方向
enum Direction RIGHT;
// 定义蛇的坐标信息
class Snake {
public:
  vector<Coordinate> body;  // 蛇的身体
  Direction dir;       // 蛇的方向
  Snake(int x=0, int y=0) {
    body.push_back(Coordinate(x, y));
    dir = RIGHT;
  }
  void move() {
    for (int i = body.size() - 1; i > 0; i--) {
      body[i].x = body[i - 1].x;
      body[i].y = body[i - 1].y;
    }
    switch (dir) {
      case UP:
        body[0].y--;
        break;
      case DOWN:
        body[0].y++;
        break;
      case LEFT:
        body[0].x--;
        break;
      case RIGHT:
        body[0].x++;
        break;
    }
  } 
};
// 定义游戏类
class Game {
private:
  int width, height;     // 界面大小
  Coordinate food;      // 食物的坐标
  Snake snake;        // 蛇的信息
  bool gameOver;       // 游戏结束标志
public:
  Game(int w=20, int h=20): width(w), height(h) {
    food = generateFood();
    gameOver = false;
  }
  Coordinate generateFood() {
    srand(time(NULL));
    int x = rand() % width;
    int y = rand() % height;
    return Coordinate(x, y);
  }
  void checkCollision() {
    Coordinate head = snake.body[0];
    if (head.x < 0 || head.x >= width || head.y < 0 || head.y >= height)
      gameOver = true// 与边缘碰撞
    
    for (int i = 1; i < snake.body.size(); i++) {
      if (head.x == snake.body[i].x && head.y == snake.body[i].y)
        gameOver = true// 与自身碰撞
      
    }
    if (head.x == food.x && head.y == food.y) {  // 吃到食物
      snake.body.push_back(snake.body[snake.body.size() - 1]);
      food = generateFood();
    }
  }
  void update() {
    snake.move();
    checkCollision();
  }
  void draw() {
    system("cls");  // 清空屏幕
    for (int i = 0; i < height; i++) {
      for (int j = 0; j < width; j++) {
        if (i == food.y && j == food.x) {
          cout << "*"// 输出食物
        } else if (snake.body[0].x == j && snake.body[0].y == i)
          cout << "O"// 输出蛇头
         else {
          bool printed = false;
          for (int k = 1; k < snake.body.size(); k++) {
            if (snake.body[k].x == j && snake.body[k].y == i)
              cout << "o"// 输出蛇身
              printed = true;
              break;
            
          }
          if (!printed)
            cout << " ";
          
        }
      }
      cout << endl;
    }
  }
  void play() {
    while (!gameOver) {
      update();
      draw();
      Sleep(200);  // 线程暂停200毫秒
      if (_kbhit()) {  // 判断键盘按键
        switch (_getch()) {
          case 'w':
            if (snake.dir != DOWN)
              snake.dir = UP;
            
            break;
          case 's':
            if (snake.dir != UP)
              snake.dir = DOWN;
            
            break;
          case 'a':
            if (snake.dir != RIGHT)
              snake.dir = LEFT;
            
            break;
          case 'd':
            if (snake.dir != LEFT)
              snake.dir = RIGHT;
            
            break;
        }
      }
    }
    cout << "Game Over!" << endl;
  }
};
int main() {
  Game game;
  game.play();
  return 0;
}

上述代码中,我们使用了vector来表示蛇的身体,使用枚举类型Direction来表示蛇的方向,使用kbhit()和getch()函数来获取键盘按键的输入。我们还使用了Windows.h库中的Sleep函数来暂停线程,实现游戏的动态效果。

我们可以使用Dev-C++等软件来编译和运行上述代码,实现简单的贪吃蛇游戏。当然,我们还可以在代码中进一步添加各种功能和特效,让游戏更加有趣。

  
  

评论区