21xrx.com
2024-12-22 21:14:51 Sunday
登录
文章检索 我的文章 写文章
C++编写贪吃蛇游戏代码
2023-07-06 19:44:30 深夜i     --     --
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++等软件来编译和运行上述代码,实现简单的贪吃蛇游戏。当然,我们还可以在代码中进一步添加各种功能和特效,让游戏更加有趣。

  
  

评论区

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