贪吃蛇

Youzg Logo

贪吃蛇(单人版):

实现过程:

本人先来介绍一个函数 —— 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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值