在贪吃蛇小游戏的实现(1)中,我们学习了win32 相关的一些知识,本篇文章,博主将带领大家从0开始实现贪吃蛇小游戏!
贪吃蛇游戏设计与分析
本地化
- <locale.h>实现本地化,该头文件提供的函数用于控制C标准库中对于不同的地区会产生不一样行为的部分,如:数字量的格式,货币量的格式,字符集以及日期和时间的表示形式
- 类项:通过修改地区,程序可以改变它的行为来适应世界的不同区域,但地区的改变可能会影响库的许多部分,其中有一部分使我们不希望改变的。所以C语言支持针对不同的类项进行修改,下面的一个宏,指定一个类项
LC_COLLATE | 影响字符串比较函数 |
LC_CTYPE | 影响字符处理函数 |
LC_MONETARY | 影响货币格式 |
LC_TIME | 影响时间格式 |
LC_NUMERIC | 影响printf()的数字格式 |
LC_ALL | 针对所有类项的修改 |
-
setlocale函数:char * setlocale (int category,const char* locale);其中第一个参数可以是前面说明的类项中的一个,第二个参数有两种取值:“C”和“ ”。“C”代表正常模式,“ ”代表本地模式。
在任意程序执行开始时,都会隐藏调用
setlocale(LC_ALL,"C");
当程序运行起来后,想改变地区,就要调用setlocale函数切换到本地模式
setlocale(LC_ALL," ");
- 宽字符的打印:
- 宽字符的字面量必须加上前缀L,否则C语言会把字面量当做窄字符类型来处理。
- 前缀L加在单引号前面,表示宽字符,宽字符的打印用wprintf,对应wprintf的占位符为%lc
- 在双引号前面表示宽字符,对应wprintf的占位符为%ls
#include <stdio.h>
#include <locale.h>
int main()
{
setlocale(LC_ALL," ");
wchar_t ch1 = L'新';
wchar_t ch2 = L'年';
wchar_t ch3 = L'快';
wchar_t ch4 = L'乐';
wprintf(L"%lc\n",ch1);
wprintf(L"%lc\n",ch2);
wprintf(L"%lc\n",ch3);
wprintf(L"%lc\n",ch4);
return 0;
}
元素设计
- 地图坐标:实现一个27行,58列的棋盘,再围绕地图画出墙。
- 蛇身和食物:初始化状态,假设蛇的长度是5,蛇身的每个节点为〇,在固定的一个坐标处,比如(24,5) 处开始出现蛇,连续5个节点。注意:蛇的每个节点的x坐标必须是2的倍数,否则可能会出现蛇的一个节点有一半出现在墙体内另一半出现在墙体外的情况。关于食物,就是在墙体内随机生成一个坐标(x坐标必须是2的倍数)坐标不能和蛇的身体重合,然后打印❤
- 数据结构设计:
- 蛇节点结构:在游戏运行过程中,蛇每次吃一个食物,身体就会变长一节,如果我们使用链表存储蛇的信息,那么蛇的每一节其实就是链表的每个节点。每个节点只需要记录好地图上的坐标就行。蛇节点结构如下:
typedef struct SnakeNode { int x; int y; struct SnakeNode* next; }SnakeNode,*pSnakeNode;
- 要管理整条贪吃蛇,需要再封装一个snake结构来维护整条贪吃蛇
typedef struct Snake { pSnakeNode _pSnake;//维护整条蛇的指针 pSnakeNode _pFood;//维护食物的指针 enum DIRECTION _Dir;//蛇头方向 enum GAME_STATUS _Status;//游戏状态 int _Score;//当前获得分数 int _foodWeight;//默认每个食物十分 int _sleepTime;//每走一步的休眠时间 }Snake,*pSnake;
- 枚举蛇的运动方向
enum DIRECTION { UP = 1, DOWN, LEFT, RIGHT };
- 枚举运动状态
//枚举游戏状态 enum GAME_STATUS { OK,//正常运行 KILL_BY_WALL,//撞墙 KILL_BY_SELF,//咬到自己 END_NORMAL//正常结束 };
游戏流程设计
在下一节中,我们将根据游戏流程的设计,进行具体代码的实现~今天是博主复工的第一天,相信不少小伙伴也都以及回到工作学习的岗位上了,新年新气象,大家一起加油冲呀!!!