零基础教做贪吃蛇——(3)部分函数讲解

在上一篇中,我们把这个项目的各个文件都创立了下,而且还在snake.h文件中把我们要用到的函数都列了出来,接下来我们来逐步完善各个函数。
在这里插入图片描述

gotoxy函数

为啥子不按照顺序先从initMap开始讲嘞?因为initMap这个函数需要定点输出,而且我之前说了,在这个项目中我不会使用“\n”这种来输出界面,所以我们采用定点输出的方式,为了方便它的使用,当然是把它打包成一个函数啦。
这个函数没啥子讲的,只是死套模板罢了,只不过我们把x和y作为函数的输入就可以了:

void gotoxy(int x, int y)
{
	HANDLE hout;								//Defining handle objects
	COORD cor;									//Defining coordinate objects
	hout = GetStdHandle(STD_OUTPUT_HANDLE);		//Get the handle of the output screen buffer
	cor.X = y;
	cor.Y = x;
	SetConsoleCursorPosition(hout, cor);		//Move Cursor
}

这样,我们在主函数中导入snake.h头文件后就可以直接调用这个函数了,而且在snake.c文件中也是。

menu函数

如果你大概玩了下这个小游戏你就会知道,我们在刚打开这个游戏的时候,会有个问你玩游戏还是退出的界面,这个函数就是用来显示这个界面的。
在这里插入图片描述
不知大家还记不记得我们在snake.h里面定义的一个ret变量,它就是在这里用来当这个函数的返回值的。

int menu()
{
	gotoxy(12, 42);//移动到12,42的位置
	printf("欢迎来到贪吃蛇小游戏....");
	gotoxy(14, 45);//移动到14,45的位置
	printf("开始游戏请按(1)");
	gotoxy(16, 42);//移动到16,42的位置
	printf("按其他任意键退出游戏QAQ");
	gotoxy(18,25);//移动到18,25的位置
	printf("反正闲着也是闲着,不如坐下来来一把紧张又刺激的贪吃蛇如何?┐(‘~`;)┌");
	int ch = getch();//使用ch接收键盘输入的值,getch()作用参考第一章

	while (TRUE)
	{
		if (ch == 49)	//因为它的 ASCII 值是1,因为我们的ch是int型
		{
			ret = 1;//则把ret标记为1,意为用户同意玩
			break;
		}
		else
		{
			break;
		}


	}
	system("cls");//把屏幕清空下,方便接下来的显示界面
	return ret;//把ret的值返回
}

initMap函数

在这里插入图片描述
这个函数是用来显示地图界面的,它用来初始化蛇的各种信息,果子的坐标,和游戏边框等地方,是非常重要的函数。我的注释会打的非常详细,帮助大家理解

void initMap(void)
{
	ch = UP;//默认的ch为向前
	Direction = UP;//默认方向为向前
	//初始化食物
	srand(time(NULL));	//使用当前时间进行随机数发生器的初始化								
	food.x = rand() % (FRAME_HEIGHT - 2) + 1;//rand( )随机函数, 食物的x坐标为1到界面最右边少一个位置中的任意一个值。FRAME_HEIGHT 和FRAME_WIDTH都是我们之前已经宏定义后的值。
	food.y = rand() % (FRAME_WIDTH - 2) + 1;
	gotoxy(food.x, food.y);//定位到我们随机出的坐标
	printf("!");//使用!代表食物
	//初始化蛇
	snake.x[0] = FRAME_HEIGHT / 2;//用地图的长和宽都除2,从而把蛇头定位到地图中央
	snake.y[0] = FRAME_WIDTH / 2;
	gotoxy(snake.x[0], snake.y[0]);//到地图中央的地方
	printf("@");//用@表示蛇身
	snake.len = 3;//初始蛇的长度是3个
	snake.speed = 200;//默认蛇的速度是200
	for (k = 1; k<snake.len; k++)//从正中央的地点开始后3个把蛇的身子部分都显示出来
	{
		snake.x[k] = snake.x[k - 1] + 1;
		snake.y[k] = snake.y[k - 1];
		gotoxy(snake.x[k], snake.y[k]);
		printf("@");
	}
	//初始化地图
	for (j = 0; j<FRAME_WIDTH; j++)//初始化宽
	{
		gotoxy(0, j);
		printf("#");//是用#表示边界
		gotoxy(FRAME_HEIGHT - 1, j);
		printf("#");
	}
	for (i = 1; i<FRAME_HEIGHT - 1; i++)//初始化长
	{
		gotoxy(i, 0);
		printf("#");
		gotoxy(i, FRAME_WIDTH - 1);
		printf("#");
	}
}

printFont函数

在这里插入图片描述
这个函数主要是显示一些游戏信息啊神马的东西与游戏内容无关,主要是加强游戏体验的东西。为了方便,这个函数的入口参数就弄了俩,其他输出地点的坐标直接计算出来,emm至于计算公式,,不用太深究,,慢慢调出来的,主要是为了美观。

