【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.控制台示意图(正确)

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

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

相关文章

每日一题:地下城游戏

恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0…

ThreeJs 环境配置及遇到问题的解决方法

一、环境搭建 ThreeJs在实际在实际使用中更多的是结合框架开发例如&#xff1a;vue框架、react框架&#xff0c;在使用时需要配置开发环境&#xff0c;本文使用的是vscode ThreeJs NodeJs vue 1、ThreeJs安装 下载路径&#xff1a;GitHub - mrdoob/three.js: JavaScript…

CentOS命令大全:掌握关键命令及其精妙用法!

CentOS是一种流行的开源企业级Linux发行版&#xff0c;它基于Red Hat Enterprise Linux (RHEL)的源代码构建。对于系统管理员和运维工程师来说&#xff0c;掌握CentOS的常用命令至关重要。 这些命令不仅可以帮助管理服务器&#xff0c;还可以进行故障排查、性能监控和安全加固等…

【idea】idea 中 git 分支多个提交合并一个提交到新的分支

一、方法原理讲解 我们在 dev 分支对不同的代码文件做了多次提交。现在我们想要把这些提交都合并到 test 分支。首先我们要明白四个 git 操作&#xff0c; commit&#xff1a;命令用于将你的代码变更保存到本地代码仓库中&#xff0c;它创建了一个新的提交&#xff08;commit…

Ubuntu编译安装MariaDB并进行初始化配置

Ubuntu编译安装MariaDB并进行初始化配置 1. 编译安装MariaDB2. 配置MariaDB3. Docker安装MariaDB 1. 编译安装MariaDB MariaDB官方安装文档&#xff1a;https://mariadb.com/kb/en/Build_Environment_Setup_for_Linux/    下载MariaDB源码&#xff1a;https://mariadb.org/ma…

Spring Boot 如何实现缓存预热

Spring Boot 实现缓存预热 1、使用启动监听事件实现缓存预热。2、使用 PostConstruct 注解实现缓存预热。3、使用 CommandLineRunner 或 ApplicationRunner 实现缓存预热。4、通过实现 InitializingBean 接口&#xff0c;并重写 afterPropertiesSet 方法实现缓存预热。 1、使用…

TCP-模拟BS架构通信

简介 bs是通过浏览器进行访问的每次访问都会开启一个短期的socket用来访问服务器的资源 响应报文的格式 服务端 bs架构中的b是浏览器&#xff0c;不需要我们书写&#xff0c;我们只需要书写服务端即可 服务端 public class Server {public static void main(String[] args) {S…

[C++]22:C++11_part_one

C11 一.列表初始化&#xff1a;1.{}初始化&#xff1a;2.C11扩大了列表初始化的范围&#xff1a;3.std::initializer_list1.简单类型的列表初始化&#xff1a;2.复杂类型的列表初始化3.实现vector的列表初始化4.实现list的列表初始化&#xff1a;5.不支持列表初始化&#xff1a…

制作一个RISC-V的操作系统十六-系统调用

文章目录 用户态和内核态mstatus设置模式切换核心流程封装代码背景解释代码示例解析解释目的 用户态和内核态 mstatus设置 此时UIE设置为1和MPIE为1&#xff0c;MPP设置为0 代表当前权限允许UIE中断发生&#xff0c;并且在第一个mret后将权限恢复为用户态&#xff0c;同时MIE也…

易错知识点(学习过程中不断记录)

快捷键专区&#xff1a; 注释&#xff1a;ctrl/ ctrlshift/ 保存&#xff1a;ctrls 调试&#xff1a; 知识点专区&#xff1a; 1基本数据类型 基本数据类型有四类&#xff1a;整型、浮点型、字符型、布尔型&#xff08;Boolean&#xff09;&#xff0c; 分为八种&#xff…

UE5 GAS开发P40 周期性效果,持续治疗

