基于C/C++的easyx实现贪吃蛇游戏

文章目录:

一:运行效果

1.演示

2.思路和功能

二:代码

文件架构

Demo


必备知识:基于C/C++的easyx图形库教程

一:运行效果

1.演示

效果图◕‿◕✌✌✌

基于C/C++的easyx实现贪吃蛇游戏运行演示


参考:【C语言实战】用EasyX写个七彩贪吃蛇游戏(1个小时) 

博主提取资源:提取

2.思路和功能

通过按键控制蛇的移动去吃食物

二:代码

文件架构

Demo

#include <graphics.h>
#include <conio.h>

#define WIDTH 40				//横的有40个格子
#define HEIGHT 30				//竖的有30个格子
#define SIZE 20					//每个格子的大小为20

// 全局变量定义
int Blocks[WIDTH][HEIGHT] = { 0 };		//表示所有的方格,用于记录地图中所有的游戏数据
char moveDirection,oldMoveDirection;	// moveDirection初始化移动方向
int foodX, foodY;						//食物的坐标
int isFailure = 0;						//游戏状态

//声明函数
void initGame();				//初始化游戏
void show();					//每一次运行时重新绘制蛇和食物的图像
void updateWithInput();			//与输入有关的更新
void updateWithoutInput();		//与输入无关的更新
void moveSnake();				//蛇运动

//---------------------------------------------------------------------------------//
int main() {
	//初始化游戏
	initGame();
	while (1) {
		show();						//每一次运行时重新绘制蛇和食物的图像
		updateWithoutInput();		//与输入无关的更新
		updateWithInput();			//与输入无关的更新
	}
	return 0;
}
//---------------------------------------------------------------------------------//

//初始化游戏
void initGame() {
	//初始化窗口
	initgraph(WIDTH * SIZE, HEIGHT * SIZE);
	//设置背景颜色
	setbkcolor(LIGHTGRAY);
	// 开始批量绘制
	BeginBatchDraw();
	cleardevice();

	//开始画线
		setlinecolor(WHITE);
		int i;
		//竖线
		for (i = SIZE; i < WIDTH * SIZE; i += SIZE)
			line(i, 0, i, HEIGHT * SIZE);
		//横线
		for (i = SIZE; i < HEIGHT * SIZE; i += SIZE)
			line(0, i, WIDTH * SIZE, i);

	//初始化向右走
	moveDirection = oldMoveDirection = 'd';

	//初始化蛇
		//画蛇头:画面中间画蛇头,数字为1
		Blocks[WIDTH / 2][HEIGHT / 2] = 1;
		//画蛇尾3个位置:向左依次3个蛇身,数值依次为2,3,4,
		for (i = 1; i < 4; i++)
			Blocks[WIDTH / 2 - i][HEIGHT / 2] = i + 1;

	//初始化食物随机放置
		foodX = rand() % (WIDTH - 2) + 1;//1到38
		foodY = rand() % (HEIGHT- 2) + 1;
}

//开始绘图:每一次运行时重新绘制蛇和食物的图像
void show() {
	//画蛇:先找到蛇的位置
	for (int i = 0; i < WIDTH; i++) {
		for (int j = 0; j < HEIGHT; j++) {
			if (Blocks[i][j] != 0)
				// 元素不等于0表示是蛇:这里让蛇的身体颜色色调渐变
				setfillcolor(HSVtoRGB(Blocks[i][j] * 10, 0.9, 1));
			else
				//设置填充的颜色为浅灰色
				setfillcolor(LIGHTGRAY);
			// 在对应位置处,以对应颜色绘制小方格
			fillrectangle(i * SIZE, j * SIZE, (i + 1) * SIZE, (j + 1) * SIZE);
		}
	}

	//画食物
		//食物颜色
		setfillcolor(LIGHTGREEN);
		//  绘制食物小方块
		fillrectangle(foodX * SIZE, foodY * SIZE, (foodX + 1) * SIZE, (foodY + 1) * SIZE);

	//游戏状态
	if (isFailure) {
		//设置文字颜色
		settextcolor(LIGHTRED);
		settextstyle(80, 0, _T("宋体"));
		//设置字体的背景
		setbkmode(TRANSPARENT);
		outtextxy(240, 220, _T("游戏失败"));
	}

	// 批量绘制结束
	FlushBatchDraw();
}

