C语言小游戏:贪吃蛇(游戏开发的环境和功能介绍)

❀❀❀ 文章由@不准备秃的大伟原创 ❀❀❀

♪♪♪ 若有转载,请联系博主哦~ ♪♪♪

❤❤❤ 致力学好编程的宝藏博主,代码兴国!❤❤❤

         生命不停,学习不止。铁汁们,我是大伟,欢迎来到大伟的游戏时间,今天带大家来玩一款几乎是所有人童年的记忆中的一款经典的不能再经典的游戏:贪吃蛇!

        当然了,在玩游戏前,我们还是要先把游戏写出来啦!○( ^皿^)っHiahiahia…

45942329dfab404885982806120a8c45.png

        废话不多说,在开始游戏前,有些知识是希望大家了解的(因为博主也不是很懂,所以只能理解了,QWQ) 。

        由于我们的贪吃蛇游戏是在我们windows电脑的控制台上实现的,所以我想带大家了解一下Win32 API:

        我们的小度娘给Win32 API的介绍是:

  Windows这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外,它同时也是⼀个很⼤ 的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启 视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application),所以便 称之为Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows 32位平台的应⽤程序编程接⼝。

         听起来很高级是吧~嗯,雀食蛮高级的,但是作为我们使用的人来说并不需要了解这么多,会用就好了,对吧?

        首先,不知道有没有铁汁的VS操作台是和大伟一样是这样的?->59f768a6ad894e0abbb68d05742dcba0.png

        上面这个窗口其实是VS的操作台,而我们需要的是我们电脑的Windows操作台,该怎么切换呢?其实很简单:     768b918ef74546899fab76b3f1b075f6.png

a186ba6d259f440287fda959ba780e75.png         这样子就切换成功了,大家来看一看效果:1f50e38c1ead43f58350d63a6492e97f.png

        是不是瞬间就有玩游戏的感觉了?哈哈 (^▽^ )

        那这个时候就有铁汁好奇了,说:“大伟啊,你这个运行框的名字是‘贪吃蛇’,而且屏幕上有一串文字,窗口大小也和我的不一样,怎么回事啊?” ,诶,别急嘛,接下来就会教你滴~

        一. 设置控制台:

我们可以使⽤cmd命令来设置控制台窗⼝的⻓宽:设置控制台窗⼝的⼤⼩,30⾏,100列,如下:

mode con cols=100 lines=30

   也可以通过命令设置控制台窗⼝的名字,如下:  

title 贪吃蛇

  这些能在控制台窗⼝执⾏的命令,也可以调⽤C语⾔函数system来执⾏。例如:

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

   此外,我们还可以调控制台屏幕上的坐标COORD,而COORD是Windows API中定义的⼀个结构体,表⽰⼀个字符在控制台屏幕上的坐标,如下:

typedef struct _COORD {SHORT X;SHORT Y;
} COORD, *PCOORD;//给坐标赋值
COORD pos = { 10, 15 };

        这个时候,我们的光标就会在坐标为(10,15)的地方闪烁,但是,我们会发现在游戏进行的时候,我们看不到光标的闪烁,这又该怎么做呢?

        这个时候就要用到GetStdHandle了,那这是啥呢?

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

原代码声明如下:GetStdHandle 函数 - Windows Console | Microsoft Learn

HANDLE GetStdHandle(DWORD nStdHandle);

我们可以写出如下代码:

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

         这时候获得了句柄,我们可以用函数 GetConsoleCursorInfo 获得光标的信息,源代码声明如下:GetConsoleCursorInfo 函数 - Windows Console | Microsoft Learn

BOOL WINAPI GetConsoleCursorInfo(
HANDLE hConsoleOutput,PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);

         我们可以这样运用:

HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值) 
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息 

        但是,上面代码中的 CONSOLE_CURSOR_INFO 是什么东西呢?

        这东西是个结构体,而这个结构体,包含有关控制台光标的信息,源代码的声明如下:

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

        其中:

1.  dwSize:由光标填充的字符单元格的百分⽐。此值介于1到100之间。光标外观会变化,范围从完全填充单元格到单元底部的⽔平线条。 

