游戏介绍:
贪吃蛇作为曾风靡全球的小游戏,尤其在智能手机还没有广泛普及的年代,贪吃蛇在所有人的手机里都存在着不同的版本。
游戏内容:
玩家操控一条小蛇分别按w、s、a、d或者↑、↓、←、→进行上下左右移动,小蛇在移动的过程中吃到随机生成的食物会加分并且增长自身长度。
玩家可以进行加速,并且加速过程中吃到食物会得到更高分数。
当小蛇撞墙或者吃到自己尾巴的时候游戏结束。
1.WIN32介绍:
Windows作为一个服务中心,除了可以进行调用函数,分配内存,管理资源功能外,还可以帮助应用程序打开视窗,描绘图形,使用周边设备等目的,由于这些函数服务的对象是应用程序(Application),所以便称为Application Programming Interface,简称API。WIN32 API 就是Microsoft Windows 32位平台的应用程序编程接口。
2.控制台程序(Console):
作为一个游戏,我们不可避免地要对控制台程序进行了解与设计。
这是一个控制台程序,我们可以使用WIN+R输入cmd指令直接弹出,也可以在我们的c语言平台使用cmd命令来控制它的大小。
1.1 mode命令
mode con cols=100 lines=100
打开控制台程序输入 mode 命令。con是指我们的控制台程序,cols是列,lines是行,也就是说,我们的控制台程序被设置为列大小为100,行大小为100的大小,并且控制台面板是有坐标概念的。
1.2 title命令
title 贪吃蛇
打开控制台程序,我们输入上述代码可以将控制台的标题更改为“贪吃蛇”。
1.3 sysytem函数
我们在编程的时候,可以使用system函数直接对控制台窗口进行控制:
#include<studio.h>
#include<stdlib.h>
int main()
{
sysytem("mode con cols=100 lines=100");
system("title 贪吃蛇");
return 0;
}
运行之后我们会发现窗口大小已经设置好了但是窗口标题没有改变,这是因为程序已经运行完了,在运行结束之前,我们的窗口名称就是“贪吃蛇”。我们可以使用getchar函数或者system("pause")进行观测。
1.4 控制台坐标COORD
COORD是Windows API 定义的一个结构体,表示一个字符在控制台屏幕缓冲区的坐标,坐标系为(0,0)的原点是缓冲区顶点左侧单元格。
COORD类型的声明:
typedef struct _COORD{
short x;
short y;
}COORD
其中,x表示横坐标,y表示纵坐标,在使用typedef之前,COORD结构体名称为_COORD。
同时,我们可以用该结构体给坐标赋值:
int main(){
COORD pos = {10,15};
return 0;
}
1.5 GetStdHandle函数
GetStdHandle是一个Windows API函数,它用于从一个特定的标准设备中取得一个句柄,使用这个句柄可以操作设备。
Handle hOutput = NULL;
//获取标准输出设备的句柄
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
1.6 GetConsleCurserInfo函数
该函数包含于头文件windows.h中。
检索有关控制台光标大小和可见性信息。
BOOL WINAPI GetConsoleCursorInfo(
HANDLE hConsoleOutPut
PCONSOLE_CURSOR_INFO lpCurserConsoleInfo
);
//PCONSOLE_CURSOR_INFO是指向CONSOLE_CURSOR_INFO结构的指针,该结构接收有关主机游标信息。
HANDLE接收句柄,PCONSOLE_CURSER_INFO是指向CONSOLE_CURSER_INFO结构的指针,该结构接收有关主机游标信息。
下面举个实例:
int main(){
CONSOLE_CURSOR_INFO cursor_info = {0};
//0是随意设置的
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleCursorInfo(handle, &cursorinfo);
return 0;
}
这段代码中,HANDLE用来获取控制台光标信息,而CONSOLE_CURSOR_INFO是应用该光标信息的结构体,通过GetConsoleCursorInfo函数可以将光标信息放置于CONSOLE_CURSOR_INFO结构体上。
要注意的是,因为GetConsoleCursorInfo函数的第二个参数是指针,所以我们传入索要传入信息的地址。
1.6.1 CONSOLE_CURSOR_INFO
这个结构体,包含光标有关的信息。
typedef struct _CONSOLE_CURSOR_INFO{
DWORD dwSize;
BOOL bVisible;
}CONSOLE_CURSOR_INFO;
其中,
dwSize是光标占字符格的百分比,数值介于1——100之间。
bVisible是光标的可见性,如果光标可见,则该成员值为True,否则为False。
也就是说,
console_info.dwSize = 100;
此时光标大小为一整个字符格大小。
1.7 SetConsoleCursorInfo函数
该函数包含于windows.h 头文件中。
设置指定控制台屏幕缓冲区的光标大小和可见性。
该函数与GetConsoleCursorInfo传参相同,只需要将新设置好的数值传入就设置好了。
1.8 SetConsoleCursorPosition函数
设置指定控制台屏幕缓冲区的光标坐标位置,我们可以将坐标传入COORD类型的pos中。
BOOL WINAPI SetConsoleCursorPosition(
HANDLE hConsoleOutPut;
COORD pos;
)
实例:
int main(){
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos = {20,5};
SetConsoleCursorPosition(handle,pos);
print("hehe\n");
return 0;
}
该段代码实现了鼠标设备句柄的获取和控制台面板缓冲区坐标的定位。
1.9 GetAsyncKeyState 函数
该函数将每个键上的虚拟值传给函数,函数通过返回值判断按键状态。
GetAsyncKeyState 函数的返回值是16位的short类型,在上次使用GetAsyncKeyState 函数的时候会检测返回值,如果返回值最高位是1,则该按键是按下状态,如果为0,则未被按下;如果返回值最低位为1,则该按键被按过,如果为0则未被按过。
GetAsyncKeyState(vk)&0x1 ? 1:0
该段代码可以检测某按键是否按下,如图所示:
运用三段式,简单粗暴。
3.贪吃蛇游戏设计
在游戏中,我们一般使用●来表示食物,而奖励则可以用★、♥等特殊符号表示。
3.1 <locale.h>本地化
在不同地区不同国家中,<locale.h>提供的函数用于于c语言标准库对于不同地区会产生不一样的部分,比如:时间表示格式,货币量格式,数字量格式,字符集。
3.2 类项
对于一个程序,我们可以通过修改地区使其行为适应于不同的地区,但直接改变地区可能会影响库的许多部分,有些部分是我们不想影响的,所以c语言支持针对不同的类项进行修改。
3.3 setlocale函数
char* setlocale(int category,const char* locale);
setlocale函数用于修改当前地区,也可以用于针对类项进行修改。
如果第一个类项是前面类项中的一个,那么该函数修改一个类项,而如果是LC_ALL,那么修改所有类项。
C标准给第二个参数仅定义了两种可能取值,即"C"(正常模式)和""(本地模式)。
在任意程序执行时,都会隐藏调用:
setlocale(LC_ALL,"C");
在正常情况下,程辉都会以正常模式运行,若想改变地区,可以通过修改该段代码的第二个值为""从而改为本地模式。
setlocale的返回值是一个字符串指针,表示已经设置好的格式,如果调用失败会返回NULL。
我们也可以通过将setlocale函数第二个参数改为NULL来查询当前地区。
3.4 宽字符打印
宽字符打印需要加上前缀L,否则C语言会将其以窄字符处理。
在单引号前加L,表示宽字符,需要使用wprintf函数,占位符为"%lc";
在双引号前加L,表示宽字符串,需要使用wprintf函数,占位符为"%ls"。
int main(){
setlocale(LC_ALL,"");
wchar_t ch1 = L'中';
wprintf(L"%lc\n",ch1);
printf("ab\n");
return 0;
}
一个宽字符占两个字符的位置。