C语言实现贪吃蛇小游戏

news2025/4/9 11:08:27
#include <stdio.h>
#include <easyx.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define PI 3.14
#define NODE_WIDTH 40
//绘制蛇的节点
typedef struct {
	int x;
	int y;
}node;


// 函数封装绘制横线和绘制竖线的方法
void paintGrid() {
	for (int y = 0; y < 600; y += NODE_WIDTH) {
		line(0, y, 800, y);
	}
	for (int x = 0; x < 800; x += NODE_WIDTH) {
		line(x, 0, x, 600);
	}
}
//将四个方向声明为枚举类型的变量
enum direction {
	eUp,
	eDown,
	eLeft,
	eRight
};
// 定义函数
void paintSnake(node* snake, int n) {
	int left, top, right, bottom;
	for (int i = 0; i < n; i++) {
		left = snake[i].x * NODE_WIDTH;
		top = snake[i].y * NODE_WIDTH;
		right = (snake[i].x + 1) * NODE_WIDTH;
		bottom = (snake[i].y + 1) * NODE_WIDTH;
		solidrectangle(left, top, right, bottom);
	}
}



// 定义snakemove函数
node snakeMove(node* snake, int length, int direction) {
	// 记录尾节点的数据
	node tail = snake[length - 1];
	for (int i = length - 1; i > 0; i--) {
		snake[i] = snake[i - 1];
	}
	node newHead;
	newHead = snake[0];

	if (direction == eUp) {
		newHead.y--;

	}
	else if (direction == eDown) {
		newHead.y++;
	}
	else if (direction == eLeft) {
		newHead.x--;
	}
	else{
		newHead.x++;
	}
	snake[0] = newHead;
	return tail;
}


// 通过键盘控制小蛇的移动
void changeDirection(enum direction* pD) {
	// 判断控制方向的按钮是否被按下,检查输入缓存当中是否有数据
	if (_kbhit() != 0) {
		// 获取用户键盘输入
		char c = _getch();
		switch (c) {
		   case 'w':
			   // 控制蛇的运动如果蛇向上移动就不能往相反的方向移动,其他的方向同理
			   if (*pD != eDown)
				   *pD = eUp;// 向上
			   break;
		   case 's':
			   if(*pD != eUp)
			    *pD = eDown; // 向下
			   break;
		   case 'a':
			   if(*pD != eRight)
			     *pD = eLeft; // 向左
			   break;
		   case 'd':
			   if(*pD != eLeft)
			     *pD = eRight; // 向右
			   break;
		}
	}
}

// 绘制食物的函数
void paintFood(node food) { // 传入食物节点数据
	int left, top, right, bottom;
	left = food.x * NODE_WIDTH;
	top = food.y * NODE_WIDTH;
	right = (food.x + 1) * NODE_WIDTH;
	bottom = (food.y + 1) * NODE_WIDTH;
	setfillcolor(YELLOW); // 设置填充颜色为黄色
	solidrectangle(left, top, right, bottom); // 绘制矩形
	setfillcolor(WHITE); // 绘制填充颜色
}
// 随机生成食物的代码
node createFood(node* snake, int length) {
	node food;
	while (1) {
		// 先创建食物
		food.x = rand() % (800 / NODE_WIDTH);
		food.y = rand() % (600 / NODE_WIDTH);
		int i;
		// 判断食物是否和蛇重叠
		for (i = 0; i < length; i++) {
			// 表示重叠则跳出循环
			if (snake[i].x == food.x && snake[i].y == food.y) {
				  break;
			}
		}
		// 如果 i < length说明有重叠,重新开始循环,否则没有重叠,返回食物数据 
		if (i < length) {
			continue;
		}
		else {
			break;
		}
	}
	return food;
}


// 游戏的结束条件函数
bool isGameOver(node* snake, int length) {
	if (snake[0].x < 0 || snake[0].x > 800 / NODE_WIDTH) {
		return true;
	}
	if (snake[0].y < 0 || snake[0].y  > 600 / NODE_WIDTH) {
		return true;
	}
	for (int i = 1; i < length; i++) {
		if (snake[0].x == snake[i].x && snake[0].y == snake[i].y) {
			return true;
		}
		return false;
	}
 
}
// 游戏结束后复位所有参数
void reset(node* snake, int* pLength, enum direction* d) {
	snake[0] = node{ 5,7 };
	snake[1] = node{ 4,7 };
	snake[2] = node{ 3,7 };
	snake[3] = node{ 2,7 };
	snake[4] = node{ 1,7 };
	*pLength = 5;
	*d = eRight;
}

