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

news2025/1/16 18:45:29

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);//蛇头为蓝色
		else
			setfillcolor(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;
	else
		return 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++;//蛇的长度+1


		f.FOOD_LIVE = 0;
		s.NODES++;
		f.x = 0 - f.x;
		score_ += 10;
		score();
		return 1;
	}
	else
		return 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.coloradmin.cn/o/1340571.html

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

相关文章

百度飞桨文心生态成果最新披露:开发者达1070万 模型数超86万

前言 12月28日&#xff0c;由深度学习技术及应用国家工程研究中心主办的WAVE SUMMIT深度学习开发者大会2023在北京召开。百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰现场公布了飞桨文心五载十届最新生态成果&#xff0c;文心一言最新用户规模破1亿&#xf…

Python 爬取 哔站视频弹幕 并实现词云图可视化

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境介绍: python 3.8 解释器 pycharm 编辑器 第三方模块: requests >>> pip install requests protobuf >>> pip install protobuf 如何安装python第三方模块: win R 输入 cmd 点击确定, 输入安装命…

UEFI模拟环境搭建——windows+EDKII

目录 0 说明 1 安装软件 1.1 VS2019的安装 1.2 Python的安装 1.3 IASL的安装 1.4 NASM的安装 1.5 git的下载 2 EDKII的下载 3 配置环境 0 说明 个人感觉UEFI的环境搭建非常复杂&#xff0c;在经过很长一段折磨后&#xff0c;终于还是搭建成功&#xff0c;写下来记录一…

Jenkins实战指南:实现自动化代码拉取和Harbor私有镜像仓库上传

前两篇中&#xff0c;介绍了如何搭建个人私有镜像仓库Harbor&#xff0c;并编写了一个goweb项目进行打包上传&#xff0c;本文则继续介绍如何利用jenkins 实现自动打包镜像并上传。 《云原生必备工具&#xff01;手把手教你搭建Harbor私有仓库(上)》 搭建jenkins mkdir jenk…

二叉树简单题|对称、翻转、合并二叉树

