老东西教你怎么用魔法生成双人贪吃蛇(纯C),一看就会,不会你来打我QWQ(上篇WIN32API相关知识与开始游戏时需要的设置)
目录
0.制作准备与制作结果
先来给大家看一下制作结束后的样子如下图所示
一.开始制作前界面的设置
1.控制台的参数设置
2.光标显示信息设置
3.光标的位置(打印位置的设置)
4.宽字符与本地化
5.获取按键情况(GetAsyncKeyState)函数
二.蛇的属性的创建
1.了解在C语言控制台上蛇移动的逻辑与蛇的性质创建
2.蛇身的创建与第一个食物的创建
食物的创建必须要素就是随机数的生成
创建的身体与食物的位置区间
0.制作准备与制作结果
当我们想要制作一款游戏的时候除了必要的c语言知识等,我们还需要对自己的游戏功能与大概的制作过程做一个大概的归纳(大纲),然后根据自己的归纳(大纲)一步一步来制作
以下是鄙人的贪吃蛇大纲
先来给大家看一下制作结束后的样子如下图所示
想不想和你的好舍友来一把呀,想玩的话就好好学噢
一.开始制作前界面的设置
1.控制台的参数设置
想要制作贪吃蛇首先我们要学会对控制台参数的设置 调试窗口到底要好大要先设置好设置代码如下
system("mode con cols=100 lines=30");//30行 100列
system("title 饕餮");
getchar();
但是还有这个光标所以我们要再想办法去除光标的显示
2.光标显示信息设置
可以看下面这个函数GetConsoleCursorInfo
这个函数的参数如下
BOOL WINAPI GetConsoleCursorInfo( HANDLE hConsoleOutput, PCONSOLE_CURSOR_INFO lpConsoleCursorInfo ); PCONSOLE_CURSOR_INFO 是指向 CONSOLE_CURSOR_INFO 结构的指针,该结构接收有关主机游标
所以我们在调用这个函数的时候首先要获取句柄(也就是第一个函数的参数)和一个CONSOLE_CURSOR_INFO结构体变量的地址
那么第一个HADLDE类型怎么得到呢,这里要用到GetStdHandle函数来获得HANDLE类型的变量
函数参数如下
HANDLE GetStdHandle(DWORD nStdHandle);
其中的DWORD其实是一个unsigned long获得句柄的操作如下
//获取标准输出的句柄(⽤来标识不同设备的数值) HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
获得了第一个句柄信息过后我们还要全去获得CONSOLE_CURSOR_INFO结构的的指针
CONSOLE_CURSOR_INFO结构体的定义如下
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize;
BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
//dwSize,由光标填充的字符单元格的百分⽐。 此值介于1到100之间。光标外观会变化,范围从完全填充单元格到单元底部的⽔平线条。
// bVisible,游标的可⻅性。 如果光标可⻅,则此成员为 TRUE。
所以我们先获取信息操作如下
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); //影藏光标操作 CONSOLE_CURSOR_INFO CursorInfo; GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息 CursorInfo.bVisible = false; //隐藏控制台光标
获取后再进行设置在上面加上最后一句SetConsoleCursorInfo函数它的参数和GetConsoleCursorInfo差不多
SetConsoleCursorInfo(hOutput, &CursorInfo);//设置控制台光标状态
这样我们就可以隐藏光标信息啦
ok但是这实在也是太枯燥了
我们直接跳转地图的打压
我们知道地图的打印是又一又一个的方块打印的
3.光标的位置(打印位置的设置)
像这样的地图我们该怎么去打印呢,如果打印第一排还好,但是如果去一列一列的打印和最后一排的打印该怎么办呢,这里就需要用到光标的位置设置
所以我们要用到这个函数SetConsoleCursorPosition
函数定义如下
BOOL WINAPI SetConsoleCursorPosition( HANDLE hConsoleOutput, COORD pos );
很明显我们可以看到它需要句柄与一个COORD类型变量
其实这个COORD就是一个结构体定义如下
typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD, *PCOORD;
可以看到它其中的有着X与Y的信息所以我们可以如下图知道
所以我们可以先给坐标赋值
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos = { x,y };//可以谁便给x和y赋值
SetConsoleCursorPosition(hOutput, pos);
想这样我们就修改了原来的光标位置,但是如果每次都要这样来写是不是有些麻烦所以我们可以封装成一个函数
ok当我们可以控制光标位置后就可以进行地图的打印了
void InitMap()
{
int cont = 0;
//上墙打印
for(int i=0;ix == x && cur->y == y)
{
goto again;
}
cur = cur->next;
}
pSnakeNode pfood=BuySnakeNode(x,y);//新生成一个结点
psnake->_pFood = pfood;
SetPos(pfood->x, pfood->y);
wprintf(L"%lc", FOOD);
}
可以看到我们这里运用到了goto语句,说实话这也是我第一次在实际操作中使用
这个里面其实是有很多很多细节的,比如说生成的食物横坐标不能为奇数,为什么呢,其实你只要仔细看看图就理解了,一个食物是宽字符占两个像素,想要整齐打印横坐标必须为偶数
然后我这里是进行了宏的定义了的,因为如果你这样做可以提高代码的可塑性,当你想要修改墙的宽,长范围的时候不用再去管其他与其相关的位置
接下来就还需要让蛇蠕动动起来
由于篇幅限制将在下篇进行讲解!!!
小bit!!!