int main()
{
	initgraph(800, 600);
	setbkcolor(RGB(164, 225, 202));
	cleardevice();

	node snake[100] = { {5,7},{4,7},{3,7},{2,7},{1,7} };
	int length = 5;
	// 使用枚举
	enum direction d = eRight;

	// 使用当前的时间作为随机数的种子,让随机数的生成更具有随机属性
	srand(unsigned int(time(NULL)));
	// 第一次生成食物
	node food = createFood(snake, length);
	while (1) {
		// 清空窗体
		cleardevice();
		// 绘制网格
		paintGrid();
		// 绘制蛇的节点
		paintSnake(snake, length);
		// 绘制食物
		paintFood(food);
		// 休眠500毫秒
		Sleep(1000);
		// 检查键盘输入
		changeDirection(&d);
		// 保存snakemove函数返回的蛇尾数据节点
		node lastTail = snakeMove(snake, length, d);
		// 判断蛇头是否和食物节点重合
		if (snake[0].x == food.x && snake[0].y == food.y) {
			if (length < 100) {
				snake[length] = lastTail;
				// 蛇尾的节点重新加回去
				length++;
			}
			//重新生成食物
			food = createFood(snake, length);
		}
		// 代码判断游戏是否结束
		if (isGameOver(snake, length) == true) {
			reset(snake, &length, &d);
			// 重新生成食物
			food = createFood(snake, length);
		}
	}
	getchar();
	closegraph();
	return 0;
}

在这里插入图片描述

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

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

相关文章

【Java 进阶篇】Java Response 重定向详解

在Java Web开发中&#xff0c;重定向&#xff08;Redirect&#xff09;是一种常见的技术&#xff0c;用于将用户从一个URL地址自动重定向到另一个URL地址。这在很多情况下都非常有用&#xff0c;例如在用户登录后将其重定向到其个人资料页面&#xff0c;或者在进行某些操作后将…

自己动手实现一个深度学习算法——二、神经网络的实现

文章目录 1. 神经网络概述1&#xff09;表示2&#xff09;激活函数3&#xff09;sigmoid函数4&#xff09;阶跃函数的实现5&#xff09;sigmoid函数的实现6)sigmoid函数和阶跃函数的比较7&#xff09;非线性函数8&#xff09;ReLU函数 2.三层神经网络的实现1&#xff09;结构2&…

现代的简洁,诠释轻奢的精致!福州中宅装饰,福州装修

轻奢风是一种生活新时尚 优雅、低调、舒适、简单&#xff0c;不断地推陈出新 站在时尚的前沿&#xff0c;引领潮流 中宅装饰集团轻奢风格产品 追求高品质生活细节 以设计精致的空间构造营造出 一种优雅、时尚生活氛围 将低调奢华之美注入现代家居设计中 客厅|The Sitt…

JVM 分代垃圾回收过程

堆空间划分了代&#xff1a; 年轻代&#xff08;Young Generation&#xff09;分为 eden 和 Survivor 两个区&#xff0c;Survivor 又分为2个均等的区&#xff0c;S0 和 S1。 首先&#xff0c;新对象都分配到年轻代的 eden 空间&#xff0c;Survivor 刚开始是空的。 当 eden …

CentOS、linux安装squid搭建正向代理,window11配置正向代理

1.CentOS安装配置squid 1.1.安装 yum install -y squid1.2.修改配置文件 在配置文件添加以下2行代码 acl localnet src 0.0.0.0/0.0.0.0 # add by lishuoboy http_access allow all # add by lishuoboy1.3.启动squid systemctl restart squid2.win11…

微服务架构——笔记(1)

微服务架构——笔记&#xff08;1&#xff09; 文章来源B站视频 尚硅谷SpringCloud框架开发教程(SpringCloudAlibaba微服务分布式架构丨Spring Cloud)教程 own process 独立部署 &#xff08;1.微服务架构零基础理论&#xff09; 叙述 马丁福勒 架构模式&#xff0c;倡导将单…

javaEE -13(6000字CSS入门级教程 - 2)

一&#xff1a;Chrome 调试工具 – 查看 CSS 属性 首先打开浏览器&#xff0c;接着有两种方式可以打开 Chrome 调试工具 直接按 F12 键鼠标右键页面 > 检查元素 点开检查即可 标签页含义&#xff1a; elements 查看标签结构console 查看控制台source 查看源码断点调试ne…

resource manager OCB structure(iofunc_ocb_t) 扩展实例

文章目录 前言一、OCB structure(iofunc_ocb_t) 是什么二、OCB structure(iofunc_ocb_t) 扩展实例1.OCB structure(iofunc_ocb_t) 扩展后的使用实例总结参考资料前言 本文主要介绍如何对qnx系统下的resource manager OCB structure(iofunc_ocb_t) 数据结构进行扩展 软件环境:…

C#__委托delegate