二叉树简单题|对称、翻转、合并二叉树 文章目录 二叉树简单题|对称、翻转、合并二叉树模板代码101 对称二叉树226 翻转二叉树617 合并二叉树 模板代码 private boolean process(TreeNode p, TreeNode q) {if (p null && q null) {return ;} else if (p null &&…

「微服务」微服务架构中的数据一致性

在微服务中&#xff0c;一个逻辑上原子操作可以经常跨越多个微服务。即使是单片系统也可能使用多个数据库或消息传递解决方案。使用多个独立的数据存储解决方案&#xff0c;如果其中一个分布式流程参与者出现故障&#xff0c;我们就会面临数据不一致的风险 - 例如在未下订单的情…

【网络安全 | Misc】世安杯 Banmabanma

该题考察图片隐写 正文 压缩包解压后得到如图png&#xff1a; 很明显是个条形码的图片隐写题&#xff0c;放入网站进行识别即可&#xff1a; https://online-barcode-reader.inliteresearch.com/flag{TENSHINE}

【C语言】程序练习(二)

大家好&#xff0c;这里是争做图书馆扫地僧的小白。 个人主页&#xff1a;争做图书馆扫地僧的小白_-CSDN博客 目标&#xff1a;希望通过学习技术&#xff0c;期待着改变世界。 目录 前言 一、运算符练习 1 算术运算符 1.1 练习题&#xff1a; 2 自加自减运算符 3 关系运…

Vulnhub-Al-Web-1.0 靶机复现完整过程

一、信息收集 1.主机发现 arp-scan -l2.端口扫描 nmap -sV -p- 192.168.200.16PORTSTATESERVICEVERSIONMAC Address80/TCPOpenhttpApache httpd00:0C:29:C4:1B:78 (VMware) 3.目录扫描 python dirsearch.py -u http://192.168.200.16扫描出来这两个文件&#xff0c;首先先…

MATLAB中./和/,.*和*,.^和^的区别

MATLAB中./和/&#xff0c;.*和*&#xff0c;.^ 和^ 的区别 MATLAB中./和/&#xff0c;.*和*&#xff0c;.^ 和^ 的区别./ 和 / 的区别.//实验实验结果 .* 和 * 的区别.**实验实验结果 .^ 和^ 的区别.^n^n实验运行结果 MATLAB中./和/&#xff0c;.和&#xff0c;.^ 和^ 的区别 …

腾讯云轻量服务器和云服务器CVM该怎么选?区别一览

腾讯云轻量服务器和云服务器CVM该怎么选&#xff1f;不差钱选云服务器CVM&#xff0c;追求性价比选择轻量应用服务器&#xff0c;轻量真优惠呀&#xff0c;活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三…

gitee+picgo+typora图床搭建

giteepicgotypora图床搭建 1.安装typora 官网下载直接安装&#xff1a;https://www.typora.io/#download 2.编辑typora图像设置 打开 文件 -> 偏好设置 -> 图像设置 插入图片时 选择 上传图片设置 上传服务 为 PicGo-Core(command line) 3.为typora安装PicGo-Core 点…

怎么设置Facebook双重验证,让Facebook账号更稳定?

对于跨境电商而言&#xff0c;Facebook 账号被封是常有的事&#xff0c;原因之一可能是没有给 Facebook 设置双重验证&#xff0c;今天就和大家科普一下什么是 Facebook双重验证以及如何设置&#xff0c;另外&#xff0c;作为跨境卖家&#xff0c;我们还需要了解如何保护 Faceb…

群晖(Synology)Plex 的服务找不到文件夹

当 Plex 在搜索 NAS 上的文件夹的时候找不到文件夹中的内容。 如下图中显示的内容。 上面的 Public 文件夹中找不到我们的子文件夹&#xff0c;但是我们的子文件夹是有内容的。 问题和解决 出现上面的问题主要还是权限的问题。 选择需要访问的文件夹&#xff0c;然后在文件…

【数据结构】C语言实现单链表的基本操作

单链表基本操作的实现 导言一、查找操作1.1 按位查找1.1.1 按位查找的C语言实现1.1.2 按位查找的时间复杂度 1.2 按值查找1.2.1 按值查找的C语言实现1.2.2 按值查找的时间复杂度 二、插入操作2.1 后插操作2.2 前插操作 三、删除操作结语 导言 大家好&#xff0c;很高兴又和大家…

软件测试/测试开发丨Pytest 参数化用例

参数化 通过参数的方式传递数据&#xff0c;从而实现数据和脚本分离。并且可以实现用例的重复生成与执行。 参数化应用场景 测试登录场景 测试登录成功&#xff0c;登录失败(账号错误&#xff0c;密码错误)创建多种账号: 中⽂文账号&#xff0c;英⽂文账号 普通测试用例方法 …

隐蔽的事务失效...

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff09;&#xff0c;发送笔记可领取 Redis、JVM 等系列完整 pdf&#xff01; 【11来了】文章导读地址&#xff1…

Cookie的详解使用(创建,获取,销毁)

文章目录 Cookie的详解使用&#xff08;创建&#xff0c;获取&#xff0c;销毁&#xff09;1、Cookie是什么2、cookie的常用方法3、cookie的构造和获取代码演示SetCookieServlet.javaGetCookieServlet.javaweb.xml运行结果如下 4、Cookie的销毁DestoryCookieServletweb.xml运行…

postman进阶使用

前言 对于postman的基础其实很容易上手实现&#xff0c;也有很多教程。 对于小编我来说&#xff0c;也基本可以实现开发任务。 但是今年我们的高级测试&#xff0c;搞了一下postman&#xff0c;省去很多工作&#xff0c;让我感觉很有必要学一下 这篇文章是在 高级测试工程师ht…

Python从入门到熟练

文章目录 Python 环境Python 语法与使用基础语法数据类型注释数据类型介绍字符串列表元组集合字典 类型转换标识符运算符算数运算符赋值运算符复合运算符 字符串字符串拼接字符串格式化 判断语句bool 类型语法if 语句if else 语句if elif else 语句 循环语句while循环for 循环r…