C语言课程设计报告小熊回家.docx
《C语言课程设计报告小熊回家.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告小熊回家.docx(17页珍藏版)》请在冰豆网上搜索。
C语言课程设计报告小熊回家
小熊回家
2008年1月
需求分析
基本功能要求
1.小熊回家的路程在屏幕上水平方向。
游戏过程中,出现的地雷、坠落物的个数是随机的。
2.开始游戏时要给小熊一定数量的生命值,当遇到某种伤害时,根据所受伤害的类别如被地雷炸伤等减少一定数量的生命值。
小熊成功回家之后就获得一定的经验,这些经验可以换成一定数量的生命值。
生命值的变化要在画面上用图形和数字加以显示。
当小熊没有到达目的地,二生命值为0时,回家失败。
3.游戏拟用←、→、↑、↓键控制小熊移动,移动步长及速度要设置合理。
4.采用不同的形状代表小熊、地雷、坠落物等,游戏画面要能够显示出小熊向前进,道路向后退的效果。
5.坠落物速度也应设置合理,并可以根据游戏级别不同,设置不同的坠落速度。
6.提供游戏初始界面,其中包括游戏管理按钮:
包括“开始”,“操作说明”,:
“等级选择”,“退出”。
游戏过程中,也要在画面合适区域内有游戏管理按钮,包括“出现开始”,“暂停”,“退出”等。
7.“级别选择”即游戏难易程度的选择,系统给出几种级别,由玩家进行选择。
8.文件保存用户名和该用户成功完成游戏的最短时间记录,并可显示排行榜。
需要处理数据
小熊,地雷,石头,键盘响应。
程序开发环境
TC30
用户界面设计
设置开始界面
设置选择难度和说明界面
游戏开始界面
退出时输入姓名
概要设计
数据结构:
通过指针,函数调用实现程序。
程序整体结构:
键盘响应函数:
实现键盘操作,主函数:
实现程序主体,小熊函数:
画小熊。
详细设计
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineENTER0x0d
#defineESC27
#defineLEFT_ARROW0x4b00
#defineRIGHT_ARROW0x4d00
#defineUP_ARROW0x4800
#defineF20x3c00
#defineF30x3d00
#defineF40x3e00
#defineF50x3f00
doubler1=10.0,x1=90.0,y1=400.0;
voidbear();
intall_key()
{
intkeycode;
keycode=bioskey(0);
if(bioskey
(2)&0x04){
returnkeycode;
}
returnkeycode&0xff?
keycode&0xff:
keycode;
}
inti=0;
main()
{
intgraphdrive=DETECT,graphmode;
intl;
longsize1,size2,size3,size4,size5;
void*buf1,*buf2,*buf3,*buf4,*buf5;
intle;
unsignedintkeycode;
doubler3=5.0,x3,y3=10.0;
doubler2=5.0,x2,y2=400.0;
doubler4=5.0,x4,y4=400.0;
doubler5=5.0,x5,y5=10.0;
charlevel[3];
intp=0;
charword1[20]="BEARGOHOME";
charword2[150]="error,thelevelwillbenormal";
charword3[150]="pleaseenterLEFT,RIGHT,UPtocontrolthebear,F5toback";
charword4[100]="pleasechoosethelevel:
\neasy=e,normal=n,hard=h";
charword5[100];
charword6[100]="[ENTER}tostart,[F5]toexit";
charword7[50]="NAME:
LIUXINYI";
charclear[50]="";
charname[20];
charopenname[200];
charlife[50];
FILE*fp;
initgraph(&graphdrive,&graphmode,"d:
\\TC30\\BGI");
/*thefirstview*/
setbkcolor(BLACK);
setcolor(RED);
rectangle(10,10,630,470);
settextstyle(1,0,5);
settextjustify(0,1);
outtextxy(180,210,word1);
settextstyle(0,0,1);
settextjustify(0,1);
sprintf(word5,"pleaseenter[ENTER]forstart");
outtextxy(200,400,word5);
outtextxy(250,420,word7);
getchar();
if((keycode=all_key())==ESC){
closegraph();}
if((keycode=all_key())==F2){
cleardevice();
rectangle(10,10,630,470);
fp=fopen("name.txt","r");
fgets(openname,200,fp);
outtextxy(30,30,openname);
fclose(fp);}
/*thesecondview*/
if((keycode=all_key())==ENTER){
cleardevice();
setbkcolor(BLACK);
rectangle(10,10,630,470);
floodfill(11,11,BLUE);
settextstyle(1,0,3);
settextjustify(0,1);
outtextxy(10,300,word4);
getche();
if(((keycode=all_key())!
=F2)&&((keycode=all_key())!
=F4)&&((keycode=all_key())!
=F3)){
outtextxy(50,100,word2);
le=20;}
if((keycode=all_key())==F2){
sprintf(level,"easy");
outtextxy(50,100,level);
le=30;}
if((keycode=all_key())==F3){
sprintf(level,"normal");
outtextxy(50,100,level);
le=20;}
if((keycode=all_key())==F4){
sprintf(level,"hard");
outtextxy(50,100,level);
le=10;}
}
l=le+80;
if((keycode=all_key())==ESC){
closegraph();}
if((keycode=all_key())==ENTER){
rectangle(10,10,630,470);
outtextxy(10,20,word3);}
if((keycode=all_key())==ESC){
closegraph();}
if((keycode=all_key())==ENTER)
cleardevice();
size1=imagesize(1,1,2*r1,2*r1);
buf1=malloc(size1);
size2=imagesize(1,1,2*r2,2*r2);
buf2=malloc(size2);
size3=imagesize(1,1,2*r3,2*r3);
buf3=malloc(size3);
size4=imagesize(1,1,2*r4,2*r4);
buf4=malloc(size4);
size5=imagesize(1,1,2*r5,2*r5);
buf5=malloc(size5);
randomize();
x3=1.0*random(610);
x2=1.0*random(610);
x4=1.0*random(610);
x5=1.0*random(610);
while
(1)
{
clrscr();
setbkcolor(BLUE);
rectangle(1,1,630,470);
line(1,411,630,411);
outtextxy(5,421,word6);
textcolor(YELLOW);
textbackground(BLUE);
sprintf(life,"thelifeis%d",l);
outtextxy(30,30,life);
getimage(x1-10.0,y1-10.0,x1+10.0,y1+10.0,buf1);
getimage(x2-r2,y2-r2,x2+r2,y2+r2,buf2);
getimage(x3-r3,y3-r3,x3+r3,y3+r3,buf3);
getimage(x4-r4,y4-r4,x4+r4,y4+r4,buf4);
getimage(x5-r5,y5-r5,x5+r5,y5+r5,buf5);
setcolor(RED);
setfillstyle(SOLID_FILL,RED);
/*thefirstdilei*/
circle(x2,y2,r2);
floodfill(x2,y2,RED);
/*thefirststone*/
circle(x3,y3,r3);
floodfill(x3,y3,RED);
/*theseconddilei*/
circle(x4,y4,r4);
floodfill(x4,y4,RED);
/*thesecondstone*/
circle(x5,y5,r5);
floodfill(x5,y5,RED);
/*thebear*/
circle(x1,y1,r1);
floodfill(x1,y1,RED);
if(sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))<15.000){
l=l-10;
sound(1000);
delay(50);
nosound();
}
if(sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1))<15.000){
l=l-10;
sound(1000);
delay(50);
nosound();
}
if(sqrt((x4-x1)*(x4-x1)+(y4-y1)*(y4-y1))<15.000){
l=l-10;
sound(1000);
delay(50);
nosound();
}
if(sqrt((x5-x1)*(x5-x1)+(y5-y1)*(y5-y1))<15.000){
l=l-10;
sound(1000);
delay(50);
nosound();
}
if(l==0){
closegraph();
printf("GAMEOVER");
printf("\npleaseenteryourname:
");
printf("\npleaseentera[SPACE]afteryourname:
");
gets(name);
fp=fopen("name.txt","a");
fputs(name,fp);
fclose(fp);
free(buf2);
free(buf1);
free(buf3);
getch();}
while
(1)
{
intkey;
if(bioskey
(1))
key=bioskey(0);
else
break;
key=bioskey(0);
switch(key)
{
caseUP_ARROW:
{
sound(400);
delay(30);
nosound();
while(y1>300){
circle(x1,y1,r1);
delay(le*1);
putimage(x1-r1,y1-r1,buf1,0);
y1=y1-10.0;
x1+=2.0;
bear();
}
while(y1<400){
circle(x1,y1,r1);
delay(le*1);
putimage(x1-r1,y1-r1,buf1,0);
y1=y1+10.0;
x1+=2.0;
bear();}
break;
}
caseLEFT_ARROW:
{sound(400);
delay(30);
nosound();
delay
(1);
putimage(x1-r1,y1-r1,buf1,0);
x1=x1-15.0;
bear();
if(x1<=15.0){
x1=600.0;}
break;
}
caseF5:
{
closegraph();
printf("pleaseenteryourname:
");
printf("\npleaseentera[SPACE]afteryourname:
");
gets(name);
fp=fopen("name.txt","a");
fputs(name,fp);
fclose(fp);
free(buf2);
free(buf1);
free(buf3);
getch();
break;
}
caseRIGHT_ARROW:
{sound(400);
delay(30);
nosound();
delay
(1);
putimage(x1-r1,y1-r1,buf1,0);
x1=x1+15.0;
bear();
if(x1>=600.0){
x1=25.0;
i++;}
if(i==3){
closegraph();
printf("youwin");
printf("\npleaseenteryourname:
");
printf("\npleaseentera[SPACE]afteryourname:
");
gets(name);
fp=fopen("name.txt","a");
fputs(name,fp);
fclose(fp);
free(buf2);
free(buf1);
free(buf3);
getch();}
break;}
}
}
delay(le*10);
putimage(x2-r2,y2-r2,buf2,0);
x2=x2-13.0;
if(x2<=20.0){
x2=610.0;}
putimage(x4-r4,y4-r4,buf4,0);
x4=x4-16.0;
if(x4<=20.0){
x4=610.0;}
putimage(x3-r3,y3-r3,buf3,0);
x3=x3-10.0;
y3=y3+10.0;
if((x3<=20.0)||(y3>=411)){
x3=610.0;
y3=10.0;}
putimage(x5-r5,y5-r5,buf5,0);
x5=x5-10.0;
y5=y5+10.0;
if((x5<=20.0)||(y5>=411)){
x5=620.0;
y5=11.0;}
}
}
voidbear()
{
circle(x1,y1,r1);
}
测试
按enter进入游戏,用上、左、右键控制小熊,按F5退出游戏并输入姓名。
测试成功。
用户手册
按enter进入游戏,在开始界面按F2查看姓名,用e、n、h选择难度,用上、左、右键控制小熊,按F5退出游戏并输入姓名。
总结与提高
通过这几个星期的学习,我深刻的体会到编写一个程序的难度,首先,自己的思路一定要清晰,其次,每一步都要经过细心的调试,只有每一步都做到准确无误,才能使一个程序正常的运行。
通过这次的经历,我相信以后我的编程会更加熟练。