注意:这里还定义出了6和7,是通过重叠的关系来算的,就是箱子在终点上,这个位置又有箱子又有终点2个标识,所以让两个的数值加起来,方便理解,也方便后面的计算
void print(){ int i,j; printf("请用wsad代表上下左右来进行游戏\n"); for(i=0;i<9;i++){ for(j=0;j<11;j++){ switch(screen[i][j]){ case 0: printf(" ");//空 break; case 1: printf("■");//墙 break; case 2: printf("★");//箱子 break; case 3: printf("♀");//人 break; case 4: printf("○");//终点 break; case 6: printf("★"); break;//箱子和终点 case 7://人和终点显示人 printf("♀"); break; } } printf("\n"); } }判断游戏输赢
这里我写了2个函数,一个判断赢,一个判断输,并返回值,然后在主函数的最后面通过判断返回值来确定游戏的输赢
判断赢
int win(){ int i,j,k=0; int t=0; for(i=0;i<9;i++){ for(j=0;j<11;j++){ if(screen[i][j]==6){ k++; } } }//遍历整个二维数组,计算箱子在终点上的个数 if(k==cum()){ t=1; }//如果个数等于前面计算出的终点个数,则说明所有终点都放了箱子,说明游戏胜利 return t; } //判断赢判断输
int lose(){ int i,j; int k=0; for(i=0;i<9;i++){ for(j=0;j<11;j++){ if(i>0 && j>0 ){ if(screen[i][j] == 2 || screen[i][j] == 6){ if(((screen[i-1][j] == 1 || screen[i-1][j] == 2 || screen[i-1][j] == 6) && (screen[i][j-1] == 1 || screen[i][j-1] == 2 || screen[i][j-1] == 6)) || ((screen[i][j-1] == 1 || screen[i][j-1] == 2 || screen[i][j-1] == 6) && (screen[i+1][j] == 1 || screen[i+1][j] == 2 || screen[i+1][j] == 6)) || ((screen[i+1][j] == 1 || screen[i+1][j] == 2 || screen[i+1][j] == 6) && (screen[i][j+1] == 1 || screen[i][j+1] == 2 || screen[i][j+1] == 6)) || ((screen[i][j+1] == 1 || screen[i][j+1] == 2 || screen[i][j+1] == 6) && (screen[i-1][j] == 1 || screen[i-1][j] == 2 || screen[i-1][j] == 6))){ k++; } } } }/*这里也是遍历了整个数组,判断所有的箱子四个方向的情况, 如果有三个方向被堵住了说明箱子无法移动了,也表明这个箱子失效了, 用k来记录失效的个数,当全部失效时游戏失败 (这是游戏的玩法,其实有一个被堵住就已经不可能胜利了)*/ } if(k==cum()){ k=1; } return k;//返回1说明游戏失败 }接下来是最重要的四个控制函数
向上移动
通过数字的变化来控制二维数组的变化,进而控制地图的更新
这里非常重要的就是要理解:加1,加2,加3减3都是什么意思
加1:箱子的值是2,人的值是3,所以箱子的位置变成人需要加1来实现
加2:空地的值是0,箱子的值是2,箱子和终点在一起的值是6,所以在推箱子的时候,前方的空格或者终点放上箱子后数值会加2
加3减3:人的值是3,人要动的话,它原先在的格子就会因为人走了导致数值减3,走到的那个格子就会因为站了人而加3