C++ vector容器实现贪吃蛇小游戏

本文实例为大家分享了C++ vector容器 实现贪吃蛇,供大家参考,具体内容如下

使用vector容器实现贪吃蛇简化了很多繁琐操作,且相比之前我的代码已经做到了尽量的简洁

技术环节:

编译环境:windows VS2019

需求:

控制贪吃蛇吃食物,吃到一个食物蛇身变长一节,得分增加,撞墙或撞自己则游戏结束。

思路:

创建一个vector容器,容器内存储蛇的每节身体的结构变量,结构变量中保存蛇身体的xy坐标,通过使用vector成员方法不断添加和删除容器中的数据,实现蛇坐标的规律移动,吃到食物等时执行对应操作。

在代码注释中标注了每一步是怎么实现的。

注意:

由于编译器原因程序中_kbhit()和_getch()函数可能在其他编译器上编译会出现错误,解决办法是去掉函数前面的“_”。

运行效果:

#include <iostream>
#include <vector>
#include <windows.h>
#include <conio.h>
#include <ctime>

using namespace std;

void gotoxy(int x, int y); //光标定位

//食物类
class Food
{
private:
 int m_x;
 int m_y;
public:
 void randfood()  //随机产生一个食物
 {
 srand((int)time(NULL));
 L1:
 m_x = rand() % (85) + 2;
 m_y = rand() % (25) + 2;

 if (m_x % 2) //如果食物的x坐标不是偶数则重新确定食物的坐标
  goto L1;

 gotoxy(m_x, m_y); //在确认好的位置输出食物
 cout << "★";
 }
 int getFoodm_x() //返回食物的x坐标
 {
 return m_x;
 }
 int getFoodm_y() //返回食物的y坐标
 {
 return m_y;
 }
};

//蛇类
class Snake
{
private:
 //蛇坐标结构
 struct Snakecoor
 {
 int x;
 int y;
 };
 //蛇容器
 vector<Snakecoor> snakecoor;

 //判断和改变方向函数
 void degdir(Snakecoor& nexthead) //参数:新蛇头结构变量、蛇坐标容器
 {
 static char key = 'd'; //静态变量防止改变移动方向后重新改回来

 if (_kbhit())  //改变蛇前进的方向
 {
  char temp = _getch();

  switch (temp) //如果临时变量的值为wasd中的一个,则赋值给key
  {
  default:
  break;
  case 'w':
  case 'a':
  case 's':
  case 'd':
  //如果temp的方向和key的方向不相反则赋值
  if ((key == 'w' && temp != 's') || (key == 's' && temp != 'w') || \
   (key == 'a' && temp != 'd') || (key == 'd' && temp != 'a'))
   key = temp;
  }
 }

 switch (key) //根据key的值确定蛇的移动方向
 {
 case 'd':
  nexthead.x = snakecoor.front().x + 2;  //新的蛇头的头部等于容器内第一个数据(旧蛇头)x坐标+2
  nexthead.y = snakecoor.front().y;
  break;
 case 'a':
  nexthead.x = snakecoor.front().x - 2;
  nexthead.y = snakecoor.front().y;
  break;
 case 'w':
  nexthead.x = snakecoor.front().x;
  nexthead.y = snakecoor.front().y - 1;
  break;
 case 's':
  nexthead.x = snakecoor.front().x;
  nexthead.y = snakecoor.front().y + 1;
 }

 }

 //游戏结束时需要做的事情
 void finmatt(const int score)
 {
 system("cls");
 gotoxy(40, 14);
 cout << "游戏结束";
 gotoxy(40, 16);
 cout << "得分:" << score;
 gotoxy(0, 26);
 exit(0);
 }

 //游戏结束的情况
 void finishgame(const int score)
 {
 //撞墙情况
 if (snakecoor[0].x >= 88 || snakecoor[0].x < 0 || snakecoor[0].y >= 28 || snakecoor[0].y < 0)
  finmatt(score);

 //撞到自己情况
 for (int i = 1; i < snakecoor.size(); i++)
  if (snakecoor[0].x == snakecoor[i].x && snakecoor[0].y == snakecoor[i].y)
  finmatt(score);
 }
public:
 //构造初始化蛇的位置
 Snake()
 {
 Snakecoor temp; //临时结构变量用于创建蛇

 for (int i = 5; i >= 0; i--) //反向创建初始蛇身,初始蛇头朝东
 {
  temp.x = 16 + (i << 1); //偶数
  temp.y = 8;
  snakecoor.push_back(temp);
 }

 }

