贪吃蛇项目GameStart部分:对游戏的初始化

         接上一篇文章介绍完需要使用到的WIN32API的相关知识,本篇文章让我们来开始使用他们来创建我们的贪吃蛇欢迎界面以及游戏所需要的地图。

准备工作:

         为了后面我们构建贪吃蛇游戏所需要的各项函数便于观察,同时便于我们的函数声明,在这里我们先创建三个文件,分别为1.Snake.h,2.Snake.c,3.test.c。它们分别用来:

         1.用于函数的声明,数值的定义,自定义类型的定义以及头文件的引用。

         2.函数功能的实现。

         3.对Snake.c中的函数进行引用最终实现贪吃蛇游戏。

         同时我们这里分装三个用于整合的函数GameStart(),GameRun(),GameEnd(),分别为游戏的初始化,游戏运行,游戏的善后工作部分,本篇我们来进行初始化工作

一,欢迎与介绍界面的打印

         如上图所示,这便是我们要打印的第一部分欢迎界面,下面是实现步骤:

1.1界面大小的设置及本地环境的切换

         首先我们要对界面大小进行设置,这里我们设置长度为100宽度为30(Windows控制台主机的长宽比约为2  :1)。

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

         紧接着我们要对C进行本地化处理,这里我们要介绍一个新函数setlocale,定义如下:
 

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

         setlocale 函数用于修改当前地区,可以针对⼀个类项修改,也可以针对所有类项。 setlocale 的第⼀个参数可以是前面说明的类项中的一个,那么每次只会影响⼀个类项,如果第⼀个参 数是LC_ALL,就会影响所有的类项。 C标准给第⼆个参数仅定义了2种可能取值:"C"(正常模式)和 ""(本地模式)。

         setlocale 的返回值是⼀个字符串指针,表示已经设置好的格式。如果调⽤失败,则返回空指针 NULL 。 setlocale() 可以⽤来查询当前地区,这时第⼆个参数设为 NULL 就可以了。

 setlocale(LC_ALL, "");//切换到本地环境

         切换完本地环境后,我们需要进行宽字符的打印,这时候我们就需要用到wprintf函数进行打印宽字符:

wprintf(L"%lc\n", L'P');

         宽字符打印必须加上前缀 L ,否则C语言会把字面量当作窄字符类型处理。前缀 L 在单引号前 面,表示宽字符,宽字符的打印使⽤ wprintf ,对应 wprintf() 的占位符为 %lc ;在双引号前面,表示宽字符串,对应 wprintf() 的占位符为 %ls 。

1.2界面光标的隐藏及光标位置调整打印文字

         首先让我们用上节学的知识来隐藏光标,实现代码如下(注意这里false需要用到头文件stdbool.h):

	HANDLE houtput = NULL;houtput = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO CursorInfo = { 25,false };SetConsoleCursorInfo(houtput, &CursorInfo);

         接着让我们把输出光标移到控制台的中间位置(这里我们直接创建一个函数以便于我们后面可以随时的移动光标):

void Set_Pos(short a,short b)
{HANDLE houtput = NULL;houtput = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos = { a,b };SetConsoleCursorPosition(houtput, pos);
}

  1.3打印欢迎界面

void Welcom_Menu()
{Set_Pos(35, 10);wprintf(L"欢迎来到贪吃蛇小游戏");Set_Pos(35, 20);system("pause");system("cls");
}

1.4打印介绍界面

void Welcom_Menu()
{Set_Pos(35, 10);wprintf(L"欢迎来到贪吃蛇小游戏");Set_Pos(35, 20);system("pause");system("cls");Set_Pos(35, 10);wprintf(L"按 ↑ ↓ ← →键操控贪吃蛇移动\n");Set_Pos(35, 11);wprintf(L"按小键盘‘1’或‘2’键加速或减速\n");Set_Pos(35, 12);wprintf(L"Tips:加速吃食物有额外分数加成");Set_Pos(35, 20);system("pause");system("cls");
}

二,地图的创建

         本篇文章设置的棋盘27⾏,58列(行和列可以根据自己的情况修改),然后我们先定义墙体所需要用到的特殊字符‘□’:

#define WALL L'□'

接下来我们来打印地图,结果如下:

实现代码如下:

void GameMap()
{Set_Pos(0, 0);int i = 0;for (; i < 58; i += 2){wprintf(L"%lc", WALL);}Set_Pos(0, 26);for (i = 0; i < 58; i += 2){wprintf(L"%lc", WALL);}for (i = 1; i < 26; i++){Set_Pos(0, i);wprintf(L"%lc", WALL);}for (i = 1; i < 26; i++){Set_Pos(56, i);wprintf(L"%lc", WALL);}
}

三,贪吃蛇蛇身的初始化

3.1蛇身信息的信息维护

         在之后的代码实现过程中,如果我们的蛇身信息没有包装在一块,而是零散的分开处理,这样无疑会增大我们的工作量,所以我们自定义一个蛇的结构体,我的自定义结构如下:

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//正常结束
};

         我们这个游戏中目前只有一条蛇,所以我们可以直接在最开始将维护蛇身的指针定义出来:
 