Periodic Gameplay Effects周期性的游戏效果 它们在一段时间内以固定的间隔重复应用到目标上。这种效果通常用于表示持续性伤害、治疗或其他影响&#xff0c;例如中毒、灼烧或回复效果。 修改GE_CrystalHeal,在Period改为每0.1秒执行一次 假如同时有三个持续时间在进行,那么这…

STM32与OLED显示屏通信(四针脚和七阵脚)

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. 单片机调试 2. OLED简介 3. 接线 4. OLED驱动函数 4.1 四针脚版本 OLED.c OLED.h OLED_Font.h 4.2 七针脚版本 引脚连接 OLED.c OLED.h OLED_Font.h 5. 主函数 工程文件模板 1. 单片机…

linux下安装deepspeed

安装步骤 一开始安装deepspeed不可以使用pip直接进行安装。 这时我们需要利用git进行clone下载到本地&#xff1a; git clone https://github.com/microsoft/DeepSpeed.git 进入到deepspeed的安装目录下 cd /home/bingxing2/ailab/group/ai4agr/wzf/Tools/DeepSpeed 激活…

verilog 从入门到看得懂---matlab 自动生成verilog

matlab 的强大不用多说&#xff0c;以前经常用simulink 生成c&#xff0c;最近尝试用simulink进行了verilog的生成&#xff0c;方法也很简单。 一个简单的示例如下。 1&#xff0c;新建一个模型文件&#xff0c;并且根据需要进行模型搭建 2.配置HDL生成模块 3.点击 generation…

纯血鸿蒙APP实战开发——全局状态保留能力弹窗

全局状态保留能力弹窗 介绍 全局状态保留能力弹窗一种很常见的能力&#xff0c;能够保持状态&#xff0c;且支持全局控制显隐状态以及自定义布局。使用效果参考评论组件 效果图预览 使用说明 使用案例参考短视频案例 首先程序入口页对全局弹窗初始化&#xff0c;使用Globa…

Linux学习之路 -- 进程篇 -- 自定义shell的编写

前面介绍了进程程序替换的相关知识&#xff0c;接下来&#xff0c;我将介绍如何基于前面的知识&#xff0c;编写一个简单的shell&#xff0c;另外本文的所展示的shell可能仅供参考。 目录 <1>获取用户的输入和打印命令行提示符 <2>切割字符串 <3>执行这个…

qt-C++笔记之滑动条QSlider和QProgressBar进度条

qt-C笔记之滑动条QSlider和QProgressBar进度条 —— 2024-04-28 杭州 本例来自《Qt6 C开发指南》 文章目录 qt-C笔记之滑动条QSlider和QProgressBar进度条1.运行2.阅读笔记3.文件结构4.samp4_06.pro5.main.cpp6.widget.h7.widget.cpp8.widget.ui 1.运行 2.阅读笔记 3.文件结构…

智慧供热一站式热网平衡多功能集成系统

供热管理地域分散的现实&#xff0c;决定必须采用先进技术手段开发软件系统&#xff0c;使各管理单位互联互通。在多年技术积累的基础上&#xff0c;公司采用目前成熟而且领先的技术架构&#xff0c;研发了适用于多个组织机构集中式管理的供热管理软件。使管理在技术上不再受地…

经典的目标检测算法有哪些?

一、经典的目标检测算法有哪些&#xff1f; 目标检测算法根据其处理流程可以分为两大类&#xff1a;One-Stage&#xff08;单阶段&#xff09;算法和Two-Stage&#xff08;两阶段&#xff09;算法。以下是一些经典的目标检测算法&#xff1a; 单阶段算法: YOLO (You Only Loo…

Java集合框架-Collection-queue

目录 一、Deque二、ArrayDequeArrayDeque层次结构图ArrayDeque概述ArrayDeque底层数据结构ArrayDeque常用方法(简略) 三、PriorityQueuePriorityQueue层次结构图PriorityQueue概述PriorityQueue 底层数据结构PriorityQueue常用方法(详细) Java里有一个叫做Stack的类&#xff0c…