【C语言】贪吃蛇详解(附源码)

一、贪吃蛇实现效果

【C语言】贪吃蛇(控制台)

二、源码

🎈🎈🎈Snake · 残风也想永存/C语言项目 - 码云 - 开源中国 (gitee.com)🎈🎈🎈

三、如何使用C语言去实现一个贪吃蛇?

1.0.贪吃蛇游戏设计

实现一个贪吃蛇游戏,我们需要构建一个清晰的游戏框架并考虑以下几个方面:

1.1. 游戏元素生成与表现
  • 食物生成:通过随机数生成函数,确定食物在游戏窗口内的随机位置。
  • 贪吃蛇表现:利用结构体存储贪吃蛇的信息(如位置、长度、移动方向等),并通过一帧帧的绘制来展现其移动效果。
1.2. 游戏界面设计
  • 窗口大小:设定游戏窗口的尺寸,决定游戏区域的边界。
  • 可移动范围:设定贪吃蛇在游戏窗口内可自由移动的区域。
  • 围墙设计:确保贪吃蛇在触碰到窗口边界时能够识别为撞墙。 元素形状:定义贪吃蛇和食物的形状,以便在界面上绘制。
1.3. 游戏信息管理与打印
  • 贪吃蛇信息存储:使用结构体来存储贪吃蛇的状态信息,包括当前位置、长度、移动速度等。
  • **信息打印:**在游戏界面上实时显示当前贪吃蛇的长度(得分)、速度、食物的分值以及帮助信息等信息。
1.4. 游戏逻辑控制
  • 蛇的移动:根据用户的输入或默认方向控制贪吃蛇的移动方向。
  • **状态判断:**实时检测(每走一步)贪吃蛇是否撞墙或蛇头是否撞到自身,以及是否吃到食物。
  • **食物分值:**设置吃到食物后的分值变化,并更新贪吃蛇的长度。
1.5. 用户交互
  • **移动方向控制:**允许用户通过交互设备控制贪吃蛇的移动方向。
  • **移动速度控制:**允许用户通过交互设备控制贪吃蛇的移动速度。
  • **游戏状态控制:**允许用户通过交互设备控制贪吃蛇的游戏暂停与游戏结束。
1.6.实现注意事项
  • 在实现过程中,需要注意代码的模块化与可读性(我会带你们感受一下,代码的模块化是多么的爽),以便后续的维护和扩展。同时,也要考虑游戏的性能优化,确保流畅的游戏体验。
2.技术要求(win32 API / cmd命令)
2.0.前言
  • win32 API 的函数接口使用需要引头文件<Windows.h>
  • system() 库函数的使用需要引用头文件<stdlib.h>
  • 打印宽字符,必须事先本地化;
2.1.修改控制台大小和名字

在C语言中,存在一个库函数可以用来执行控制台命令:

int system(const char* command);

#修改控制台的大小 (这里我将控制台的长设为100,宽设为30)

mode con cols = 100 lines = 30

system("mode con cols=100 lines=30");

#修改控制台的名字 (这里我将控制台名字设为贪吃蛇)

title 贪吃蛇

system("title 贪吃蛇");

2.2.隐藏控制台光标
2.3.定位光标位置
2.4.修改控制台文字输出颜色
2.5.获取按键信息

更多键值信息:虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn

2.6.宽字符与窄字符
  • 宽字符和窄字符的定义:
  • ASCII是用于信息交换的标准单字节字符编码系统。它最初包含了128个特定字符,每个字符占用一个字节(8位)。这些字符主要是英文字母、数字和一些控制字符。因此,ASCII码对应的字符通常被称为窄字符。
  • 随着C语言使用国家与区域的人越来越多,使用一个char类型来存储已经明显不够用了,所以就引用了多字符(通常是两个字符),也被称为宽字符。
  • 我们可以在控制台上打印以下的宽字符来表示蛇身,蛇头,食物,和围墙
2.7.如何去打印宽字符

注意:很多宽字符在控制台上的打印是窄字符的两倍(如上边打印的特殊符号)

2.8.如何播放音乐(选择)

所需头文件

#include<Windows.h>

#include<mmstream.h>

#pragma comment(lib,"winmm.lib")

播放音乐的函数

MCIERROR mciSendString( LPCTSTR lpszCommand , LPTSTR lpszReturnString , UINT cchReturn , HANDLE hwndCallback );

第二个参数:填 NULL 就行

第三个参数:填 0 就行

第四个参数:填 NULL 就行

第一个参数:对音乐进行的操作

1.L"open 文件名 alias 别名" #打开音乐文件+取别名

2.L"setaudio 文件名 volume to 音量大小" #调整音量大小

3.L"play 文件名 repeat" #播放音乐+重复播放

4.L"stop 文件名" #停止播放音乐

这是我把此函数的所有功能进行了重新封装:以达到方便使用的功能~

2.9.如何播放音效(选择)

BOOL PlaySound( LPCSTR pszSound , HMODULE hmod , DWORD fdwSound );

第一个参数:你要播放的音效的文件路径

第二个参数:填 NULL 就行

第三个参数:填 0 就行

四、代码实现(详解)

1.代码实现流程框图
2. 每个板块的逐一实现与讲解
2.1.游戏开始
2.1.0.游戏开始的函数代码
2.1.1.播放音乐
2.1.2.设置控制台信息
2.1.3.打印欢迎界面
2.1.4.初始化围墙
2.1.5.初始化贪吃蛇

蛇的生成起始位置+起始蛇的长度

2.1.6.随机生成食物
2.1.7.打印帮助信息
2.2.游戏运行
2.2.0.游戏运行的函数代码
2.2.1.打印得分情况
2.2.2.获取按键情况
2.2.3.蛇的移动(重要)
2.2.4.判断是否撞墙
2.2.5.判断是否撞到自身
2.2.6.贪吃蛇的休眠

Sleep(snake->_SnakeSpeed);

2.2.7.判断游戏状态

snake->_State == GAME_NORMAL //只需判断这个语句是否为真;

2.3.游戏结束
2.4.菜单代码(实现重复玩功能)

五、问题拓展补充

0.问题介绍

你得保证自己的一切操作是windows控制台上执行的,而不是终端上面,修改方法,上边的横栏右键,点击设置,将windows终端,改为windows控制台即可~

1.终端示意图(错误)
2.控制台示意图(正确)
相关推荐
QAQ小菜鸟29 分钟前
一、初识C语言(1)
c语言
何曾参静谧44 分钟前
「C/C++」C/C++ 之 变量作用域详解
c语言·开发语言·c++
互联网打工人no11 小时前
每日一题——第一百二十一题
c语言
朱一头zcy2 小时前
C语言复习第9章 字符串/字符/内存函数
c语言
此生只爱蛋2 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
何曾参静谧3 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
lulu_gh_yu3 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
~yY…s<#>5 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
EricWang13587 小时前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
我是谁??7 小时前
C/C++使用AddressSanitizer检测内存错误
c语言·c++