今天浅交一下我的课设——推箱子。
今天教大家写一个简单的游戏。
游戏呢主要分为一下几个主要内容:
1.打印菜单页面
2.初始化地图
3.推箱子
4.判断输赢
5.结束后询问是否继续。
那么来看看代码:
首先是所用到的头文件,以及函数。
#include<stdio.h>
#include<conio.h>
#include<windows.h>
int play(int map[9][11]);
int drawmain(int map[9][11]);
int tuidong(int map[9][11]);
int isWin(int map[9][11]);
游戏做的比较简单,有三个地图:
int map1[9][11]={
{0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,1,1,0,0,0,0,0},
{0,0,0,1,4,1,0,0,0,0,0},
{0,0,0,1,0,1,1,1,1,0,0},
{0,1,1,1,3,0,3,4,1,0,0},
{0,1,4,0,3,2,1,1,1,0,0},
{0,1,1,1,1,3,1,0,0,0,0},
{0,0,0,0,1,4,1,0,0,0,0},
{0,0,0,0,1,1,1,0,0,0,0}
};
int map2[9][11]={
{1,1,1,1,1,0,0,0,0,0,0},
{1,2,0,0,1,0,0,0,0,0,0},
{1,0,3,3,1,0,1,1,1,0,0},
{1,0,3,0,1,0,1,4,1,0,0},
{1,1,1,0,1,1,1,4,1,0,0},
{0,1,1,0,0,0,0,4,1,0,0},
{0,1,0,0,0,1,0,0,1,0,0},
{0,1,0,0,0,1,1,1,1,0,0},
{0,1,1,1,1,1,0,0,0,0,0},
};
int map3[9][11]={
{0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,1,1,0,0,0},
{0,1,0,0,0,0,0,1,1,1,0},
{1,1,3,1,1,1,0,0,0,1,0},
{1,0,2,0,3,0,0,3,0,1,0},
{1,0,4,4,1,0,3,0,1,1,0},
{1,1,4,4,1,0,0,0,1,0,0},
{0,1,1,1,1,1,1,1,1,0,0},
{0,0,0,0,0,0,0,0,0,0,0},
};
其实可以使用三维数组来做地图,为了方便起见使用了三个二维数组,但其实都是一样的道理。
地图中的元素有空地0、墙1、人2、箱子3、目的地4。分别用数字来代替。那么在推动的过程中,就会箱子和目的地在一起用7表示,同样人+目的地6。
初始化地图
空地用空格表示;墙用■,人♀,箱子☆,终点◎,人+终点♂,箱子+终点★。
int drawmain(int map[9][11])
{
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<11;j++) //检索每一个元素
{
switch(map[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");
}
}
这里用switch检索每一个元素,检索到相应的将其打印。打印出来地图长这样:
有了地图,我们要去推动他,
先分析一下,人要推箱子,那么我们需要把人的位置找到是数字2,那么在推动的时候,人和终点重合时6。(第一步找到人的位置,2/6)
找到位置之后就要推动了4个方向主要讲一个方向(向上)
确定人的位置之后,有3种可能
1.人前面时空地,人前面是终点
2.人前面是箱子
2.1箱子前是空地
2.2箱子前是终点。
如图1,如果前面是空地或者是终点,人可以向前一步,那么map[i-1][j]的值为0+2=0(4+2=6)map[i][j]的值为2-2=0;
如图2,如果前面是箱子,箱子前面是空地(终点),可以推动。若为终点,则map[i-2][j]的值为4+3=7.
对于向下推动只需要
对,map[i+1][j]+2,也就是和向上比起来,将i-1变为i+1;同理向左就是[i-1][j]变为[i][j-1];向右[i][j+1]。
int tuidong(int map[9][11])
{
int count,caw=0;//行和列
int i,j,tui;
for(i=0;i<9;i++){
for (j=0;j<11;j++)
{
if(map[i][j]==2||map[i][j]==6)
{
count=i;
caw=j;
}
}
}
tui=getch();//与getchar()有区别的是:getchar()输入一个字符后需要回车来进行下一个字符的输入,
//比较麻烦 ,getch()则不需要回车就能连续输入多个字符。
switch(tui)
{//上
case 'W':
case 'w':
// 1.人的前面是空地;
// 2.人的前面是终点位置;
// 3.人的前面是箱子
//3.1.箱子的前面是空地;
//3.2.箱子的前面是终点位置。
if(map[count-1][caw]==0||map[count-1][caw]==4)
{
map[count][caw]-=2;
map[count-1][caw]+=2;
}
else if(map[count-1][caw]==3||map[count-1][caw]==7)
{
if(map[count-2][caw]==0||map[count-2][caw]==4)
{
map[count][caw]-=2;
map[count-1][caw]-=1;
map[count-2][caw]+=3;
}
}
break;
//下
case 'S':
case 's'://键值
if(map[count+1][caw]==0||map[count+1][caw]==4)
{
map[count][caw]-=2;
map[count+1][caw]+=2;
}
else if(map[count+2][caw]==0||map[count+2][caw]==4)
{
if(map[count+1][caw]==3||map[count+1][caw]==7)
{
map[count][caw]-=2;
map[count+1][caw]-=1;
map[count+2][caw]+=3;
}
}
break;
//左
case 'A':
case 'a':
if(map[count][caw-1]==0||map[count][caw-1]==4)
{
map[count][caw]-=2;
map[count][caw-1]+=2;
}
else if(map[count][caw-2]==0||map[count][caw-2]==4)
{
if(map[count][caw-1]==3||map[count][caw-1]==7)
{
map[count][caw]-=2;
map[count][caw-1]-=1;
map[count][caw-2]+=3;
}
}
break;
//右
case 'D':
case 'd':
if(map[count][caw+1]==0||map[count][caw+1]==4)
{
map[count][caw]-=2;
map[count][caw+1]+=2;
}
else if(map[count][caw+2]==0||map[count][caw+2]==4)
{
if(map[count][caw+1]==3||map[count][caw+1]==7)
{
map[count][caw]-=2;
map[count][caw+1]-=1;
map[count][caw+2]+=3;
}
}
break;
}
}
推动完后要判断输赢
检索每一个元素,如果有元素等于箱子(3) 就输了。
int isWin(int map[9][11])
{
int k = 0;//初始化
int j,i;
for(i=0;i<9;i++)
{
for (j=0;j<11;j++)
{
if(map[i][j]==3)
k++;
}
}
if(k==0)
return 1;
return 0;
}
最后,play把这些函数放一起
int play(int map[9][11])
{
while(!isWin(map))
{
system("cls");
drawmain(map);
tuidong(map);
}
system("cls");
printf("哇!你真棒,过关了!\n继续下一关吧!\n输入任意键进入下一关");
getch();
}
注意:这里 需要吊桶头文件#include<conio.h> 。这里用到了清屏。
system("cls");,需要对屏幕清空。
最后的最后就是main函数了
在这里实现了页面
int main()//主函数
{char direction, q;
printf("******************************************************\n");
printf("***** 欢迎来到推箱子大赛 *****\n");
printf("***** 本游戏由让我康康攻略团队制作 *****\n");
printf("******************************************************\n");
printf("***************************\n");
printf(" 是否要开始游戏?(y/n)\n");
printf("***************************\n");
while(scanf(" %c",&q) && q!='n' && q!='N')
{
while(1)
{
play(map1);
play(map2);
play(map3);
}
printf("shuchu \n");
return 0;}
}
页面效果就是这样啦
推箱子就完成了,
全部代码如下
#include<stdio.h>
#include<conio.h>
#include<windows.h>
int map2[9][11]={
{1,1,1,1,1,0,0,0,0,0,0},
{1,2,0,0,1,0,0,0,0,0,0},
{1,0,3,3,1,0,1,1,1,0,0},
{1,0,3,0,1,0,1,4,1,0,0},
{1,1,1,0,1,1,1,4,1,0,0},
{0,1,1,0,0,0,0,4,1,0,0},
{0,1,0,0,0,1,0,0,1,0,0},
{0,1,0,0,0,1,1,1,1,0,0},
{0,1,1,1,1,1,0,0,0,0,0},
};
int map1[9][11]={
{0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,1,1,0,0,0,0,0},
{0,0,0,1,4,1,0,0,0,0,0},
{0,0,0,1,0,1,1,1,1,0,0},
{0,1,1,1,3,0,3,4,1,0,0},
{0,1,4,0,3,2,1,1,1,0,0},
{0,1,1,1,1,3,1,0,0,0,0},
{0,0,0,0,1,4,1,0,0,0,0},
{0,0,0,0,1,1,1,0,0,0,0}
};
int map3[9][11]={
{0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,1,1,0,0,0},
{0,1,0,0,0,0,0,1,1,1,0},
{1,1,3,1,1,1,0,0,0,1,0},
{1,0,2,0,3,0,0,3,0,1,0},
{1,0,4,4,1,0,3,0,1,1,0},
{1,1,4,4,1,0,0,0,1,0,0},
{0,1,1,1,1,1,1,1,1,0,0},
{0,0,0,0,0,0,0,0,0,0,0},
};
//原始的图表,五行六列,其中 0 代表着空白的地方; 1 代表着墙;2 代表着人;
//3 代表着箱子;4 代表着箱子的终点位置。
//图的变化要靠自己来编写数组,通过数字来进行图的构造。
int play(int map[9][11]);
int drawmain(int map[9][11]);
int tuidong(int map[9][11]);
int isWin(int map[9][11]);
int main()//主函数
{char direction, q;
printf("******************************************************\n");
printf("***** 欢迎来到推箱子大赛 *****\n");
printf("***** 本游戏由让我康康攻略团队制作 *****\n");
printf("******************************************************\n");
printf("***************************\n");
printf(" 是否要开始游戏?(y/n)\n");
printf("***************************\n");
while(scanf(" %c",&q) && q!='n' && q!='N')
{
while(1)
{
play(map1);
play(map2);
play(map3);
}
printf("shuchu \n");
return 0;}
}
//把图形刻画出来
int play(int map[9][11])
{
while(!isWin(map))
{
system("cls");
drawmain(map);
tuidong(map);
}
system("cls");
printf("哇!你真棒,过关了!\n继续下一关吧!\n输入任意键进入下一关");
getch();
}
int drawmain(int map[9][11])
{
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<11;j++)
{
switch(map[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");
}
}
//进行小人的移动,整个移动的过程就是数组变化的过程
int tuidong(int map[9][11])
{
int count,caw=0;//行和列
int i,j,tui;
for(i=0;i<9;i++){
for (j=0;j<11;j++)
{
if(map[i][j]==2||map[i][j]==6)
{
count=i;
caw=j;
}
}
}
tui=getch();//与getchar()有区别的是:getchar()输入一个字符后需要回车来进行下一个字符的输入,
//比较麻烦 ,getch()则不需要回车就能连续输入多个字符。
switch(tui)
{//上
case 'W':
case 'w':
// 1.人的前面是空地;
// 2.人的前面是终点位置;
// 3.人的前面是箱子
//3.1.箱子的前面是空地;
//3.2.箱子的前面是终点位置。
if(map[count-1][caw]==0||map[count-1][caw]==4)
{
map[count][caw]-=2;
map[count-1][caw]+=2;
}
else if(map[count-1][caw]==3||map[count-1][caw]==7)
{
if(map[count-2][caw]==0||map[count-2][caw]==4)
{
map[count][caw]-=2;
map[count-1][caw]-=1;
map[count-2][caw]+=3;
}
}
break;
//下
case 'S':
case 's'://键值
if(map[count+1][caw]==0||map[count+1][caw]==4)
{
map[count][caw]-=2;
map[count+1][caw]+=2;
}
else if(map[count+2][caw]==0||map[count+2][caw]==4)
{
if(map[count+1][caw]==3||map[count+1][caw]==7)
{
map[count][caw]-=2;
map[count+1][caw]-=1;
map[count+2][caw]+=3;
}
}
break;
//左
case 'A':
case 'a':
if(map[count][caw-1]==0||map[count][caw-1]==4)
{
map[count][caw]-=2;
map[count][caw-1]+=2;
}
else if(map[count][caw-2]==0||map[count][caw-2]==4)
{
if(map[count][caw-1]==3||map[count][caw-1]==7)
{
map[count][caw]-=2;
map[count][caw-1]-=1;
map[count][caw-2]+=3;
}
}
break;
//右
case 'D':
case 'd':
if(map[count][caw+1]==0||map[count][caw+1]==4)
{
map[count][caw]-=2;
map[count][caw+1]+=2;
}
else if(map[count][caw+2]==0||map[count][caw+2]==4)
{
if(map[count][caw+1]==3||map[count][caw+1]==7)
{
map[count][caw]-=2;
map[count][caw+1]-=1;
map[count][caw+2]+=3;
}
}
break;
}
}
int isWin(int map[9][11])
{
int k = 0;//初始化
int j,i;
for(i=0;i<9;i++)
{
for (j=0;j<11;j++)
{
if(map[i][j]==3)
k++;
}
}
if(k==0)
return 1;
return 0;
}