基于C语言推箱子游戏设计毕业论文 下载本文

广东工程职业技术学院毕业论文

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

7、 printMan()

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

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

9、 初始化游戏

函数原型:winer *initStep1()、winer *initStep2()、winer *initStep3()、winer *initStep4(),这几个函数分别初始化游戏的第一关到第四关。这些函数的功能和实现步骤相似。首先根据需要在指定的位置画墙壁和画箱子,在这里可以设置游戏的难度,初始化的墙壁越复杂,箱子越多,则游戏就越难。游戏的第一关至第四关难度依次增加。然后分别调用printDestination1()和printMan()函数画目的地和小人。函数返回包含各个目的地位置的链表。 10、 移动箱子

函数原型: 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),这几个函数实现的功能分别是人空地移动箱子到空地、从目的地移动箱子到空地、从空地移动箱子到目的地和中从目的地移动箱子到目的地。X、y指明小人当前所处的位置,字符a表示移动的方向,有“u”、“d”、“l”和“r”4个值,分别表示向上、下、左、右移动。这几个函数的实现原理大致相似。对于前面两个函数,首先判断移动的方向,人小人所在的位置沿着移动的方向移动一步画小人,移动两步画箱子(调用printBox()函数),并设置状态为“b”;对于后面两个参数,首先判断移动的方向,从小人所在的位置沿着移动方向移动一步画小人,移动两上在目的地画箱子(调用printBoxDes()函数),并设置状态为“i”,表明箱子在目的地上。 11、 judge()

函数原型: int judge(int x,int y),judge()根据结构体struct[x][y]中存的值来判断该点的状态。 12、 move()

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

5

广东工程职业技术学院毕业论文

下一步位置以及下下一步位置所在的状态进行处理。

(1) 若下一步所在位置的状态为墙壁(“w”),则直接退出,不作任何处理。 (2) 若下一步所在位置的状态为目的地(“i”)或者什么都没有(“0”),

则:

① 若当前位置的状态为目的地,则在当前位置画目的地(调用

printDestination()函数)、在下一步位置画小人(调用printMan()函数)。

② 若当前位置的状态为非目的地,则输出空格清空当前位置的小人,并在

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

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

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

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

③ 其它情况则直接返回,不作任何处理。

(4) 若下一步所在位置的状态为箱子在目的地(“i”),则: ① 如果下下一步位置的状态为“0”,则把箱子从目的地移动到空地(调用

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

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

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

③ 其它情况则直接返回,不作任何处理。 13、 reset()

函数原型:void reset(int i)

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

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

6

广东工程职业技术学院毕业论文

第三章 推箱子游戏的程序实现

3.1源码分析

3.1.1程序预处理

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

/*定义结构体,判断是否胜利*/ typedef struct winer {

/*目的地的xy坐标*/ int x,y;

struct winer *p; }winer;

/*定义全局变量*/

/*记录屏幕上各点的状态*/ char status [20][20];

/*彩色显示器的字符缓冲区首地址为0xB8000000*/ 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);

7

广东工程职业技术学院毕业论文

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); 3.1.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(40,4);

printf(\ gotoxy(40,6);

printf(\ gotoxy(40,8);

printf(\ gotoxy(40,10);

printf(\ gotoxy(40,12);

printf(\ gotoxy(40,14);

printf(\

8