毕业论文基于C语言的推箱子游戏设计34703.doc

上传人:文库蛋蛋多 文档编号:2385407 上传时间:2023-02-17 格式:DOC 页数:37 大小:332KB
返回 下载 相关 举报
毕业论文基于C语言的推箱子游戏设计34703.doc_第1页
第1页 / 共37页
毕业论文基于C语言的推箱子游戏设计34703.doc_第2页
第2页 / 共37页
毕业论文基于C语言的推箱子游戏设计34703.doc_第3页
第3页 / 共37页
毕业论文基于C语言的推箱子游戏设计34703.doc_第4页
第4页 / 共37页
毕业论文基于C语言的推箱子游戏设计34703.doc_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《毕业论文基于C语言的推箱子游戏设计34703.doc》由会员分享,可在线阅读,更多相关《毕业论文基于C语言的推箱子游戏设计34703.doc(37页珍藏版)》请在三一办公上搜索。

1、广东工程职业技术学院毕业论文 基于C语言的推箱子游戏设计 Design of the push box Based on Combined Language 作者姓名: 陈德坤 莫植忠 学科专业: 应用电子技术 学院(系部): 机电工程系 指导教师: 余金栋 广东工程职业技术学院2010年1月摘 要近年来随着科技的飞速发展,C语言的应用正在不断深入。C语言目前是国际上比较流行的计算机高级编程语言之一,因其简洁、使用方便且具备强大的功能而受到编程人员的普通青睐。它既适合作为系统描述语言,也可用来编写系统软件,还可以用来编写应用软件和设计游戏等。本文着重分析用C语言实现一个简单的推箱子游戏,旨在介

2、绍推箱子游戏的实现方法,并逐步介绍C语言图形编程的方法和技巧。在C语言编写软件WIN-TC上,涉及软中断、二维数组、键盘操作及图形化函数等方面,显示器中断寄存器的设置、二维数组及结构体的定义、键盘上键值的获取、图形方式下光标的显示和定位,以及部分图形函数的使用实现了一个完整的推箱子游戏界面,界面清晰可见。关键词:C语言;WIN-TC;推箱子AbstractWith the rapid development of science and technology in recent years, C language, applications are continuously in depth.

3、 C language is now more popular internationally high-level computer programming language, one of its simplicity, easy to use and with powerful features favored by ordinary programmers. It is suitable as a system description language, can also be used to write system software, application software ca

4、n also be used to write and design games.This article focuses on analysis using C language to implement a simple Sokoban game aimed at introducing the Sokoban game implementation method, and gradually introduced the C language graphical programming methods and techniques. In the C language software,

5、 WIN-TC, the related soft interrupt, two-dimensional array, keyboard operation and graphical functions, etc., the display interrupt register settings, two-dimensional array, and structure of the definition of access keys on the keyboard, graphical mode, the cursor display and positioning, as well as

6、 some graphics functions used to achieve a complete Sokoban game interface, the interface clearly visible.Key words: C language; WIN-TC; PushBox目录摘要IAbstractII第一章 绪论11.1设计的功能11.2游戏的编程思想11.2.1 确定软件的功能11.2.2 定义软件的核心数据结构11.2.3 对整个软件进行功能模块划分1 1.2.4 整个推箱子游戏的功能介绍.2第二章 游戏的总体设计22.1功能模块设计2 2.1.1 系统模块图.2 2.1.

7、2 任务执行流程图.3 2.1.3 小人移动流程图.32.2数据结构设计3 2.2.1 设置全局变量.3 2.2.2 定义结构体.42.3函数功能描述4第三章 推箱子游戏的程序实现73.1源码分析73.1.1程序预处理73.1.2初始化模块.83.1.3画图模块123.1.4移动箱子模块.14 3.1.5 移动小人模块18 3.1.6 功能控制模块25 3.1.7 主函数253.2运行结果分析.28 3.2.1进入游戏选关界面283.2.2游戏第一关.283.2.3.游戏第二、三关.293.2.4 游戏结束30第四章 总结.32参考文献.33第一章 绪论1.1设计的功能C语言是我们数计系都要学

