赶快进来!!!手把手教你贪吃蛇

2023-11-02

一.大体框架

在这里插入图片描述
这里和前面写过的游戏一样,大体框架都是这样(有个简要的目录),我们主要是对play()函数进行封装。
由于我们引用了自己的头文件"game.h",所以我们可以把所要引用的库函数的预处理指令都放在"game.h"的头文件中。
如果你细心的话发现我们定义的数组是20行40列的,因为我们在设计地图的时候,地图的四周用’-‘和’|'围成,可以发现后者是前者长度的二倍为了形成正方形的地图所以就要使行数是列数的二倍。

二.地图初始化

在这里插入图片描述
这就是数组的初始化,我们想要打印’-‘那么就在数组中存上1,同理’|‘数组中存上2,其他位置都存0。蛇头是3,食物是4.这里在数组中存上0 1 2 3 4 是为了后面打印地图方便。我们在遍历数组时,遇到1就打印’-',遇到0就打印空格,等等。

三.地图打印

在这里插入图片描述
正如上面所述,1代表’-‘,2代表’|',0代表空格,3代表蛇头,4代表食物。

四.蛇的移动

在这里插入图片描述
蛇的移动其实就是一种视觉效果,我们不断改变蛇头的坐标之后再清屏就会得到移动的效果。
这里还要介绍俩个函数:
1,kbhit:(头文件:conio)它的作用是当有数据输入时返回值为真就。我们再玩儿贪吃蛇的时候不改变蛇身方向的时候,他也会一直的前进,这就与kbhit有关。
在这里插入图片描述
我们不输入的时候,他不会进入到这个语句中。

2,getch:(头文件:conio)这个函数读取数据的时候不用敲回车,就自动完成下一步了,如果我们这里用getchar就会很尴尬,我们输入一个字符的时候还需要按回车,要不蛇不会动。
在这里插入图片描述
我们从键盘输入w s a d,转化为给direction赋给不同的值,使蛇头的坐标发生改变。这里可能有人会有疑问为何用了两个switch语句,一个接收ch一个接收direction,因为我们不输入w s a d的时候蛇会朝着 一个方向动,这是因为我们在开头定义了一个direction变量并赋予初值。

五.如何使蛇身逐渐变长

在这里插入图片描述
这是我们的蛇头坐标与食物坐标重合的时候,我们重置食物坐标,并且得分+1;而且我们的count与蛇身长度也有关系。、
在这里插入图片描述
这个代码可能不太好理解,它的作用是把结构体中前一个坐标赋予给下一个坐标。
在这里插入图片描述
这里可以看到我们蛇头不断前进的时候,蛇身也会前进,但是最后一段蛇身我们要清理掉。
在这里插入图片描述

六.最终代码展示

// 
game.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include<time.h>
void initmap(int arr[20][40]);
void printmap(int arr[20][40]);
void playmap(int arr[20][40]);

game.c

// 
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
typedef struct Snake
{
	int x;
	int y;
}S;
	S snake[800] = { {15,20} };
	int arr[20][40] = { 0 };
	int food_x = 2;
	int food_y = 6;
	int count = 0;
	int i = 0;
