课程设计.docx
- 文档编号:30572842
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:41
- 大小:231.71KB
课程设计.docx
《课程设计.docx》由会员分享,可在线阅读,更多相关《课程设计.docx(41页珍藏版)》请在冰豆网上搜索。
课程设计
计算机学院计算机科学与技术专业
《程序设计综合课程设计》报告
(2010/2011学年第一学期)
学生姓名:
白雪亮
学生班级:
计算机092002
学生学号:
200920010201
指导教师:
崔志华
2011年1月10日
第一章、课程设计的目的和要求
1、课程设计的目的
1.1巩固和加深我们对C++课程的基本知识的理解和掌握;
1.2掌握C++语言编程和程序调试的基本技能;
1.3利用C++进行基本的软件设计;
1.4提高利用C++解决实际问题的能力。
2、课程设计的要求
2.1写出详细的设计说明;
2.2编写程序代码,调整程序使其正确运行;
2.3设计完成后提交课程设计报告和源代码的电子档
第二章、课程设计的任务内容
1、本游戏一共3关,由易到难,每一关都有初化、按键处理、重置及退出功能。
2、初始化包括屏幕初始化和每一关卡的初始化。
3、按键处理包括移动小人和移动箱子,通过移动上下左右键来控制小人的移动,从而推动箱子,以把箱子推到指定的目的地为过关。
4、每一关都可以重置,按空格键可以重置当前关。
5、按Esc键可以在任何时候退出游戏。
第三章、详细设计说明
1、系统模块图
本程序包括5个模块,分别是初始化模块、画图模块、移动箱子模块、移动小人模块和功能控制模块,如图
(1)所示。
各个模块的功能描述如下:
1、初始化模块。
该模块包括屏幕初始化和游戏第一关的初始化。
屏幕初始化用于输出欢迎信息和操作提示,游戏每一关的初始化是构建每一关的关卡。
2、画图模块。
该模块主要是被其它模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。
3、移动箱子模块。
该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。
4、移动小人模块。
该模块用于控制小人移动,从而推动箱子到目的地。
5、功能控制模块。
该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。
图
(1)系统模块图
2、任务执行流程图
游戏从第一关开始,按上下左右方向键控制小人移动来推动箱子,可以在游戏中的任何时候按Esc键退出。
如果游戏无成功希望,可以按空格键回到当前任务的开始状态;如果成功完成当前关,则进入下一关,如果当前关是最后一关,则显示通关信息,提示游戏结束。
图
(2)显示了任务执行的流程。
图
(2)任务执行流程图
3、小人移动流程图
小人移动的方向有4个,move()函数(处理小人移动的函数)对这4个方向移动的处理都一致,只是调用函数时的参数有所不同。
首先判断小人移动的方向,然后根据小人所处世的当前状态、下一步状态或者下下一步状态进行适当的处理。
处理过程如图(3)所示。
续图(3)小人移动流程图
4、函数功能描述
1、putoutChar()
函数原型:
voidputoutChar(inty,intx,charch,charfc,charbc)
putoutChar()函数在屏幕上的指定位置输出指定的字符。
其中,x、y指明输出的位置,ch表示输出的字符,fc表示输出的字符颜色,bc表示背景色。
2、printWall()
函数原型:
voidprintWall(intx,inty)
printWall()函数用于画墙壁,传入参数x、y指明位置。
该函数调用putoutChar()进行输出,以黑色为背景画绿色墙,用小方块表示墙(ASCII值为219)。
3、printBox()
函数原型:
voidprintBox(intx,inty)
printBox()函数用于在非目的地画箱子,传入参数x、y指明位置。
该函数调用putoutChar()进行输出,以黑色为背景白色箱子,用ASCII值为10的字符表示箱子。
4、printBoxDes()
函数原型:
voidprintBoxDes(intx,inty)
printBoxDes()函数用于在目的地画箱子,传入参数x、y指明位置。
该函数调用putoutChar()进行输出,以黑色为背景画黄色箱子,仍用ASCII值为10的字符表示箱子。
5、printDestination()
函数原型:
voidprintDestination(intx,inty)
printDestination()函数用于画目的地,传入参数x、y指明位置。
该函数调用putoutChar()进行输出,以黑色为背景画黄色目的地,用心型表示(ASCII值为003)。
6、printDestination1()
函数原型:
voidprintDestination1(intx,inty,winer**win,winer**pw)
printDestination1()函数与printDestination()函数功能基本相同,都是画目的地函数,但是printDestination1()增加了记录每一个目的地位置的功能。
其中x、y指明目的地的位置,每一关的所有目的地位置存放在结构体structwiner中,形成一条链表,**winer返回链表的头,**pw则指向链表的尾部。
7、printMan()
函数原型:
voidprintMan(intx,inty)
printMan()函数用于画小人。
X、y指明画的位置。
该函数通过软中断来实现,首先设置寄存器AX的高位和低位,设置高位0xa表示在光标位置显示字符;设置低位02(ASCII值),表示输出的字符;然后设置寄存器CX为01,表示重复输出的次数,这里只输出一次;最后产生类型为0x10的中断,表示显示器输出。
8、init()
函数原型:
voidinit()
init()函数用于初始化屏幕。
该函数首先用两个for循环初始化屏幕20*20范围内的状态,初始化为0,以后根据实际情况重新赋值;然后设置屏幕输出状态,设置寄存器AX的高位为0,低位为3,表示以80*25的彩色方式显示;最后移动光标到指定的位置输出操作提示信息以及版权信息。
9、初始化游戏
函数原型:
winer*initStep1()、winer*initStep2()、winer*initStep3()、winer*initStep4()
这几个函数分别初始化游戏的第一关到第三关。
这些函数的功能和实现步骤相似。
首先根据需要在指定的位置画墙壁和画箱子,在这里可以设置游戏的难度,初始化的墙壁越复杂,箱子越多,则游戏就越难。
游戏的第一关至第三关难度依次增加。
然后分别调用printDestination1()和printMan()函数画目的地和小人。
函数返回包含各个目的地位置的链表。
10、移动箱子
函数原型:
voidmoveBoxSpacetoSpace(intx,inty,chara)、voidmoveBoxDestoSpace(intx,inty,chara)、voidmoveBoxSpacetoDes(intx,inty,chara)、voidmoveBoxDestoDes(intx,inty,chara)
这几个函数实现的功能分别是人空地移动箱子到空地、从目的地移动箱子到空地、从空地移动箱子到目的地和中从目的地移动箱子到目的地。
X、y指明小人当前所处的位置,字符a表示移动的方向,有“u”、“d”、“l”和“r”4个值,分别表示向上、下、左、右移动。
这几个函数的实现原理大致相似。
对于前面两个函数,首先判断移动的方向,人小人所在的位置沿着移动的方向移动一步画小人,移动两步画箱子(调用printBox()函数),并设置状态为“b”;对于后面两个参数,首先判断移动的方向,从小人所在的位置沿着移动方向移动一步画小人,移动两上在目的地画箱子(调用printBoxDes()函数),并设置状态为“i”,表明箱子在目的地上。
11、judge()
函数原型:
intjudge(intx,inty)
judge()根据结构体struct[x][y]中存的值来判断该点的状态。
12、move()
函数原型:
voidmoid(intx,inty,chara)
Move()函数根据按下的键来处理小人的移动。
小人移动的方向有上(“u”)、下(“d”)、左(“l”)、右(“r”)4个,4个方向的处理方式一样。
首先判断移动的方向,然后根据小人的当前位置、下一步位置以及下下一步位置所在的状态进行处理。
13、reset()
函数原型:
voidreset(inti)
reset()函数的功能是重置当前关。
该函数首先判断当前关是第几关,然后调用init()函数和初始化当前关的函数进行重置。
14、主函数
主函数首先设置寄存器AX的高位和低位,显示器软中断,进行显示状态的设置,初始化
屏幕,初始化第一关,并显示操作提示信息和版权信息。
然后根据按下的键(bioskey(0)函数返回按下的键值)进行处理,处理过程由move()函数进行(如果按下Esc键,则退出程序)。
对于每一关,如果所有的表示目的地的状态都由“m”变成了“i”,则表示通过该关,可以进入下一关。
第四章、软件的使用说明
TurboC/C++forWindows是在微机上广泛使用的编译程序,它具有方便、直观它向用户提供了一个集成环境,、易用的界面和丰富的库函数,把程序的编译、编辑、连接和运行等操作全部集中在一个界面上运行,使用十分方便。
本程序的开发就是在C/C++程序设计学习与实验系统中完成的。
本程序的运行环境windows操作系统。
1、运行结果截图
第一关
第二关
第三关
第五章、课程设计心得与体会
经过三个星期的实践学习,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对C语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。
通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。
附录1参考文献
C++程序设计谭浩强编著清华大学出版社
C++程序开发与设计(第二版)GaryJ.Bronson著刘勇译人民邮电出版社
附录2程序代码清单
#include
#include
#include
#include
#include
#include
typedefstructwiner
{
intx,y;
structwiner*p;
}winer;
charstatus[20][20];
charfar*printScreen=(charfar*)0xB8000000;
voidputoutChar(inty,intx,charch,charfc,charbc);
voidprintWall(intx,inty);/*用于画墙*/
voidprintBox(intx,inty);/*在空白地(非目的地)画箱子*/
voidprintBoxDes(intx,inty);/*在目的地画箱子*/
voidprintDestination(intx,inty);/*画目的地函数*/
voidprintDestination1(intx,inty,winer**win,winer**pw);/*画目的地函数,并记录每个目的地的位置*/
voidprintMan(intx,inty);/*画小人函数*/
voidinit();
winer*initStep1();
winer*initStep2();
winer*initStep3();
voidmoveBoxSpacetoSpace(intx,inty,chara);/*把箱子从空地移动到空地*/
voidmoveBoxDestoSpace(intx,inty,chara);/*把箱子从目的地移动到空地*/
voidmoveBoxSpacetoDes(intx,inty,chara);/*把箱子从空地移动到目的地*/
voidmoveBoxDestoDes(intx,inty,chara);/*把箱子从目的地移动到目的地*/
intjudge(intx,inty);
voidmove(intx,inty,chara);
voidreset(inti);
voidputoutChar(inty,intx,charch,charfc,charbc)
{printScreen[(x*160)+(y<<1)+0]=ch;
printScreen[(x*160)+(y<<1)+1]=(bc*16)+fc;
}
voidprintWall(intx,inty)
{
putoutChar(y-1,x-1,219,GREEN,BLACK);
status[x][y]='w';
}
voidprintBox(intx,inty)
{
putoutChar(y-1,x-1,10,WHITE,BLACK);
status[x][y]='b';
}
voidprintDestination1(intx,inty,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));
qw->x=x;
qw->y=y;
(*pw)->p=qw;
(*pw)=qw;qw->p=NULL;
}
}
voidprintDestination(intx,inty)
{
putoutChar(y-1,x-1,003,YELLOW,BLACK);
status[x][y]='m';
}
voidprintMan(intx,inty)
{gotoxy(y,x);
_AL=02;
_CX=01;
_AH=0xa;
geninterrupt(0x10);
}
voidprintBoxDes(intx,inty)
{putoutChar(y-1,x-1,10,YELLOW,BLACK);
status[x][y]='i';
}
voidinit()
{
inti,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:
2010BaiXueliang");
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);
}
winer*initStep1()
{intx;
inty;
winer*win=NULL;
winer*pw;
gotoxy(25,2);
printf("Level1");
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);
returnwin;
}
winer*initStep2()
{intx;
inty;
winer*win=NULL;
winer*pw;
gotoxy(25,2);
printf("Level2");
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);
returnwin;
}
winer*initStep3()
{intx;
inty;
winer*win=NULL;
winer*pw;
gotoxy(25,2);
printf("Level3");
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);
returnwin;
}
voidmoveBoxSpacet
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计