哥们,能把推箱子的程序设计发给我没,感谢啊。。。
发布网友
发布时间:2022-05-02 19:23
我来回答
共2个回答
热心网友
时间:2022-05-19 05:36
推箱子游戏是一款很有趣味的游戏,其开发过程有一定的技巧和方法,其中涉及到软中断、二维数组、键盘操作以及图形化函数等方面的知识。本游戏的开发者需要基本掌握显示器中断寄存器的设置。二维数组及结构体的定义、键盘上键值的获取、图形方式下光标的显示各定位,以及部分图形函数的使用。
具体架构我不说了,直接上代码:
1、程序预处理
程序预处理部分包括加载头文件、定义全局变量和定义数据结构,并对它们进行初始化工作。其中加载头文件的代码如下:
#include <dos.h>
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <bios.h>
#include <alloc.h>
2、初始化模块
该模块主要用于对屏幕和关卡的初始化,初始化关卡时是调用画图模块中画图函数。该模块包括以下几个函数。
(1) void init(),初始化屏幕的大小、显示方式、显示操作提示信息和版权信息。
(2) winer *initStep1(),初始化游戏的第一关。
(3) winer *initStep2(),初始化游戏的第二关。
(4) winer *initStep3(),初始化游戏的第三关。
(5) winer *initStep4(),初始化游戏的第四关。
其中初始化屏幕函数的详细代码如下:
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(" --------- up");
gotoxy(41,6);
printf(" --------- down");
gotoxy(41,8);
printf(" --------- left");
gotoxy(41,10);
printf(" --------- right");
gotoxy(40,12);
printf("Space ----- reset");
gotoxy(40,14);
printf("Esc ------- quit");
gotoxy(18,24);
printf("CopyRight: 2008 LuoFuxing");
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);
}
3、 画图模块
该模块主要用于画图操作,包括画墙、画箱子、画目的地和画小人等。该模块包括以下几个函数。
(1) void printWall(int x,int y),用于画墙。
(2) void printBox(int x,int y),在空白地(非目的地)画箱子。
(3) void printBoxDes(int x,int y),在目的地画箱子。
(4) void printDestination(int x,int y),画目的地函数。
(5) void printDestination1(int x,int y,winer **win,winer **pw),画目的地函数,并记录每个目的地的位置。
(6) 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个函数。
(1) void moveBoxSpacetoSpace(int x,int y,char a),把箱子从空地移动到空地。
(2) void moveBoxDestoSpace(int x,int y,char a),把箱子从目的地移动到空地。
(3) void moveBoxSpacetoDes(int x,int y,char a),把箱子从空地移动到目的地。
(4) void moveBoxDestoDes(int x,int y,char a),把箱子从目的地移动到目的地。
其中从空地移动箱子到空地函数的详细代码如下:
void moveBoxSpacetoSpace(int x,int y,char a)
{
switch(a)
{
/*如果按向上键*/
case 'u':
/*重设((x-1),y)位置的状态为0*/
status[x-1][y]=0;
/*清空(x,y)处原有的小人*/
printf(" ");
/*在((x-2),y)处重新画箱子*/
printBox(x-2,y);
/*在((x-1),y)处重新画小人*/
printMan(x-1,y);
/*重设((x-2),y)位置的状态为箱子*/
status[x-2][y]='b';
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':
/*如果(x-1,y)即小人的下一步状态为墙*/
if(!judge(x-1,y))
{
/*则跳转到(y,x),并跳出循环*/
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;
}
/*如果下一步状态为0*/
else
{
/*输出空字符,覆盖当前状态的小人*/
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、 功能控制模块
功能控制模块包括屏幕输出功能、关卡重置功能和坐标位置状态的判断功能。该模块包括以下几个函数。
(1) void putoutChar(int y,int x,char fc,char bc),在屏幕上指定的位置输出指定的字符。
(2) int judge(int x,int y),判断位置(x,y)处的状态,状态值可参见“数据结构设计”部分。
(3) 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;
int y;
/*记录未被推到目的地的箱子个数*/
int s;
/*记录已经过了几关*/
int i=0;
winer *win;
winer *pw;
/*设置寄存器AX低位*/
_AL=3;
/*设置寄存器AX高位*/
_AH=0;
geninterrupt(0x10);
init();
win=initStep1();
do{
/*设置AH,读取光标位置*/
_AH=3;
geninterrupt(0x10);
/*读取光标所在的行,加1*/
x=_DH+1;
/*读取光标所在的列,加1*/
y=_DL+1;
/*bioskey(1)返回0,直到有键按下*/
while(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;
/*如果按下空格键*/
case 0x3920:
reset(i);
break;
default:
break;
}
s=0;
pw=win;
/*如果指针非空*/
while(pw)
{
/*如果目的地的状态为m,不是i,表示还有箱子
未被推到目的地,该关还未完成*/
if(status[pw->x][pw->y]=='m')
/*未被推到目的地的箱子数*/
s++;
/*判断下一个目的地的状态*/
pw=pw->p;
}
/*该关完成*/
if(s==0)
{
/*释放分配的空间*/
free(win);
gotoxy(15,20);
printf("congratulate! You have done this step!");
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("Congratulation! \n");
gotoxy(15,22);
printf("You have done all the steps, You are very clever!");
/*设置键为Esc以便退出程序*/
key=0x011b;
/*按任意键结束*/
getch();
break;
default:
break;
}
}
}while(key!=0x011b);
_AL=3;
_AH=0;
geninterrupt(0x10);
}