用C写一个简单的推箱子游戏(二)

下面接着上一篇随笔《用C写一个简单的推箱子游戏(一)》来写

tuidong()函数是用来判断游戏人物前方情况的函数,是推箱子游戏中非常重要的一个函数,下面从它开始继续介绍推箱子的小程序怎么写:

e)   tuidong()函数:判断移动人物的前方的情况

1)   第一部分:

 1 int count,caw=0;//行和列 
 2     int i,j,tui;
 3     for(i=0;i<9;i++)
 4     {
 5         for (j=0;j<11;j++)
 6         {
 7             if(map[i][j]==2||map[i][j]==6)
 8             {
 9                 count=i;
10                 caw=j;
11             }
12         }
13 }
14 tui=getch();

说明:

①为了判断游戏人物位置,首先需要将人物位置记录下来,此处用count和caw变量记录初始位置;

②使用getch()函数而不用getchar()函数的原因是:getchar()函数输入一个字符后需要回车来进行下一个字符的输入,比较麻烦,而getch()函数则不需要回车就能连续输入多个字符。所以采用getch()函数对玩家键盘输入的内容进行记录,并将值赋给tui。

2)   第二部分

 1 switch(tui)
 2 {
 3         case 'w'://向上
 4          if(map[count-1][caw]==0||map[count-1][caw]==4)
 5             {
 6                 map[count][caw]-=2;
 7                 map[count-1][caw]+=2;
 8             } 
 9          else if(map[count-1][caw]==3||map[count-1][caw]==7)
10             {
11                 if(map[count-2][caw]==0||map[count-2][caw]==4)
12                 {
13                   map[count][caw]-=2;
14                   map[count-1][caw]-=1;
15                   map[count-2][caw]+=3;
16                 }
17             }
18         break;
19 case 's'://向下
20 ……(同理)
21 case 'a'://向左
22 ……(同理)
23 case 'd'://向右
24 ……(同理)
25 default://错误输入
26 printf("你的输入有误,请输入方向键");
27 }

说明:

①这里只取向上的代码进行解释,其他方向原理同理;

②游戏人物前面的位置有以下几种情况:

1.人的前面是空地;

2.人的前面是终点位置;

3.人的前面是箱子

3.1.箱子的前面是空地;

3.2.箱子的前面是终点位置。

③第一个判断条件map[count-1][caw]==0||map[count-1][caw]==4就是判断前面第1和第2两种情况的。如果满足这两种情况,则执行map[count][caw]-=2和map[count-1][caw]+=2的操作,即:将人的位置变为空地并将前方一格变为人或者人在终点的标志。不满足则执行下一个判断。

④第二个判断条件map[count-1][caw]==3||map[count-1][caw]==7就是判断前面第3种情况。人的前面有箱子,这个箱子可以是在空地之上,也可以是在终点位置之上(这个是为了区分两种情况:一种是如果箱子在空地之上,那么人过后可以直接变为空地,但是另外一种情况就是,当箱子是在终点之上时,人通过终点后,仍然需要有终点标记)。而在人的前面有箱子(不管是箱子在空地之上还是在终点之上)这种情况下,因为箱子的前面情况不同,结果也会不同。比如说箱子前是墙壁或者是箱子,那么人是不能推动的,而如果前面是终点或者是空地则是可以推动的。因此,在判断完人前有箱子之后,还要进一步判断箱子前的情况,所以,就需要加上第二个判断条件(即前面3.1和3.2情况):当满足map[count-2][caw]==0||map[count-2][caw]==4情况时,进行如下操作:map[count][caw]-=2;map[count-1][caw]-=1;map[count-2][caw]+=3。

第一个是将人的位置变为空地,第二个是将箱子标志/箱子在终点标志变为人标志/人在终点的标志,第三个是将箱子前的空地/箱子前的终点位置变为箱子/箱子在终点的标志。

f)   winshu()函数:判断输赢的函数

1 int winshu() 
2 {int k = 0;//初始化
3     int j,i;
4     for(i=0;i<9;i++)
5     {for (j=0;j<11;j++)
6         {if(map[i][j]==3)
7                  k++;}}
8     if(k==0)
9         printf("恭喜你,你赢了!\n");}

这段函数是在每次移动指令输入后打印屏幕前进行判断的函数,所以它引用在drawmain()函数里面(见前面的d部分)。其判断依据很简单,我们把没有到达的箱子命名为空箱子,其判断依据就是当空箱子为零时,玩家就赢了。

将以上所有函数组合起来就可以完成这个简单的推箱子小游戏了,这个只是一关,如果想要增加关卡数,可以采用三维数组,新增的数组用来记录关卡数即可。

用C写推箱子游戏源码》已发布,密码请关注微信公众号“优秀物联人”后台回复“验证码”即可获得(密码不定时更换)。

posted @ 2020-02-01 14:22  Billsheng  阅读(662)  评论(0编辑  收藏  举报