void initmap(int arr[20][40])
{
	int i = 0;
	int j = 0;
	
	for (i = 0; i < 20; i++)
	{
		for (j = 0; j < 40; j++)
		{
			if (0 == i || 19 == i)//1,-,    2,|,      0,打印空格    3,打印蛇头'*'
				arr[i][j] = 1;
			if (0 == j || 39 == j)
				arr[i][j] = 2;
		}
	}
}
void printmap(int arr[20][40])
{
	int i = 0;
	int j = 0;
	for (i = 0; i < 20; i++)
	{
		for (j = 0; j < 40; j++)
		{
			switch (arr[i][j])
			{
			case 1:printf("-"); break;
			case 2:printf("|"); break;
			case 0:printf(" "); break;
			case 3:printf("*"); break;
			case 4:printf("$"); break;
			}
		}
		printf("\n");
	}
}
void playmap(int arr[20][40])
{
	int direction = 1;
	while (1)
	{
		arr[food_x][food_y] = 4;
		arr[snake[count].x][snake[count].y] = 0;//最后一节不断消失
		char ch = 0;
		if (_kbhit())
		{
			ch = _getch();
			switch (ch)
			{
			case 'w':direction = 1 ;break;
			case 's':direction = 2; break;
			case 'a':direction = 3; break;
			case 'd':direction = 4; break;
			default:break;
			}
		}
		for (i = count; i > 0; i--)
		{
			snake[i].x = snake[i - 1].x;
			snake[i].y = snake[i - 1].y;
			arr[snake[i].x][snake[i].y] = 3;
		}
		switch (direction)
		{
			case 1:snake[0].x--; break;
			case 2:snake[0].x++; break;
			case 3:snake[0].y--; break;
			case 4:snake[0].y++; break;
			default:break;
		}
		arr[snake[0].x][snake[0].y] = 3;
		Sleep(50);
		system("cls");
			
		if (snake[0].x == 0 || snake[0].x == 19 || snake[0].y == 0 || snake[0].y == 39)
			exit(0);
		if (snake[0].x == food_x && snake[0].y == food_y)
		{
				
			arr[food_x][food_y] = 0;
			food_x = rand() % 18+1;
			food_y = rand() % 38+1;
			arr[food_x][food_y] = 4;
			count++;
				
				
		}
		printmap(arr);
		printf("\ncount=%d",count);
			
	}
}

test.c

// 
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

void menu()
{
	printf("**********************************\n");
	printf("*********** 1.play ***************\n");
	printf("*********** 0.exit ***************\n");
	printf("**********************************\n");
}
void play()
{
	int snake_x = 10;
	int snake_y = 15;
	int arr[20][40]={0};
	initmap(arr);
	printmap(arr);
	playmap(arr);
}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;;
	do
	{
		menu();
		printf("请输入:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:play(); break;
		case 2:printf("退出游戏\n"); break;
		default:printf("输入错误,请重新输入\n"); break;
		}
	} while (input);
	return 0;
}

感谢您的观看!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

