我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++如何实现简易贪吃蛇游戏

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++如何实现简易贪吃蛇游戏

这篇文章主要介绍C++如何实现简易贪吃蛇游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

C++实现建议贪吃蛇(不会闪屏幕)

使用vs2013完成。记录踏上游戏开发的道路。

效果图

C++如何实现简易贪吃蛇游戏

代码

// 2021.7.24.1贪吃蛇.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <list>#include <numeric>  #include <algorithm> #include <Windows.h>#include <WinUser.h>#include <cstdlib>#include <ctime>#include <vector>using namespace std;#define KEY_DOWN(vk_code) (GetAsyncKeyState(vk_code) & 0x8000 ? 1 : 0)#define MAX_SNAKE_LEN 20#define MAP_MAXIMUM_HEIGHT 20#define MAP_MAXIMUM_WIDTH 20#define MAX_NUMBER_FRUIT 5struct sSnakeBody{ void setPostion(int x, int y) {  nSnakeBodyX = x;  nSnakeBodyY = y; } void setPostion(sSnakeBody* temp) {  nSnakeBodyX = temp->nSnakeBodyX;  nSnakeBodyY = temp->nSnakeBodyY; } int nSnakeBodyX; int nSnakeBodyY;};typedef list<sSnakeBody> LISTSNAKEBODY;struct sSnake{ sSnake() {  nSnakeHeadX = 1;  nSnakeHeadY = 1;  nSnakeDirection = 1;  speed = 5; } bool isExit(sSnakeBody temp) {  if (nSnakeHeadX==temp.nSnakeBodyX&&nSnakeHeadY==temp.nSnakeBodyY)  {   return true;  }  return false; } bool isExit(int x, int y) {  if (nSnakeHeadX == x&&nSnakeHeadY == y)  {   return true;  }  return false; } void reduction(sSnakeBody temp) {  nSnakeHeadX = 2 * nSnakeHeadXBk - temp.nSnakeBodyX;  nSnakeHeadY = 2 * nSnakeHeadYBk - temp.nSnakeBodyY; } int nSnakeHeadX; int nSnakeHeadY; int nSnakeHeadXBk; int nSnakeHeadYBk; int nSnakeDirection;//0表示上,1表示右,2表示下,3表示左,顺时针 int speed;//指的是几个循环前进一次 LISTSNAKEBODY snakeBodyList[MAX_SNAKE_LEN];};struct sFruit{ int FruitX; int FruitY; sFruit() {  FruitX = -1;  FruitY = -1; } sFruit(int x, int y) {  FruitX = x;  FruitY = y; } bool isExit(sSnake snake) {  if (FruitX == snake.nSnakeHeadX && FruitY == snake.nSnakeHeadY)   return true;  else return false; }};vector<sFruit> gFruitVector;sSnake gSnake;//显示地图void showArrMap(int arrMap[MAP_MAXIMUM_HEIGHT][MAP_MAXIMUM_WIDTH]){ system("cls"); for (int i = 0; i < MAP_MAXIMUM_HEIGHT; i++) {  for (int j = 0; j < MAP_MAXIMUM_WIDTH; j++)  {   if (1 == arrMap[i][j] || gSnake.isExit(i,j))   {    cout << "■";   }   else if (arrMap[i][j] == 2)   {    cout << "●";   }   else   {    cout << "  ";   }  }  if (4 == i)  {   cout << "\t得分:" << gSnake.snakeBodyList->size();  }  cout << endl; }}//将数据加载到地图上。返回值为加载后游戏是否失败bool mapLoadData(int arrMap[MAP_MAXIMUM_HEIGHT][MAP_MAXIMUM_WIDTH]){ //加载水果的数据 for (unsigned int i = 0; i < gFruitVector.size(); i++) {  arrMap[gFruitVector[i].FruitX][gFruitVector[i].FruitY] = 2; } //加载蛇的身体数据 for (LISTSNAKEBODY::iterator iter = gSnake.snakeBodyList->begin(); iter != gSnake.snakeBodyList->end(); iter++) {  arrMap[iter->nSnakeBodyX][iter->nSnakeBodyY] = 1; } // 吃到第一个水果的时候,一定不是游戏失败 if (gSnake.snakeBodyList->size() == 1 && gSnake.isExit(gSnake.snakeBodyList->front())) {  return false; } if (arrMap[gSnake.nSnakeHeadX][gSnake.nSnakeHeadY] == 1)  return true; return false;}//更新蛇的数据void updateSnake(int &nProgramCounter){ if (nProgramCounter > gSnake.speed) {  gSnake.nSnakeHeadXBk = gSnake.nSnakeHeadX;  gSnake.nSnakeHeadYBk = gSnake.nSnakeHeadY;  if (gSnake.nSnakeDirection == 0)  {   gSnake.nSnakeHeadX--;  }  else if (gSnake.nSnakeDirection == 1)  {   gSnake.nSnakeHeadY++;  }  else if (gSnake.nSnakeDirection == 2)  {   gSnake.nSnakeHeadX++;  }  else if (gSnake.nSnakeDirection == 3)  {   gSnake.nSnakeHeadY--;  }  if (gSnake.snakeBodyList->size() != 0)  {   if (gSnake.isExit(gSnake.snakeBodyList->front()))   {    gSnake.reduction(gSnake.snakeBodyList->front());   }  }  //蛇的身体移动  if (gSnake.snakeBodyList->size() != 0)  {   sSnakeBody snakeBody;   snakeBody.setPostion(gSnake.nSnakeHeadXBk, gSnake.nSnakeHeadYBk);   gSnake.snakeBodyList->push_front(snakeBody);   gSnake.snakeBodyList->pop_back();  }  nProgramCounter = 0; }}//绑定键盘事件void bindKeyboardEvents(){ if (KEY_DOWN(VK_UP)) {  gSnake.nSnakeDirection = 0; } else if (KEY_DOWN(VK_RIGHT)) {  gSnake.nSnakeDirection = 1; } else if (KEY_DOWN(VK_DOWN)) {  gSnake.nSnakeDirection = 2; } else if (KEY_DOWN(VK_LEFT)) {  gSnake.nSnakeDirection = 3; } if (KEY_DOWN(VK_SHIFT)) {  gSnake.speed = 2; } else {  gSnake.speed = 5; }}//随机生成 N 个水果,void randomlyGeneratedFruit(int N, int arrMap[MAP_MAXIMUM_HEIGHT][MAP_MAXIMUM_WIDTH]){ int maxi = MAP_MAXIMUM_HEIGHT; int maxj = MAP_MAXIMUM_WIDTH; int AllCnt = 0; vector<int> randMap; for (int i = 0; i < maxi; i++) {  for (int j = 0; j < maxj; j++)  {   if (0 == arrMap[i][j])   {    randMap.push_back(i*maxj + j);    AllCnt++;   }  } } if (AllCnt < N) {  N = AllCnt; } for (int i = 0; i < N; i++) {  int temp = (rand() % AllCnt--);  randMap.erase(randMap.begin() + temp);  sFruit fruitTemp = sFruit(temp / maxi + 1, temp % (maxi - 2) + 1);  gFruitVector.push_back(fruitTemp); }}//初始化地图void initArrMap(int arrMap[MAP_MAXIMUM_HEIGHT][MAP_MAXIMUM_WIDTH]){ for (int i = 0; i < MAP_MAXIMUM_HEIGHT; i++) {  for (int j = 0; j < MAP_MAXIMUM_WIDTH; j++)  {   if (i == 0 || j == 0 || i == MAP_MAXIMUM_HEIGHT - 1 || j == MAP_MAXIMUM_WIDTH - 1)    arrMap[i][j] = 1;   else    arrMap[i][j] = 0;  } }}//初始化水果数据void initFruit(int arrMap[MAP_MAXIMUM_HEIGHT][MAP_MAXIMUM_WIDTH]){ randomlyGeneratedFruit(MAX_NUMBER_FRUIT, arrMap);}//蛇头吃到水果事件void eatFruitEvent(int arrMap[MAP_MAXIMUM_HEIGHT][MAP_MAXIMUM_WIDTH]){ for (unsigned int i = 0; i < gFruitVector.size(); i++) {  if (gFruitVector[i].isExit(gSnake))  {   sSnakeBody snakeBodyTemp;   if (gSnake.snakeBodyList->size() == 0)   {    snakeBodyTemp.setPostion(gSnake.nSnakeHeadX, gSnake.nSnakeHeadY);   }   else   {    snakeBodyTemp.setPostion(&gSnake.snakeBodyList->back());   }   gSnake.snakeBodyList->push_back(snakeBodyTemp);   gFruitVector.erase(gFruitVector.begin() + i);   randomlyGeneratedFruit(1, arrMap);  } }}int _tmain(int argc, _TCHAR* argv[]){ HANDLE hOutput; COORD coord = { 0, 0 }; hOutput = GetStdHandle(STD_OUTPUT_HANDLE); //创建新的缓冲区 HANDLE hOutBuf = CreateConsoleScreenBuffer(  GENERIC_READ | GENERIC_WRITE,  FILE_SHARE_READ | FILE_SHARE_WRITE,  NULL,  CONSOLE_TEXTMODE_BUFFER,  NULL  ); //设置新的缓冲区为活动显示缓冲 SetConsoleActiveScreenBuffer(hOutBuf); //隐藏两个缓冲区的光标 CONSOLE_CURSOR_INFO cci; cci.bVisible = 0; cci.dwSize = 1; SetConsoleCursorInfo(hOutput, &cci); SetConsoleCursorInfo(hOutBuf, &cci); //双缓冲处理显示 DWORD bytes = 0; char data[3200]; //地图,需要将数据映射到地图上,再去渲染地图。 int arrMap[MAP_MAXIMUM_HEIGHT][MAP_MAXIMUM_WIDTH]; srand(time(NULL)); //计数器。 int nProgramCounter = 0; //初始化各个数据 initArrMap(arrMap); initFruit(arrMap); while (true) {  nProgramCounter++;  initArrMap(arrMap);  bindKeyboardEvents();  updateSnake(nProgramCounter);  eatFruitEvent(arrMap);  bool bIsWin = mapLoadData(arrMap);  showArrMap(arrMap);  if (bIsWin)  {   cout << endl << "游戏失败!!!";   ReadConsoleOutputCharacterA(hOutput, data, 3200, coord, &bytes);   WriteConsoleOutputCharacterA(hOutBuf, data, 3200, coord, &bytes);   break;  }  ReadConsoleOutputCharacterA(hOutput, data, 3200, coord, &bytes);  WriteConsoleOutputCharacterA(hOutBuf, data, 3200, coord, &bytes); } system("pause"); return 0;}

