湖南商学院2

更新时间:2024-05-03 01:06:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

推箱子游戏课程设计

一、课程设计任务与要求

推箱子游戏既能锻炼思维的严密性,又有很多乐趣。为了能在玩时也能锻炼思维,我尽力设计了一个简单的推箱子游戏,其开发过程有一定的技巧和方法,其中涉及到软中断、二维数组、键盘操作以及图形化函数等方面的知识。本游戏的开发者需要基本掌握显示器中断寄存器的设置。二维数组及结构体的定义、键盘上键值的获取、图形方式下光标的显示各定位,以及部分图形函数的使用。

二、总体设计

1、系统模块

本程序包括5个模块,分别是初始化模块、画图模块、移动箱子模块、移动小人模块和功能控制模块,。各个模块的功能描述如下: 1)初始化模块

该模块包括屏幕初始化和游戏第一关的初始化。屏幕初始化用于输出欢迎信息和操作提示,游戏每一关的初始化是构建每一关的关卡。 2)画图模块

该模块主要是被其它模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。 3)移动箱子模块

该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。 4)移动小人模块

该模块用于控制小人移动,从而推动箱子到目的地。 5)功能控制模块

该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。

推箱子游戏 初始化模块 画图模块 移动箱子模块 第 1 页 共 26 页

移动小人模块 功能控制模块

图(1) 系统模块图

2、任务执行流程

游戏从第一关开始,按上下左右方向键控制小人移动来推动箱子,可以在游戏中的任何时候按Esc键退出。如果游戏无成功希望,可以按空格键回到当前任务的开始状态;如果成功完成当前关,则进入下一关,如果当前关是最后一关,则显示通关信息,提示

游戏结束。

开始 第一关开始 否 是否继续完成? 按Esc键退出

有无成功 希望? 否 否

是 是否是第四关? 是否成功? 按空格键回到任务开始

否 进入下一关 显示通关信息

图(2) 任务执行流程图

3、小人移动流程

小人移动的方向有4个,move()函数(处理小人移动的函数)对这4个方向移动的处理都一致,只是调用函数时的参数有所不同。首先判断小人移动的方向,然后根据小人所处世的当前状态、下一步状态或者下下一步状态进行适当的处理。

第 2 页 共 26 页

判断移动方向 否 是 下一步状态为w? 否 下一步状态 是 当前状态 否 为0或m? 为m? 输出空字符,调用printMain() 否 是 下一步状态为b? 调用printMain()和printDestination() 是 否 否 下下一步状态为0? 下下一步状态为m? 否 是 是 moveBoxSpacetoSpace() moveBoxSpacetoDes() 是 当前状态 否

下一步状态为i? 为m? 是 否 4函数功能描述 1)putoutChar()

第 3 页 共 26 页

printDestination() 光标移动到下一步处 读取下一键 图(3) 小人移动流程图

函数原型:void putoutChar(int y,int x,char ch,char fc,char bc)

putoutChar()函数在屏幕上的指定位置输出指定的字符。其中,x、y指明输出的位置,ch表示输出的字符,fc表示输出的字符颜色,bc 表示背景色。

2)printWall()

函数原型:void printWall(int x,int y)

printWall()函数用于画墙壁,传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景画绿色墙,用小方块表示墙(ASCII值为219)。

3)printBox()

函数原型:void printBox(int x,int y)

printBox()函数用于在非目的地画箱子,传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景白色箱子,用ASCII值为10的字符表示箱子。

4)printBoxDes()

函数原型:void printBoxDes(int x,int y)

printBoxDes()函数用于在目的地画箱子,传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景画黄色箱子,仍用ASCII值为10的字符表示箱子。

5)printDestination1()

函数原型: void printDestination1(int x,int y,winer **win,winer **pw) printDestination1()函数与printDestination()函数功能基本相同,都是画目的地函数,但是printDestination1()增加了记录每一个目的地位置的功能。其中x、y指明目的地的位置,每一关的所有目的地位置存放在结构体struct winer中,形成一条链表,**winer返回链表的头,**pw则指向链表的尾部。

