3.推箱子总结完整
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*按下空格键后,回到本关开头的函数*/
void reset(int i)
{switch(i)
{
case 0: init();
inithouse1();break;
case 1: init();
inithouse2();break;
case 2: init();
inithouse3();break;
}
for(x=1,y=5;y<=9;y++)/*初始化墙壁,根据printwall函数设置墙,重点:写上‘w’*/
printwall(x+4,y+10);
for(y=5,x=2;x<=5;x++)
printwall(x+4,y+10);
for(y=9,x=2;x<=5;x++)
printwall(x+4,y+10);
printwall(x+4,y+10);
printwall(5+4,4+10);
printwall(5+4,7+10);
printwall(3+4,2+10);
printbox(3+4,6+10); /*在特定的坐标点画箱子,并写下'b'*/
printbox(3+4,7+10);
printbox(4+4,7+10);
case 0x4b00:move(x,y,'l');break; /*按下向左键后*/
case 0x4d00:move(x,y,'r');break; /*按下向右键后*/
case 0x3920:reset(i);break; /*按下空格键后*/
default:break;
}
for(y=1,x=3;x<=8;x++)
printwall(x+4,y+10);
for(x=3,y=3;x<=5;x++)
printwall(x+4,y+10);
for(x=5,y=8;x<=9;x++)
printwall(x+4,y+10);
for(x=7,y=4ຫໍສະໝຸດ Baidux<=9;x++)
printwall(x+4,y+10);
else if(judge(x-1,y)==1||judge(x-1,y)==3) /*(2)人的上面是空地或是目的地*/
{if(judge(x,y)==3) /*人的上面是目的地*/
{ printwhither(x,y);printman(x-1,y);break;}
else
{printf(" ");printman(x-1,y);break;} /*人的上面是空地*/
目的地:3个,在ghouse函数中在特定的三个坐标点画出目的地,并用printwhither1函数写下'm'并记录记录'm':如//目的地的坐标是由链表记录的,6个值表示坐标,由三个节点的链表来记录
/*在特定的坐标上画目的地并用数组记录状态的函数*/
winer *qw;
putchxy(y-1,x-1,'*',YELLOW,BLACK);
case 3: init();
inithouse4();break;
default:break;
}
}
8.主函数设计:
1)首先定义了一些变量和指针,然后初始化数组、屏幕和第一关
main()
{int key,x,y,s,i=0;
winer *win,*pw;
_AL=3;_AH=0;
geninterrupt(0x10);
printwall(x+4,y+10);
for(x=5,y=8;x<=9;x++)
printwall(x+4,y+10);
for(x=7,y=4;x<=9;x++)
printwall(x+4,y+10);
for(x=9,y=5;y<=7;y++)
printwall(x+4,y+10);
for(x=8,y=2;y<=3;y++)
}
else /*存入信息后执行else语句,将链表进行连接*/
{
qw=(winer* )malloc(sizeof(winer));
qw->x=x;qw->y=y;(*pw)->p=qw;(*pw)=qw;qw->p=NULL;
}
5.关卡设置:初始化箱子、目的地、墙壁、小人:通过for循环与printman,printbox,printwhither1,printwall函数的调用进行初始化:如(其他三关同理)
for(x=9,y=5;y<=7;y++)
printwall(x+4,y+10);
for(x=8,y=2;y<=3;y++)
printwall(x+4,y+10);
printwall(5+4,4+10);
printwall(5+4,7+10);
printwall(3+4,2+10);
4.目的地的设置:通过特定的坐标点画出目的地,并写下'm',并用链表与ghouse数组记录目的地的信息
{ moveboxin(x,y,'u');
if(judge(x,y)==3) printwhither(x,y); gotoxy(y,x-1);
}
else gotoxy(y,x);
break;
}
else if(judge(x-1,y)==4) /*人的上面是箱子在目的地*/
{ if(judge(x-2,y)==1) /*箱子上面是空地*/
printwhither1(4+4,2+10,&win,&pw); /*在特定的坐标上画目的地,写下'm'并用数组记录状态*/
printwhither1(5+4,2+10,&win,&pw);
printwhither1(6+4,2+10,&win,&pw);
printman(2+4,8+10); /*在特定的坐标上画人*/
return win;
}
6.箱子的下一个位置的情况:/*在特定的坐标上画箱子在目的地上并用数组记录状态的函数*/
1)下一个位置是目的地,空地:当下一个位置为目的地时写下'i',当下一个位置为空地时写下'b',并擦去原位置的状态(将原位置ghouse数组==0)如
/*移动在空地上的箱子到空地上*/
movebox(int x,int y,char a)
ghouse[x+2][y]='b';break;
case 'l':ghouse[x][y-1]=0;printf(" ");
printbox(x,y-2);printman(x,y-1);
ghouse[x][y-2]='b';break;
case 'r':ghouse[x][y+1]=0;printf(" ");
while(bioskey(1)==0);
key=bioskey(0); /*bioskey从键盘上返回数值*/
switch(key)
{
case 0x4800:move(x,y,'u');break; /*按下向上键后*/
case 0x5000:move(x,y,'d');break; /*按下向下键后*/
init(); /*初始化函数,初始化数组和屏幕*/
win=inithouse1(); /*设置第一关win指针接收inithouse1返回的图像*/
2)设计了一个大的do,while循环条件:重点:是本游戏的主要部分
do{
_AH=3;
geninterrupt(0x10);
x=_DH+1;y=_DL+1;
(通过for循环实现)
/*在特定的坐标上画墙壁并用数组记录状态的函数*/
void printwall(int x,int y)
{
putchxy(y-1,x-1,219,MAGENTA,BLACK);
/*x,y,219样式参数,MAGENTA前景色,BLACK背景色(x,y初始值为1,所以减1)*/
ghouse[x][y]='w';
{switch(a)
{
case 'u':ghouse[x-1][y]=0;printf(" ");
printbox(x-2,y);printman(x-1,y);
ghouse[x-2][y]='b';break;
case 'd':ghouse[x+1][y]=0;printf(" ");
printbox(x+2,y);printman(x+1,y);
printbox(x,y+2);printman(x,y+1);
ghouse[x][y+2]='b';break;
default: break;
}
}
2)下一个位置是箱子:如果上面是箱子则有b标记,两个b相撞则不能移动
3)下一个位置是箱子或墙壁:b与b,b与w相碰则不能移动
2),3)例子
case 'u':if(!judge(x-1,y)) {gotoxy(y,x);break;} /*(1)人的上面是墙*/
printwall(x+4,y+10);
for(y=5,x=2;x<=5;x++)
printwall(x+4,y+10);
for(y=9,x=2;x<=5;x++)
printwall(x+4,y+10);
for(y=1,x=3;x<=8;x++)
printwall(x+4,y+10);
for(x=3,y=3;x<=5;x++)
}
else gotoxy(y,x); /*else情况则包括箱子的下一个状态是箱子或箱子的下一个状态是障碍物(箱子或墙壁)*/
break;
}
7./*按下空格键后,回到本关开头的函数*/如何实现的
1)当按下空格键时返回一个i的值
2)调用/*初始化函数,初始化数组和屏幕*/
3)调用关卡函数如inithouse1()进行重新开始
箱子:3个,
在ghouse数组中特定的三个坐标设置三个箱子并由printbox函数给箱子写下'b':如
/*在特定的坐标上画箱子并用数组记录状态的函数*/
void printbox(int x,int y)
{
putchxy(y-1,x-1,10,WHITE,BLACK); /*设置箱子,样式10,前景色白色,背景色黑色*/
/*第一关的图象初始化*/
winer *inithouse1()
{
int x,y;
winer *win=NULL,*pw;
gotoxy(8,2);
printf("Level No.1");/*在指定地点显示关卡*/
for(x=1,y=5;y<=9;y++)/*初始化墙壁,根据printwall函数设置墙,重点:写上‘w’*/
/*在特定的坐标上画人的函数*/
void printman(int x,int y)
{
gotoxy(y,x);
_AL=02;_CX=01;_AH=0xa;
geninterrupt(0x10);
}
printman(2+4,4+10);/*在特定的坐标上画人*/
2.箱子设置:在特定的坐标点画出箱子,并写下'b'
推箱子复习总结
推箱子基本概括思路:
/*定义二维数组ghouse来记录屏幕上各点的状态,
其中:0表示什么都没有,'b'表示箱子,'w'表示墙壁,'m'表示目的地,'i'表示箱子在目的地。*/
1.人物设置:即在特定的坐标将人画出。
(1)1个,在ghouse数组中特定的坐标点用printman函数画出小人:如
ghouse[x][y]='b';
}
printbox(3+4,6+10); /*在特定的坐标点写下箱子*/
printbox(3+4,7+10);
printbox(4+4,7+10);
3.墙壁设置:在ghouse数组中画出墙壁,并写下'w'
在ghouse数组中画出墙壁,并用printwall函数写下'w':如
}
else if(judge(x-1,y)==2) /*人的上面是箱子*/
{ if(judge(x-2,y)==1) /*箱子上面是空地*/
{movebox(x,y,'u');
if(judge(x,y)==3) printwhither(x,y); gotoxy(y,x-1);
}
else if(judge(x-2,y)==3) /*箱子上面是目的地*/
{moveinbox(x,y,'u');
if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x-1);
}
else if(judge(x-2,y)==3) /*箱子上面是目的地*/
{ moveinboxin(x,y,'u');
if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x-1);
ghouse[x][y]='m';
if(*win==NULL) /*刚输入时*win==null,if语句执行,将第一个目的地存入第一节点*/
{
*win=*pw=qw=(winer* )malloc(sizeof(winer));
(*pw)->x=x;(*pw)->y=y;(*pw)->p=NULL; /* ->结构体成员符*/
void reset(int i)
{switch(i)
{
case 0: init();
inithouse1();break;
case 1: init();
inithouse2();break;
case 2: init();
inithouse3();break;
}
for(x=1,y=5;y<=9;y++)/*初始化墙壁,根据printwall函数设置墙,重点:写上‘w’*/
printwall(x+4,y+10);
for(y=5,x=2;x<=5;x++)
printwall(x+4,y+10);
for(y=9,x=2;x<=5;x++)
printwall(x+4,y+10);
printwall(x+4,y+10);
printwall(5+4,4+10);
printwall(5+4,7+10);
printwall(3+4,2+10);
printbox(3+4,6+10); /*在特定的坐标点画箱子,并写下'b'*/
printbox(3+4,7+10);
printbox(4+4,7+10);
case 0x4b00:move(x,y,'l');break; /*按下向左键后*/
case 0x4d00:move(x,y,'r');break; /*按下向右键后*/
case 0x3920:reset(i);break; /*按下空格键后*/
default:break;
}
for(y=1,x=3;x<=8;x++)
printwall(x+4,y+10);
for(x=3,y=3;x<=5;x++)
printwall(x+4,y+10);
for(x=5,y=8;x<=9;x++)
printwall(x+4,y+10);
for(x=7,y=4ຫໍສະໝຸດ Baidux<=9;x++)
printwall(x+4,y+10);
else if(judge(x-1,y)==1||judge(x-1,y)==3) /*(2)人的上面是空地或是目的地*/
{if(judge(x,y)==3) /*人的上面是目的地*/
{ printwhither(x,y);printman(x-1,y);break;}
else
{printf(" ");printman(x-1,y);break;} /*人的上面是空地*/
目的地:3个,在ghouse函数中在特定的三个坐标点画出目的地,并用printwhither1函数写下'm'并记录记录'm':如//目的地的坐标是由链表记录的,6个值表示坐标,由三个节点的链表来记录
/*在特定的坐标上画目的地并用数组记录状态的函数*/
winer *qw;
putchxy(y-1,x-1,'*',YELLOW,BLACK);
case 3: init();
inithouse4();break;
default:break;
}
}
8.主函数设计:
1)首先定义了一些变量和指针,然后初始化数组、屏幕和第一关
main()
{int key,x,y,s,i=0;
winer *win,*pw;
_AL=3;_AH=0;
geninterrupt(0x10);
printwall(x+4,y+10);
for(x=5,y=8;x<=9;x++)
printwall(x+4,y+10);
for(x=7,y=4;x<=9;x++)
printwall(x+4,y+10);
for(x=9,y=5;y<=7;y++)
printwall(x+4,y+10);
for(x=8,y=2;y<=3;y++)
}
else /*存入信息后执行else语句,将链表进行连接*/
{
qw=(winer* )malloc(sizeof(winer));
qw->x=x;qw->y=y;(*pw)->p=qw;(*pw)=qw;qw->p=NULL;
}
5.关卡设置:初始化箱子、目的地、墙壁、小人:通过for循环与printman,printbox,printwhither1,printwall函数的调用进行初始化:如(其他三关同理)
for(x=9,y=5;y<=7;y++)
printwall(x+4,y+10);
for(x=8,y=2;y<=3;y++)
printwall(x+4,y+10);
printwall(5+4,4+10);
printwall(5+4,7+10);
printwall(3+4,2+10);
4.目的地的设置:通过特定的坐标点画出目的地,并写下'm',并用链表与ghouse数组记录目的地的信息
{ moveboxin(x,y,'u');
if(judge(x,y)==3) printwhither(x,y); gotoxy(y,x-1);
}
else gotoxy(y,x);
break;
}
else if(judge(x-1,y)==4) /*人的上面是箱子在目的地*/
{ if(judge(x-2,y)==1) /*箱子上面是空地*/
printwhither1(4+4,2+10,&win,&pw); /*在特定的坐标上画目的地,写下'm'并用数组记录状态*/
printwhither1(5+4,2+10,&win,&pw);
printwhither1(6+4,2+10,&win,&pw);
printman(2+4,8+10); /*在特定的坐标上画人*/
return win;
}
6.箱子的下一个位置的情况:/*在特定的坐标上画箱子在目的地上并用数组记录状态的函数*/
1)下一个位置是目的地,空地:当下一个位置为目的地时写下'i',当下一个位置为空地时写下'b',并擦去原位置的状态(将原位置ghouse数组==0)如
/*移动在空地上的箱子到空地上*/
movebox(int x,int y,char a)
ghouse[x+2][y]='b';break;
case 'l':ghouse[x][y-1]=0;printf(" ");
printbox(x,y-2);printman(x,y-1);
ghouse[x][y-2]='b';break;
case 'r':ghouse[x][y+1]=0;printf(" ");
while(bioskey(1)==0);
key=bioskey(0); /*bioskey从键盘上返回数值*/
switch(key)
{
case 0x4800:move(x,y,'u');break; /*按下向上键后*/
case 0x5000:move(x,y,'d');break; /*按下向下键后*/
init(); /*初始化函数,初始化数组和屏幕*/
win=inithouse1(); /*设置第一关win指针接收inithouse1返回的图像*/
2)设计了一个大的do,while循环条件:重点:是本游戏的主要部分
do{
_AH=3;
geninterrupt(0x10);
x=_DH+1;y=_DL+1;
(通过for循环实现)
/*在特定的坐标上画墙壁并用数组记录状态的函数*/
void printwall(int x,int y)
{
putchxy(y-1,x-1,219,MAGENTA,BLACK);
/*x,y,219样式参数,MAGENTA前景色,BLACK背景色(x,y初始值为1,所以减1)*/
ghouse[x][y]='w';
{switch(a)
{
case 'u':ghouse[x-1][y]=0;printf(" ");
printbox(x-2,y);printman(x-1,y);
ghouse[x-2][y]='b';break;
case 'd':ghouse[x+1][y]=0;printf(" ");
printbox(x+2,y);printman(x+1,y);
printbox(x,y+2);printman(x,y+1);
ghouse[x][y+2]='b';break;
default: break;
}
}
2)下一个位置是箱子:如果上面是箱子则有b标记,两个b相撞则不能移动
3)下一个位置是箱子或墙壁:b与b,b与w相碰则不能移动
2),3)例子
case 'u':if(!judge(x-1,y)) {gotoxy(y,x);break;} /*(1)人的上面是墙*/
printwall(x+4,y+10);
for(y=5,x=2;x<=5;x++)
printwall(x+4,y+10);
for(y=9,x=2;x<=5;x++)
printwall(x+4,y+10);
for(y=1,x=3;x<=8;x++)
printwall(x+4,y+10);
for(x=3,y=3;x<=5;x++)
}
else gotoxy(y,x); /*else情况则包括箱子的下一个状态是箱子或箱子的下一个状态是障碍物(箱子或墙壁)*/
break;
}
7./*按下空格键后,回到本关开头的函数*/如何实现的
1)当按下空格键时返回一个i的值
2)调用/*初始化函数,初始化数组和屏幕*/
3)调用关卡函数如inithouse1()进行重新开始
箱子:3个,
在ghouse数组中特定的三个坐标设置三个箱子并由printbox函数给箱子写下'b':如
/*在特定的坐标上画箱子并用数组记录状态的函数*/
void printbox(int x,int y)
{
putchxy(y-1,x-1,10,WHITE,BLACK); /*设置箱子,样式10,前景色白色,背景色黑色*/
/*第一关的图象初始化*/
winer *inithouse1()
{
int x,y;
winer *win=NULL,*pw;
gotoxy(8,2);
printf("Level No.1");/*在指定地点显示关卡*/
for(x=1,y=5;y<=9;y++)/*初始化墙壁,根据printwall函数设置墙,重点:写上‘w’*/
/*在特定的坐标上画人的函数*/
void printman(int x,int y)
{
gotoxy(y,x);
_AL=02;_CX=01;_AH=0xa;
geninterrupt(0x10);
}
printman(2+4,4+10);/*在特定的坐标上画人*/
2.箱子设置:在特定的坐标点画出箱子,并写下'b'
推箱子复习总结
推箱子基本概括思路:
/*定义二维数组ghouse来记录屏幕上各点的状态,
其中:0表示什么都没有,'b'表示箱子,'w'表示墙壁,'m'表示目的地,'i'表示箱子在目的地。*/
1.人物设置:即在特定的坐标将人画出。
(1)1个,在ghouse数组中特定的坐标点用printman函数画出小人:如
ghouse[x][y]='b';
}
printbox(3+4,6+10); /*在特定的坐标点写下箱子*/
printbox(3+4,7+10);
printbox(4+4,7+10);
3.墙壁设置:在ghouse数组中画出墙壁,并写下'w'
在ghouse数组中画出墙壁,并用printwall函数写下'w':如
}
else if(judge(x-1,y)==2) /*人的上面是箱子*/
{ if(judge(x-2,y)==1) /*箱子上面是空地*/
{movebox(x,y,'u');
if(judge(x,y)==3) printwhither(x,y); gotoxy(y,x-1);
}
else if(judge(x-2,y)==3) /*箱子上面是目的地*/
{moveinbox(x,y,'u');
if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x-1);
}
else if(judge(x-2,y)==3) /*箱子上面是目的地*/
{ moveinboxin(x,y,'u');
if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x-1);
ghouse[x][y]='m';
if(*win==NULL) /*刚输入时*win==null,if语句执行,将第一个目的地存入第一节点*/
{
*win=*pw=qw=(winer* )malloc(sizeof(winer));
(*pw)->x=x;(*pw)->y=y;(*pw)->p=NULL; /* ->结构体成员符*/