8、的一门基础学科。那么,为什么不用C语言编一个游戏来玩呢?学习程序设计,并不是一件艰苦、枯燥的事情,它能象电脑游戏一样充满好奇、富有乐趣,C语言对于电脑程序设计来说是一种非常重要的语言。设计者只要完成对推箱子游戏的功能描述,就可以利用计算机和工具,进行设计处理,最终得到理想的设计结果。本设计是基于C语言编程技术,用数据结构实现的,集科学性,先进性,创新性,实用性于一体,并在电脑屏幕上实现游戏界面的功能,包括选择游戏关卡和游戏挑战失败可按空格键重新开始。1.2游戏的变成思想1.2.1 确定软件的功能让玩家通过按上下左右键推箱子,当箱子们都推到了目的地后出现过关信息,并显示下一关。推错了玩家还按空格

9、键从新玩过这关。直到过完全部关卡。1.2.2 定义软件的核心数据结构我们定义一个二维数组ghouse来记录屏幕上各点的状态。char ghouse2020; 其中:0表示什么都没有,b表示箱子,w表示墙壁,m表示目的地,i表示箱子在目的地。1.2.3 对整个软件进行功能模块的划分1.初始化:在屏幕上输出欢迎信息,把ghouse数组的元素初始化为0。并根据各关的要求在屏幕上输出墙、箱子、目的地和人。并用ghouse 数组记录各点的状态。2.进入游戏循环:这个游戏主循环是等待按键。当接受到上下左右键时执行相关操作:接受ESC键时退出游戏;接受空格键时返回本关开头;接受无效按键时做忽略处理。重点介绍

10、按上下左右键时如何执行相关操作。3.判断是否过关:用一个链表win由每关的初始化函数传给main函数。Win链表主要记录屏幕上的哪些点是目的地,并记录目的地的位置。Main函数每执行一次操作后就判断屏幕上的目的地是不是都有箱子了。1.2.4 整个推箱子游戏功能介绍本游戏一共4关,由易到难,每一关都有初化、按键处理、重置及退出功能。(1)初始化包括屏幕初始化和每一关卡的初始化,屏幕被初始化宽80像素,高25像素。(2)按键处理包括移动小人和移动箱子,通过移动上下左右键来控制小人的移动,从而推 动箱子,以把箱子推到指定的目的地为过关。(3)每一关都可以重置,按空格键可以重置当前关。(4)按Esc键

11、可以在任何时候退出游戏。第二章 游戏的整体设计2.1功能模块设计2.1.1 系统模块图本程序包括5个模块,分别是初始化模块、画图模块、移动箱子模块、移动小人模块和功能控制模块,如图(一)所示。各个模块的功能描述如下:(1)初始化模块。 该模块包括屏幕初始化和游戏第一关的初始化。屏幕初始化用于输出欢迎信息和操作提示,游戏每一关的初始化是构建每一关的关卡。(2)画图模块。该模块主要是被其它模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。(3)移动箱子模块。该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。(4)移动小人模块。该模块用于控制小人移动,从而推

12、动箱子到目的地。(5)功能控制模块。该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。推箱子游戏初始化模块画图模块移动箱子模块移动小人模块功能控制模块2.1.2 任务执行流程图游戏从第一关开始,按上下左右方向键控制小人移动来推动箱子,可以在游戏中的任何时候按Esc键退出。如果游戏无成功希望,可以按空格键回到当前任务的开始状态;如果成功完成当前关,则进入下一关,如果当前关是最后一关,则显示通关信息,提示游戏结束。2.1.3小人移动流程图小人移动的方向有4个,move()函数(处理小人移动的函数)对这4个方向移动的处理都一致,只是调用函数时的参数有所不同。首先判断小