6)printMan()

函数原型: void printMan(int x,int y)

printMan()函数用于画小人。X、y指明画的位置。该函数通过软中断来实现,首先设置寄存器AX的高位和低位,设置高位0xa表示在光标位置显示字符;设置低位02(ASCII值),表示输出的字符;然后设置寄存器CX为01,表示重复输出的次数,这里只输出一次;最后产生类型为0x10的中断,表示显示器输出。

7)init()

函数原型: void init()

init()函数用于初始化屏幕。该函数首先用两个for循环初始化屏幕20*20范围内的状态,初始化为0,以后根据实际情况重新赋值;然后设置屏幕输出状态,设置寄存器AX的高位为0,低位为3,表示以80*25的彩色方式显示;最后移动光标到指定的位置输出操作提示信息以及版权信息。

8)move()

函数原型: void moid(int x,int y,char a) Move()函数根据按下的键来处理小人的移动。小人移动的方向有上(“u”)、下(“d”)、左(“l”)、右(“r”)4个,4个方向的处理方式一样。首先判断移动的方向,然后根据小人的当前位置、下一步位置以及下下一步位置所在的状态进行处理。

(1) 若下一步所在位置的状态为墙壁(“w”),则直接退出,不作任何处理。 (2) 若下一步所在位置的状态为目的地(“i”)或者什么都没有(“0”),则: ① 若当前位置的状态为目的地,则在当前位置画目的地(调用printDestination()函数)、在下一步位置画小人(调用printMan()函数)。 ② 若当前位置的状态为非目的地,则输出空格清空当前位置的小人,并在下一步位

第 4 页 共 26 页

置画小人(调用printMan()函数)。 (3) 若下一步所在位置的状态为箱子(“b”),则: ① 如果下下一步位置的状态为“0”,则把箱子从空地移动到空地(调用

moveBoxSpacetoSpace()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestinanion()函数))。

② 如果下下一步位置的状态为目的地,则把箱子从空地移动到目的地(调用

moveBoxSpacetoDes()函数),然后把光标移动到下一步位置(如果当前位置的状态 为目的地,则应先画目的地(调用printDestination()函数))。 ③ 其它情况则直接返回,不作任何处理。

(4) 若下一步所在位置的状态为箱子在目的地(“i”),则: ① 如果下下一步位置的状态为“0”,则把箱子从目的地移动到空地(调用moveBoxDestoSpace()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestination()函数))。

② 如果下下一步位置的状态为目的地,则把箱子从目的地移动到目的地(调用moveBoxDestoDes()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestination()函数))。 ③ 其它情况则直接返回,不作任何处理。 9)reset()

函数原型:void reset(int i)

reset()函数的功能是重置当前关。该函数首先判断当前关是第几关,然后调用init()函数和初始化当前关的函数进行重置。 10)主函数

主函数首先设置寄存器AX的高位和低位,显示器软中断,进行显示状态的设置,初始化

屏幕,初始化第一关,并显示操作提示信息和版权信息。然后根据按下的键(bioskey(0)函数返回按下的键值)进行处理,处理过程由move()函数进行(如果按下Esc键,则退出程序)。对于每一关,如果所有的表示目的地的状态都由“m”变成了“i”,则表示通过该关,可以进入下一关。

三、详细设计

1、程序预处理

程序预处理部分包括加载头文件、定义全局变量和定义数据结构,并对它们进行初始化工作。其中加载头文件的代码如下: #include #include #include #include #include #include 2、初始化模块

该模块主要用于对屏幕和关卡的初始化,初始化关卡时是调用画图模块中画图函数。该模块包括以下几个函数。

① void init(),初始化屏幕的大小、显示方式、显示操作提示信息和版权信息。 ② winer *initStep1(),初始化游戏的第一关。

第 5 页 共 26 页

图(4)推箱子游戏初始状态

③ winer *initStep2(),初始化游戏的第二关。

图(5)推箱子游戏第二关

④ winer *initStep3(),初始化游戏的第三关。

图(6)推箱子游戏第三关

⑤ winer *initStep4(),初始化游戏的第四关。

