c++贪吃蛇源代码 完整版 您所在的位置:网站首页 贪吃蛇的代码写出来 c++贪吃蛇源代码 完整版

c++贪吃蛇源代码 完整版

2024-05-30 05:55| 来源: 网络整理| 查看: 265

文章目录 c++ 实现贪吃蛇, 完整源码0.非常重要的注意事项1.数据结构分析:2.程序运行分析3.难点分析1.蛇移动怎么显示?2.怎么控制吃到食物后蛇的速度的变化?3.怎么解决屏幕闪烁? 4.一些废话5.源代码6.运行效果展示7.总结

c++ 实现贪吃蛇, 完整源码 0.非常重要的注意事项

请注意: 1.这是c++代码,请建立.cpp文件而不是.c文件,然后将代码拷贝进去,再使用c++编译器进行编译运行。 2.因为使用了一些c++11标准当中的语法,所以c++编译器的编译标准至少需要设置到c++11以上,不然会报错。编译标准可以在你的IDE里设置,或者使用命令行编译时附加-std=c++11选项。 3.代码中使用了getch()函数,用于无回显的接收用户输入;使用了kbhit()函数用于判断用户是否按下键盘。但是如果你在visual studio中直接运行本代码可能会报错,你可以将上述两个函数替换为_getch()函数和_kbhit()函数就可以了。

1.数据结构分析:

这里我采用双向队列的数据结构存储蛇身节点,目的是:方便,减少屏闪。并且双向队列也能更好的体现贪吃蛇本身的特点。有利于实现,且效率也较高。

2.程序运行分析

程序开始用户随机按下w,a,s,d中任意按键开始游戏并且作为蛇运动的初始方向(如果刚开始觉得蛇的运动速度太慢可以键入’v’使变为当前运行素的1.25倍速,键入’b’则会使之变为当前速度的2/3倍速),然后进入循环持续游戏直到游戏结束,显示分数之后用户输入任意按键退出游戏。

3.难点分析 1.蛇移动怎么显示?

这也就是我采用双向队列的原因,蛇每运动一步,就从双向队列中弹出队尾,然后将新的队首(即蛇头)压入队列首部,然后再清除蛇尾打印蛇身即可,不需要对贪吃蛇全部进行清楚以及打印,可以极大的减少程序运行过程中出现的闪烁现象。如果吃到食物那么本次运动就会在将蛇尾变为蛇头的同时再加入一个蛇身达到使蛇身长度加一的目的(我认为双向队列更能从本质上体现贪吃蛇本来的特点,而每次弹出队尾,加入队首而不对中间的蛇身进行改变也使程序变得更加简洁,运行更流畅)

2.怎么控制吃到食物后蛇的速度的变化?

最开始我设置初始速度为1000(即:Sleep()函数的参数为1000)每次吃到食物就将速度乘以0.8以此达到加速的目的。但我发现到后面速度越来越快没有上限,根本无法控制。 解法:设置一个上限为MaxSpeed,则速度为 MaxSpeed + Index,MaxSpeed 保持不变且较小作为蛇速度的渐进上限,每次乘以0.8(可自定义)则乘到Index上面,这样的话速度就不会无限制的上升。

3.怎么解决屏幕闪烁?

解:不要使用system(“cls”);清屏函数,使用函数SetConsoleCursorPosition控制光标填充空格进行覆盖能大大减少屏闪问题!!这一点要注意了!

4.一些废话

1.首先肯定是存储蛇身的数据结构方面,有很多种选择:链表,双向队列,循环队列,vector甚至数组都可以用来存储蛇身。 2.最开始以为这个比较简单…上手就开始写写废了一次,提醒大家在写程序(特别是这种结构比较复杂且步骤较多的程序)时一定要先进行规划,想清楚要使用的数据结构以及构建方式,想清楚再写,避免浪费时间。

5.源代码

下面是源代码,还需要什么功能大家可以在此基础上进行改动。

#include #include #include #include #include #include using namespace std; struct Snake { //蛇类结构体 char image; short x, y; //坐标 }; class snakeGame { public: snakeGame(); void printMap(); // 控制光标移动 void gotoxy(short x, short y) { hOut = GetStdHandle(STD_OUTPUT_HANDLE); //获取句柄 pos = {x, y}; SetConsoleCursorPosition(hOut, pos); //移动光标 } //隐藏光标 void HideCursor() { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO CursorInfo; GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息 CursorInfo.bVisible = false; //隐藏控制台光标 SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态 } // 初始化蛇身,可根据需要更改初始长度 void initSnake() { snake.push_front({'@', width / 2, height / 2}); for (int i=0; i for (Snake body : snake) if(body.x == food_x && body.y == food_y) return 0; return 1; } // 产生食物,并打印 void createFood() { do { food_x = rand() % (width - 4) + 2; food_y = rand() % (height - 2) + 1; } while (!WrongLocation());//处理冲突 gotoxy(food_x,food_y); cout char ch; switch(ch=getch()) { case 'w':if (dir != 's') dir = ch;break; case 'a':if (dir != 'd') dir = ch;break; case 's':if (dir != 'w') dir = ch;break; case 'd':if (dir != 'a') dir = ch;break; case 'v':speed*=0.8;break; case 'b':speed*=1.5;break; case ' ':gotoxy(width / 2, height); cout createFood(); eatFood=true; speed*=.8; ++score; } // 判断蛇是否撞墙或者吃到自己的尾巴 void snakeGame::judgeCrash() { int flag=0; if (snake.size()>=5) { deque::iterator iter = snake.begin() + 1; int x = (iter-1)->x, y = (iter-1)->y; for (; iter != snake.end(); ++iter) { if (iter->x == x && iter->y == y) flag=1; }} if (flag || snake.front().x == 1 || snake.front().x == width - 2 || snake.front().y == 0 || snake.front().y == height - 1)//检测是否撞墙或者是否吃到自身 { gotoxy(width / 2 - 10, height /2); cout deque::const_iterator iter = snake.begin(); for (; iter int i; for (i = 0; i != width; i += 2) cout HideCursor(); // 隐藏光标 srand(static_cast(time(NULL))); beg=true; Snake tmp1,tmp2; while (1) { if(beg) { // 判断是不是第一次运行程序,因为第一次运行需要打印边框 printMap(); dir = getch(); initSnake(); createFood(); beg = eatFood=false; } tmp2=snake.back(); tmp1=snake.front(); snake.pop_back(); if (eatFood) { // 如果吃到食物... tmp2.image='+'; snake.push_back(tmp2); eatFood=false; } else clearSnake(tmp2); // 判断当前的前进方向,根据dir来进行移动 if (dir == 's') ++tmp1.y; else if (dir == 'a') --tmp1.x; else if (dir == 'd') ++tmp1.x; else --tmp1.y; try{ judgeCrash(); // 判断是否撞墙或者吃到自己 } catch(runtime_error &quitSignal) { throw quitSignal; } snake.front().image='+'; snake.push_front(tmp1); printSnake(); Sleep(speed+30); if (tmp1.x == food_x && tmp1.y == food_y) foodEaten(); // 监测用户的键入 if(kbhit()) userInput(); } } int main() { // 设置小黑框的一些参数 system("mode con cols=120 lines=42"); try{ snakeGame game; } catch(runtime_error &gameEnd) { system("cls"); cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有