21xrx.com
2025-04-17 03:29:39 Thursday
文章检索 我的文章 写文章
完整版贪吃蛇C++代码
2023-07-05 13:04:34 深夜i     7     0
贪吃蛇 C++ 代码 完整版 游戏开发

贪吃蛇是一款经典的电脑游戏,在很多玩家心目中占有重要的地位。如果你也想尝试写一个贪吃蛇游戏,那么可以参考下面的C++代码示例,完整版代码详见:

#include<iostream>
#include<conio.h>
#include<windows.h>
#include<random>
using namespace std;
//定义地图大小
const int width = 40;
const int height = 20;
//定义蛇的结构体
struct Snake
y;
snake[400];
//定义食物的结构体
struct Food
  int xfood;
//定义变量
bool stop = false;
int speed = 100;
int len = 3;
char dir = 'r';
//定义函数
void gotoxy(int x, int y);
void init();//初始化地图、蛇和食物
void draw();//绘制地图、蛇和食物
void update();//更新蛇的位置和状态
bool check();//检测蛇是否碰到墙壁或自身
void produce_food();//产生食物
//主函数
int main()
{
  init();//初始化地图、蛇和食物
  //进入游戏循环
  while(!stop)
  {
    if(_kbhit())//如果按下了键盘上的按键
      dir = _getch();//获取输入的方向键值
    update();//更新蛇的位置和状态
    if(!check())//如果蛇碰到了墙壁或自身
      stop = true;//游戏结束
    draw();//绘制地图、蛇和食物
    Sleep(speed);//休息一段时间,控制游戏速度
  }
  gotoxy(0, height + 2);//将光标移动到地图下面
  return 0;
}
void init()
{
  //隐藏光标,方便游戏界面展示
  HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  CONSOLE_CURSOR_INFO CursorInfo;
  GetConsoleCursorInfo(handle, &CursorInfo);
  CursorInfo.bVisible = false;
  SetConsoleCursorInfo(handle, &CursorInfo);
  //设置地图边框
  for(int i = 0; i <= height + 1; i++)
  {
    for(int j = 0; j <= width + 1; j++)
    {
      if(i == 0 || i == height + 1 || j == 0 || j == width + 1)
        cout << "#";
      else
        cout << " ";
    }
    cout << endl;
  }
  //设置蛇的初始位置
  snake[0].x = width / 2;
  snake[0].y = height / 2;
  for(int i = 1; i < len; i++)
  {
    snake[i].x = snake[i - 1].x - 1;
    snake[i].y = snake[i - 1].y;
  }
  //产生食物
  produce_food();
}
void draw()
{
  //清空地图
  for(int i = 1; i <= height; i++)
  {
    for(int j = 1; j <= width; j++)
    {
      gotoxy(j, i);
      cout << " ";
    }
  }
  //绘制蛇
  for(int i = 0; i < len; i++)
  {
    gotoxy(snake[i].x, snake[i].y);
    if(i == 0)
      cout << "@";
    else
      cout << "O";
  }
  //绘制食物
  gotoxy(food.x, food.y);
  cout << "*";
  //显示分数和速度
  gotoxy(width + 4, 4);
  cout << "分数:" << len - 3;
  gotoxy(width + 4, 6);
  cout << "速度:" << 110 - speed;
  gotoxy(0, height + 2);//将光标移动到地图下面
}
void update()
{
  //根据方向键值更新蛇的位置
  for(int i = len - 1; i >= 1; i--)
  {
    snake[i].x = snake[i - 1].x;
    snake[i].y = snake[i - 1].y;
  }
  if(dir == 'r')
    snake[0].x++;
  else if(dir == 'l')
    snake[0].x--;
  else if(dir == 'u')
    snake[0].y--;
  else if(dir == 'd')
    snake[0].y++;
  //如果吃到了食物,长度加一,并生成新的食物
  if(snake[0].x == food.x && snake[0].y == food.y)
  {
    len++;
    produce_food();
    //控制游戏速度
    if(speed > 10)
      speed -= 10;
  }
}
bool check()
{
  bool flag = true;
  //如果蛇碰到了墙壁
  if(snake[0].x == 0 || snake[0].x == width + 1 ||
    snake[0].y == 0 || snake[0].y == height + 1)
    flag = false;
  //如果蛇碰到了自身
  for(int i = 1; i < len; i++)
  {
    if(snake[0].x == snake[i].x && snake[0].y == snake[i].y)
      flag = false;
  }
  return flag;
}
void produce_food()
{
  //使用随机数产生食物的位置
  random_device rd;
  mt19937 gen(rd());
  uniform_int_distribution<> dis_x(1, width);
  uniform_int_distribution<> dis_y(1, height);
  food.x = dis_x(gen);
  food.y = dis_y(gen);
}
void gotoxy(int x, int y)
{
  COORD pos = y;
  HANDLE hand = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleCursorPosition(hand, pos);
}

这个代码是在控制台中运行的,使用了一些Windows API进行界面的绘制和控制台光标的移动。代码中使用了一个循环来不断地更新蛇的位置和状态,并在每次更新后绘制地图、蛇和食物。

如果你想更好地理解这个代码,建议先安装Visual Studio等C++开发环境,并在其中新建一个控制台项目,把以上代码复制粘贴进去编译和运行一下。如果出现了问题,可以找到对应的行号进行调试。祝你在编写贪吃蛇游戏的时候顺利!

  
  

评论区