1、打地鼠 C语言大型程序设计之打地鼠游戏设计实验报告1、游戏设计目的32、游戏设计内容33、游戏设计背景知识44、功能分析45、设计结果分析56、程序代码6一、游戏设计目的1、熟悉C语言运行环境Turbo C 2.02、会简单的程序调试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、键盘操纵 2.6 记录打中的个数3、游戏结束界面 3.1 判断成功与失败 3.2 判断是否重新开始三、游戏设计背景知识打地鼠作为娱乐性质的游戏项目,可以锻炼玩家的反应能力,其次,本游戏可通过敲击键盘来控制锤子打地鼠,还能锻炼玩家对键盘的熟悉程度。打地鼠游戏设计牵涉到图像处理函数、声音处理函数、动画处理函数以及鼠标控制等各方面知识,许多函数的使用方法可借鉴扫雷游戏的处理方法,通过对现有打地鼠游戏的改造,形成特有的TC下的打地鼠游戏。四、功能分析总体游戏过程分析:1、在游戏开始时,先显示一个欢迎界面,简单说明游戏规则,点击任意键开始;2、选择游戏等级(等级一:3行3列;等级二:4行4列;等级三:5
3、行5列),选择使用键盘或鼠标操作;3、游戏开始时,每场游戏时有时间限制,键盘玩的时间比鼠标玩的时间稍长,背景界面出现后按任意键计时自动开始,屏幕中央位置会显示一个游戏区,方格表示地鼠显示区域,若用键盘操纵,在每个方格中还会显示不同的字母,地鼠在不同方格中闪现,用鼠标表示铁锤;4、若玩家选择键盘操作,则通过键盘输入各方块中的字母来控制打地鼠;5、若玩家选择鼠标操作,则通过鼠标的运动来击打地鼠;6、游戏开始后,按空格键表示暂停,按ESC键跳出游戏,且按下ESC键表示退出游戏后只能手动重新开始;7、地鼠被打中时,会响起一声提示音,表示准确打中,屏幕上也会显示此时打中地鼠的积累数;8、时间截止时,若打
4、中地鼠总数达到五十,则判断胜利,否则为失败;9、选择是否继续游戏,选择是,则回到选择等级界面,选择否,则退出游戏。五、设计结果分析 预期要求基本达到,图像绘制较为美丽,功能都已经实现,时间控制方面因电脑随机处理方面产生一些无法计算的因素使得游戏时间控制精确度不够,鼠标图形闪烁较为严重。六、程序代码/*-main.c文件-*/#include#include#include#include#include#include#includepicture.c#includekey.cint grade;/*等级*/int operation;/*操作方式*/int kick=0;/*击中地鼠个数*/
5、long count=0;/*控制游戏时间*/int mouseflag=0;/*标记鼠标分辨频率*/int changeflag=0;/*标记地鼠频率*/int keyboardflag=0;/*标记地鼠频率*/void interrupt Timer()/*控制时间*/ count+; if(count%600=0) changeflag=1; if(count%1000=0) keyboardflag=1; if(count%500=0) mouseflag=1; outportb(0x20,0x20);void InstallTime()/*调用电脑时间中断*/ disable();/
6、*修改定时器分频值,使定时器中断时间变为0.5ms每次,安装计时函数*/ outportb(0x43,0x36); outportb(0x40,596&0x00ff); outportb(0x40,(596&0xff00)8); setvect(0x1c,Timer); enable();void initgr()/*界面初始化*/ int graphdriver=VGA,graphmode=VGAHI; int errorcode; initgraph(&graphdriver,&graphmode,f:tc);void getmouse(int *x,int *y,int *key)/*获
7、取鼠标函数*/ union REGS inregs,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寄存器是按键状态*/void visbilemouse()/*初始化鼠标函数*/ union REGS inregs,outregs; inregs.x.ax=0x01; /*显示鼠标*/ int86(
8、0x33,&inregs,&outregs);void mouse(int *x,int *y,int *z)/*画鼠标函数*/ int a=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(
9、&a,&b,&c); /*a,为横坐标,b,为列坐标,c为按键状态*/ if(a120) a=120; /*保证鼠标不出界*/ if(bgetmaxx()-155) a=getmaxx()-155; if(bgetmaxy()-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
10、(m_ball); free(b_ball);main() int row=0,col=0;/*行、列*/ int mx,my,mz;/*存储鼠标位置*/ int *s_hole;/*存储地鼠洞图像*/ int *s_ball;/*存储地鼠图像*/ int *k4;/*存储击中个数*/ int *tim;/*显示剩余时间*/ int t=71;/*控制时间显示*/ int b;/*是否重来*/ initgr();/*界面初始化*/ InstallTime();/*时间控制*/ cleardevice(); setbkcolor(BLACK); Welcome(); Game_Rules();
11、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);/*
12、存入黑色方块*/ 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);
13、outtextxy(36,250,k); while(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 & rowmx & mxrow+50 &
14、col-60my & my=80000) break; while(1); if(kick=50) win();/*判断输赢*/ if(kick50) lose(); b=back(); free(s_ball); free(s_hole); free(tim); if(b=1) /*是否重来*/ kick=0; count=0; t=71; goto again; else closegraph(); exit(0);/*-main.c文件-*/*-key.c文件-*/#include#define A 0x1e61#define B 0x3062#define C 0x2e63#defin
15、e D 0x2064#define E 0x1265#define F 0x2166#define G 0x2267#define H 0x2368#define I 0x1769#define J 0x246a#define K 0x256b#define L 0x266c#define M 0x326d#define N 0x316e#define O 0x186f#define P 0x1970#define Q 0x1071#define R 0x1372#define S 0x1f73#define T 0x1474#define U 0x1675#define V 0x2f76#d
16、efine W 0x1177#define X 0x2d78#define Y 0x1579#define ONE 0x231#define TWO 0x332#define THREE 0x433#define BLANK 0x3920#define ESC 0x011bint getkey(int row,int col,int kick) /*获取按键信息,返回有效的操作值*/ int key=bioskey(0); switch(key) case A: if(row=206&col=176 | row=168&col=128 | row=130&col=80) kick+; kick
17、_music(); break; case B: if(row=206&col=274 | row=168&col=226 | row=130&col=178) kick+; kick_music(); break; case C: if(row=206&col=372 | row=168&col=324 | row=130&col=276) kick+; kick_music(); break; case D: if(row=284&col=176 | row=168&col=422 | row=130&col=374) kick+; kick_music(); break; case E:
18、 if(row=284&col=274 | row=246&col=128 | row=130&col=472) kick+; kick_music(); break; case F: if(row=284&col=372 | row=246&col=266 | row=208&col=80) kick+; kick_music(); break; case G: if(row=362&col=176 | row=246&col=324 | row=208&col=178) kick+; kick_music(); break; case H: if(row=362&col=274 | row
19、=246&col=422 | row=208&col=276) kick+; kick_music(); break; case I: if(row=362&col=372 | row=324&col=128 | row=208&col=374) kick+; kick_music(); break; case J: if(row=324&col=266 | row=208&col=472) kick+; kick_music(); break; case K: if(row=324&col=324 | row=286&col=80) kick+; kick_music(); break; c
20、ase L: if(row=324&col=422 | row=286&col=178) kick+; kick_music(); break; case M: if(row=402&col=128 | row=286&col=276) kick+; kick_music(); break; case N: if(row=402&col=266 | row=286&col=374) kick+; kick_music(); break; case O: if(row=402&col=324 | row=286&col=472) kick+; kick_music(); break; case
21、P: if(row=402&col=422 | row=364&col=80) kick+; kick_music(); break; case Q: if(row=364&col=178) kick+; kick_music(); break; case R: if(row=364&col=276) kick+; kick_music(); break; case S: if(row=364&col=374) kick+; kick_music(); break; case T: if(row=364&col=472) kick+; kick_music(); break; case U:
22、if(row=442&col=80) kick+; kick_music(); break; case V: if(row=442&col=178) kick+; kick_music(); break; case W: if(row=442&col=276) kick+; kick_music(); break; case X: if(row=442&col=374) kick+; kick_music(); break; case Y: if(row=442&col=472) kick+; kick_music(); break; case ONE: return 1; case TWO:
23、 return 2; case THREE: return 3; case BLANK: getch(); break; case ESC: outtextxy(10,20,EXIT); getch(); exit(0); break; return kick;/*-key.c文件-*/*-picture.c文件-*/void Welcome()/*开机界面*/ int i,j,k; /*(i,j)在图像正中心定位*/ int im; int fr=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; int tim=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,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1