21xrx.com
2025-04-11 13:26:04 Friday
文章检索 我的文章 写文章
C++贪吃蛇游戏代码及详解
2023-07-11 11:41:13 深夜i     9     0
C++ 贪吃蛇 游戏代码 详解 程序设计

贪吃蛇游戏是一款大家耳熟能详的经典游戏,它可以带给玩家们无尽的乐趣和挑战。在本文中,我们将分享一份 C++ 贪吃蛇游戏代码及其详解,希望对想要了解游戏开发的人们有所帮助。

以下是 C++ 贪吃蛇游戏的代码:

#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
bool gameOver;
const int width = 20;
const int height = 20;
int x, y, fruitX, fruitY, score;
int tailX[100], tailY[100];
int nTail;
enum Direction LEFT;
Direction dir;
void Setup()
{
  gameOver = false;
  dir = STOP;
  x = width / 2;
  y = height / 2;
  fruitX = rand() % width;
  fruitY = rand() % height;
  score = 0;
}
void Draw()
{
  system("cls");
  
  for (int i = 0; i < width+2; i++)
    cout << "#";
  cout << endl;
  for (int i = 0; i < height; i++)
  {
    for (int j = 0; j < width; j++)
    {
      if (j == 0)
        cout << "#";
      if (i == y && j == x)
        cout << "O";
      else if (i == fruitY && j == fruitX)
        cout << "F";
      else
      {
        bool print = false;
        for (int k = 0; k < nTail; k++)
        {
          if (tailX[k] == j && tailY[k] == i)
          
            cout << "o";
            print = true;
          
        }
        if (!print)
          cout << " ";
      }
      if (j == width - 1)
        cout << "#";
    }
    cout << endl;
  }
  for (int i = 0; i < width+2; i++)
    cout << "#";
  cout << endl;
  cout << "Score:" << score << endl;
}
void Input()
{
  if (_kbhit())
  {
    switch (_getch())
    
    case 'a':
      dir = LEFT;
      break;
    case 'd':
      dir = RIGHT;
      break;
    case 'w':
      dir = UP;
      break;
    case 's':
      dir = DOWN;
      break;
    case 'x':
      gameOver = true;
      break;
    
  }
}
void Logic()
{
  int prevX = tailX[0];
  int prevY = tailY[0];
  int prev2X, prev2Y;
  tailX[0] = x;
  tailY[0] = y;
  for (int i = 1; i < nTail; i++)
  {
    prev2X = tailX[i];
    prev2Y = tailY[i];
    tailX[i] = prevX;
    tailY[i] = prevY;
    prevX = prev2X;
    prevY = prev2Y;
  }
  switch (dir)
  {
  case LEFT:
    x--;
    break;
  case RIGHT:
    x++;
    break;
  case UP:
    y--;
    break;
  case DOWN:
    y++;
    break;
  default:
    break;
  }
  if (x > width || x < 0 || y > height || y < 0)
    gameOver = true;
  for (int i = 0; i < nTail; i++)
    if (tailX[i] == x && tailY[i] == y)
      gameOver = true;
  if (x == fruitX && y == fruitY)
  {
    score += 10;
    fruitX = rand() % width;
    fruitY = rand() % height;
    nTail++;
  }
}
int main()
{
  Setup();
  while (!gameOver)
  {
    Draw();
    Input();
    Logic();
    Sleep(100);
  }
  return 0;
}

上述代码可以直接在任意 C++ 编译器中编译运行。代码中用了广泛的 C++ 语法,包括变量声明、循环、条件判断、函数调用等。现在,我们会详细解释代码中每个部分的作用和实现过程。

游戏的主函数

int main()
{
  Setup();
  while (!gameOver)
  {
    Draw();
    Input();
    Logic();
    Sleep(100);
  }
  return 0;
}

该函数是游戏的主要逻辑控制服务函数。它首先调用 Setup 函数来设置游戏的初始状态,然后在游戏运行期间不断执行 Draw、Input 和 Logic 等函数,直到游戏结束或玩家主动退出游戏。最后返回 0 来结束游戏。

Setup 函数

void Setup()
{
  gameOver = false;
  dir = STOP;
  x = width / 2;
  y = height / 2;
  fruitX = rand() % width;
  fruitY = rand() % height;
  score = 0;
}

该函数主要用于游戏的初始设置,包括设置 gameOver 的初始值为 false,表示游戏未结束;dir 的初始值为 STOP,表示蛇静止不动;x、y 的初始值为游戏界面中心的坐标值;fruitX 和 fruitY 的初始值为随机生成的坐标,代表水果的位置;score 的初始值为 0,代表初始分数为 0。

