C语言实现贪吃蛇小游戏

#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;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue中electron与vue通信(fs.existsSync is not a function解决方案)

electron向vue发送消息 dist/main.js (整个文件配置在另一条博客里) win new BrowserWindow({width:1920,height:1080,webPreferences: {// 是否启用Node integrationnodeIntegration: true, // Electron 5.0.0 版本之后它将被默认false// 是否在独立 JavaScript 环境中运行…

三.RocketMQ单机安装及集群搭建

RocketMQ单机安装及集群搭建 一&#xff1a;安装环境1.软硬件要求2.下载RocketMQ 二.安装单机MQ1.上传并解压2.目录介绍3.修改MQ启动时初始JVM内存4.启动NameServer与Broker5.测试RocketMQ 三.RocketMQ集群搭建1.集群概念特点2.集群模式分类3.集群工作流程4.双主双从集群搭建4.…

GORM:在Go中轻松管理数据库

GORM综合介绍 - Go对象关系映射库 在现代软件开发中&#xff0c;高效的数据库管理对于构建强大的应用程序至关重要。GORM是Go开发人员寻求与数据库进行交互的简化方式的宝贵工具。GORM是Go对象关系映射的缩写&#xff0c;它为Go的面向对象世界与数据库的关系世界之间提供了桥梁…

小红书协议算法最新版

如果您想通过学习来了解小红书的点赞、关注、私信等功能的实现&#xff0c;以下是一些一般性的思路和示例代码&#xff0c;供您学习参考&#xff1a; 1. 点赞功能&#xff1a; - 后端实现&#xff1a;在后端&#xff0c;您可以创建一个用于存储用户点赞信息的数据库表。对于每…

测试遇到bug怎么分析,这可能是我看到最专业的总结了!

为什么定位问题如此重要&#xff1f; 可以明确一个问题是不是真的“bug” 很多时候&#xff0c;我们找到了问题的原因&#xff0c;结果发现这根本不是bug。原因明确&#xff0c;误报就会降低多个系统交互&#xff0c;可以明确指出是哪个系统的缺陷&#xff0c;防止“踢皮球”&…

Qlik Sense Enterprise 忘记PostgreSQL密码

在 Windows 上安装 Qlik Sense Enterprise 期间会提供密码。如果您忘记了该密码&#xff0c;则无法找回&#xff1b;但是&#xff0c;可以按照以下步骤重置密码。 如何在 Qlik 中重置忘记的 PostgreSQL 密码... - Qlik Community - 1712725 如果该过程完成后记录了密码错误的…

Python开发技能实战-通过配置的代理服务器在具有外网连接的环境中在Pycharm中运行python代码

实现功能 打开科学上网工具&#xff0c;使得能够在浏览器科学上网&#xff0c;通过科学上网工具的配置文件&#xff0c;可以看出本地和远程代理的映射关系&#xff0c;此时&#xff0c;远程地址本地地址&#xff0c;远程端口本地端口。 1、在程序中配置请求网页代理请求。不需…

Http代理与socks5代理有何区别?如何选择?(二)

上篇文章我们基本分别了解了http代理与socks5代理的定义与优缺点&#xff0c;接下来我们继续来了解http代理与socks5代理之间的比较与区别。 一、两者的比较 1、功能比较 HTTP代理专门用于Web流量&#xff0c;并在处理HTTP和HTTPS协议方面非常高效。它们可以修改正在传输的数据…

解析mfc100u.dll文件丢失的修复方法,快速解决mfc100u.dll问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“缺少某个文件”的错误。最近&#xff0c;我也遇到了一个这样的问题&#xff0c;那就是“mfc100u.dll丢失”。这个问题可能会导致某些应用程序无法正常运行&#xff0c;给我们带来困扰。…

ANGR初识

首页&#xff1a; https://angr.io 项目存储库&#xff1a; GitHub - angr/angr: A powerful and user-friendly binary analysis platform! 文档&#xff1a; https://docs.angr.io API 文档&#xff1a; angr documentation 练习项目&#xff1a; https://github.com/angr/an…

Python的web自动化学习(五)Selenium的隐式等待(元素定位)

引言&#xff1a; WebDriver隐式等待是一种全局性的等待方式&#xff0c;它会在查找元素时设置一个固定的等待时间。当使用隐式等待时&#xff0c;WebDriver会在查找元素时等待一段时间&#xff0c;如果在等待时间内找到了元素&#xff0c;则立即执行下一步操作&#xff1b;如果…

Windows下多Chrome谷歌浏览器版本共存

场景 某些年代久远的 WEB 应用&#xff0c;必须在指定的浏览器或版本才能正常运行&#x1f602;&#xff0c;此时就需要多个版本 chrome 浏览器共存。 解决方案 下载指定版本 可以从 https://www.chromedownloads.net/ 下载需要的版本&#xff0c;此处下载的是87.0.4280.14…

【MySQL索引与优化篇】数据库设计实操(含ER模型)

数据库设计实操&#xff08;含ER模型&#xff09; 文章目录 数据库设计实操&#xff08;含ER模型&#xff09;1. ER模型1.1 概述1.2 建模分析1.3 ER 模型的细化1.4 ER 模型图转换成数据表1. 一个实体转换成一个数据库表2. 一个多对多的关系转换成一个数据表3. 通过外键来表达1对…

VS2019 C# mysql数据库使用EF

mysql 安装mysql-8.0.18-winx64 mysql-connector-net-8.0.18.msi mysql数据库.net开发驱动&#xff0c; 要在工程中引入connector安装后目录中的mysql.data.dll;如果直接在nutget中下载mysql.data.dll&#xff0c;那么就不用下载.net开发驱动包 mysql-for-visualstudio-1.…

oracel处理XML时,报ORA-31011、ORA-19202。

原字段为clob&#xff0c; 查询 SELECT XMLTYPE(字段) FROM TABLE_A报错如下&#xff1a; ORA-31011: XML 语法分析失败 ORA-19202: XML 处理 LPX-00217: invalid character 12 (U000C) Error at line 1559时出错 ORA-06512: 在 "SYS.XMLTYPE", line 272 ORA-0651…

嵌入式到底如何理解呢?

今日话题&#xff0c;嵌入式到底如何理解呢&#xff1f;以我个人的理解&#xff0c;可以用一个客观的比喻来描述&#xff0c;就是将某个系统嵌入到特定的环境中&#xff0c;以实现特定的功能。这个过程包括将现实世界中的人、物的意图和逻辑关系&#xff0c;通过计算和运算的方…

【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A:基于计算机视觉的坑洼道路检测和识别 python 代码解析

【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A&#xff1a;基于计算机视觉的坑洼道路检测和识别 python 代码解析 1 题目 坑洼道路检测和识别是一种计算机视觉任务&#xff0c;旨在通过数字图像&#xff08;通常是地表坑洼图像&#xff09;识别出存在坑洼的道路。这…

栅栏密码fence cypher

f{_wi3_hlyk_lnceaonr_cirgu04fep} flag{you_kn0w_r4il_f3nce_cipher}

Android NDK开发详解之调试和性能分析的系统跟踪概览

Android NDK开发详解之调试和性能分析的系统跟踪概览 系统跟踪指南 “系统跟踪”就是记录短时间内的设备活动。系统跟踪会生成跟踪文件&#xff0c;该文件可用于生成系统报告。此报告有助于您了解如何最有效地提升应用或游戏的性能。 有关进行跟踪和性能分析的全面介绍&#x…

JavaScript基础

JavaScript是一种轻量级、解释型的Web开发语言&#xff0c;获得了所有浏览器的支持&#xff0c;是目前广泛使用的编程语言之一。本章将简要介绍JavaScript基本语法和用法。 1、编写JavaScript脚本 在HTML页面中嵌入JavaScript脚本需要使用<script>标签&#xff0c;在&l…