13、人移动的方向,然后根据小人所处世的当前状态、下一步状态或者下下一步状态进行适当的处理。2.2数据结构设计2.2.1设置全局变量定义二维数组char status2020,用于记录屏幕一各点的状态。其中,“0”表示什么都没有,“b”表示箱子,“w”表示目的地,“i”表示箱子在目的地。首先将屏幕20*20范围内的状态初始化为0,然后根据具体情况,在画箱子时,将箱子所在点的状态改为“b”;在画墙壁时,将墙壁所在点的状态改为“w”;在画目的地时,将目的地所在点的状态改为“m”;当箱子被推到目的地时,箱子所在点的状态改为“i”,如果每一关中所有目的地的状态都为“i”,则说明该关已完成。定义全局变量,ch

14、ar far *printScreen=(char far*)0xB8000000,用于在屏幕上输出字符。彩色显示器的字符缓冲区首地址为0xB8000000,每一个字符占2个字节(第一个字节为ASCII值,第二个字节为颜色值),字符模式下屏幕宽80像素,高25像素,一屏可以写80*25个字符。2.2.2定义结构体typedef struct winerint x;int y;struct winer *p;winer;定义结构体struct winer用于判断每一关是否已完成。其中x用于存放目的地的横坐标,y用于存放目的地的纵坐标。如果所有表示目的地坐标对应的状态都为“i”,即箱子在目的地,则

15、表示已经过关,可以进入下一关。该结构体的初始化在每一关的初始化时进行。2.3函数功能描述1、 putoutChar()函数原型: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()进行输出,以黑色为背景画绿

