C++ 一个有bug的贪吃蛇。。。。。。。。

C++    一个有bug的贪吃蛇。。。。。。。。

#include <graphics.h>
#include<Windows.h>
#include<Mmsystem.h>
#include<conio.h> 
#include<time.h> 
#include<stdio.h>
#include<easyx.h>
using namespace std;
#pragma warning(disable:4996)
#define WINDOW_LENGTH 640 //窗口长
#define WINDOW_WIDE 480 //串口宽
#define M_TOP 50 //地图左上顶点y坐标
#define M_LEFT 20 //地图左上顶点x坐标
#define M_BOTTOM WINDOW_WIDE-30 //地图右下顶点y坐标
#define M_RIGHT WINDOW_LENGTH-30 //地图右下顶点x坐标
#define SNAKE_UP 72 //蛇向上运动
#define SNAKE_DOWN 80 //蛇向下运动
#define SNAKE_LEFT 75 //蛇向左运动
#define SNAKE_RIGHT 77  //蛇向右运动
#define SNAKE_QUIT 27 //结束游戏ESC键
#define SNAKE_SPEED 500 //蛇运动速度
#define SNAKE_PAUSS 32 //蛇暂停运动typedef struct FOOD { //定义食物结构体int x;int y;int FOOD_LIVE;
}FOOD;typedef struct NODE { //定义蛇的节点int x;int y;NODE* PRE;NODE* NEXT;
}NODE;typedef struct SANKE { //定义一个蛇NODE* TAIL;NODE* HEAD;int NODES; //蛇的节数int DIRECTION; //蛇的运动方向int SANKE_LIVE; //存活状态
}SANKE;int score_ = 0;
FOOD f;
SANKE s;
int rank;
int t = 1;
int tt;
int biteSelf(); // 判断是否咬到了自己
int snake_life(); //蛇是否存活
void gameover(); //结束界面
int eatfood(); /食物
void score(); //分数
void time(); //时间
void meau(); //菜单
void initGAME(); //初始化游戏
void creatWINDOW(int x, int y); //创建窗口
void closeWINDOW(); //关闭窗口
void creatmap(); //创建地图
void creatfood(); //创建食物
void drawfood(); //画食物
void drawSANKE(); //画蛇
void initSANKE(); //创建蛇
void moveSANKE(); //移动蛇
void speed(); //调整速度
void playgame(); //开始游戏
int direction(int c); //判断操作方向是否与蛇的方向相同
void Data(); //保存分数
void ESC(); //esc结束
void upgrade(); //升级模式int main()
{while (t){meau();initGAME();playgame();closeWINDOW();}
}void initGAME()//进入游戏
{creatWINDOW(WINDOW_LENGTH, WINDOW_WIDE);creatmap();creatfood();initSANKE();score();f.FOOD_LIVE = 0;
}void creatWINDOW(int x, int y) {//创建窗口initgraph(WINDOW_LENGTH, WINDOW_WIDE);setbkcolor(RGB(166, 135, 100));cleardevice();
}void closeWINDOW() {//关闭窗口Data();getch();closegraph();
}void creatmap() {int i;setlinecolor(BLACK);rectangle(M_LEFT, M_TOP, M_RIGHT, M_BOTTOM);//画外边界线rectangle(M_LEFT - 10, M_TOP - 10, M_RIGHT + 10, M_BOTTOM + 10);//画内边界线for (i = M_LEFT; i <= M_RIGHT; i = i + 10)line(i, M_TOP, i, M_TOP - 10);for (i = M_TOP; i <= M_BOTTOM; i = i + 10)line(M_LEFT, i, M_LEFT - 10, i);for (i = M_LEFT; i <= M_RIGHT; i = i + 10)line(i, M_BOTTOM, i, M_BOTTOM + 10);for (i = M_TOP; i <= M_BOTTOM; i = i + 10)line(M_RIGHT, i, M_RIGHT + 10, i);
}void creatfood() {srand(time(0));int x, y;while (1) {x = rand() % (600 - 20 + 1) + 20;y = rand() % (440 - 50 + 1) + 50;if (x % 10 == 0 && y % 10 == 0) {f.x = x;f.y = y;break;}}f.FOOD_LIVE = 1;
}void drawfood() {setfillcolor(YELLOW);fillrectangle(f.x, f.y, f.x + 9, f.y + 9);
}void initSANKE() {s.HEAD = (NODE*)malloc(sizeof(NODE));s.TAIL = (NODE*)malloc(sizeof(NODE));s.HEAD->x = 30;//初始蛇头蛇尾s.HEAD->y = 400;s.TAIL->x = 30;s.TAIL->y = 410;s.HEAD->NEXT = s.TAIL;s.HEAD->PRE = NULL;s.TAIL->NEXT = NULL;s.TAIL->PRE = s.HEAD;s.DIRECTION = SNAKE_UP;s.NODES = 2;s.SANKE_LIVE = 1;
}void drawSANKE() {NODE* p;//指针p指向蛇的头部p = s.HEAD;while (p){if (p == s.HEAD)setfillcolor(BLUE);//蛇头为蓝色elsesetfillcolor(YELLOW);fillrectangle(p->x, p->y, p->x + 9, p->y + 9);p = p->NEXT;}
}int direction(int c) {//不是相反的方向,返回0.if (s.DIRECTION == SNAKE_DOWN && c == SNAKE_UP)return 1;else if (s.DIRECTION == SNAKE_UP && c == SNAKE_DOWN)return 1;else if (s.DIRECTION == SNAKE_LEFT && c == SNAKE_RIGHT)return 1;else if (s.DIRECTION == SNAKE_RIGHT && c == SNAKE_LEFT)return 1;elsereturn 0;
}void playgame() {int c;while (true) {if (f.FOOD_LIVE == 1)//若食物存在,则画出食物{drawfood();}if (f.FOOD_LIVE == 0)//若食物不存在,则生成食物{creatfood();drawfood();}if (snake_life() == 0)//若蛇死亡,游戏结束{gameover();closeWINDOW();break;}while (!kbhit())//当没有按键的时候{time();if (eatfood() == 1){creatfood();drawfood();}if (snake_life() == 0)//若蛇死亡,游戏结束{break;}moveSANKE();drawSANKE();if (tt)upgrade();speed();}while (kbhit())//当有按键的时候{c = getch();if (direction(c) == 0)//不是相反的方向{switch (c){case SNAKE_LEFT: s.DIRECTION = SNAKE_LEFT; break;case SNAKE_RIGHT: s.DIRECTION = SNAKE_RIGHT; break;case SNAKE_UP: s.DIRECTION = SNAKE_UP; break;case SNAKE_DOWN: s.DIRECTION = SNAKE_DOWN; break;case SNAKE_PAUSS:system("pause"); break;case SNAKE_QUIT:ESC();default:break;}}}}
}void ESC() {gameover();_getch();exit(0);
}void moveSANKE() {NODE* p;p = (NODE*)malloc(sizeof(NODE));clearrectangle(s.TAIL->x, s.TAIL->y, s.TAIL->x + 9, s.TAIL->y + 9);//清楚原来的蛇尾creatmap();//绘制地图p = s.TAIL;while (p->PRE != NULL){p->x = p->PRE->x;p->y = p->PRE->y;p = p->PRE;}switch (s.DIRECTION) {//蛇头变换方向case SNAKE_UP:s.HEAD->y -= 10; break;case SNAKE_LEFT:s.HEAD->x -= 10; break;case SNAKE_DOWN:s.HEAD->y += 10; break;case SNAKE_RIGHT:s.HEAD->x += 10; break;default:break;}
}void speed() {Sleep(rank);
}int snake_life() {int x, y;x = s.HEAD->x;y = s.HEAD->y;if (x < 20 || x > 600 || y > 440 || y < 50)//蛇头出界,蛇死亡s.SANKE_LIVE = 0;if (biteSelf() == 1)//蛇吃到自己蛇死亡s.SANKE_LIVE = 0;return s.SANKE_LIVE;
} //蛇是否存活void gameover() {int c, x;x = 1;//musicforgg();settextstyle(50, 0, _T("宋体"));settextcolor(BLUE);char s1[] = "你死掉了!!!";outtextxy(150, 200, s1);_getch();initgraph(WINDOW_LENGTH, WINDOW_WIDE);setbkcolor(BLACK);cleardevice();settextcolor(YELLOW);char s[] = "";sprintf(s, "%s%d", "您的分数是:", score_);char s3[] = "1.重新挑战";char s2[] = "2.退出游戏";settextstyle(30, 0, _T("宋体"));outtextxy(200, 200, s3);outtextxy(200, 250, s2);settextstyle(50, 0, _T("宋体"));outtextxy(150, 100, s);settextcolor(WHITE);char s5[] = "按任意键继续。。。";char s7[] = "输入有误。。。";char s8[] = "谢谢使用!";while (x) {kbhit();c = getch();switch (c) {case '1':t = 1; x = 0; outtextxy(150, 350, s5);score_ = 0; main(); break;//继续生成游戏case '2':outtextxy(150, 350, s8); getch(); exit(0);//退出游戏default:x = 1; outtextxy(150, 350, s7); break;}}
}//结束界面int eatfood() {int x1 = s.HEAD->x;int y1 = s.HEAD->y;int x2 = f.x;int y2 = f.y;NODE* p;if (x1 == x2 && y1 == y2)//蛇的头部和食物重叠{s.TAIL->NEXT = (NODE*)malloc(sizeof(NODE));//扩大蛇的长度s.TAIL->NEXT->x = s.TAIL->x;s.TAIL->NEXT->y = s.TAIL->y;s.TAIL->NEXT->PRE = s.TAIL;s.TAIL->NEXT->NEXT = NULL;p = s.TAIL->NEXT;s.TAIL = p;//尾部扩展s.NODES++;//蛇的长度+1f.FOOD_LIVE = 0;s.NODES++;f.x = 0 - f.x;score_ += 10;score();return 1;}elsereturn 0;
} /食物void score() {//记录分数char str[20];settextcolor(YELLOW);//颜色:灰色settextstyle(20, 0, _T("宋体"));//大小和字体sprintf(str, "得分:%d", score_);//生成字符串outtextxy(10, 20, str);
} //分数void time() {char str[20];char c[] = "提示:空格键暂停游戏,ESC键结束游戏。";time_t t;struct tm* lt;settextstyle(20, 0, _T("宋体"));//大小和字体time(&t);//获取Unix时间戳。lt = localtime(&t);//转为时间结构。sprintf(str, "时间:%2d:%2d:%2d", lt->tm_hour, lt->tm_min, lt->tm_sec);//生成字符串outtextxy(500, 20, str);outtextxy(100, 20, c);
}//时间void meau() {int c;int x;x = 1;initgraph(WINDOW_LENGTH, WINDOW_WIDE);setbkcolor(BLACK);cleardevice();settextstyle(50, 0, _T("宋体"));settextcolor(YELLOW);char s[] = "欢迎来到贪吃蛇!";outtextxy(170, 100, s);settextstyle(25, 0, _T("宋体"));char s1[] = "选择难度:";char s2[] = "1.简单模式";settextcolor(GREEN);outtextxy(250, 240, s2);char s3[] = "2.普通模式";settextcolor(BLUE);outtextxy(250, 280, s3);char s4[] = "3.困难模式";settextcolor(RED);outtextxy(250, 320, s4);char s7[] = "输入有误。。。";settextcolor(WHITE);char s5[] = "按任意键继续。。。";while (x){kbhit();c = getch();switch (c){case '1':rank = 300; x = 0; tt = 0;outtextxy(250, 390, s5);break;case '2':rank = 200; x = 0; tt = 0;outtextxy(250, 390, s5);break;case '3':rank = 80; x = 0; tt = 0;outtextxy(250, 390, s5);break;default:x = 1; outtextxy(250, 390, s7); break;}}_getch();
} //菜单
void upgrade() {}void __cdecl fprintf()
{
}int biteSelf() {NODE* self;self = s.HEAD->NEXT;while (self != NULL){if (self->x == s.HEAD->x && self->y == s.HEAD->y)//蛇身坐标与蛇头重合,判断蛇死亡{return 1;}self = self->NEXT;}return(0);
}void Data()
{FILE* pf = fopen("123.txt", "w"); //以只写的方式打开文件if (pf == NULL) //打开文件失败{printf("保存最高得分记录失败\n");exit(0);}fwrite(&score, sizeof(int), 1, pf); //将本局游戏得分写入文件当中fclose(pf); //关闭文件pf = NULL; //文件指针及时置空}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/582101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt之自定义分页(翻页)控件

当数据量较大时,分页显示是个不错的选择。这里用百家姓来演示分页效果,包括首页、上一页、下一页、尾页和跳转。 一.效果 每页15个姓氏。 二.实现 QHPageWidget.h #ifndef QHPAGEWIDGET_H #define QHPAGEWIDGET_H#include <QWidget> #include <QStandardItemMod…

DBeaver连接hive

1.新建hive连接 其中主机填写hive所在节点地址&#xff0c;端口10000为默认&#xff0c;数据库名不填则是默认default数据库&#xff0c;用户名密码填写hadoop集群中能操作hdfs的用户和密码。 2.编辑驱动&#xff0c;驱动的jar包从安装的hive下的jdbc路径下获取&#xff0c;例…

第8章 社会工程学攻击

社会工程学是利用人性弱点体察、获取有价值信息的实践方法&#xff0c;它是一种欺骗的艺术。在缺少目标系统的必要信息时&#xff0c;社会工程学技术是渗透测试人员获取信息的至关重要的手段。对所有类型的组织&#xff08;单位&#xff09;而言&#xff0c;人都是安全防范措施…

STM32 基础知识(探索者开发板)--93讲 PWM

预分频器相当于一个计数器&#xff0c;2分频就是接收2个脉冲传递一个脉冲&#xff0c;3分频就是接收3个脉冲传递一个脉冲&#xff0c;最高65535分频&#xff0c;那么总计时间能达到65535*65535*1/72MHZ 约59秒&#xff0c;没有分频器只能计数最高0.09秒 PWM配置步骤 1.配置定时…

《长江丛刊》期刊投稿发表

《长江丛刊》杂志是由国家新闻出版总署批准的正规期刊&#xff0c;是一本文学类综合性刊物&#xff0c;包括文学评论以及文学作品的发表。是广大专家、学者、教师、学子发表论文、交流信息的重要平台&#xff0c;符合评职称要求&#xff08;单位有特殊要求除外&#xff09;。 …

docker小白第八天

docker小白第八天 redis常规安装 前期已经配好了阿里云容器镜像加速库 docker search redis docker pull redis:6.0.8 docker images redis:6.0.8启动容器,并进入容器的命令行界面 docker run -d -p 6379:6379 redis:6.0.8 docker ps docker exec -it 容器id /bin/bash验证…

Java生态系统的进化:从JDK 1.0到今天

目录 前言 JDK 1.0&#xff1a;开启Java时代 JDK 1.1&#xff1a;Swing和内部类 JDK 1.2&#xff1a;Collections框架和JIT编译器 JDK 1.5&#xff1a;引入泛型和枚举 JDK 1.8&#xff1a;Lambda表达式和流 JDK 11以后&#xff1a;模块化和新特性 未来展望 总结 作者简…

UI自动化Selenium 元素定位之Xpath

一、元素定位方式 selenium中定位元素&#xff0c;通常有几种方式&#xff1a; 1、通过id定位&#xff1a;By.ID 2、通过Name定位&#xff1a;By.Name 3、通过元素其他属性定位&#xff0c;如class、type、text文本。。。。。。等等&#xff0c;如果要用属性定位那就需要使…

虚析构和纯虚析构

多态使用时&#xff0c;如果子类中有属性开辟到堆区&#xff0c;那么父类的指针在释放时无法调用到子类的析构代码 解决方式&#xff1a;将父类中的析构代码函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性&#xff1a; 可以解决父类指针释放子类对象 都需要有具体的函数…

[SWPUCTF 2021 新生赛]finalrce

[SWPUCTF 2021 新生赛]finalrce wp 注&#xff1a;本文参考了 NSSCTF Leaderchen 师傅的题解&#xff0c;并修补了其中些许不足。 此外&#xff0c;参考了 命令执行(RCE)面对各种过滤&#xff0c;骚姿势绕过总结 题目代码&#xff1a; <?php highlight_file(__FILE__); …

【算法练习】leetcode链表算法题合集

链表总结 增加表头元素倒数节点&#xff0c;使用快慢指针环形链表&#xff08;快慢指针&#xff09;合并有序链表&#xff0c;归并排序LRU缓存 算法题 删除链表元素 删除链表中的节点 LeetCode237. 删除链表中的节点 复制后一个节点的值&#xff0c;删除后面的节点&#x…

java球队信息管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web球队信息管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5…

深度学习之RNN

1.循环神经网络 在时间t的时候&#xff0c;对于单个神经元来讲它的输出y(t)如下 wx是对于输入x的权重&#xff0c;wy是对于上一时刻输出的权重 所以循环神经网络有两个权重。 如果有很多这样的神经元并排在一起 则在t时刻的输出y为 这时输入输出都是向量 2.记忆单元 由于循…

车队试验的远程实时显示方案

风丘科技推出的数据远程实时显示方案更好地满足了客户对于试验车队远程实时监控的需求&#xff0c;并真正实现了试验车队的远程管理。随着新的数据记录仪软件IPEmotion RT和相应的跨平台显示解决方案的引入&#xff0c;让我们的客户端不仅可在线访问记录器系统状态&#xff0c;…

git unable to create temporary file: No space left on device(git报错)

1.问题 1.1 vscode中npm run serve跑项目的时候&#xff0c;进度达到95%的时候一直卡着无进度&#xff1b; 1.2 git命令提交代码报错&#xff1b; 2.具体解决 这个错误通常表示你的磁盘空间已经满了&#xff0c;导致 Git 无法在临时目录中创建文件。2.1 清理磁盘空间&#xf…

低代码平台在金融银行中的应用场景

随着数字化转型的推进&#xff0c;商业银行越来越重视技术在业务发展中的作用。在这个背景下&#xff0c;白码低代码平台作为一种新型的开发方式&#xff0c;正逐渐受到广大商业银行的关注和应用。白码低代码平台能够快速构建各类应用程序&#xff0c;提高开发效率&#xff0c;…

跨境电商引流真的很难吗?了解一下这些技巧!

随着全球电商市场的不断扩大&#xff0c;越来越多的企业开始涉足跨境电商领域&#xff0c;然而&#xff0c;与国内电商相比&#xff0c;跨境电商面临着诸多挑战&#xff0c;其中最大的难题之一就是如何有效地吸引潜在客户。 很多卖家觉得跨境电商引流非常困难&#xff0c;但实…

springBoot整合redis做缓存

一、Redis介绍 Redis是当前比较热门的NOSQL系统之一&#xff0c;它是一个开源的使用ANSI c语言编写的key-value存储系统&#xff08;区别于MySQL的二维表格的形式存储。&#xff09;。和Memcache类似&#xff0c;但很大程度补偿了Memcache的不足。和Memcache一样&#xff0c;R…

BAT log-yyyy-mm-dd.log

日志文件 文件名 日期格式化 https://download.csdn.net/download/spencer_tseng/88673832 https://download.csdn.net/download/spencer_tseng/88673716

探究Android DreamService的梦幻世界

探究Android DreamService的梦幻世界 引言 DreamService的概述 在Android开发中&#xff0c;DreamService是一种特殊类型的服务&#xff0c;它可以用于创建梦幻世界的屏保应用。梦幻世界是一种用户界面显示模式&#xff0c;当设备进入空闲状态时&#xff0c;系统会自动启动D…