2.  bVisible:游标的可⻅性。如果光标可⻅,则此成员为TRUE。

之后我们可以用SetConsoleCursorInfo设置指定控制台屏幕缓冲区的光标的⼤⼩和可⻅性。SetConsoleCursorInfo的源代码声明如下:SetConsoleCursorInfo 函数 - Windows Console | Microsoft Learn

BOOL WINAPI SetConsoleCursorInfo(HANDLE hConsoleOutput,const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
);

        综上,我们可以这么写:

HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//影藏光标操作 
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息 
CursorInfo.bVisible = false; //隐藏控制台光标 
SetConsoleCursorInfo(hOutput, &CursorInfo);//设置控制台光标状态 

         而为了设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调⽤SetConsoleCursorPosition函数将光标位置设置到指定的位置。源代码声明如下:

BOOL WINAPI SetConsoleCursorPosition(HANDLE hConsoleOutput,COORD pos
);

         实例:

COORD pos = { 10, 5};HANDLE hOutput = NULL;//获取标准输出的句柄(⽤来标识不同设备的数值) hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//设置标准输出上光标的位置为pos SetConsoleCursorPosition(hOutput, pos);

        由于我们有可能会在控制台的不同地方打印信息,所以可以封装一个SetPos函数来设置光标的位置:

//设置光标的坐标 
void SetPos(short x, short y)
{COORD pos = { x, y };HANDLE hOutput = NULL;//获取标准输出的句柄(⽤来标识不同设备的数值) hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//设置标准输出上光标的位置为pos SetConsoleCursorPosition(hOutput, pos);
}

        此外,我们需要操作↑ ↓ ← → 键来操作蛇的移动,所以我们需要一个函数来检测键盘按键是否被按下,而函数GetAsyncKeyState就可以做到,源代码声明如下:GetAsyncKeyState function (winuser.h) - Win32 apps | Microsoft Learn

SHORT GetAsyncKeyState(int vKey
);

         我们需要将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。

        GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果 返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬起;如果最低位被置为1则说明,该按键被按过,否则为0。 

        如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1,因此我们可以定义一个宏:

#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 1) ? 1 : 0 )

         这样就可以检测我们的键盘是否被按下了。

        二.贪吃蛇游戏的设计分析

        首先,我们玩贪吃蛇,都会有个地图吧(限制蛇的运动范围),那我们该如何布置我们的地图呢?这个时候就不得不谈到控制台窗口的一些知识,如果想在控制台的窗⼝中指定位置输出信息,我们得知道该位置的坐标,所以⾸先介绍⼀下控制台窗⼝的坐标知识

        控制台窗⼝的坐标如下所⽰,横向的是X轴,从左向右依次增⻓,纵向是Y轴,从上到下依次增⻓08279dd84e744df7929da4985cf86a99.png

        在游戏地图上,我们打印墙体使⽤宽字符:□,打印蛇使⽤宽字符●,打印⻝物使⽤宽字符★         普通的字符是占⼀个字节的,这类宽字符是占⽤2个字节。而为了打印这些字节,我们需要在这些宽字符前加上大写的'L',我们还需要将 printf 改为 wprintf ,wprintf是专门来打印宽字符的,如下:

wprintf(L"%c", □);

        通过输出的结果我们可以发现,⼀个普通字符占⼀个字符的位置,但是打印⼀个汉字字符,占⽤2个字符的位置,那么我们如果 要在贪吃蛇中使⽤宽字符,就得处理好地图上坐标的计算。 

        此外,我们的VS2022是默认的正常模式,而我们的汉字是不包含在这里面的,所以我们需要将当地地区改为适应本地模式,于是我们需要使用 setlocale 函数来使我们的编译器符合我们的本地模式。

        而为了使用 setlocale 我们需要包含头函数 #include<locale.h> ,setlocale 的源代码声明如下:setlocale,_wsetlocale | Microsoft Learn

char* setlocale (int category, const char* locale);

        C标准给第⼆个参数仅定义了2种可能取值:“C” 和 “ ”。于是我们可以有以下两种写法:

setlocale(LC_ALL, "C");
//此时当地设置为“C”,库函数按正常方式执行,小数点是一个点
setlocale(LC_ALL, " ");
//切换到本地环境,这种模式下程序会适应本地环境

        这时候我们写代码的必要条件已经做好了,接下来博主会在下一篇博客里给大家手撕一个贪吃蛇,敬请期待哦~

        真正的幸运在等待着有资格享受的 ---------- 忒俄克里托斯

        本篇博客也就到此为止了,送大家一碗鸡汤,勉励自己以及这世界上所有追逐梦想的赤子趁年华尚好努力提升自己,莫欺少年穷!  829e591a7798414fa84504131fe672c5.jpeg

 

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

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

相关文章

一次Kubernetes Pod内存异常导致的测试环境耗时异常问题排查过程

概述 在使用公司内部后台系统测试环境时发现一个请求加载慢的问题&#xff0c;简简单单的列表&#xff0c;查询MongoDB数据库&#xff0c;测试环境不过几百上千条数据而已&#xff0c;请求耗时居然高达5~6秒&#xff1a; 作为对比&#xff0c;生产环境的请求响应截图如下&…

【Java程序设计】【C00194】基于SSM的高校财务处理管理系统(论文+PPT)

基于SSM的高校财务处理管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的高校从财务处理系统 本系统分为财务和管理员2个功能模块。 财务&#xff1a;财务登录高校财务处理系统后&#xff0c;能对首页、个人中心…

链表经典算法(+OJ刷题)

文章目录 前言一、移除链表元素二、链表的中间节点三.反转链表四.合并两个有序链表五.分割链表六.环形链表的约瑟夫问题总结 创作不易&#xff0c;点赞收藏一下呗&#xff01;&#xff01;&#xff01; 前言 在上一节&#xff0c;我们介绍了单链表的增&#xff0c;删&#xff…

docker手动迁移镜像

1&#xff0c;将镜像保存在本地 docker save 镜像名称:版本号 > 镜像名称.tar 2&#xff0c;下载镜像 通过 ftp 工具或者命令&#xff0c;下载到本地 3&#xff0c;上传镜像到目标 docker 所在服务器 4&#xff0c;导入镜像 docker load < 镜像名称.tar

Electron实战(一):环境搭建/Hello World/打包exe

文章目录 Electron安装Node.jsNodeJs推荐配置开始Electron项目创建index.js文件创建src目录运行打包生成exe生成安装包踩坑 下一篇Electron实战(二)&#xff1a;将Node.js和UI能力&#xff08;app/BrowserWindow/dialog)等注入html Electron Electron是一个使用JavaScript, HT…

AI-数学-高中-22-tanx的图像与性质

原作者视频&#xff1a;三角函数】9tanx的图像与性质&#xff08;易中档&#xff09;_哔哩哔哩_bilibili 做题时注意先画图&#xff0c;再计算。

RabbitMQ(保姆级教程)

RabbitMQ学习 基础 1. 同步通信和异步通信 同步调用 下一步动作必须依赖上一步 异步调用 通知到位就行&#xff0c;不对消费者做强制要求&#xff0c;只要求最终一致性就行 2. MQ技术选项 消息先进先出&#xff0c;RabbitMQ默认有序 Erlang 是面向并发&#xff0c…

Allegro如何把Symbols,shapes,vias,Clines,Cline segs等多种元素一起移动

Allegro如何把Symbols,shapes,vias,Clines,Cline segs等多种元素一起移动 在用Allegro进行PCB设计时,有时候需要同时移动某个区域的所有元素,如:Symbols,shapes,vias,Clines,Cline segs等元素。那么如何操作呢? 首先就是把Symbols,shapes,vias,Clines,Cline …

【实训】网络规划与部署实训

一 实训目的及意义 本周实训主要是了解网络规划与部署&#xff0c;熟悉三大厂商华为、思科、锐捷交换机路由器以及相关协议的原理和配置&#xff0c;提高学生的动手能力和分析规划部署能力。 实训主要针对计算机网络系统集成的设计与实现的实际训练&#xff0c;着重锻炼学生熟练…

