C++实现简单贪吃蛇小游戏

 更新时间:2021年05月25日 10:17:36   作者:纯粹.  
这篇文章主要为大家详细介绍了C++实现简单贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C++实现简单贪吃蛇小游戏的具体代码,供大家参考,具体内容如下

1 贪吃蛇游戏原理

1.1 构造蛇身:定义一个坐标数组,存放的是蛇的每一节蛇身所在的坐标位置。

1.2 移动效果:每次移动时,将每一节蛇身(蛇头除外)依次往前移动一节,去掉蛇的最后一节,确定蛇的方向

1.3 移动判断:每次移动时,判断蛇头是否触碰食物,如果碰到了食物,只进行前移蛇身和增加蛇头的操作,不进行擦除蛇尾的操作

2游戏设计

2.1 游戏首页

2.2 开始游戏

2.3 退出游戏

3.游戏实现

3.1 游戏首页

void fist_show()
{
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
 cout << "        贪吃蛇游戏       " << endl;
 cout << "                          " << endl;
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
 cout << "*————————————*" << endl;
 cout << "*                        *" << endl;
 cout << "*                        *" << endl;
 cout << "*       1,游戏说明      *" << endl;
 cout << "*       2,开始游戏      *" << endl;
 cout << "*       3,结束游戏      *" << endl;
 cout << "*                        *" << endl;
 cout << "*                        *" << endl;
 cout << "*————————————*" << endl;
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
 system("pause");
 system("cls");
}

游戏说明介绍

void game_instruction()
{
 color(5);
 cout << "*********游戏说明如下:***********" << endl;
 color(3);
 cout << "*                                *" << endl;
 cout << "*  使用↑.↓.←.→控制蛇的移动   *" << endl;
 cout << "*  不能咬到自己                  *" << endl;
 cout << "*  不能撞到墙                    *" << endl;
 cout << "*  按到空格键暂停游戏            *" << endl;
 color(5);
 cout << "**********************************" << endl;
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
 system("pause");
 system("cls");
}

3.2 游戏开始

// 食物的坐标
struct food{
 int x;
 int y;
}food1;

//蛇的相关属性
struct snake {
 int speed;//蛇移动的速度
 int len;//蛇的当前长度
 int x[snake_length];//组成蛇身的每一个*中x的坐标
 int y[snake_length];//组成蛇身的每一个*中y的坐标

}snake1;

将光标移动到控制台的(x,y)坐标点处