void printFont(int x, int y, int speed)
{
	int i = 1;//定义一个变量,后面计算用
	gotoxy(x, y);
	printf("反正闲着也是闲着,不如坐下来来一把紧张又刺激的贪吃蛇如何?");

	gotoxy(x + ADD, y);//ADD也是我们在snake.h里面定义的一个常量,现在用作计算坐标用,大家随意处理即可
	if (speed == 200)//根据速度显示数度级数
	{
		printf("现在的速度是:%d级", i);
	}
	else if (speed == 175)
	{
		printf("现在的速度等级是:%d级", i + 1);
	}
	else if (speed == 150)
	{
		printf("现在的速度等级是:%d级", i + 2);
	}
	else if (speed == 100)
	{
		printf("现在的速度等级是:%d级", i + 3);
	}
	else
	{
		printf("恭喜你,召唤师,现在是最高级");
	}
	gotoxy(x + 2 * ADD, y);
	printf("上下左右操作键分别是:w,s,a,d");

	gotoxy(x + 3 * ADD, y);
	printf("当吃到自己身体或者撞墙时游戏结束");

	gotoxy(x + 4 * ADD, y);
	printf("按空格键暂停,在按空格键继续");
}

updataFood函数

这个函数主要是用来更新了食物的,它用来判断食物是否被吃,如果被吃掉了就再随机出一个新的食物。。
至于怎么判断食物是否被吃掉了,很简单,直接判断蛇头的坐标是否和食物的坐标一样就可与了,,emm,,但是后来我玩这个游戏的时候,发现这个bug,因为食物是全图生成的,如果生成的食物在蛇的身上,它会随着蛇的移动,输出的食物图标“!”被覆盖,随后消失。而且不会生成新的食物。。。说白了,按照上面的逻辑,这个bug就是食物没了,而且不再生成。

所以我把它的判断逻辑小改了下——当食物的坐标在蛇的身体中时,它才判定食物被吃掉了。

void updataFood()
{
    int iseat=0;//用作标记食物是否被吃,默认为没有被吃
    for(int i=0;i<snake.len;i++){//循环判断,食物的坐标是否以在蛇的身体中
        if(snake.x[i]==food.x&&snake.y[i]==food.y){
            iseat=1;//如果时,则记录食物被吃了
            break;
        }
    }
	if (iseat)//当食物被吃了后,再次随机新的食物
	{
		srand(time(NULL));//不明白的参考第一章
		food.x = rand() % (FRAME_HEIGHT - 2) + 1;//使用取余的方式,把随机的结果固定在地图范围中
		food.y = rand() % (FRAME_WIDTH - 2) + 1;
		gotoxy(food.x, food.y);
		printf("!");
		snake.len++;//由于食物被吃了,蛇的长度加一
		grow = 1;//是否增长标记为是,这个变量也是snake.h宏定义过的
	}
}

好了,今天就先讲解这么多,剩下的明天再讲吧,,,毕竟打字打的手有点疼在这里插入图片描述

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Excel下实现贪吃蛇游戏 上次我们在Excel下实现了一个华容道式的小游戏,使用了Excel中的小部分属性和功能,不到100行语句就完成了。这次我们要把贪吃蛇搬到Excel中,就不那么容易了。 首先要解决游戏显示的问题。对我们来说,小游戏最好的平台是Excel的工作区,由于大小可调、颜色可填的单元格操作方便,我们完全可以把它们当像素来使用。于是我们的贪吃蛇游戏就有了以单元格为基础的像素形式的显示方式了。 其次是游戏的控制方法。在这里我摸索了好久,其中走了弯路不说,我最后的结论是在Excel中要实现按键事件的方法是引入窗体,然后在窗体中响应Keydown与Keypress事件。这样的话,既可以快速响应还可以根据情况修改对应按键。 最后是游戏的定时问题。所有的游戏事实上都是在一个时间大循环里面定时接收输入信息更新状态的程序,我们的小游戏都不例外。老实说,我写这个游戏部分的思考时间就浪费在如何实现游戏定时这里。Excel的VBA中与定时有关的只有onTime函数,没有其他相关函数提供了,onTime函数可以实现某一事件在指定时间发生,但只能以秒为最小单位,对我们要在一秒内更新数十次信息的小游戏不适合,我们只能另找方法。用过VB的人都知道VB控件中有个定时控件,用它来实现游戏定时是最好的,但在Excel中却没有,难道我要把VB中的定时控件移植到VBA中?这也是个很值得研究的课题,但是我想到了另外的方法。VB的程序员都知道要想VB程序发挥大作用一定离不开调用系统的API,于是我查看了系统相关API的帮助,发现系统API中实现相应功能的有settimer与killtimer函数,具体定义和用法大家可以参考相关帮助,但从字面大家都已经可以知道它们就是我们要找的东西了。那么现在的问题就是如何在vba环境下调用系统API。心想微软称vba就是office中的vb,那么在vba中调用系统API应该也与在VB中的一样。一试,呵呵,果然非虚,这微软真不是盖的(后在msdn中发现ms office vba从2000版本开始支持调用系统API,大家可以拓展office应用了)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值