16、色墙,用小方块表示墙(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、 prin

17、tDestination()函数原型:void printDestination(int x,int y)printDestination()函数用于画目的地,传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景画黄色目的地,用心型表示(ASCII值为003)。6、 printDestination1()函数原型: void printDestination1(int x,int y,winer *win,winer *pw),printDestination1()函数与printDestination()函数功能基本相同,都是画目的地函数,但是printDesti

18、nation1()增加了记录每一个目的地位置的功能。其中x、y指明目的地的位置,每一关的所有目的地位置存放在结构体struct winer中,形成一条链表,*winer返回链表的头,*pw则指向链表的尾部。7、 printMan()函数原型: void printMan(int x,int y),printMan()函数用于画小人。X、y指明画的位置。该函数通过软中断来实现,首先设置寄存器AX的高位和低位,设置高位0xa表示在光标位置显示字符;设置低位02(ASCII值),表示输出的字符;然后设置寄存器CX为01,表示重复输出的次数,这里只输出一次;最后产生类型为0x10的中断,表示显示器输出

19、。8、 init()函数原型: void init(),init()函数用于初始化屏幕。该函数首先用两个for循环初始化屏幕20*20范围内的状态,初始化为0,以后根据实际情况重新赋值;然后设置屏幕输出状态,设置寄存器AX的高位为0,低位为3,表示以80*25的彩色方式显示;最后移动光标到指定的位置输出操作提示信息以及版权信息。9、 初始化游戏函数原型:winer *initStep1()、winer *initStep2()、winer *initStep3()、winer *initStep4(),这几个函数分别初始化游戏的第一关到第四关。这些函数的功能和实现步骤相似。首先根据需要在指定的

20、位置画墙壁和画箱子,在这里可以设置游戏的难度,初始化的墙壁越复杂,箱子越多,则游戏就越难。游戏的第一关至第四关难度依次增加。然后分别调用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,in

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

22、置状态为“i”,表明箱子在目的地上。11、 judge()函数原型: int judge(int x,int y),judge()根据结构体structxy中存的值来判断该点的状态。12、 move()函数原型: void moid(int x,int y,char a),Move()函数根据按下的键来处理小人的移动。小人移动的方向有上(“u”)、下(“d”)、左(“l”)、右(“r”)4个,4个方向的处理方式一样。首先判断移动的方向,然后根据小人的当前位置、下一步位置以及下下一步位置所在的状态进行处理。(1) 若下一步所在位置的状态为墙壁(“w”),则直接退出,不作任何处理。(2) 若下一步

23、所在位置的状态为目的地(“i”)或者什么都没有(“0”),则: 若当前位置的状态为目的地,则在当前位置画目的地(调用printDestination()函数)、在下一步位置画小人(调用printMan()函数)。 若当前位置的状态为非目的地,则输出空格清空当前位置的小人,并在下一步位置画小人(调用printMan()函数)。(3) 若下一步所在位置的状态为箱子(“b”),则: 如果下下一步位置的状态为“0”,则把箱子从空地移动到空地(调用moveBoxSpacetoSpace()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestinanion

24、()函数)。 如果下下一步位置的状态为目的地,则把箱子从空地移动到目的地(调用moveBoxSpacetoDes()函数),然后把光标移动到下一步位置(如果当前位置的状态 为目的地,则应先画目的地(调用printDestination()函数)。 其它情况则直接返回,不作任何处理。(4) 若下一步所在位置的状态为箱子在目的地(“i”),则: 如果下下一步位置的状态为“0”,则把箱子从目的地移动到空地(调用moveBoxDestoSpace()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestination()函数)。 如果下下一步位置的状态为

25、目的地,则把箱子从目的地移动到目的地(调用moveBoxDestoDes()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestination()函数)。 其它情况则直接返回,不作任何处理。13、 reset()函数原型:void reset(int i)reset()函数的功能是重置当前关。该函数首先判断当前关是第几关,然后调用init()函数和初始化当前关的函数进行重置。14、 主函数主函数首先设置寄存器AX的高位和低位,显示器软中断,进行显示状态的设置,初始化屏幕,初始化第一关,并显示操作提示信息和版权信息。然后根据按下的键(bioske

26、y(0)函数返回按下的键值)进行处理,处理过程由move()函数进行(如果按下Esc键,则退出程序)。对于每一关,如果所有的表示目的地的状态都由“m”变成了“i”,则表示通过该关,可以进入下一关。第三章 推箱子游戏的程序实现3.1源码分析3.1.1程序预处理程序预处理部分包括加载头文件、定义全局变量和定义数据结构,并对它们进行初始化工作。其中加载头文件的代码如下:/*加载头文件*/#include #include #include #include #include #include /*定义结构体,判断是否胜利*/typedef struct winer /*目的地的xy坐标*/ int

27、x,y; struct winer *p; winer;/*定义全局变量*/*记录屏幕上各点的状态*/char status 2020;/*彩色显示器的字符缓冲区首地址为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

28、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) ;voi

29、d 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) w

30、iner *initStep2(),初始化游戏的第二关。(4) winer *initStep3(),初始化游戏的第三关。(5) winer *initStep4(),初始化游戏的第四关。其中初始化屏幕函数的详细代码如下:/*初始化屏幕函数*/void init() int i,j; for(i=0;i20;i+) for(j=0;j20;j+) /*屏幕20*20范围内状态初始化为0,表示什么都没有*/ statusij=0; /*设置寄存器AX地位,80*25彩色方式显示*/ _AL=3; /*设计寄存器AX高位*/ _AH=0; geninterrupt(0x10); /*移动光标到指定

31、位置输出屏幕信息*/ gotoxy(40,4); printf(Welcome to the box world!); gotoxy(40,6); printf(You can use up, down, left,); gotoxy(40,8); printf(right key to control it, or); gotoxy(40,10); printf(you can press Esc to quit it.); gotoxy(40,12); printf(Press space to reset the game.); gotoxy(40,14); printf(Wish yo

32、u have a good time !); gotoxy(40,16); printf(Dec , 2009); /*初始化游戏第一关函数*/winer *initStep1() int x; int y; winer *win=NULL; winer *pw; /*在指定位置画墙,构建第一关*/ 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+) printW

33、all(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); /*在指定位置画箱子*/ prin

34、tBox(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 *

35、pw; /*在指定位置画墙,构建第二关*/ 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+

36、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+1

37、0,&win,&pw); /*在指定位置画小人*/ printMan(2+4,6+10); return win; /*初始化游戏第三关函数*/winer *initStep3() int x; int y; winer *win=NULL; winer *pw; /*在指定位置画墙,构建第三关*/ 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+) printW

38、all(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); print

39、Box(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; for(x=1,y=1;y=

40、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); /*在指定位

41、置画箱子*/ 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,

42、&win,&pw); /*在指定位置画小人*/ printMan(2+4,2+10); return win;3.1.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) v

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号