21xrx.com
2024-12-22 21:21:05 Sunday
登录
文章检索 我的文章 写文章
C++贪吃蛇游戏代码及详解
2023-07-11 11:41:13 深夜i     --     --
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++ 游戏开发有更深入的了解,更好的将其应用到实际的游戏开发中。

  
  

评论区

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