打地鼠.docx
《打地鼠.docx》由会员分享,可在线阅读,更多相关《打地鼠.docx(43页珍藏版)》请在冰豆网上搜索。
打地鼠
C语言大型程序设计之
打地鼠游戏
设计实验报告
1、游戏设计目的————————————————3
2、游戏设计内容————————————————3
3、游戏设计背景知识——————————————4
4、功能分析——————————————————4
5、设计结果分析————————————————5
6、程序代码——————————————————6
一、游戏设计目的
1、熟悉C语言运行环境TurboC2.0
2、会简单的程序调试
3、熟悉C语言各种类型数据的输入输出,以及各种函数的使用方法
4、掌握顺序结构程序设计
二、游戏设计内容
按照经典打地鼠游戏制作方案,用C语言编写程序,主要包括以下几个部分:
1、游戏开始界面
1.1初始化游戏
1.2欢迎界面
1.3等级选择
1.4操纵方式选择
2、游戏过程界面
2.1画方格
2.2计时
2.3地鼠和锤子画面设计
2.4鼠标操控
2.5键盘操纵
2.6记录打中的个数
3、游戏结束界面
3.1判断成功与失败
3.2判断是否重新开始
三、游戏设计背景知识
打地鼠作为娱乐性质的游戏项目,可以锻炼玩家的反应能力,其次,本游戏可通过敲击键盘来控制锤子打地鼠,还能锻炼玩家对键盘的熟悉程度。
打地鼠游戏设计牵涉到图像处理函数、声音处理函数、动画处理函数以及鼠标控制等各方面知识,许多函数的使用方法可借鉴扫雷游戏的处理方法,通过对现有打地鼠游戏的改造,形成特有的TC下的打地鼠游戏。
四、功能分析
总体游戏过程分析:
1、在游戏开始时,先显示一个欢迎界面,简单说明游戏规则,点击任意键开始;
2、选择游戏等级(等级一:
3行3列;等级二:
4行4列;等级三:
5行5列),选择使用键盘或鼠标操作;
3、游戏开始时,每场游戏时有时间限制,键盘玩的时间比鼠标玩的时间稍长,背景界面出现后按任意键计时自动开始,屏幕中央位置会显示一个游戏区,方格表示地鼠显示区域,若用键盘操纵,在每个方格中还会显示不同的字母,地鼠在不同方格中闪现,用鼠标表示铁锤;
4、若玩家选择键盘操作,则通过键盘输入各方块中的字母来控制打地鼠;
5、若玩家选择鼠标操作,则通过鼠标的运动来击打地鼠;
6、游戏开始后,按空格键表示暂停,按ESC键跳出游戏,且按下ESC键表示退出游戏后只能手动重新开始;
7、地鼠被打中时,会响起一声提示音,表示准确打中,屏幕上也会显示此时打中地鼠的积累数;
8、时间截止时,若打中地鼠总数达到五十,则判断胜利,否则为失败;
9、选择是否继续游戏,选择是,则回到选择等级界面,选择否,则退出游戏。
五、设计结果分析
预期要求基本达到,图像绘制较为美丽,功能都已经实现,时间控制方面因电脑随机处理方面产生一些无法计算的因素使得游戏时间控制精确度不够,鼠标图形闪烁较为严重。
六、程序代码
/*-------------------------main.c文件------------------------*/
#include
#include
#include
#include
#include
#include
#include"picture.c"
#include"key.c"
intgrade;/*等级*/
intoperation;/*操作方式*/
intkick=0;/*击中地鼠个数*/
longcount=0;/*控制游戏时间*/
intmouseflag=0;/*标记鼠标分辨频率*/
intchangeflag=0;/*标记地鼠频率*/
intkeyboardflag=0;/*标记地鼠频率*/
voidinterruptTimer()/*控制时间*/
{
count++;
if(count%600==0)changeflag=1;
if(count%1000==0)keyboardflag=1;
if(count%500==0)mouseflag=1;
outportb(0x20,0x20);
}
voidInstallTime()/*调用电脑时间中断*/
{
disable();/*修改定时器分频值,使定时器中断时间变为0.5ms每次,安装计时函数*/
outportb(0x43,0x36);
outportb(0x40,596&0x00ff);
outportb(0x40,(596&0xff00)>>8);
setvect(0x1c,Timer);
enable();
}
voidinitgr()/*界面初始化*/
{
intgraphdriver=VGA,graphmode=VGAHI;
interrorcode;
initgraph(&graphdriver,&graphmode,"f:
\\tc");
}
voidgetmouse(int*x,int*y,int*key)/*获取鼠标函数*/
{
unionREGSinregs,outregs;
inregs.x.ax=3;/*获取鼠标位置和状态也可以用3*/
int86(0x33,&inregs,&outregs);/*中断调用*/
*x=outregs.x.cx;/*cx寄存器中存的是横坐标*/
*y=outregs.x.dx;/*dx寄存器中存的是列坐标*/
*key=outregs.x.bx;/*bx寄存器是按键状态*/
}
voidvisbilemouse()/*初始化鼠标函数*/
{
unionREGSinregs,outregs;
inregs.x.ax=0x01;/*显示鼠标*/
int86(0x33,&inregs,&outregs);
}
voidmouse(int*x,int*y,int*z)/*画鼠标函数*/
{
inta=0,b=0,c=0,a_old=0,b_old=0;
int*b_ball;/*存储背景图片*/
int*m_ball;
b_ball=malloc(imagesize(a,b,a+18,b+18));
m_ball=malloc(imagesize(0,0,18,18));
getimage(a,b,a+18,b+18,b_ball);/*第一次将一个空矩形存入到内存中*/
getimage(36,0,54,18,m_ball);
getmouse(&a,&b,&c);/*a,为横坐标,b,为列坐标,c为按键状态*/
if(a<120)a=120;/*保证鼠标不出界*/
if(b<0)b=0;
if(a>getmaxx()-155)a=getmaxx()-155;
if(b>getmaxy()-27)b=getmaxy()-27;
if(a!
=a_old||b!
=b_old)
{
getimage(a,b,a+18,b+18,b_ball);
putimage(a,b,m_ball,0);
}
a_old=a;b_old=b;
*x=a;*y=b;*z=c;/*返回按键后鼠标的位置*/
putimage(a,b,b_ball,0);/*将鼠标擦掉*/
free(m_ball);
free(b_ball);
}
main()
{
introw=0,col=0;/*行、列*/
intmx,my,mz;/*存储鼠标位置*/
int*s_hole;/*存储地鼠洞图像*/
int*s_ball;/*存储地鼠图像*/
int*k[4];/*存储击中个数*/
int*tim;/*显示剩余时间*/
intt=71;/*控制时间显示*/
intb;/*是否重来*/
initgr();/*界面初始化*/
InstallTime();/*时间控制*/
cleardevice();
setbkcolor(BLACK);
Welcome();
Game_Rules();
again:
grade=Choose_Grade();
operation=Choose_Operation();
Hole_Draw(grade,operation);
s_hole=malloc(imagesize(0,0,51,80));
s_ball=malloc(imagesize(0,0,50,60));
tim=malloc(imagesize(0,0,8,8));
getimage(320-grade*38+1,320-grade*48+2,320-grade*38+52,320-grade*48-78,s_hole);
getimage(530,50,538,58,tim);/*存入黑色方块*/
grade+=2;
setcolor(RED);/*表示剩余时间*/
rectangle(530,70,540,450);
setfillstyle(SOLID_FILL,LIGHTRED);
floodfill(535,180,RED);
susliks(15,270);/*画地鼠*/
mouse_draw(36,0);/*画鼠标图形*/
mouse_draw(36,450);
getimage(15,270,65,210,s_ball);
setcolor(GREEN);
settextstyle(SMALL_FONT,0,5);
sprintf(k,"%d",kick);
outtextxy(36,250,k);
while(count<=80000)
{
if(operation==1)/*键盘操作*/
{
row=320-grade*38+78*(rand()%grade);
col=320-grade*48+98*(rand()%grade);
getimage(row,col-80,row+51,col,s_hole);
do{
if(bioskey
(1))/*如果有按键按下*/
{
putimage(15,210,s_ball,COPY_PUT);
kick=getkey(row,col,kick);
setcolor(GREEN);
settextstyle(SMALL_FONT,0,5);
sprintf(k,"%d",kick);
outtextxy(36,250,k);
}
if(keyboardflag==1)/*地鼠在新位置出现*/
{
keyboardflag=0;
putimage(row,col-80,s_hole,COPY_PUT);
row=320-grade*38+78*(rand()%grade);
col=320-grade*48+98*(rand()%grade);
getimage(row,col-80,row+51,col,s_hole);
putimage(row,col-60,s_ball,COPY_PUT);
putimage(531,t,tim,COPY_PUT);
t+=4;
}
if(count>=100000)break;
}while
(1);
}
if(operation==2)/*鼠标操作*/
{
row=320-grade*38+78*(rand()%grade);
col=320-grade*48+98*(rand()%grade);
putimage(row,col-60,s_ball,COPY_PUT);
visbilemouse();/*鼠标显示*/
do{
if(bioskey
(1))getkey(0,0,kick);
mouse(&mx,&my,&mz);
if(mz==1&&row{
putimage(15,210,s_ball,COPY_PUT);
kick++;
kick_music();
mouseflag=0;
setcolor(GREEN);
settextstyle(SMALL_FONT,0,5);
sprintf(k,"%d",kick);
outtextxy(36,250,k);
}
if(changeflag==1)/*地鼠在新位置出现*/
{
changeflag=0;
putimage(row-1,col-80,s_hole,COPY_PUT);
row=320-grade*38+78*(rand()%grade);
col=320-grade*48+98*(rand()%grade);
putimage(row,col-60,s_ball,COPY_PUT);
putimage(531,t,tim,COPY_PUT);
t+=3;
}
if(count>=80000)break;
}while
(1);
}
}
if(kick>=50)win();/*判断输赢*/
if(kick<50)lose();
b=back();
free(s_ball);
free(s_hole);
free(tim);
if(b==1)/*是否重来*/
{
kick=0;
count=0;
t=71;
gotoagain;
}
else
closegraph();
exit(0);
}
/*-------------------------main.c文件------------------------*/
/*--------------------------key.c文件-------------------------*/
#include
#defineA0x1e61
#defineB0x3062
#defineC0x2e63
#defineD0x2064
#defineE0x1265
#defineF0x2166
#defineG0x2267
#defineH0x2368
#defineI0x1769
#defineJ0x246a
#defineK0x256b
#defineL0x266c
#defineM0x326d
#defineN0x316e
#defineO0x186f
#defineP0x1970
#defineQ0x1071
#defineR0x1372
#defineS0x1f73
#defineT0x1474
#defineU0x1675
#defineV0x2f76
#defineW0x1177
#defineX0x2d78
#defineY0x1579
#defineONE0x231
#defineTWO0x332
#defineTHREE0x433
#defineBLANK0x3920
#defineESC0x011b
intgetkey(introw,intcol,intkick)/*获取按键信息,返回有效的操作值*/
{
intkey=bioskey(0);
switch(key){
caseA:
if(row==206&&col==176||row==168&&col==128||row==130&&col==80)
{
kick++;
kick_music();
}
break;
caseB:
if(row==206&&col==274||row==168&&col==226||row==130&&col==178)
{
kick++;
kick_music();
}
break;
caseC:
if(row==206&&col==372||row==168&&col==324||row==130&&col==276)
{
kick++;
kick_music();
}
break;
caseD:
if(row==284&&col==176||row==168&&col==422||row==130&&col==374)
{
kick++;
kick_music();
}
break;
caseE:
if(row==284&&col==274||row==246&&col==128||row==130&&col==472)
{
kick++;
kick_music();
}
break;
caseF:
if(row==284&&col==372||row==246&&col==266||row==208&&col==80)
{
kick++;
kick_music();
}
break;
caseG:
if(row==362&&col==176||row==246&&col==324||row==208&&col==178)
{
kick++;
kick_music();
}
break;
caseH:
if(row==362&&col==274||row==246&&col==422||row==208&&col==276)
{
kick++;
kick_music();
}
break;
caseI:
if(row==362&&col==372||row==324&&col==128||row==208&&col==374)
{
kick++;
kick_music();
}
break;
caseJ:
if(row==324&&col==266||row==208&&col==472)
{
kick++;
kick_music();
}
break;
caseK:
if(row==324&&col==324||row==286&&col==80)
{
kick++;
kick_music();
}
break;
caseL:
if(row==324&&col==422||row==286&&col==178)
{
kick++;
kick_music();
}
break;
caseM:
if(row==402&&col==128||row==286&&col==276)
{
kick++;
kick_music();
}
break;
caseN:
if(row==402&&col==266||row==286&&col==374)
{
kick++;
kick_music();
}
break;
caseO:
if(row==402&&col==324||row==286&&col==472)
{
kick++;
kick_music();
}
break;
caseP:
if(row==402&&col==422||row==364&&col==80)
{
kick++;
kick_music();
}
break;
caseQ:
if(row==364&&col==178)
{
kick++;
kick_music();
}
break;
caseR:
if(row==364&&col==276)
{
kick++;
kick_music();
}
break;
caseS:
if(row==364&&col==374)
{
kick++;
kick_music();
}
break;
caseT:
if(row==364&&col==472)
{
kick++;
kick_music();
}
break;
caseU:
if(row==442&&col==80)
{
kick++;
kick_music();
}
break;
caseV:
if(row==442&&col==178)
{
kick++;
kick_music();
}
break;
caseW:
if(row==442&&col==276)
{
kick++;
kick_music();
}
break;
caseX:
if(row==442&&col==374)
{
kick++;
kick_music();
}
break;
caseY:
if(row==442&&col==472)
{
kick++;
kick_music();
}
break;
caseONE:
return1;
caseTWO:
return2;
caseTHREE:
return3;
caseBLANK:
getch();
break;
caseESC:
outtextxy(10,20,"EXIT");
getch();
exit(0);
break;
}
returnkick;
}
/*--------------------------key.c文件-------------------------*/
/*------------------------picture.c文件-----------------------*/
voidWelcome()/*开机界面*/
{
inti,j,k;/*(i,j)在图像正中心定位*/
intim;
intfr[]={440,1,440,1,440,1,392,392,1,392,392,1,330,330,330,1,330,330,330,1,262,262,262,262,262,262,1,/*设置背景音乐*/
296,296,296,296,296,330,330,330,330,296,296,296,296,262,262,262,262,262,220,220,220,220,262,262,1,220,220,220,220,220,1};
inttim[]={1,6,1,6,1,6,1,1,6,1,1,6,1,1,2,1,1,1,2,1,1,1,1,1,1,1,6,
1,1,1,1,