3步实现贪吃蛇

news/2024/11/19 0:57:02/

方法很简单,打开页面,复制,粘贴

一.整体思维架构

53bf3be904424253b41d16d68a9202f8.jpg

 我们根据游戏的开始,运行,结束,将整个游戏划分成三个部分。在每个部分下面又划分出多个功能,接下来我们就根据模块一一实现功能。

二.Gamestart

2.1设置窗口大小与窗口名字

由于游戏需要用到控制台窗口,所以我们需要使用一些win32API的相关知识。

首先我们需要调整窗口大小,这里用到了一个mode con的指令,以及给title进行命名,通过调用system来实现

c861712526704fa895ef26d271b9add5.png

 在使用system之前要加上头文件

bb4c857341ec4045a10d454b39fcadea.png

 2.2隐藏屏幕光标

2.2.1 GetStdHandle

GetStdHandle是Windows ApI函数,他用于从一个特定的标准设备(标准输入,标准输出,标准错误)中取得一个句柄,用这个句柄可以操作设备。

8816363624d748e48357769336c3e137.png

 我们通过一个houput指针来接收一份标准输出光标。

2.2.2 GetConsoleCursorInfo

GetConsoleCursorInfo是用来检索有关指定控制台屏幕缓冲区的光标大小和可见性信息。他的参数为一个bool类型。使用时,需要一份handle指针,以及一个相关结构体(包含控制台光标信息)。

cfbdbefcc31b4b7196e2b034ec70a75e.png

 2.2.3 CONSOLE_CURSOR_INFO

这是一个结构体,能够获取有关控制台光标的信息。包括dwSize光标填充的字符单元格的百分比,bVisinle游标的可见性。

ac5ed8d2d6c94cb08e8c29cc214261ad.png

 这里我们将其置为false,就可以隐藏光标。

2.2.4 SetConsoleCursorInfo

设置指定控制台屏幕缓冲区的光标大小和可见性。

6f13b897f07e4e8ca03f6a4ef925e691.png

 我们将指针与检索信息传给其,就能完成光标设置。

2.3 欢迎界面WelcomeToGame

在此之前我们需要制作一个坐标设置的函数。

COORD是Windows API中定义的一个结构体,表示一个字符在控制台屏幕上的坐标。

由此我们可以制作一个定位函数

773ffc24949c4fe4a8fdc837ae93904b.png

 输入x,y的坐标,将光标定位到该处。

我们根据这个函数,以及屏幕的大小,适当调整位置打印相关信息。

a02d5c8ab4164d04956c41482f45926a.png

 这里我们运用到了pause 和cls,使每打印完一次信息就清理屏幕打印下一句信息。

2.4创建地图CreatMap

首先我们定义一下墙体

dbdf847b659d41b8a3cf4abf12fcb6df.png

 为一个□,这个字符号可以在输入法内找到。接着我们开始输入墙体,从0.0开始,在控制台内输入要用到wprintf,输入则需要在类型前加上L。由于控制台的x坐标与y坐标大小不一样的原因,x坐标相较于y坐标的每个单位要小,所以我们的循环中,x坐标处我们每两个一打印。

7fa4d4faede14019ae66cebfb7661a40.png

 2.5创建蛇身InitSnake

2.5.1蛇身结点创建

这里我们用到一个结构体,蛇身需要xy坐标,以及下一个蛇身结点的地址。

40571c82733c425f9f57d7a66a603114.png

 2.5.2蛇的维护结构

一条蛇内要包含蛇头的指针,维护蛇食物的指针,蛇的初始方向,蛇的状态,得分情况,蛇的大小,每走一步需要休眠的时间。

1bfc155c97a54d8eb98b108f9b8d23ce.png

 我们用一个枚举结构体储存蛇的相关状态以及方向控制。

cb449b44f68a462ca684388fd10d5314.png

5dd053b13950417ebfda2eac53f3c876.png 

 2.5.3初始化蛇身

传递一个蛇身结点,初始化为cur。我们先初始化蛇身为5个结点,通过for循环一次malloc出一块空间,结点依次链接。将结点赋给_psnake。

8a061aef29e7462581490d9471e8d4fb.png

 之后我们需要将蛇身打印出来,并且初始化数据。

caad7ef93c4b46ca87e994793a079a6e.png

 2.6创建食物CreateFood

首先我们要保证食物要在地图内部,其次食物不能与蛇身重复。

我们将食物坐标设置为⭐

5eee59bc41a54d148aa8d2be7a0650e2.png

我们可以用x=rand%53+2,y=rand%25+1使得坐标在地图内部,while循环x%2!=0使x坐标恒为2的倍数。

6a83bc66000c4ecbb1930f62c7398ada.png

 完成上述判断后给食物进行初始化

022df84dd3b54c9ea9d9ea43962eeae1.png

 2.7总结Gamestart

cee1d15072b346988a9a2d7cd99a58d6.png

 三. GameRun

3.1右侧打印有效信息PrintHelpInfo

98a6b7f582cf4373816daa6fa64a3a95.png

 3.2 KEY_PRESS

这是一个宏,用于检测按键状态,若按键被按下则首位为1,否则则为0

ee41e748fcd54ab7aa9dee9f3ef2681e.png

 3.3主要设计思路

首先我们在右侧打印出游戏相应提示,用KEY_PRESS判断按键,来判断蛇的移动方向以及加速减速,游戏暂停等等。我们用一个do while循环来操作蛇的每一步,每走一步休眠一定时间,直到游戏结束为止。