//将光标移动到控制台的(x,y)坐标点处
void gotoxy(int x, int y)
{
 COORD coord;
 coord.X = x;
 coord.Y = y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

绘制地图

void creat_map()
{
 //打印上下边框
  for (int i = 0; i <= wide; i += 1)
  {
   //将光标移动依次到(i,0)处打印上边框
   gotoxy(i, 0);
   cout<<"*";
   gotoxy(i, hight);
   cout << "*";
  }

  //打印左右边框
  for (int i = 1; i < hight; i++)
  {
   //将光标移动依次到(0,i)处打印左边框
   gotoxy(0, i);
   cout << "*";
   gotoxy(wide, i);
   cout << "*";
  }
}

初始化蛇身和食物

void init()
{
//随机生成初始食物
  
  food1.x = rand() % (wide - 2) + 2;
  food1.y = rand() % (hight - 2) + 1;
  gotoxy(food1.x, food1.y);
  cout<<"★";
  //初始化蛇的属性
  snake1.len = 4;
  snake1.speed = 200;

  //在屏幕中间生成蛇头
  snake1.x[0] = wide / 2 + 2;//x坐标为偶数
  snake1.y[0] = hight / 2;
  //打印蛇头
  gotoxy(snake1.x[0], snake1.y[0]);
  cout<<"■";

  //生成初试的蛇身
  for (int i = 1; i < snake1.len; i++)
  {
   //蛇身的打印,纵坐标不变,横坐标为上一节蛇身的坐标值+2
   snake1.x[i] = snake1.x[i - 1] + 2;
   snake1.y[i] = snake1.y[i - 1];
   gotoxy(snake1.x[i], snake1.y[i]);
   printf("■");
  }
 
}

让蛇移动

void snake_move() 
{
 int pre_key = key;
 key = _getch();

 
 
 *changeFlag为0表明此时没有吃到食物,因此每走一步就要擦除掉蛇尾,以此营造一个移动的效果
 *为1表明吃到了食物,就不需要擦除蛇尾,以此营造一个蛇身增长的效果
 */
 if (changeFlag == 0)
 {
  gotoxy(snake1.x[snake1.len - 1], snake1.y[snake1.len - 1]);
  cout<<"  ";//在蛇尾处输出空格即擦去蛇尾
 }

 //将蛇的每一节依次向前移动一节(蛇头除外)
 for (int i = snake1.len - 1; i > 0; i--)
 {
  snake1.x[i] = snake1.x[i - 1];
  snake1.y[i] = snake1.y[i - 1];
 }

 //蛇当前移动的方向不能和前一次的方向相反,比如蛇往左走的时候不能直接按右键往右走
 //如果当前移动方向和前一次方向相反的话,把当前移动的方向改为前一次的方向
 if (pre_key == 4 && key == 5)
 {
  key = 4;
 }
  
 if (pre_key == 5 && key == 4)
 {
  key = 5;
 }
  
 if (pre_key == 6 && key == 7)
 {
  key = 6;
 }
  
 if (pre_key == 7 && key == 6)
 {
  key = 7;
 }
  

 
 //判断蛇头应该往哪个方向移动
 switch (key)
 {
 case 4:
  snake1.x[0] -= 2;//往左
  break;
 case 5:
  snake1.x[0] += 2;//往右
  break;
 case 6:
  snake1.y[0]--;//往上
  break;
 case 7:
  snake1.y[0]++;//往下
  break;
 }
 //打印出蛇头
 gotoxy(snake1.x[0], snake1.y[0]);
 printf("■");
 gotoxy(wide - 2, 0);
 //由于目前没有吃到食物,changFlag值为0
 changeFlag = 0;
 return;
}

创造食物

void createFood()
{
 if (snake1.x[0] == food1.x && snake1.y[0] == food1.y)//蛇头碰到食物
 {
  //蛇头碰到食物即为要吃掉这个食物了,因此需要再次生成一个食物
  while (1)
  {
   int flag = 1;
   food1.x = rand() % (wide - 4) + 2;
   food1.y = rand() % (hight - 2) + 1;

   //随机生成的食物不能在蛇的身体上
   for (int i = 0; i < snake1.len; i++)
   {
    if (snake1.x[i] == food1.x && snake1.y[i] == food1.y)
    {
     flag = 0;
     break;
    }
   }
  }

  //绘制食物
  gotoxy(food1.x, food1.y);
  printf("★");

  snake1.len++;//吃到食物,蛇身长度加1
  sorce += 10;//每个食物得10分
  snake1.speed -= 5;//随着吃的食物越来越多,速度会越来越快
  changeFlag = 1;//很重要,因为吃到了食物,就不用再擦除蛇尾的那一节,以此来造成蛇身体增长的效果
 }
 return;
}

判断蛇的规则

//判断蛇运动是否符合规则
bool snakeStatus()
{
 //蛇头碰到上下边界,游戏结束
 if (snake1.y[0] == 0 || snake1.y[0] == hight)
  return false;
 //蛇头碰到左右边界,游戏结束
 if (snake1.x[0] == 0 || snake1.x[0] == wide)
  return false;
 //蛇头碰到蛇身,游戏结束
 for (int i = 1; i < snake1.len; i++)
 {
  if (snake1.x[i] == snake1.x[0] && snake1.y[i] == snake1.y[0])
   return false;
 }
 return true;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 给ActiveX签名的实现方法详解

    给ActiveX签名的实现方法详解

    本篇文章是对给ActiveX签名的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言广播的使用详解

    C语言广播的使用详解

    顾名思义可以把自己的数据发送给在特定范围内的所有人;我们网络编程中的广播一般是通过特定的广播地址把自己的数据发送给局域网内当前在线的客户端
    2022-05-05
  • C语言动态内存分配函数的实现

    C语言动态内存分配函数的实现

    这篇文章主要介绍了C语言动态内存分配函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • C语言计算分段函数问题

    C语言计算分段函数问题

    这篇文章主要介绍了C语言计算分段函数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C语言中进行大小写字母转化的示例代码

    C语言中进行大小写字母转化的示例代码

    C语言标准库中提供了用于大小写转换的函数,使得这一操作变得简单而高效,本文将详细介绍如何在C语言中进行大小写字母的转换,包括相关的函数和示例代码,需要的朋友可以参考下
    2024-03-03
  • C++传值、传址、传引用的区别和选择小结

    C++传值、传址、传引用的区别和选择小结

    参数传递有传值、传址和传引用这三种,本文主要介绍了C++传值、传址、传引用的区别和选择小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • 利用C语言编写一个无限循环语句

    利用C语言编写一个无限循环语句

    这篇文章主要介绍了利用C语言编写一个无限循环语句问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 15种 C++ 常见报错原因分析

    15种 C++ 常见报错原因分析

    这篇文章主要介绍了15种 C++ 常见报错,本文通过实例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • C语言进阶教程之预处理

    C语言进阶教程之预处理

    C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等,下面这篇文章主要给大家介绍了关于C语言进阶教程之预处理的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 归并排序的递归实现与非递归实现代码

    归并排序的递归实现与非递归实现代码

    以下是对归并排序的递归实现与非递归实现代码进行了详细的介绍,需要的朋友可以过来参考下
    2013-08-08

最新评论