赶快进来!!!手把手教你贪吃蛇 的相关文章

  • 如何向WebRequest添加参数?

    我需要从 Web 服务调用一个方法 所以我编写了以下代码 private string urlPath http xxx xxx xxx manager string request urlPath index php org get or
  • C# 中直接从 URL 获取图像尺寸

    我正在尝试使用以下代码直接从网络上获取图片的尺寸 string image http www hephaestusproject com csharp3 png byte imageData new WebClient DownloadDa
  • 如何检查号码是否只有唯一的数字?

    例如 2345 是唯一的数字 因为没有数字显示两次 但 3324 不是唯一的数字 因为 3 出现了两次 我尝试使用 但我 代码 显示但我没有得到数字我得到了数字 编辑 你不能使用字符串 number 10 number 100 number
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • C# 实体框架我们应该使用 POCO.Id 还是仅使用 POCO 设置关系?

    我在服务方法中遇到一种情况 将 POCO 分配为另一个 POCO 的子对象无法按预期工作 我正在使用实体框架 4 public void ChangeOrderCurrency Currency currency order Currenc
  • 打开位置设置页面或提示用户启用位置

    我一直在绞尽脑汁 徒劳地谷歌搜索 我正在尝试找到一种方法来提示用户通过直接进入设置页面或仅点击屏幕上的 是 来切换位置 我见过的所有代码似乎都不起作用 有人有有效的方法吗 一个详细的例子将不胜感激 谢谢 我对 Xamarin 开发非常陌生
  • 应用新设置时如何防止 GraphicsDevice 被丢弃?

    我的游戏窗口允许手动调整大小 这意味着它可以像任何其他普通窗口一样通过拖动其边缘来调整大小 游戏还利用了RenderTarget2D rt2d 在主 Draw 方法中设置主渲染目标 GraphicsDevice SetRenderTarge
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r
  • Web 文本编辑器中的 RTF 格式

    网络上是否有支持 RTF 格式文档输入的文本编辑器 我知道这对 webdev 来说有点奇怪 但我需要从数据库中读取 RTF 文档 并在基于 Web 的文本编辑器中对其进行编辑 然后将其存储回 RTF 中 在我在转换工具上投入太多资金之前 我
  • 如果我重新分配并且新大小为 0,会发生什么情况。这与释放等效吗?

    给出以下代码 int a NULL a calloc 1 sizeof a printf d n a a realloc a 0 printf d n a return 0 它返回 4078904 0 这个 realloc 相当于 free
  • 如何解决文件被另一个进程使用的问题?

    我一直在 VS NET 2010 中调试 没有任何问题 但现在无法建造 我收到错误 Unable to copy file filename to bin Debug filename The process cannot access t
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • 禁用实体框架的默认值生成(Code First)

    我数据库中有一个列不能为空 我想将其设置为默认值在数据库中 问题是实体框架似乎自己创建了一个默认值 例如 int gt 0 并且完全忽略了数据库中的默认值约束 有没有办法禁用实体框架的默认值 我发现您可以使用以下属性来装饰您的字段 Data
  • 如果项目包含多个文件夹,如何使用 Add-Migration

    我想Add Migration使用我的 DbContext 但出现错误 The term add migration is not recognized as the name of a cmdlet function script fil
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • 如何阻止 Control-I 在 CoreWindow 范围内的 UWP 文本框中插入选项卡?

    当我在 UWP 应用程序中有一个 TextBox 时 对我来说 奇怪的行为 在 Windows 10 中创建通用的空白应用程序 UWP 应用程序 使用以下代码将文本框添加到默认网格
  • 如何在 SQLite 中检查数据库是否存在 C#

    我目前正在用 C 编写一个应用程序 并使用 sqlite 作为嵌入式数据库 我的应用程序在启动时创建一个新数据库 但如何让它检查数据库是否存在 如果它确实存在 我如何让它使用它 如果不存在如何创建一个新数据库 这是我到目前为止所拥有的 pr
  • 使用 WinAPI 连接禁用的显示设备

    我的问题是启用禁用的监视器ChangeDisplaySettingsEx 我想这不是火箭科学 但经过一番挖掘后 它看起来仍然是不可能的 我找到了一种根据找到的 Microsoft 代码示例禁用所有辅助显示器的方法here https msd
  • 在 C# 窗口应用程序中运行 C/C++ 控制台应用程序?

    现在 我想开发一个简单的应用程序 因此我决定最快的编码方式是 C NET 但现在 我很难实现我需要的功能之一 我想做的是在 C 应用程序的窗口内运行 C C 控制台应用程序 就像在虚幻前端中一样 添加一点通信方式 以便我可以为控制台应用程序
  • boost::spirit::qi::语法和可变参数模板

    我在使用可变参数模板定义语法时面临一个问题 我首先定义一些包含在某些结构中的简单语法 例如纬度 经度 如下所示 include