//与输入有关的更新:检测移动方向
void updateWithInput() {
	//  如果有按键输入,并且不失败
	if (_kbhit() && isFailure == 0) {
		 //  获得按键输入
		char input = _getch();
		if (input == 'a' || input == 's' || input == 'd' || input == 'w') {
			 // 设定移动方向
			moveDirection = input;

			//放置误按:调用小蛇移动函数
			if (moveDirection == 'a' && oldMoveDirection == 'd')
				moveDirection = 'd';
			else if (moveDirection == 's' && oldMoveDirection == 'w')
				moveDirection = 'w';
			else if (moveDirection == 'd' && oldMoveDirection == 'a')
				moveDirection = 'a';
			else if (moveDirection == 'w' && oldMoveDirection == 's')
				moveDirection = 's';
			else oldMoveDirection = input;

			//移动蛇
			moveSnake();
		}
	}
}

//与输入无关的更新
void updateWithoutInput() {
	//  如果游戏失败,函数返回
	if (isFailure)
		return;
	
	// 静态局部变量,初始化时为1
	static int waitIndex = 1;
	waitIndex++;					//每一帧+1
	if (waitIndex == 15) {			//小蛇每隔10帧移动一次
		//蛇运动
		moveSnake();
		// 再变成1
		waitIndex = 1;
	}
}

//蛇运动
void moveSnake() {
	int i, j;
	//日常对蛇身更新:蛇移动
		for (i = 0; i < WIDTH; i++)
			for (j = 0; j < HEIGHT; j++)
				// 不等于0的为小蛇元素 
				if (Blocks[i][j] != 0)
					Blocks[i][j]++;

	//旧蛇头蛇尾:寻找旧蛇头和旧蛇尾的xy坐标
		int oldHeadX, oldHeadY, oldTailX, oldTailY;
		//找最大的:蛇尾
		int tailBlocks = 0;	

		for (i = 0; i < WIDTH; i++) {
			for (j = 0; j < HEIGHT; j++) {
				//旧蛇尾:4最大的
				if (tailBlocks < Blocks[i][j]) {
					//更新最大的值
					tailBlocks = Blocks[i][j];
					//记录最大值的坐标,就是旧蛇尾的位置
					oldTailX = i;
					oldTailY = j;
				}
				//旧蛇头:1 2 3 4
				if (Blocks[i][j] == 2) {
					//数值为2恰好是旧蛇头的位置
					oldHeadX = i;
					oldHeadY = j;
				}
			}
		}

	//新蛇头:根据蛇的移动方向来寻找赋值新蛇头的xy坐标
		//设定变量存储新蛇头的位置
		int newHeadX = oldHeadX, newHeadY = oldHeadY;

		switch (moveDirection) {
		case'a'://左边移动	x
			newHeadX -= 1;
			break;
		case 's'://下边移动	y
			newHeadY += 1;
			break;
		case 'd'://右边移动	x
			newHeadX += 1;
			break;
		case 'w'://上边移动	y
			newHeadY -= 1;
			break;
		}

	//判断游戏是否失败:如果蛇头超出边界,或者蛇头碰到蛇身,游戏失败
	if (newHeadX >= WIDTH || newHeadX < 0 || newHeadY >= HEIGHT || newHeadY < 0 || Blocks[newHeadX][newHeadY] != 0) {
		isFailure = 1;
		return;
	}

	// 新蛇头位置数值为1
	Blocks[newHeadX][newHeadY] = 1;

	//对吃到食物以及蛇尾的处理
		//吃到食物
		if (newHeadX == foodX && newHeadY == foodY) {
			 //食物重新随机位置
			foodX = rand() % (WIDTH - 2) + 1;
			foodY = rand() % (HEIGHT - 2) + 1;
			//不对旧蛇尾处理,相当于蛇的长度+1
		}
		//没有吃到食物
		else
			 // 旧蛇尾变成空白,不吃食物时保持蛇的长度不变
			Blocks[oldTailX][oldTailY] = 0;	//灰格
}

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

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