第 6 页 共 26 页

图(7)推箱子游戏第四关

其中初始化屏幕函数的详细代码如下: void init() {

int i,j;

for(i=0;i<20;i++)

for(j=0;j<20;j++)

/*屏幕20*20范围内状态初始化为0,表示什么都没有*/ status[i][j]=0;

/*设置寄存器AX低位,80*25彩色方式显示*/

_AL=3;

/*设置寄存器AX高位*/ _AH=0;

geninterrupt(0x10);

/*移动光标到指定位置输出屏幕信息*/ gotoxy(41,4);

printf(\ gotoxy(41,6);

printf(\ gotoxy(41,8);

printf(\ gotoxy(41,10);

printf(\ gotoxy(40,12);

printf(\ gotoxy(40,14);

printf(\ gotoxy(18,24);

printf(\ gotoxy(40,4); _CX=01; _AH=0xa;

第 7 页 共 26 页

_AL=24;

geninterrupt(0x10); gotoxy(40,6); _CX=01; _AH=0xa; _AL=25;

geninterrupt(0x10); gotoxy(40,8); _CX=01; _AH=0xa; _AL=27;

geninterrupt(0x10); gotoxy(40,10); _CX=01; _AH=0xa; _AL=26;

geninterrupt(0x10); }

3、画图模块

该模块主要用于画图操作,包括画墙、画箱子、画目的地和画小人等。该模块包括以下几个函数。

① void printWall(int x,int y),用于画墙。

② void printBox(int x,int y),在空白地(非目的地)画箱子。 ③ void printBoxDes(int x,int y),在目的地画箱子。void printDestination(int x,int y),画目的地函数。

④ void printDestination1(int x,int y,winer **win,winer **pw),画目的地函数,并记录每个目的地的位置。

⑤ void printMan(int x,int y),画小人函数。 其中画墙函数的代码如下: void printWall(int x,int y) {

putoutChar(y-1,x-1,219,GREEN,BLACK);/*以黑色为背景画绿色墙,用小方块表示*/

status[x][y]='w'; /*记录状态为墙*/ }

4、移动箱子模块

该模块是实现箱子的移动。根据游戏规则,箱子可以在空地之间、目的地之间、空地和目的地之间来回移动,因此,实现本模块共有以下4个函数。

① void moveBoxSpacetoSpace(int x,int y,char a),把箱子从空地移动到空地。 ② void moveBoxDestoSpace(int x,int y,char a),把箱子从目的地移动到空地。 ③ void moveBoxSpacetoDes(int x,int y,char a),把箱子从空地移动到目的地。 ④ void moveBoxDestoDes(int x,int y,char a),把箱子从目的地移动到目的地。 其中从空地移动箱子到空地函数的详细代码如下: void moveBoxSpacetoSpace(int x,int y,char a)

第 8 页 共 26 页

{

switch(a)

{

case 'u':/*如果按向上键*/ status[x-1][y]=0;/*重设((x-1),y)位置的状态为0*/ printf(\清空(x,y)处原有的小人*/ printBox(x-2,y);/*在((x-2),y)处重新画箱子*/ printMan(x-1,y); /*在((x-1),y)处重新画小人*/ status[x-2][y]='b';/*重设((x-2),y)位置的状态为箱子*/ break;

case 'd':/*如果按向下键*/ status[x+1][y]=0; printf(\ printBox(x+2,y); printMan(x+1,y); status[x+2][y]='b';

break;

case 'l':/*如果按向左键*/ status[x][y-1]=0; printf(\ printBox(x,y-2); printMan(x,y-1); status[x][y-2]='b';

break;

case 'r':/*如果按向右键*/ status[x][y+1]=0; printf(\ printBox(x,y+2); printMan(x,y+1); status[x][y+2]='b'; break; default: break; } }

5、移动小人模块

移动小人模块是本程序的核心模块,仅由move()函数来实现。Move()函数控制小人的移动,并调用画图模块、移动箱子模块中的函数来实现箱子的重画、移动等操作。其操作流程可参见图(三)。部分代码如下: void move(int x,int y,char a) {

switch(a)

{

case 'u':

第 9 页 共 26 页

if(!judge(x-1,y))/*如果(x-1,y)即小人的下一步状态为墙*/ {

gotoxy(y,x); /*则跳转到(y,x),并跳出循环*/ break;

}

else

if(judge(x-1,y)==1||judge(x-1,y)==3)

{ /*如果小人的下一步状态为目的地或者什么都没有*/ if(judge(x,y)==3) /*如果当前状态为目的地*/ {

printDestination(x,y);/*画目的地*/

printMan(x-1,y); /*在新位置重新画小人*/ break; }

else /*如果下一步状态为0*/ {

printf(\/*输出空字符,覆盖当前状态的小人*/ printMan(x-1,y); /*在下一步重新画小人*/ break; }

}

else if(judge(x-1,y)==2) /*如果下一步状态是箱子*/

{

if(judge(x-2,y)==1) /*如果下下一步为空*/ {

moveBoxSpacetoSpace(x,y,'u'); /*则将箱子从空地向上移动到空地*/ if(judge(x,y)==3) /*如果当前状态为目的地*/ printDestination(x,y); /*画目的地*/ gotoxy(y,x-1); }

else if(judge(x-2,y)==3) /*如果下下一步为目的地*/ {

moveBoxSpacetoDes(x,y,'u'); /*则将箱子从空地向上移动到目的地*/ if(judge(x,y)==3)

printDestination(x,y); gotoxy(y,x-1); } else

gotoxy(y,x); break;

}

6、功能控制模块

功能控制模块包括屏幕输出功能、关卡重置功能和坐标位置状态的判断功能。该模块包括以下几个函数。

第 10 页 共 26 页

① void putoutChar(int y,int x,char fc,char bc),在屏幕上指定的位置输出指定的字符。

② int judge(int x,int y),判断位置(x,y)处的状态,状态值可参见“数据结构设计”部分。

③ void reset (int i),重置关卡。

其中在屏幕上的指定位置输出指定的字符函数的代码如下: void putoutChar(int y,int x,char ch,char fc,char bc) {

/*屏幕输出字符*/

printScreen[(x*160)+(y<<1)+0]=ch; /*指定字符颜色fc,背景色bc*/

printScreen[(x*160)+(y<<1)+1]=(bc*16)+fc; }

7、主函数

主函数实现整个程序的控制,其游戏操作流程可参见图(二)。详细代码如下: void main() {

int key; /*记录按下的键*/

int x,y;

int s;/*记录未被推到目的地的箱子个数*/ int i=0; /*记录已经过了几关*/ winer *win,*pw;

_AL=3;/*设置寄存器AX低位*/ _AH=0; /*设置寄存器AX高位*/ geninterrupt(0x10); init();

win=initStep1();

do{

_AH=3; /*设置AH,读取光标位置*/ geninterrupt(0x10);

x=_DH+1;/*读取光标所在的行,加1*/ y=_DL+1; /*读取光标所在的列,加1*/

while(bioskey(1)==0);/*bioskey(1)返回0,直到有键按下*/ key=bioskey(0); /*返回按下的键*/ switch(key)

{

case 0x4800:/*如果按下向上键*/ move(x,y,'u'); break;

case 0x5000:/*如果按下向下键*/ move(x,y,'d');break;

case 0x4b00:/*如果按下向左键*/ move(x,y,'l');break;

case 0x4d00:/*如果按下向右键*/ move(x,y,'r');break;

第 11 页 共 26 页

case 0x3920:/*如果按下空格键*/ reset(i);break; default:break; } s=0;

pw=win;

while(pw) /*如果指针非空*/

{

if(status[pw->x][pw->y]=='m')/*如果目的地的状态为m,不是i,表示还有箱子未被推到目的地,该关还未完成*/

s++; /*未被推到目的地的箱子数*/ pw=pw->p;/*判断下一个目的地的状态*/ }/*该关完成*/ if(s==0)

{

free(win); /*释放分配的空间*/ gotoxy(15,20);

printf(\ getch(); i++;

switch(i) {

case 1:/*进入第二关*/ init();

win=initStep2(); break;

case 2:/*进入第三关*/ init();

win=initStep3(); break;

case 3:/*进入第四关*/ init();

win=initStep4(); break;

case 4:/*完成所有关*/ gotoxy(15,21);

printf(\ gotoxy(15,22);

printf(\ key=0x011b;/*设置键为Esc以便退出程序*/ getch();/*按任意键结束*/ break; default: break;

第 12 页 共 26 页

}

}

}while(key!=0x011b); _AL=3; _AH=0;

geninterrupt(0x10); }

四、参考文献

【1】《C程序设计(第三版)》,谭浩强编,清华大学出版社; 【2】《Turbo C 2.0实用大全》,常玉龙等编写,北京航空航天大学出版社; 【3】《C语言趣味程序百例精解》,陈朔鹰 陈英主编,北京理工大学出版社; 【4】《C游戏编程从入门到精通》,浦滨著, 北京希望电子出版社; 【5】《C函数实用手册》,张曜 郭立山 吴天著, 冶金工业出版社;

五、课程设计总结

推箱子游戏是目前比较流行的游戏之一,很多操作系统或者流行软件都会带有这种游戏。它既能锻炼思维的严密性,又有很多乐趣。我个人也比较喜欢玩这个游戏,因此,我就借这个机会将这个推箱子游戏用C语言实现了出来,当然,我也借鉴了前人的一些技巧经验。由于时间仓促和本人水平有限,此游戏的制作显得有些粗糙,希望老师能够谅解,我以后将会再接再厉。

六、软件使用说明书

本游戏一共4关,由易到难,每一关都有初化、按键处理、重置及退出功能。

① 初始化包括屏幕初始化和每一关卡的初始化,屏幕被初始化宽80像素,高25像素。

② 按键处理包括移动小人和移动箱子,通过移动上下左右键来控制小人的移动,从而推动箱子,以把箱子推到指定的目的地为过关。

③ 每一关都可以重置,按空格键可以重置当前关。 ④ 按Esc键可以在任何时候退出游戏。

七、附录

#include #include #include #include #include #include typedef struct winer {

int x,y;

struct winer *p; }winer;

char status [20][20];

第 13 页 共 26 页

char far *printScreen=(char far* )0xB8000000; void putoutChar(int y,int x,char ch,char fc,char bc); void printWall(int x, int y); void printBox(int x, int y); void printBoxDes(int x, int y); void printDestination(int x, int y);

void printDestination1(int x,int y,winer **win,winer **pw); void printMan(int x, int y); void init();

winer *initStep1(); winer *initStep2(); winer *initStep3(); winer *initStep4();

void moveBoxSpacetoSpace(int x ,int y, char a); void moveBoxDestoSpace(int x ,int y, char a) ; void moveBoxSpacetoDes(int x, int y, char a); void moveBoxDestoDes(int x, int y, char a); int judge(int x, int y);

void move(int x, int y, char a); void reset(int i);

void putoutChar(int y,int x,char ch,char fc,char bc) {

printScreen[(x*160)+(y<<1)+0]=ch;

printScreen[(x*160)+(y<<1)+1]=(bc*16)+fc; } void printWall(int x,int y) {

putoutChar(y-1,x-1,219,GREEN,BLACK); status[x][y]='w'; } void printBox(int x,int y) {

putoutChar(y-1,x-1,10,WHITE,BLACK); status[x][y]='b'; }

void printDestination1(int x,int y,winer **win,winer **pw) {

winer *qw;

putoutChar(y-1,x-1,003,YELLOW,BLACK); status[x][y]='m'; if(*win==NULL) {

*win=*pw=qw=(winer* )malloc(sizeof(winer)); (*pw)->x=x; (*pw)->y=y; (*pw)->p=NULL;} else {

qw=(winer* )malloc(sizeof(winer));

第 14 页 共 26 页

qw->x=x; qw->y=y;(*pw)->p=qw; (*pw)=qw;qw->p=NULL; } }

void printDestination(int x,int y) {

putoutChar(y-1,x-1,003,YELLOW,BLACK); status[x][y]='m'; } void printMan(int x,int y) {

gotoxy(y,x); _AL=02; _CX=01; _AH=0xa;

geninterrupt(0x10); }

void printBoxDes(int x,int y) {

putoutChar(y-1,x-1,10,YELLOW,BLACK); status[x][y]='i'; }

void init() {

int i,j;

for(i=0;i<20;i++) for(j=0;j<20;j++) status[i][j]=0; _AL=3; _AH=0; geninterrupt(0x10);

gotoxy(41,4); printf(\ gotoxy(41,6); printf(\ gotoxy(41,8); printf(\ gotoxy(41,10); printf(\ gotoxy(40,12); printf(\ gotoxy(40,14); printf(\

gotoxy(40,4);

_CX=01;_AH=0xa;_AL=24; geninterrupt(0x10); gotoxy(40,6);

_CX=01;_AH=0xa;_AL=25; geninterrupt(0x10);

gotoxy(40,8);_CX=01;_AH=0xa;_AL=27; geninterrupt(0x10);

gotoxy(40,10);_CX=01;_AH=0xa;_AL=26; geninterrupt(0x10);

第 15 页 共 26 页

}

winer *initStep1() {

int x; int y;

winer *win=NULL;winer *pw; gotoxy(25,2);printf(\

for(x=1,y=5;y<=9;y++) 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++) 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++)

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);printBox(3+4,7+10);printBox(4+4,7+10); printDestination1(4+4,2+10,&win,&pw); printDestination1(5+4,2+10,&win,&pw); printDestination1(6+4,2+10,&win,&pw); printMan(2+4,8+10); return win; }

winer *initStep2() {

int x;int y;

winer *win=NULL; winer *pw; gotoxy(25,2);printf(\

for(x=1,y=4;y<=7;y++) printWall(x+4,y+10); for(x=2,y=2;y<=4;y++) printWall(x+4,y+10); for(x=2,y=7;x<=4;x++) printWall(x+4,y+10); for(x=4,y=1;x<=8;x++) printWall(x+4,y+10); for(x=8,y=2;y<=8;y++) printWall(x+4,y+10); for(x=4,y=8;x<=8;x++) printWall(x+4,y+10); for(x=4,y=6;x<=5;x++) printWall(x+4,y+10); for(x=3,y=2;x<=4;x++) printWall(x+4,y+10); for(x=4,y=4;x<=5;x++) printWall(x+4,y+10);

printWall(6+4,3+10); printBox(3+4,5+10);printBox(6+4,6+10);printBox(7+4,3+10); printDestination1(5+4,7+10,&win,&pw); printDestination1(6+4,7+10,&win,&pw); printDestination1(7+4,7+10,&win,&pw); printMan(2+4,6+10); return win;

第 16 页 共 26 页

}

winer *initStep3() {

int x;int y;

winer *win=NULL;winer *pw; gotoxy(25,2);printf(\

for(x=1,y=2;y<=8;y++) printWall(x+4,y+10); for(x=2,y=2;x<=4;x++)printWall(x+4,y+10); for(x=4,y=1;y<=3;y++)printWall(x+4,y+10); for(x=5,y=1;x<=8;x++) printWall(x+4,y+10); for(x=8,y=2;y<=5;y++) printWall(x+4,y+10); for(x=5,y=5;x<=7;x++)printWall(x+4,y+10); for(x=7,y=6;y<=9;y++) printWall(x+4,y+10); for(x=3,y=9;x<=6;x++) printWall(x+4,y+10); for(x=3,y=6;y<=8;y++) printWall(x+4,y+10); printWall(2+4,8+10); printWall(5+4,7+10);

printBox(6+4,3+10); printBox(4+4,4+10);printBox(5+4,6+10); printDestination1(2+4,5+10,&win,&pw); printDestination1(2+4,6+10,&win,&pw); printDestination1(2+4,7+10,&win,&pw); printMan(2+4,4+10); return win; }

winer *initStep4() {

int x;int y;

winer *win=NULL;winer *pw;

gotoxy(23,2);printf(\

for(x=1,y=1;y<=6;y++) printWall(x+4,y+10); for(x=2,y=7;y<=8;y++) printWall(x+4,y+10); for(x=2,y=1;x<=7;x++) printWall(x+4,y+10); for(x=7,y=2;y<=4;y++) printWall(x+4,y+10); for(x=6,y=4;y<=9;y++) printWall(x+4,y+10); for(x=3,y=9;x<=5;x++) printWall(x+4,y+10);

for(x=3,y=3;y<=4;y++) printWall(x+4,y+10);printWall(3+4,8+10); printBox(3+4,5+10); printBox(4+4,4+10);printBox(4+4,6+10); printBox(5+4,5+10);printBox(5+4,3+10); printDestination1(3+4,7+10,&win,&pw); printDestination1(4+4,7+10,&win,&pw); printDestination1(5+4,7+10,&win,&pw); printDestination1(4+4,8+10,&win,&pw); printDestination1(5+4,8+10,&win,&pw); printMan(2+4,2+10); return win;

第 17 页 共 26 页

}

void moveBoxSpacetoSpace(int x,int y,char a) {

switch(a) {

case 'u':

status[x-1][y]=0;printf(\ case 'd':

status[x+1][y]=0; printf(\ case 'l':

status[x][y-1]=0;printf(\ case 'r':

status[x][y+1]=0;printf(\ default:break; } }

void moveBoxDestoSpace(int x,int y,char a) {

switch(a) {

case 'u':

status[x-1][y]='m';printf(\ case 'd':

status[x+1][y]='m';printf(\ case 'l':

status[x][y-1]='m';printf(\ case 'r':

status[x][y+1]='m';printf(\ default:break; } }

void moveBoxSpacetoDes(int x,int y,char a) {

switch(a) {

case 'u':

status[x-1][y]=0;printf(\ case 'd':

status[x+1][y]=0;printf(\ case 'l':

status[x][y-1]=0;printf(\ case 'r':

status[x][y+1]=0;printf(\ default:break;

第 18 页 共 26 页

} }

void moveBoxDestoDes(int x,int y,char a) {

switch(a) {

case 'u':

status[x-1][y]='m';printf(\ case 'd':

status[x+1][y]='m';printf(\ case 'l':

status[x][y-1]='m';printf(\ case 'r':

status[x][y+1]='m';printf(\ default:break; } }

int judge(int x,int y) {

int i;

switch(status[x][y]) {

case 0: i=1;break; case 'w': i=0;break; case 'b': i=2;break; case 'i': i=4;break; case 'm': i=3;break; default: break; }

return i; }

void move(int x,int y,char a) {

switch(a) {

case 'u':

if(!judge(x-1,y)) {gotoxy(y,x);break;}

else if(judge(x-1,y)==1||judge(x-1,y)==3) {

if(judge(x,y)==3)

{printDestination(x,y);printMan(x-1,y);break;} else

{printf(\

第 19 页 共 26 页

}

else if(judge(x-1,y)==2) {

if(judge(x-2,y)==1) {

moveBoxSpacetoSpace(x,y,'u'); if(judge(x,y)==3)

printDestination(x,y); gotoxy(y,x-1); }

else if(judge(x-2,y)==3) {

moveBoxSpacetoDes(x,y,'u'); if(judge(x,y)==3)

printDestination(x,y); gotoxy(y,x-1); } else

gotoxy(y,x); break; }

else if(judge(x-1,y)==4) {

if(judge(x-2,y)==1) {

moveBoxDestoSpace(x,y,'u'); if(judge(x,y)==3)

printDestination(x,y); gotoxy(y,x-1); }

else if(judge(x-2,y)==3) {

moveBoxDestoDes(x,y,'u'); if(judge(x,y)==3)

printDestination(x,y); gotoxy(y,x-1); } else

gotoxy(y,x); break; }

case 'd':

if(!judge(x+1,y)) {gotoxy(y,x);break;}

第 20 页 共 26 页

本文来源:https://www.bwwdw.com/article/64mg.html

Top