 //蛇运动主要函数
 void move(Food& food, int& score)
 {
 Snakecoor nexthead;  //新蛇头变量

 degdir(nexthead);  //判断和改变蛇前进的方向

 snakecoor.insert(snakecoor.begin(), nexthead); //将新的蛇头插入容器头部

 gotoxy(0, 0);
 cout << "得分:" << score;  //每次移动都在左上角刷新得分

 finishgame(score);  //判断游戏结束函数

 if (snakecoor[0].x == food.getFoodm_x() && snakecoor[0].y == food.getFoodm_y()) //蛇头与食物重合
 {
  gotoxy(snakecoor[0].x, snakecoor[0].y); //吃到食物时因为直接返回此次移动没有输出蛇身,会少输出一次蛇
  cout << "●";   //所以在这里补上蛇移动时需要输出的字符
  gotoxy(snakecoor[1].x, snakecoor[1].y);
  cout << "■";

  score++;  //吃到食物得分+1

  food.randfood(); //如果蛇头坐标和食物坐标重合则重新产生一个食物
  return;   //直接结束本次移动
 }

 for (int i = 0; i < snakecoor.size(); i++) //遍历容器,判断食物与蛇身是否重合并输出整条蛇
 {
  gotoxy(snakecoor[i].x, snakecoor[i].y);

  if (!i)    //头部输出圆形否则输出方块
  cout << "●";
  else
  cout << "■";

  //如果食物刷新到了蛇身上,则重新产生一个食物
  if (snakecoor[i].x == food.getFoodm_x() && snakecoor[i].y == food.getFoodm_y())
  food.randfood();
 }

 gotoxy(snakecoor.back().x, snakecoor.back().y); //在容器尾部的地方输出空格
 cout << " ";
 snakecoor.pop_back();   //删除容器中最后一个数据
 }

};