相关文章

一文带你速通go语言指针

写在文章开头 关于go语言的系列文章更新了有一段时间了&#xff0c;从阅读量来看大部分接触go语言的读者都是Java开发&#xff0c;因为Java这门语言没有指针的概念&#xff0c;所以笔者专门整理了一篇文章带读者快速了解一下指针的概念。 Hi&#xff0c;我是 sharkChili &…

【蓝桥杯嵌入式】四、各种外设驱动(十)USART+DMA通信方式和串口通信协议的设计与使用

温馨提示&#xff1a;本文不会重复之前提到的内容&#xff0c;如需查看&#xff0c;请参考附录 【蓝桥杯嵌入式】附录 目录 重点提炼&#xff1a; 一、需求分析 1、需要的外设资源分析&#xff1a; 2、外设具体分析&#xff1a; CubeMX配置中&#xff0c;我们需要改动的参…

C 语言中位取反操作符 ~ 和逻辑取反操作符 !

在 C 语言中&#xff0c;有两种取反操作符&#xff0c;分别是位取反操作符 ~ 和逻辑取反操作符 !。 位取反操作符 ~&#xff1a; 位取反操作符 ~ 是一个一元操作符&#xff0c;用于执行按位取反操作。它会将操作数的每个位取反&#xff0c;即将 0 变为 1&#xff0c;将 1 变为 …

成为高效Java工程师的干货笔记

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流&#xff0c;摸鱼划水的小伙伴&#xff0c;请点击【全栈技术交流群】 作为一名Java工程师&…

手撕算法-判断是不是平衡二叉树

描述&#xff1a;分析&#xff1a;只需要看左右子树的深度差小于等于1&#xff0c;且左右子树都是平衡二叉树。 代码&#xff1a; public class Solution {public boolean IsBalanced_Solution (TreeNode pRoot) {if (pRoot null) return true;return Math.abs(deep(pRoot.l…

科普一下|了解胎牛血清

胎牛血清是从未出生的胎牛中经过穿刺采血后&#xff0c;经过层析、离心、三级0.1m微滤除菌等操作而收集到的上清液。本文将会探讨胎牛血清的生产流程、应用、储存以及胎牛血清的成分&#xff0c;让我们一起走进胎牛血清的世界吧&#xff01; 1、胎牛血清的生产流程&#xff1a…

redis的安装与string类型

1. redis的安装 1.1 升级gcc版本 因为centos7.x的gcc版本还是4.8.5&#xff0c;而编译指定的版本是需要5.3以上。 环境部署与安装scl源 yum install gcc cmake -y --部署安装环境 yum install centos-release-scl scl-utils-build -y --安装scl源 安装gcc新版本 yum -y ins…

Batch Normalization(批量归一化)和 Layer Normalization(层归一化)

Batch Normalization(批量归一化)和 Layer Normalization(层归一化)都是深度学习中用于改善网络训练过程的归一化技术。尽管它们的目标相似,即通过规范化中间层的激活值来加速训练过程并提高性能,但它们在细节上有所不同。 Batch Normalization (批量归一化) Batch Nor…

如何处理WordPress网站域名循环重定向

我在 HostEase 搭建了一个 WordPress 网站。在访问网站时出现了循环重定向的问题。经检查&#xff0c;发现是我在 .htaccess 文件中设置的重定向规则导致的。 重定向循环通常指的是一个网页或者URL地址在不断地进行重定向&#xff0c;最终形成一个循环&#xff0c;导致网页无法…

docker swarm 集群创建

1&#xff0c;目的&#xff1a; 通过docker swarm 工具将一台或者多台安装了docker的服务器组成一个完整的集群&#xff0c;该集群中的node节点可以通过Leader节点管理。在使用docker stack部署时&#xff0c;可以将容器自动分发到合适的节点上。 2&#xff0c;服务器准备&am…

