贪吃蛇(单人版):
实现过程:
本人先来介绍一个函数 —— bioskey函数:
int bioskey (int cmd)
参数 (cmd) | 基本功能 |
---|---|
0 | 返回下一个从键盘键入的值(若不键入任何值,则将等下一个键入) 它返回一个16位的二进制数,包括两个不同的值: 1.当按下一个普通键时,它的低8位数存放该字符的ASCII码,高8位存放该键的扫描码; 2.对于特殊键(如方向键、F1~F12等 等),低8位为0,高8位字节存放该键的扫描码 |
1 | 查询是否按下一个键,若按下一个键则返回非零值,否则返回0 |
2 | bioskey()返回Shift、Ctrl、Alt、ScrollLock、NumLock、CapsLock、Insert键的状态。 各键状态存放在返回值的低8位字节中。 |
在所有操作开始之前,本人先按照以往博文的惯例,编写家师所授的模仿Java中的boolean类型,自定义的伪 boolean型:
自定义boolean类型:
typedef unsigned char boolean;
#define TRUE 1
#define FALSE 0
“蛇身体单元” 结构体 —— SNAKE_BODY:
本人先来构造一个可以用来表示一条蛇的身体单元的结构体:
typedef struct SNAKE_BODY{
int xPostion;
int yPostion;
}SNAKE_BODY;
“蛇 全部信息” 结构体 —— SNAKE:
现在,我们再来构造一个能够存储蛇全部信息的结构体:
typedef struct SNAKE{
int head; //这个成员是为了我们之后判断蛇头方向用的
int len; //这个成员用来记录蛇当前 “应该”有的长度
int curlen; //这个成员用来记录蛇当前 “实际”的长度
int direct; //这个成员表示键盘输入的指令
SNAKE_BODY *snake; //这个成员是我们用来存储蛇的身体所在坐标用的
}
那么,为了,根据我们上面的蛇头和蛇方向的成员,
我们现在来给出两个数组来存储 蛇头的形状 和 蛇的方向:
首先,我们再来构造一个结构体,用来存储蛇移动信息的结构体:
“蛇”移动信息 结构体 —— DELTA_MOVE:
typedef struct DELTA_MOVE{
int deltRow;
int deltCol;
}DELTA_MOVE;
那么,现在本人就可以根据以上的结构体来给出两个数组了:
蛇头移动 位置大小 —— delta:
DELTA_MOVE delta[4] = {
{
0, -1}, //向上运动
{
0, 1}, //向下运动
{
-1, 0}, //向左运动
{
1, 0} //向右运动
};
蛇头形状 数组 —— SnakeHead:
char SnakeHead[4] = {
"^", "v", "<", ">" //这个数组存储的蛇头方向的 “上下左右”,分别存在下标为0、1、2、3的单元中
}
现在,根据上面的数组,我们来编写一个获取蛇头形状的函数:
根据下标 获取 蛇头形状 函数 —— getHeadType:
char getHeadType(int snakeHeadIndex) {
return snakeHead[snakeHeadIndex];
}
那么,现在我们就可以初始化一条蛇了:
初始化 一条蛇的信息:
#define MAX_LEN 1000
//我们设定蛇最长为100(也可以设置地大一点,一般玩家都不会玩到100,所以本人设置最长长度是 100)
//由于最长长度是我们用宏定义定义的,所以,我们之后如果想要改的话,在这里改也比较方便
SNAKE player = {
0, //设定 开始时 蛇头信息存储在下标为0的数组空间内
5, //设定 开始时 蛇应该有5个长度
1, //因为刚开始是一个点,所以初始长度是1
3, //因为向右运动,所以设定运动方向是 右
NULL}; //因为我们还没有初始化身体,所以先令身体为NULL
SNAKE_BODY snakeBody[MAX_LEN] = {
{
0,0}};
现在,我们来制定一下边界,使得我们做出来的游戏界面更加美观:
“墙壁”边界 的设置:
#define WALL -2
int screenPoint[Full_Screen_COUNT] = {
0}; //整个屏幕一共分为25行、80列
void init() {
int i;
int j;
int tmp;
for(i = 1; i <= 80; i++) {
for(j = 1; j <= 25; j