以上是“C++如何实现简易贪吃蛇游戏”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++如何实现简易贪吃蛇游戏

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++如何实现简易贪吃蛇游戏

这篇文章主要介绍C++如何实现简易贪吃蛇游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!C++实现建议贪吃蛇(不会闪屏幕)使用vs2013完成。记录踏上游戏开发的道路。效果图代码// 2021.7.24.1贪吃蛇.
2023-06-20

c++如何实现超简单的贪吃蛇游戏

小编给大家分享一下c++如何实现超简单的贪吃蛇游戏,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!设计思路 建议先将代码复制下来跑一遍再来看思路!!! 通俗易懂,请仔细看。 值得注意
2023-06-22

C语言如何实现简单的贪吃蛇游戏

本篇内容主要讲解“C语言如何实现简单的贪吃蛇游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何实现简单的贪吃蛇游戏”吧!运行效果代码#include #inclu
2023-07-04

java如何实现简单贪吃蛇小游戏

这篇文章给大家分享的是有关java如何实现简单贪吃蛇小游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下有两个类,放在同一文件下下即可,背景图片,标题,蛇尾可自行更改import java.awt.*
2023-06-15

python如何实现简单贪吃蛇小游戏

本篇内容介绍了“python如何实现简单贪吃蛇小游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 导入游戏库import pgzrun
2023-07-02

如何使用Vue3及Canvas实现简易的贪吃蛇游戏

这篇“如何使用Vue3及Canvas实现简易的贪吃蛇游戏”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用Vue3及Ca
2023-07-06

C语言实现简易贪吃蛇游戏的示例代码

这篇文章主要介绍了如何利用C语言实现一个经典的小游戏——贪吃蛇,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
2022-11-13

js如何实现贪吃蛇游戏

本篇内容介绍了“js如何实现贪吃蛇游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!两个小时完成的,有点简陋。直接看效果。打开调试面板,在r
2023-06-14

QT如何实现贪吃蛇游戏

这篇文章主要介绍了QT如何实现贪吃蛇游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。为了熟悉QT的相关知识,我用了大约8个小时的时间用QT再次写了一遍贪吃蛇。因为QT的机制
2023-06-15

python如何实现贪吃蛇游戏

这篇文章主要介绍了python如何实现贪吃蛇游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。游戏实现效果如下:后面有完整代码和解析import sysimport pyga
2023-06-14

C#游戏开发之实现贪吃蛇游戏

这篇文章主要为大家详细介绍了C#如何实现经典贪吃蛇游戏,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
2023-01-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录