随机推荐

  • 写爬虫遇到验证码识别问题的解决方案

    写爬虫遇到验证码识别问题的解决方案 遇到滑块问题 在写爬虫的时候 经常会遇到滑块问题 很多次都想过尝试如何攻破滑块 但是每次都没成功 除了最开始的极验滑块 当时通过原图和滑块图的对比 能够得出缺口坐标 但是随着极验 网易 腾讯滑块的更新 已
  • 图(Graph)——图的遍历算法

    图 Graph 图的遍历算法 前言 深度优先搜索 广度优先搜索 前言 有了图的存储结构以后 就要考虑解决图的相关问题 关于图的算法有很多 比如最小生成树 最短路径 拓扑排序等 这些算法以后有空补上 现在主要记录图的遍历算法 在介绍前 先给出
  • 贪心之商人的诀窍

    商人的诀窍 Time Limit 1000 ms Memory Limit 65536 KiB Submit Statistic Problem Description E star和von是中国赫赫有名的两位商人 俗话说的好无商不奸 最近
  • web端生成pdf,前端生成pdf导出并自定义页眉页脚

    web前端生成pdf文档 2023 06 15 根据码友 咔布哩 需求补充完善一丢丢功能 2023 05 08 重新整理 封装目录结构图 generatePdfFile config js generatePdfFile index js
  • dede后台-系统基本参数无法保存中文/显示空白

    dede后台 系统基本参数无法保存中文 显示空白解决办法 dede templets sys info htm里面搜索 htmlspecialchars row value 替换成 htmlspecialchars row value EN
  • C++—C++程序基础

    文章目录 1 数据类型 1 1 基本数据类型 1 2 字面值常量 1 3 左值和右值 1 4 引用与指针 2 基本输入输出 2 1 输出 2 2 输入 3 函数 3 1 内联函数 3 2 函数的重载 1 数据类型 1 1 基本数据类型 在C
  • 用c语言编写九九乘法表

    这个需要使用两重循环来实现 我们用i表示行 外面一层循环 for i 1 i lt 9 i 外循环 从第一行到第九行 第一步 输出该行的乘法式子 第二步 该行结束换行 我们只需要将中间2步补充完整即可 第二步换行比较简单 printf n
  • 1P+N

    1p n是什么意思 单极二线 就是 一个单片空气开关 和一个漏电保护模块组合在一起的开关 火线 零线一起进出组合开关 当漏电发生时漏电模块带动空气开关跳闸 火线和外网电断开 但是零线是不断开的
  • 公共子串计算

    h1 公共子串计算 h1
  • 双线macd指标参数最佳设置_mt5怎么添加双线macd?mt5中macd怎么设置快慢线?

    在mt4平台中怎么添加双线macd指标 的设置要求是这样的 将MACD的快速EMA参数设定为8 将慢速EMA参数设定 打开mt4 菜单栏选择 数据文件夹 mql4 indicator 将技术指标复制粘贴进去 然后关闭mt4重新打开 菜单栏
  • Android Studio打开XML文件Design显示Waiting for build to finish

    Android Studio打开XML文件Design显示Waiting for build to finish 项目编译完 Design的界面一直出现如下图所示情况 解决方法一 重构项目 按下 ctrl shift A 输入 Sync P
  • [spring处理webservice报文] 3 rest处理soap报文

    目录 1 背景 2 rest请求处理soap报文 2 1 创建controller 3 调试 1 背景 前面两篇讲解了spring处理soap报文的囧途 如下 这一篇讲解下spring如何通过post类型的请求来处理soap报文 sprin
  • rust的错误和异常

    一 错误和异常 在所有语言中 对程序运行不按照设计的 套路 出牌 都是错误 异常可以理解成程序的错误引发了运行的故障 甚至导致程序崩溃 正因为如此 对错误和异常的处理是所有语言都必须拥有的一个行为 无论是从语法层面还是从运行检查层面 都是无
  • 51单片机PWM输出

    PWM输出 学期快结束了 51单片机的学习也差不多告一段落 也快要转入新的学习阶段 寒假找个时间看看32 小白哈哈哈 下面是我学习51定时器弄出来的小东西 一个PWM的输出 还请大神指点 刚开始觉得PWM输出应该不难 很容易做的 但是后面越
  • Spring Boot使用Scheduled完成自动任务

    说明 Scheduled注解可以控制方法定时执行 其中有三个参数可选择 1 fixedDelay控制方法执行的间隔时间 是以上一次方法执行完开始算起 如上一次方法执行阻塞住了 那么直到上一次执行完 并间隔给定的时间后 执行下一次 2 fix
  • layui php phpexcel导出,Yii2 基于 layui 的 Excel 上传并导入数据(含分页)

    安装命令 composer require phpoffice phpexcel 引入layui包 我这里用的是2 4 5的版本 请自行下载对应版本 layui前台页面 导入文件 卡号信息 layui use form element up
  • 【python随笔】之【将doc、docx文件保存为txt文件】

    import win32com client def change word to txt word path save path print 读取中 word win32com client Dispatch Word Applicati
  • vector 操作

    C 内置的数组支持容器的机制 但是它不支持容器抽象的语义 要解决此问题我们自己实现这样的类 在标准C 中 用容器向量 vector 实现 容器向量也是一个类模板 标准库vector类型使用需要的头文件 include
  • 汇编语言笔记-keil5软件仿真及调试

    目录 keil5调试功能 软件仿真设置 硬件调试设置 调试方法 调试选项及介绍 调试窗口 Command Disassembly Symbols Registers Call Stack Locals Watch Memory Serial
  • 赶快进来!!!手把手教你贪吃蛇

    一 大体框架 这里和前面写过的游戏一样 大体框架都是这样 有个简要的目录 我们主要是对play 函数进行封装 由于我们引用了自己的头文件 game h 所以我们可以把所要引用的库函数的预处理指令都放在 game h 的头文件中 如果你细心的