可视化特效汇总-2023年

基于threejs可视化效果展示、基于mapbox白膜展示、基于cesium模型加载、磁场专题图绘制

【Redis】字符串原理--简单动态字符串SDS

一.SDS定义 free 属性值为0&#xff0c;标识SDS没有分配任何未使用空间。len 属性值为5&#xff0c;标识SDS保存了一个5字节长度的字符串。buf 属性是一个char类型数组&#xff0c;数组的前5个字节保存了&#xff0c;R e d i s 五个字符&#xff0c;最后一个保存空字符串 \0…

架构篇33:传统的可扩展架构模式-分层架构和SOA

文章目录 分层架构SOA小结相比于高性能、高可用架构模式在最近几十年的迅猛发展来说,可扩展架构模式的发展可以说是步履蹒跚,最近几年火热的微服务模式算是可扩展模式发展历史中为数不多的亮点,但这也导致了现在谈可扩展的时候必谈微服务,甚至微服务架构都成了架构设计的银…

JAVA建造者模式详解

建造者模式 1 建造者模式介绍 建造者模式 (builder pattern), 也被称为生成器模式 , 是一种创建型设计模式. 定义: 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 **建造者模式要解决的问题 ** 建造者模式可以将部件和其组装过程分开…

Linux 查看系统信息 + 服务信息命令(简记)

概述 作用&#xff1a;Linux 运维工作中常用的命令速查 小步教程 (xiaobuteach.com) Linux 命令大全 | 菜鸟教程 (runoob.com) 文本编辑器vim 本章大纲 | 小步教程 vim 多文件编辑 | 小步教程 常用 ps 查看服务启动命令 Linux ps 命令 | 菜鸟教程 (runoob.com) # 查找…

第七讲:考试介绍与考纲解读

第七讲:考试介绍与考纲解读 考试介绍考试人群考试报名考试环境考纲解读选择题(40分)操作题(60分)小结本讲简介:终于,熬过了略微枯燥的基础课程,我们进入了二级考试训练阶段。在这讲中,我们将对全国计算机等级考试(66)Python 语言程序设计(二级)进行 360全方位无死…

微服务的幂等性

微服务架构设计的中心思想是将服务进行拆分&#xff0c;但是在这个过程中&#xff0c;如果被依赖的服务发生奔溃&#xff0c;就会引起一系列问题。为了解决这个问题&#xff0c;就会引入重试的机制&#xff0c;重试又会引入幂等性的问题&#xff0c;下面我们就分析这个过程&…

Java GC-常见垃圾回收器

目录 前言一、垃圾回收器分类二、垃圾回收器介绍1、Serial 收集器2、ParNew 收集器3、Parallel Scavenge 收集器4、Serial Old 收集器5、Parallel Old 收集器6、CMS 收集器&#xff08;多线程标记清除算法&#xff09;7、G1 收集器 三、项目中垃圾收集器选型 前言 Java的垃圾回…

乐意购项目前端开发 #7

一、购物车 本地购物车 创建cartStore.js文件 创建cartStore.js文件, 将购物车列表数据存在pinia中 import { ref, computed } from "vue"; import { defineStore } from "pinia"; import { useUserStore } from "./user"; import {insertCart…

PyTorch使用

前言 系统环境&#xff1a;win10 使用Anaconda&#xff0c;Anaconda的安装自行百度。 conda 23.7.4 目录 前言 创建虚拟环境 1、查看当前有哪些虚拟环境 2、创建虚拟环境pytorch 3、激活及关闭pytorch虚拟环境 4、删除pytorch虚拟环境 使用yolov5测试 1、切换至yolo…

idea 快捷键ctrl+shift+f失效的解决方案

文章目录 搜狗输入法快捷键冲突微软输入法快捷键冲突 idea的快捷键ctrlshiftf按了没反应&#xff0c;理论上是快捷键冲突了&#xff0c;检查搜狗输入法和微软输入法快捷键。 搜狗输入法快捷键冲突 不需要简繁切换的快捷键&#xff0c;可以关闭它&#xff0c;或修改快捷键。 微…