Snake snake = { 0 };
GameStart(&snake);

3.2蛇身信息的初始化

         由于控制台的长宽比近似为2 :1,所以我们使用宽字符打印蛇身,这里我们使用头插法以链表的形式初始化一个长度为5的蛇身,同时设置蛇的初始移动方向为右,一个食物的得分为10,总成绩初始化为0,起始状态设置为正常运行状态’OK‘:

void SnakeInit(pSnake ps)
{pSnakeNode cur = NULL;int i = 0;for (i = 0; i < 5; i++){cur = (pSnakeNode)mallloc(sizeof(SnakeNode));if (cur == NULL){perror("SnakeInit:malloc;cur()");return;}cur->next = NULL;cur->x = POS_X + 2 * i;cur->y = POS_Y;if (ps->_pSnake == NULL){ps->_pSnake = cur;}else{cur->next = ps->_pSnake;ps->_pSnake = cur;}}cur = ps->_pSnake;while (cur){Set_Pos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}ps->_Dir = RIGHT;ps->_foodWeight = 10;ps->_SleepTime = 300;ps->_Socre = 0;ps->_Status = OK;
}

3.3食物位置的初始化

         我们都知道,在贪吃蛇的游戏过程中,蛇每吃掉一个食物自身长度就会增加一格,所以既然蛇身的维护我们使用链表,那食物信息的维护我们也使用malloc来开辟空间储存信息。

         除此之外,食物的信息也要在随机位置生成,不能生成在墙体外或墙体上,不能与蛇身位置重叠,同时需要确保x坐标为2的倍数(因为我们用的是宽字符打印的蛇身),以下为我的实现代码(记得在GameStart函数的最前面设置srand使他的随机值随着时间的变化而变化):

	int x = 0;int y = 0;again:do{x = rand()%53 + 2;y = rand()%24 + 1;} while (x % 2 != 0);pSnakeNode cur = ps->_pSnake;while (cur){if (cur->x == x && cur->y == y)goto again;cur = cur->next;}pSnakeNode cur2 = (pSnakeNode)malloc(sizeof(SnakeNode));if (cur2 == NULL){perror("malloc():FoofInit:cur2:");return;}cur2->next = NULL;cur2->x = x;cur2->y = y;Set_Pos(x, y);wprintf(L"%lc", FOOD);ps->_pFood = cur2;cur2 = NULL;

         OK,到这里我们的初始化工作就完成了,接下来我们要让这条蛇动起来,我们下篇文章见。

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

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

相关文章

【源码+文档+调试讲解】企业人才引进服务平台

摘 要 随着信息时代的来临&#xff0c;过去的传统管理方式缺点逐渐暴露&#xff0c;对过去的传统管理方式的缺点进行分析&#xff0c;采取计算机方式构建企业人才引进服务平台。本文通过课题背景、课题目的及意义相关技术&#xff0c;提出了一种企业信息、招聘信息、应聘信息等…

Python-爬虫 下载天涯论坛帖子

为了爬取的高效性&#xff0c;实现的过程中我利用了python的threading模块&#xff0c;下面是threads.py模块&#xff0c;定义了下载解析页面的线程&#xff0c;下载图片的线程以及线程池 import threading import urllib2 import Queue import re thread_lock threading.RL…

300 KVA(240kW、180KVAR)系列负载组

交流 固定式/永久式 电阻式和电抗性 300 KVA&#xff08;240kW、180KVAR&#xff09; 480 伏交流电 60赫兹 这是一款紧凑、多功能的 300 KVA 固定/永久负载组&#xff0c;用于测试备用发电机和地面电源装置。负载组可用于测试在 480V 电压下最大 300KVA 的任何负载。…

可穿戴式手持气象仪

TH-SQ17在快节奏的现代生活中&#xff0c;我们越来越依赖各种智能设备来辅助我们的决策和行动。其中&#xff0c;气象信息的重要性不言而喻&#xff0c;它不仅关系到我们的出行安全&#xff0c;更影响着我们的日常生活安排。如今&#xff0c;一款革命性的产品——可穿戴式手持气…

Qt 实战(6)事件 | 6.1、事件机制

文章目录 一、事件1、基本概念2、事件描述3、事件循环4、事件分发4.1、QApplication::notify()4.2、QObject::event() 5、事件传递6、事件处理器 前言&#xff1a; Qt 框架中的事件机制&#xff08;Event Mechanism&#xff09;是一种核心功能&#xff0c;它允许应用程序以事件…

文华WH7主图多空预警系统指标公式源码