C# 数组(Array)

C# 数组&#xff08;Array&#xff09; 初始化数组 声明一个数组不会在内存中初始化数组。当初始化数组变量时&#xff0c;您可以赋值给数组。 数组是一个引用类型&#xff0c;所以您需要使用 new 关键字来创建数组的实例。 例如&#xff1a; double[] b new double[10];…

VMware 替代专题 | 浅析 VMware 与 SmartX 超融合 I/O 路径差异及其影响

不同的超融合软件&#xff0c;其读写机制有一定的差异性&#xff0c;I/O 路径也不尽相同&#xff0c;这使得他们在 I/O 读写效率以及资源占用上都有不同的表现。有兴趣着手构建超融合基础架构的用户&#xff0c;可能会希望了解更多关于 I/O 路径的细节&#xff0c;从而在实施之…

二极管使用总结

1、整流的二极管、快恢复二极管、肖特基二极管做整流的差异。 标准整流二极管与快恢复二极管主要差异在恢复时间上。 • Standard rectifiers with a trr > 500 ns • Fast rectifiers with a 100 ns < trr < 500 ns • Ultrafast rectifiers with a trr < 100…

软件工程导论画图题汇总:期末+复试

文章目录 一、数据模型&#xff1a;实体联系图&#xff08;E-R图&#xff09;二、行为模型&#xff1a;状态转换图三、功能模型&#xff1a;数据流图四、数据字典五、系统流程图六、层次图七、HIPO图八、结构图九、程序流程图十、盒图十一、PAD图十二、判定表、判定树 一、数据…

【链表】Leetcode 19. 删除链表的倒数第 N 个结点【中等】

删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 解题思路 1、使用快慢指针找到要删除节点的前一个节点。2、删…

30-如何使用命令给共享文件夹给人员授权?windows 的共享文件

&#xff08;1&#xff09;需求&#xff1a; 维护公司的DFS真的很烦&#xff0c;每天要给他们人员进行授权。用AD组可以&#xff0c;但是呢&#xff0c;用户想看到他们授权情况&#xff0c;没办法只能一个个授权吗&#xff1f;可以使用命令吗&#xff1f;可以的 &#xff08;2&…

【SpringMVC】知识汇总

SpringMVC 短暂回来&#xff0c;有时间就会更新博客 文章目录 SpringMVC前言一、第一章 SpingMVC概述二、SpringMVC常用注解1. Controller注解2. RequestMapping注解3. ResponseBody注解4. RequestParam5. EnableWebMvc注解介绍6. RequestBody注解介绍7. RequestBody与RequestP…

腾讯游戏全年收入1799亿,DNF手游有望突破100亿

易采游戏网3月21日消息&#xff1a;腾讯公司近期发布的2023财务年度报告显示&#xff0c;其营收和净利润双双显著上升&#xff0c;尤以游戏业务成绩不俗。管理团队承诺&#xff0c;将继续深耕既有游戏产品&#xff0c;同时强化新游研发力度&#xff0c;提升市场竞争力。引人瞩目…

SV-7035VP播放模块通用型播放终端SV-7035VP-SIP 网络通用型播放功放模块

SV-7035VP播放模块通用型播放终端SV-7035VP-SIP 网络通用型播放功放模块 产品介绍 SV-7035VP模块是一款SIP播放模块&#xff0c;具有10/100M以太网接口&#xff0c;其接收网络的音频数据&#xff0c;提供立体声的音频输出。 本SIP播放模块带有一个继电器端子和一个NET接口&a…

C++ —— 内存管理

目录 1. C内存分布 2. C 内存管理方式 2.1 new 和 delete 操作内置类型 2.2 new 和 delete 操作自定义类型 3. operator new与operator delete函数 4. new和delete的实现原理 5. malloc/free 和 new/delete 的区别 1. C内存分布 首先看一段代码&#xff1a; int globalV…
最新文章