图(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 页