Draw 函数

void Draw()
{
  system("cls");
  for (int i = 0; i < width+2; i++)
    cout << "#";
  cout << endl;
  for (int i = 0; i < height; i++)
  {
    for (int j = 0; j < width; j++)
    {
      if (j == 0)
        cout << "#";
      if (i == y && j == x)
        cout << "O";
      else if (i == fruitY && j == fruitX)
        cout << "F";
      else
      {
        bool print = false;
        for (int k = 0; k < nTail; k++)
        {
          if (tailX[k] == j && tailY[k] == i)
          
            cout << "o";
            print = true;
          
        }
        if (!print)
          cout << " ";
      }
      if (j == width - 1)
        cout << "#";
    }
    cout << endl;
  }
  for (int i = 0; i < width+2; i++)
    cout << "#";
  cout << endl;
  cout << "Score:" << score << endl;
}

该函数的作用是绘制游戏界面,包括游戏地图、蛇和水果的位置、分数等。这里使用了系统函数 system("cls") 来清屏,这是因为绘制过程中需要清空绘图区域,避免重复绘制。该函数在绘制过程中,首先使用 "#" 字符来描绘游戏地图的边框,然后使用 "O" 、"F" 、"o" 等字符来描绘蛇和水果。具体来说,"O" 代表蛇的头部,"o" 代表蛇的身体部分,"F" 代表水果。Draw 函数还需要记录尾巴的位置。和蛇身每一节,利用 tailX 和 tailY 两个数组存储每个身体部分的坐标位置。nTail 变量代表蛇身块的数量。

Input 函数

void Input()
{
  if (_kbhit())
  {
    switch (_getch())
    
    case 'a':
      dir = LEFT;
      break;
    case 'd':
      dir = RIGHT;
      break;
    case 'w':
      dir = UP;
      break;
    case 's':
      dir = DOWN;
      break;
    case 'x':
      gameOver = true;
      break;
    
  }
}

该函数的作用是接收玩家的输入操作。如果玩家按下键盘,则 _kbhit() 函数返回 true,并执行 _getch() 函数来获取用户输入的键值。根据不同的键值,改变 dir 变量的值,从而控制蛇的运动方向。玩家可以使用键盘的方向键来控制蛇的运动方向。

Logic 函数

void Logic()
{
  int prevX = tailX[0];
  int prevY = tailY[0];
  int prev2X, prev2Y;
  tailX[0] = x;
  tailY[0] = y;
  for (int i = 1; i < nTail; i++)
  {
    prev2X = tailX[i];
    prev2Y = tailY[i];
    tailX[i] = prevX;
    tailY[i] = prevY;
    prevX = prev2X;
    prevY = prev2Y;
  }
  switch (dir)
  {
  case LEFT:
    x--;
    break;
  case RIGHT:
    x++;
    break;
  case UP:
    y--;
    break;
  case DOWN:
    y++;
    break;
  default:
    break;
  }
  // 判断游戏是否结束
  if (x > width || x < 0 || y > height || y < 0)
    gameOver = true;
  for (int i = 0; i < nTail; i++)
    if (tailX[i] == x && tailY[i] == y)
      gameOver = true;
  // 判断是否吃到水果
  if (x == fruitX && y == fruitY)
  {
    score += 10;
    fruitX = rand() % width;
    fruitY = rand() % height;
    nTail++;
  }
}

该函数的作用是控制蛇的实际运动。在函数的开头,保存蛇尾部的位置,并将蛇头的新位置存储在 tailX 和 tailY 数组中。通过 for 循环,依次将蛇的身体部分前移,从而让蛇看起来像是整体的运动。接着考虑蛇头的运动,如果 dir 变量为 LEFT、RIGHT、UP 或 DOWN,分别改变 x 和 y 变量的值,从而控制蛇的运动方向。如果蛇的头部触碰到了游戏界面的边缘或者触碰到了自己的身体,那么游戏结束。如果蛇的头部刚好触碰到了水果,那么增加分数,同时在随机位置重新生成新的水果,蛇的身长加 1。

总结:

在本文中,我们了解了 C++ 贪吃蛇游戏的代码和实现逻辑。通过这份代码的详细讲解,我们补充了 C++ 编程的基础知识,懂得了各种操作和方法的实现。希望这篇文章能让大家对 C++ 游戏开发有更深入的了解,更好的将其应用到实际的游戏开发中。

  
  

评论区