7c90e7f0b72c407e87a35e27ddac08ec.png

b87098acf5de4c149171a1b8a9fbc1e6.png 

 我们通过控制sleep和weight来实现加速和减速效果。

3.4 蛇的移动SnakeMove

蛇的移动首先要满足不能和原先方向相反移动。蛇头向前走,蛇尾销毁结点。以及蛇的状态,是吃食物,撞墙,自杀。

3.4.1上下左右移动

通过判断按键是否按下,用Switch来进行循环判断,注意x坐标每次移动2个单位。

eb100f8bcbdd4cfda69b2fb4762e7952.png

 3.4.2判断是否有食物

若下一个结点有食物,就将食物与蛇结点相连接,随后打印出整条蛇,改变相应的分数,最后销毁的食物空间,创建一个新的食物。

32be51fb938348ffb2004f8a0f3db2e8.png

 若不是食物,则创建一个新结点放在蛇头出,并与蛇连接,销毁最后一个蛇结点。

5137bc04c76146b5ba71d87efc5fc27d.png

 3.4.3撞墙或自杀

6d75ada302a745bea4a30dd8516c2b60.png

 3.5总结GameRun

756bdc569f7c44678ef02de33f7ddbe6.png

32a6d6e57cae44168c0c2c0a358c5e8c.png 

 四. GameEnd

4.1主要思路

告知死亡原因,并且释放所有结点。

4.2代码实现

6fa505fa697a4cc0a5353ed2dfba0dc9.png

 五.完整代码

5.1 test.c

7425dd7797434efe9b8d3fda7ed48037.png

 5.2 Snake.c

13cb1c345c324cb6a0a63a3f18cb67d9.png deb39b1ca437495fa99cee71fd7e0155.png

ebf1b66c70d947c8a0dd24210319cc7b.png

32590132b224400bb0a672ebb8caa599.png 

fe4862660e8244299105a13f33938140.png 

cf0e67004ba243878c493e9325e7b944.png 

6065636c384d4b2bb6cd26802a74e22f.png 

579ce56792564171b8350194de70b93b.png 

a21e71c69b274cd2b9031eaa6c4bd7c9.png 

a90169002d5145d9abd82ad3129db1d5.png 

4f3e11e6b45c4891b99133c5b41a1c24.png 

09c59871795d404db8d81c6a0c715917.png 

ed31e0071b044fbabc23669963de9ac6.png 

 5.3 Snake.h

7760f8d3e44548cd9315b150a2eb7396.png

f37f6b02f4e94ac8b22cb3357e09e99c.png 

1490e1ce662344db8337e0f85eb0d92b.png 

 


http://www.ppmy.cn/news/1548113.html

相关文章

linux之时间服务器

序 在项目开发中,各个模块的时间同步是一个重要的机制;那么如何在linux上搭建时间服务器呢?并且客户端怎么与服务器进行时间同步呢? 时间服务器搭建 linux中有两种时间服务器: ntp服务器和chrony服务器 1.ntp服务器 1.1 安装 …

Leetcode 每日一题 125.验证回文串

问题定义 给定一个字符串s,我们需要判断它是否是一个回文串。但在此之前,我们需要将所有大写字符转换为小写字符,并移除所有非字母数字字符。只有经过这样处理后的字符串,我们才进行回文检测。 示例解析 以下是几个示例&#x…

释放高级功能:Nexusflows Athene-V2-Agent在工具使用和代理用例方面超越 GPT-4o

在不断发展的人工智能领域,Nexusflows 推出了 Athene-V2-Agent 作为其模型系列的强大补充。这种专门的代理模型设计用于在功能调用和代理应用中发挥出色作用,突破了人工智能所能达到的极限。 竞争优势 Athene-V2-Agent 不仅仅是另一种人工智能模型&…

借助Aspose.Email,拆分和合并 Outlook PST 文件

PST(个人存储表)文件由 Microsoft Outlook 用于存储电子邮件、日历事件、联系人和其他项目。随着时间的推移,随着电子邮件和其他数据的积累,它们会变得非常大,这可能会导致性能问题、管理困难和更高的损坏风险。为了应…

工厂方法模式和抽象工厂模式

序 本文主要是记录学习设计模式当中的工厂方法和抽象工厂时碰到的疑惑和对答案的探讨 刚接触时的工厂方法模式和抽象工厂模式 工厂方法模式 类图 代码 //工厂public interface TVFactory {TV produce(); }public class TclTVFactory implements TVFactory{Overridepublic T…

Mac 使用mac 原生工具将mp4视频文件提取其中的 mp3 音频文件

简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:扎实基础 + 多做笔…

构建SSH僵尸网络

import argparse import paramiko# 定义一个名为Client的类,用于表示SSH客户端相关操作 class Client:# 类的初始化方法,接收主机地址、用户名和密码作为参数def __init__(self, host, user, password):self.host hostself.user userself.password pa…

鸿蒙UI开发——使用动画曲线

1、前 言 动画曲线是属性关于时间的变化函数,决定属性变化时产生动画的运动轨迹。某一时刻下动画曲线的斜率代表动画的速度,对应属性变化的快慢。 一条优秀的动画曲线具备连续光滑、符合用户意图、符合物理世界客观规律的特点。我们可结合用户的使用场…