委托存储的是函数的引用&#xff08;把某个函数赋值给一个委托类型的变量&#xff0c;这样的话这个变量就可以当成这个函数来进行使用了&#xff09; 委托类型跟整型类型、浮点型类型一样&#xff0c;也是一种类型&#xff0c;是一种存储函数引用的类型 using System.Reflec…

【MATLAB第81期】基于MATLAB的LSTM长短期记忆网络预测模型时间滞后解决思路(更新中)

【MATLAB第81期】基于MATLAB的LSTM长短期记忆网络预测模型时间滞后解决思路&#xff08;更新中&#xff09; 在LSTM预测过程中&#xff0c;极易出现时间滞后&#xff0c;类似于下图&#xff0c;与一个以上的样本点结果错位&#xff0c;产生滞后的效果。 在建模过程中&#xf…

torch.div()不支持round_mode参数

问题怎么定位的呢&#xff0c;把报错信息一股脑甩给chatgpt&#xff0c;问他什么意思&#xff0c;他就反馈说“在标准的Python库中&#xff0c;div() 函数不接受 rounding_mode 参数。”&#xff08;虽然这个问题也不难&#xff0c;但是改偷的懒还是要偷&#xff09; 问题再现…

reactive与ref VCA

简介 Vue3 最大的一个变动应该就是推出了 CompositionAPI&#xff0c;可以说它受ReactHook 启发而来&#xff1b;它我们编写逻辑更灵活&#xff0c;便于提取公共逻辑&#xff0c;代码的复用率得到了提高&#xff0c;也不用再使用 mixin 担心命名冲突的问题。 ref 与 reactive…

虚函数表(图文详解)

虚函数表 1. 单继承和多继承关系的虚函数表1.1 单继承中的虚函数表1.2 多继承中的虚函数表1.3 菱形继承、菱形虚拟继承 2. 继承和多态常见的面试问题2.1 概念查考2.2 问答题 1. 单继承和多继承关系的虚函数表 需要注意的是在单继承和多继承关系中&#xff0c;下面我们去关注的是…

聊聊宿主机管理

2020年&#xff0c;机器上线需要在八个服务间反复横跳&#xff0c;而且全程手动操作。伴随滴滴业务规模上云&#xff0c;弹性云新增大量物理机&#xff0c;上线操作至少有百次&#xff0c;这时暴露了一个问题&#xff1a;如果按这个速度上线机器&#xff0c;需要大量人力投入到…

罢工效应,韩电池业在美建厂面临挑战 | 百能云芯

美国汽车行业的罢工事件仍在持续&#xff0c;对于远在数千公里之外的韩国电池制造商来说&#xff0c;这引发了不小的担忧&#xff0c;他们担心生产成本会因此大幅上升。 据彭博资讯报道&#xff0c;韩国电池制造商LG新能源、SK On和三星SDI&#xff0c;已与美国的三家汽车制造巨…

Apache ActiveMQ 远程代码执行漏洞复现(CNVD-2023-69477)

Apache ActiveMQ 远程代码执行RCE漏洞复现&#xff08;CNVD-2023-69477&#xff09; 上周爆出来的漏洞&#xff0c;正好做一下漏洞复现&#xff0c;记录一下 1.漏洞描述 ​ Apache ActiveMQ 中存在远程代码执行漏洞&#xff0c;具有 Apache ActiveMQ 服务器TCP端口&#xff…

kotlin中集合操作符

集合操作符 1.总数操作符 any —— 判断集合中 是否有满足条件 的元素&#xff1b; all —— 判断集合中的元素 是否都满足条件&#xff1b; none —— 判断集合中是否 都不满足条件&#xff0c;是则返回true&#xff1b; count —— 查询集合中 满足条件 的 元素个数&#x…

案例分析真题-质量属性

案例分析真题-质量属性 2009 年真题 【问题1】 【问题2】 2011 年真题 【问题1】 骚戴理解&#xff1a;首先要知道这样的题目没有可靠性&#xff0c;只有可用性&#xff0c;更没有容错性&#xff0c;这里我&#xff08;3&#xff09;写成了i&#xff0c;而不是f&#xff0c;仔…

git 权限报错处理(亲测可行)

错误信息“Please make sure you have the correct access rights and the repository exists. fatal: clone of gitgithub.com:wechat-miniprogram/awesome-skyline.git into submodule path C:/Tencent/miniprogram-demo/miniprogram/packageSkylineExamples failed Failed t…

Qt 项目实战 | 俄罗斯方块

Qt 项目实战 | 俄罗斯方块 Qt 项目实战 | 俄罗斯方块游戏架构实现游戏逻辑游戏流程实现基本游戏功能设计小方块设计方块组添加游戏场景添加主函数 测试踩坑点1&#xff1a;rotate 失效踩坑点2&#xff1a;items 方法报错踩坑点3&#xff1a;setCodecForTr 失效踩坑点4&#xff…