void HideCursor()  //隐藏光标
{
 CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void gotoxy(int x, int y) //光标定位
{
 COORD pos = { x,y };
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

//主函数
int main()
{
 system("mode con cols=88 lines=28");  //设置控制台窗口大小
 system("title C++ 贪吃蛇");      //设置标题
 HideCursor();     //光标隐藏

 int score = 0;  //得分变量

 Food food;   //食物对象
 food.randfood();  //开局随机产生一个食物

 Snake snake;  //蛇对象

 while (true)
 {
 snake.move(food, score);//蛇移动

 Sleep(150); //游戏速度
 }

 return 0;
}

不足之处:

因为初学C++,所以程序中肯定还有一些不规范或不合理的地方。

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

(0)

相关推荐

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

    我大概在一个多月前把自己上学期写的c代码的贪吃蛇游戏push到csdn上,并且说c风格的贪吃蛇写起来有些麻烦(贪吃蛇游戏的c语言实现),准备用面向对象的c++再写一遍.现在我们专业恰好刚教完了c++,学校也布置了一道简单的贪吃蛇的编程题目,实现下来,的确觉得c++的思路清晰很多,所以再次把c++的代码push上来,供大家对比参考:) 直接上代码,c++把整个游戏拆分成几个文件,分开上,有一定的c++基础的同学应该可以很容易看懂. 1.全局头文件(global.hpp) #ifndef _GLOB

  • C/C++实现贪吃蛇逐步运动效果

    本文实例为大家分享了C/C++实现贪吃蛇逐步运动效果的代码,供大家参考,具体内容如下 主要使用结构数组和结构指针,再用easyx图形库进行的绘图,以供讨论和学习 #include <conio.h> //建立储存蛇身的结构体 struct snack { int x; int y; }; //决定方向 int fangxiang=3;//w=0,s=1,a=2,d=3 // 按键变量 char anjian=0; //调整坐标关系 int tiaozheng(struct snack *a);

  • 利用C/C++实现较完整贪吃蛇游戏

    记得在大一时刚学习c/c++语言,学到一半突然想用这门语言做一些小游戏出来,首先想到的便是贪吃蛇.于是本人利用空余时间写出了这么一个简单的小游戏. 由于当时的我还没有能力构造出用户界面,故直接使用dos界面运行.那么问题来了,如何让一个字符在dos界面上自由移动???对于这个问题我采用的解决方案是实现gotoxy函数来控制指针位置从而实现字符的移动.那么我们就先来实现这个函数. gotoxy 函数并非系统函数,我将其储存于 gotoxy.h 的头文件中方便调用. gotoxy.h #includ

  • 贪吃蛇游戏C++命令行版实例代码

    本文实例讲述了贪吃蛇游戏C++命令行版的实现代码,是非常经典的游戏.分享给大家供大家参考.具体实现方法如下: 众所周知,贪吃蛇游戏是经典的计算机游戏. 游戏描述如下: 1. 贪吃蛇可以自动直线前进,或者玩家可以通过方向键操纵贪吃蛇上下左右前进,每次前进一格. 2. 贪吃蛇在规定的区域内活动,当: ①贪吃蛇触碰到墙壁时: ②贪吃蛇的蛇头触碰到蛇身或者蛇尾时: ③玩家的键盘输入不是方向键时: 命令行显示"Game Over!"并且退出游戏. 3. 贪吃蛇活动的区域内每次随机产生一颗&quo

  • C++基于控制台实现的贪吃蛇小游戏

    本文实例讲述了C++基于控制台实现的贪吃蛇小游戏.分享给大家供大家参考.具体实现方法如下: #include <windows.h> #include <time.h> #include <stdio.h> #define MAX 100 #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4 #define MOVING 5 #define STOP 0 HANDLE hMain_Out = NULL; H

  • C++ vector容器实现贪吃蛇小游戏

    本文实例为大家分享了C++ vector容器 实现贪吃蛇,供大家参考,具体内容如下 使用vector容器实现贪吃蛇简化了很多繁琐操作,且相比之前我的代码已经做到了尽量的简洁 技术环节: 编译环境:windows VS2019 需求: 控制贪吃蛇吃食物,吃到一个食物蛇身变长一节,得分增加,撞墙或撞自己则游戏结束. 思路: 创建一个vector容器,容器内存储蛇的每节身体的结构变量,结构变量中保存蛇身体的xy坐标,通过使用vector成员方法不断添加和删除容器中的数据,实现蛇坐标的规律移动,吃到食物

  • java实现贪吃蛇小游戏

    本文实例为大家分享了java实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 这是MVC模式的完整Java项目,编译运行SnakeApp.java即可开始游戏. 可扩展功能: 1.积分功能:可以创建得分规则的类(模型类的一部分), 在GameController的run()方法中计算得分 2.变速功能:比如加速功能,减速功能,可以在GameController的keyPressed()方法中针对特定的按键设置每一次移动之间的时间间隔,将Thread.sleep(Settings.DEFAUL

  • C++代码实现贪吃蛇小游戏

    本文实例为大家分享了C++实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 1.游戏描述 贪吃蛇可谓是从小玩到大的经典趣味小游戏,蛇每吃到一次食物,身体就会长一节,如果撞到墙或者撞到自身,游戏结束. 2.代码实现 1.首先需要思考的问题是如何指定位置输出字符?这时候就有一个非常强大的函数叫 gotoxy() ,现在库函数里边已经没有了,只能我们自己实现,代码中注释很完整,自行阅读即可. 2.实现了指哪画哪的目标之后,就可以开始游戏内容制作了.首先便是圈地,即画地图,一个简简单单的循环就能安排

  • 原生js实现简单贪吃蛇小游戏

    本文实例为大家分享了js实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 先上图 话不多说,代码奉上,喜欢的请留下你的小星星♥(ˆ◡ˆԅ) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial

  • php实现贪吃蛇小游戏

    贪吃蛇游戏是经典手机游戏,既简单又耐玩.通过控制蛇头方向吃蛋,使得蛇变长,从而获得积分.在诺基亚时代,风靡整个手机界,今天我们来看看另类的,如何使用php来实现贪吃蛇小游戏 废话不多说,代码奉上: control.php <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> </head> <body>  <a href="control.php

  • 纯js和css完成贪吃蛇小游戏demo

    本文实例为大家分享了js贪吃蛇小游戏demo,纯js和css完成,供大家参考,具体内容如下 <!doctype html> <html> <meta charset="utf-8"> <head> <style> *{ margin: 0; padding:0; } .content{ position: absolute; width: 500px; height: 500px; background-color: #212

  • JS学习笔记之贪吃蛇小游戏demo实例详解

    本文实例讲述了JS学习笔记之贪吃蛇小游戏demo实例.分享给大家供大家参考,具体如下: 最近跟着视频教程打了一个贪吃蛇, 来记录一下实现思路, 先上代码 静态页 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>贪吃蛇</title> </head> <style> *{ mar

  • js实现贪吃蛇小游戏

    本文实例为大家分享了js实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> &

  • C语言单链表贪吃蛇小游戏

    C语言实现单链表控制台贪吃蛇小游戏 编译环境:vs2019 需求: 统计游戏开始后的时间,控制贪吃蛇:吃到食物蛇身加长,得分加一:碰墙或蛇头碰到身体减一条生命:生命消耗完则结束游戏. 思路: 使用wasd键控制蛇的移动方向,蛇头碰到食物得分加一,并在地图上随机产生一个食物,累加得分,碰墙或碰自己减一条生命,并初始化整条蛇,生命值为0时结束游戏. 做法: 使用单链表控制贪吃蛇移动的核心思想就是:链表存储贪吃蛇所有坐标,每次循环贪吃蛇不断向一个方向插入一个新的结点作为新的蛇头,按下按键控制新蛇头产生

随机推荐