贪吃蛇小游戏(c语言)

1.效果展示

屏幕录制 2024-04-28 205129

2.基本功能

贪吃蛇地图绘制
蛇吃食物的功能 (上、下、左、右方键控制蛇的动作)
蛇撞墙死亡
蛇撞自身死亡
计算得分
蛇身加速、减速
暂停游戏

3.技术要点

C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等。

4.WIN32 API

WIN32 API是windows操作系统最基本的API之一,它定义了windows操作系统的各种操作的函数和数据结构,WIN32 API也就是Windows 32位平台的应用程序编程接口。

4.1控制台程序

我们平时运行代码的时候那个黑色框程序其实就是控制台程序

然后可以使用cmd命令来控制黑色框的长度和宽度:设置控制台窗口的大小:200行,50列

mode con cols=200 lines=50

参考:mode | Microsoft Learn

然后通过命令来修改控制台名字

title 贪吃蛇

效果:

参考:mode | Microsoft Learn

通过c语言的system函数来实现:

#include <stdio.h>
int main()
{//设置控制台窗⼝的⻓宽:设置控制台窗⼝的⼤⼩,50⾏,200列system("mode con cols=200 lines=50");//设置cmd窗⼝名称system("title 贪吃蛇"); return 0;
}
4.2控制屏幕上的坐标COORD

参考:COORD 结构 - Windows Console | Microsoft Learn

COORD是windowsAPI中定义的一个结构体,它可以表示字符在屏幕上的坐标,最左上角的位置坐标是(0,0)。

COORD类型的声明:
typedef struct _COORD {SHORT X;SHORT Y;
} COORD, *PCOORD;

给坐标赋值:

COORD pos = { 10, 15 };
4.3.GetStdHandle(简单了解会用即可)

相关了解:GetStdHandle 函数 - Windows Console | Microsoft Learn

GetStdHandle是⼀个Windows API函数。它用于从⼀个特定的标准设备(标准输入、标准输出或标准错误)中取得⼀个句柄(用来标识不同设备的数值),使用这个句柄可以操作设备。
 HANDLE GetStdHandle(DWORD nStdHandle);

例:

HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

HANDLE是一种类型;

4.4.GetConsoleCursorInfo(会用即可)
相关了解: GetConsoleCursorInfo 函数 - Windows Console | Microsoft Learn

例:

HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息
4.5.CONSOLE_CURSOR_INFO(简单了解会用即可)

这是一个结构体,包含了控制台的光标的相关信息:

typedef struct _CONSOLE_CURSOR_INFO {DWORD dwSize;BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;

其中

dwSize,由光标填充的字符单元格的百分比。 此值介于1到100之间。 光标外观会变化,范围从完全填充单元格到单元底部的水平线条。
bVisible,游标的可见性。 如果光标可见,则此成员为 TRUE。
例:
CursorInfo.bVisible = false; //隐藏控制台光标
4.6.SetConsoleCursorInfo(简单了解会用即可)

相关了解:SetConsoleCursorInfo 函数 - Windows Console | Microsoft Learn

SetConsoleCursorInfo可以 设置指定控制台屏幕缓冲区的光标的大和可见性
例:
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//影藏光标操作
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo(hOutput, &CursorInfo);//设置控制台光标状态
4.7.SetConsoleCursorPosition(简单了解会用即可)

相关了解:SetConsoleCursorPosition 函数 - Windows Console | Microsoft Learn

设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调用SetConsoleCursorPosition函数将光标位置设置到指定的位置。
例:
COORD pos = { 10, 5};HANDLE hOutput = NULL;//获取标准输出的句柄(⽤来标识不同设备的数值)hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//设置标准输出上光标的位置为posSetConsoleCursorPosition(hOutput, pos);

写贪吃蛇时为了方便可以将上面的初始化信息封装成一个函数

例:

//设置光标的坐标
void SetPos(short x, short y)
{//取句柄HANDLE hOutput = NULL;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//移动光标位置COORD pos = { x, y };SetConsoleCursorPosition(hOutput, pos);
}
4.8.GetAsyncKeyState(简单了解会用即可)

相关了解:getAsyncKeyState 函数 (winuser.h) - Win32 apps | Microsoft Learn

键盘中每个按键都有与之对应的虚拟值。

获取按键情况,GetAsyncKeyState的函数原型如下:
SHORT GetAsyncKeyState(int vKey
);
GetAsyncKeyState 的返回值是short类型,在上⼀次调用 GetAsyncKeyState 函数后,如果返回的16位的short数据中,最高位是1,说明按键的状态是按下,如果最高是0,说明按键的状是抬起;如果最低位被置为1则说明,该按键被按过,否则为0。如果要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1.
我们可以定义宏:
#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )

虚拟键:虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn

5.地图

游戏地图效果:

其中有一些宽字符想要打印还要再作一些处理

5.1<locale.h>本地化(简单了解会用即可)
<locale.h>提供的函数用于控制C标准库中对于不同的地区会产生不⼀样行为的部分。
在标准中,依赖地区的部分有以下几项:
数字量的格式
货币量的格式
字符集
日期和时间的表示形式
这里我们主要是获得字符的修改。
5.2.类项

通过修改地区,程序可以改变它的行为来适应世界的不同区域。但地区的改变可能会影响库的许多部分,其中⼀部分可能是我们不希望修改的。所以C语言支持针对不同的类项进行修改,下面的⼀个宏,指定⼀个类项:
LC_COLLATE:影响字符串比较函数 strcoll() strxfrm()
LC_CTYPE:影响字符处理函数的行为。
LC_MONETARY:影响货币格式。
LC_NUMERIC:影响 printf() 的数字格式。
LC_TIME:影响时间格式 strftime() wcsftime()
LC_ALL - 针对所有类项修改,将以上所有类别设置为给定的语言环境。
相关了解: setlocale,_wsetlocale | Microsoft Learn
5.3setlocale函数
char* setlocale (int category, const char* locale);
setlocale 函数用于修改当前地区,可以针对⼀个类项修改,也可以针对所有类项。
setlocale 的第⼀个参数可以是前面说明的类项中的⼀个,那么每次只会影响⼀个类项,如果第⼀个参数是LC_ALL,就会影响所有的类项。
C标准给第二个参数仅定义了2种可能取值: "C" (正常模式)和 " " (本地模式)。
在任意程序执行开始,都会隐藏式执行调用:
setlocale(LC_ALL, "C");
当地区设置为"C"时,库函数按正常方式执行,小数点是⼀个点。
当程序运行起来后想改变地区,就只能显示调用setlocale函数。用" "作为第2个参数,调用setlocale 函数就可以切换到本地模式,这种模式下程序会适应本地环境。
比如:切换到我们的本地模式后就支宽字符(汉字)的输出等。
setlocale(LC_ALL, " ");//切换到本地环境
5.4.宽字符的打印
宽字符的字面量必须加上前缀“L”,否则 C 语言会把字面量当作窄字符类型处理。前缀“L”在单引
号前面,表示宽字符,对应 wprintf() 的占位符为 %lc ;在双引号前,表示宽字符串,对应 wprintf() 的占位符为 %ls
例:
#include<locale.h>
int main() {setlocale(LC_ALL, "");wchar_t ch1 = L'●';wchar_t ch2 = L'晚';wchar_t ch3 = L'成';wchar_t ch4 = L'★';printf("%c%c\n", 'a', 'b');wprintf(L"%lc\n", ch1);wprintf(L"%lc\n", ch2);wprintf(L"%lc\n", ch3);wprintf(L"%lc\n", ch4);return 0;
}

输出结果:

这里看到一个汉字或者一个宽字符需要占两个字符的位置,所以我们打印地图和对蛇,食物的坐标进行处理时一定要注意。

5.5.地图坐标

我们要设置一个40行,54列的地图:

5.6蛇身和食物
初始化状态,假设蛇是连续5个节点。
注意:蛇的每个节点的x坐标必须是2个倍数,否则可能会出现蛇的⼀个节点有⼀半出现在墙体中,
另外一半在墙外的现象,坐标不好对齐。
关于食物,就是在墙体内随机生成⼀个坐标(x坐标必须是2的倍数),坐标不能和蛇的身体重合,然后打印★。
效果如上图:
5.7数据结构设计

蛇每吃一个食物,蛇身就会变长一节,因此我们可以用链表来存蛇的信息,每一个结点只要记录好蛇的坐标就行,食物同样也是用这个链表来存。

typedef struct SnakeNode{int x;int y;struct SnakeNode* next;
}SnakeNode, * pSnakeNode;

然后维护蛇还要一个结构体:

typedef struct Snake
{pSnakeNode _pSnake;//维护整条蛇的指针pSnakeNode _pFood;//维护⻝物的指针enum DIRECTION _Dir;//蛇头的⽅向,默认是向右enum GAME_STATUS _Status;//游戏状态int _Socre;//游戏当前获得分数int _foodWeight;//默认每个⻝物10分int _SleepTime;//每⾛⼀步休眠时间
}Snake, * pSnake;

蛇的方向可以用枚举:

//⽅向
enum DIRECTION
{UP = 1,DOWN,LEFT,RIGHT
};

游戏的状态:

//游戏状态
enum GAME_STATUS
{OK,//正常运⾏KILL_BY_WALL,//撞墙KILL_BY_SELF,//咬到⾃⼰END_NOMAL//正常结束
};

6.游戏流程

7.游戏参考代码

c语言: 储存c代码 - Gitee.com

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何更好的使用cpm

nvidia发布了RAFT库&#xff0c;支持向量数据库的底层计算优化&#xff0c;RAFT 也使用CMake Package Manager( CPM )和rapids-cmake管理项目&#xff0c;可以方便快捷的下载到需要的对应版本的thirdparty的依赖库&#xff0c;但是&#xff0c;一般情况下&#xff0c;项目是直接…

C++多态(全)

多态 概念 调用函数的多种形态&#xff0c; 多态构成条件 1&#xff09;父子类完成虚函数的重写&#xff08;三同&#xff1a;函数名&#xff0c;参数&#xff0c;返回值相同&#xff09; 2&#xff09;父类的指针或者引用调用虚函数 虚函数 被virtual修饰的类成员函数 …

DSP开发实战教程-国产DSP替代进口TI DSP的使用技巧

1.替换CCS安装路径下的Flash.out文件 找到各自CCS的安装路径&#xff1a; D:\ti\ccs1230\ccs\ccs_base\c2000\flashAlgorithms 复制进芯电子国产DSP官网提供的配置文件 下载链接&#xff1a;https://mp.csdn.net/mp_download/manage/download/UpDetailed 2.替换原有文件 3.…

Python 深度学习(一)

原文&#xff1a;zh.annas-archive.org/md5/98cfb0b9095f1cf64732abfaa40d7b3a 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 序言 随着全球对人工智能的兴趣不断增长&#xff0c;深度学习引起了广泛的关注。每天&#xff0c;深度学习算法被广泛应用于不同行业。本书…

[GXYCTF 2019]BabyUpload

过滤 <? 且后缀不能有 php 上传1.jpg文件&#xff0c;内容为&#xff1a; <script languagephp>eval($_POST[cmd]);</script> 但文件后缀为.jpg&#xff0c;蚁剑不能连接。那怎么办呢&#xff1f; .htaccess文件&#xff1a;解析.jpg文件中的php代码 &#xf…

【C语言】——数据在内存中的存储

【C语言】——数据在内存中的存储 一、整数在内存中的存储1.1、整数的存储方式1.2、大小端字节序&#xff08;1&#xff09;大小端字节序的定义&#xff08;2&#xff09;判断大小端 1.3、整型练习 二、浮点数在内存中的存储2.1、引言2.2、浮点数的存储规则2.3、浮点数的存储过…

macbookproM2通过docker安装CDH

背景&#xff1a;项目中用的CDH大数据集群&#xff0c;但是自己的电脑上是MacM芯片的系统&#xff0c;网上在arm架构上搭建CDH集群的资料太少了&#xff0c;所以自己尝试搭建并且梳理一下文档 一、启动docker 我安装的是桌面版的docker 二、搜索CDH的镜像&#xff0c;然后拉…

【八大排序(三)】快速排序

❣博主主页: 33的博客❣ ▶️文章专栏分类:八大排序◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多排序知识 目录 1.前言2.快速排序2.1概念2.2画图理解2.3递归代码实现2.3.1Hoare法2.3.2挖坑法2.3.3前…

【介绍下OneFlow概念清单】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

智能健康管理系统的一次新体验

智能健康管理系统是一个集成了多方面数据资源&#xff0c;并配合人工智能算法的健康管理系统。该系统的应用涉及多个领域&#xff0c;包括医学、科学、生态和医疗保健等。其服务对象包括健康人群、亚健康人群和疾病人群&#xff0c;旨在通过病因预防、临床前期预防和临床预防三…

Java设计模式 _结构型模式_组合模式

一、组合模式 1、组合模式 组合模式&#xff08;Composite Pattern&#xff09;是这一种结构型设计模式。又叫部分整体模式。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次关系。即&#xff1a;创建了一个包含自己对象组的类&#xff0c;该类提供了修改…

代码随想录——双指针与滑动窗口(四)

一.1423. 可获得的最大点数 题目详情 解题思路 这里我们每次只能取最左或最右边的卡牌,第一反应其实是使用双指针&#xff0c;通过局部贪心来解决&#xff0c;但是如果两边相等的话用局部贪心无法来判断到底取哪一边&#xff0c;那我们不妨换一个思路&#xff1a; 我们首先任…

AI项目二十一:视频动态手势识别

若该文为原创文章&#xff0c;转载请注明原文出处。 一、简介 人工智能的发展日新月异&#xff0c;也深刻的影响到人机交互领域的发展。手势动作作为一种自然、快捷的交互方式&#xff0c;在智能驾驶、虚拟现实等领域有着广泛的应用。手势识别的任务是&#xff0c;当操作者做出…

写文献综述常用的几种深度神经网络模型!

写文献综述常用的几种深度神经网络模型 卷积神经网络&#xff08;CNN&#xff09; 解释说明&#xff1a;专门用于处理图像和图像数据的深度学习模型。它通过卷积层、池化层等操作提取图像特征。应用&#xff1a;图像分类、目标检测、人脸识别等。未来改进&#xff1a;进一步提…

windows和mac 电脑 部署Ollama

官网地址&#xff1a;https://ollama.com/ github地址&#xff1a;https://github.com/ollama/ollama 一、windows下 https://github.com/ollama/ollama 安装大模型 ollama run llama3 下载的大模型地址&#xff1a; C:\Users\dengg\.ollama 4.34G

二维数组-----刷题2

题目不是傻子题目&#xff0c;但很简单&#xff01;定义一个变量k&#xff0c;在嵌套中不断累加输出即可。 #include<cstdio> int k,n; int main(){scanf("%d",&n);for(int i1;i<n;i){for(int j1;j<n;j){k;printf("%d ",k);}printf("…

Python基础学习之记录中间文件

倘若想记录代码运行过程中的结果文件&#xff0c;那么以下函数仅供参考 代码示例&#xff1a; import os import datetime import sys import pandas as pd# 定义总的文件夹路径 base_folder E:\\D\\log\\product_data_compare_log# 定义一个函数来创建带时间戳的文件夹 def…

【Godot4.2】有序和无序列表函数库 - myList

概述 在打印输出或其他地方可能需要构建有序或无序列表。本质就是构造和维护一个纯文本数组。并用格式化文本形式&#xff0c;输出带序号或前缀字符的多行文本。 为此我专门设计了一个类myList&#xff0c;来完成这项任务。 代码 以下是myList类的完整代码&#xff1a; # …

SQL Sever无法连接服务器

SQL Sever无法连接服务器&#xff0c;报错证书链是由不受信任的颁发机构颁发的 解决方法&#xff1a;不用ssl方式连接 1、点击弹框中按钮“选项” 2、连接安全加密选择可选 3、不勾选“信任服务器证书” 4、点击“连接”&#xff0c;可连接成功

python安卓自动化pyaibote实践------学习通自动刷课

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文是一个完成一个自动播放课程&#xff0c;避免人为频繁点击脚本的构思与源码。 加油&#xff01;为实现全部电脑自动化办公而奋斗&#xff01; 为实现摆烂躺平的人生而奋斗&#xff01;&#xff01;&#xff…