RSV:(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;//收盘价与N周期最低值做差&#xff0c;N周期最高值与N周期最低值做差&#xff0c;两差之间做比值定义为RSV K:SMA(RSV,3,1);//RSV的移动平均 D:SMA(K,3,1);//K值的移动平均 DIFF : EMA(CLOSE,12) - EMA(CLOSE,26); D…

springboot集成达梦数据库,打包后,tomcat中启动报错

背景&#xff1a;springboot集成达梦数据库8&#xff0c;在工具idea中正常使用&#xff0c;但是打包后&#xff0c;无法启动&#xff0c;报错 pom引入的依赖 但是这种情况&#xff0c;只有在idea中启动没问题的解决方法 需要修改引入的依赖&#xff0c;再次打包就可以 <d…

考研数学一有多难?130+背后的残酷真相

考研数学一很难 大家平时在网上上看到很多人说自己考了130&#xff0c;其实这些人只占参加考研数学人数的极少部分&#xff0c;有个数据可以展示出来考研数学到底有多难&#xff1a; 在几百万考研大军中&#xff0c;能考到120分以上的考生只有2%。绝大多数人的分数集中在30到…

Lua流媒体服务器支持(MP4视频、桌面直播、摄像头)

本来在做FFMPEG的项目&#xff0c;忽然想到Lua封装FFMPEG与SRS实现一个简易的直播网站何尝不是一个大胆的想法。 示例为初级版本&#xff0c;主要是用来验证可行性和功能性DEMO 演示效果&#xff1a; Lua流媒体直播服务器(支持MP4、桌面直播、摄像头)_哔哩哔哩_bilibili 代码简…

【SSM】医疗健康平台-用户端-体检预约

知识目标 了解FreeMarker&#xff0c;能够简述FreeMarker的作用和生成文件的原理 熟悉FreeMarker的常用指令&#xff0c;能够在FTL标签中正确使用assign指令、include指令、if指令和list指令 掌握显示套餐列表功能的实现 掌握显示套餐详情功能的实现 掌握体检预约功能的实现…

【源码】最新源支付系统源码 V7版全开源 免授权 附搭建教程

最新源支付系统源码_V7版全开源_免授权_附详细搭建教程_站长亲测 YPay是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。它采用全新轻量化的界面UI&#xff0c;让您能更方便快捷地解决知识付费和运营赞助的难题。同时&#xff0c;它基于高性能的thin…

el-form重置后input无法输入问题

新增用户遇到的问题&#xff1a; 如果你没有为 formData 设置默认值&#xff0c;而只是将其初始化为空对象 {}&#xff0c;则在打开dialog时&#xff0c;正常输入&#xff0c; formdata会变成如下 但是&#xff0c;打开后&#xff0c;直接使用 resetFields 或直接清空表单&…

宜搭低代码开发高级认证例题1-待办列表

1、进行中待办和已完成待办界面相同 关键代码就是重要度默认为1星 2、新增自定义页面Todolist 2.1主要参数设置-新建远和API getTodoList和getDoneList代码相同 绑定代码&#xff1a;/${window.pageConfig.appType || window.g_config.appKey}/v1/form/searchFormDatas.json …

福州代理记账服务财务专业知识会计助手

福州的代理记服务可探索企业和个体工商户处理财务和会计工作。选择合适的代理记服务不仅可以节省成本&#xff0c;还可以确保财务工作专业、合规。以下是一些关于代理记服务的关键信息和财务信息&#xff0c;供您参考&#xff1a; https://www.9733.cn/news/detail/180.html …

C++ ─── vector的实现

知识点&#xff1a; ① 因为vector是模版&#xff0c;所以声明和定义都放在.h中&#xff0c;防止出现编译错误 .h不会被编译&#xff0c;在预处理中.h在.cpp中展开所以在编译时只有.cpp 而 .cpp顺序编译&#xff0c;只会进行向上查找&#xff0c;因此至少有函数的声明。 ②memc…

【数据结构与算法】堆排序算法 详解

堆排序算法 Status heapAdjust(ElemType *a, int s, int m) {ElemType t a[s];for (int j s * 2 1; j < m; j j * 2 1) {if (j < m && a[j] < a[j 1]) {j;}if (t > a[j]) {break;}a[s] a[j];s j;}a[s] t;return OK; }Status heapSort(ElemType *a…

xhs 旋转验证码剖析和协议算法实现

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#…

计算机视觉的职业规划

Hi&#xff0c;大家好。我是茶桁。 今天这节课呢&#xff0c;咱们先不着急讲原理&#xff0c;先来讲讲职业规划的话题。 如果想要直接上手企业级的 AI 项目&#xff0c;可以看看咱们的「AI 人工智能企业项目实战」。 趋势和薪资 首先&#xff0c;先来讲讲就业的趋势。其实学…

JavaWeb——MySQL:DDL

目录 3. DQL:查询 ​编辑3.3 排序查询&#xff08;order by&#xff09; &#xff08;1&#xff09;排序 &#xff08;2&#xff09;多字段排序&#xff1a; &#xff08;3&#xff09;总结&#xff1a; 3. DQL:查询 查询是使用最多、最频繁的操作&#xff0c;因为前面的…

开心汉化轻量级工单与知识库一体化管理系统源码

开心汉化发布&#xff1a;轻量级工单与知识库一体化管理系统源码 我们很高兴地宣布&#xff0c;开心汉化团队现已发布一款轻量级工单与知识库一体化管理系统的汉化源码。该系统不仅功能强大&#xff0c;而且易于部署和管理&#xff0c;适用于各类企业或个人管理大量工单数据的…