还剩32页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
一、题目描述这是通过C语言编程的坦克大战void mainvoid{Init;DrawMap;GamePlay;End;void TimeDelayunsigned long microsec/*延时函数传入微秒数*/{union REGSr;r.h.ah=0x86;r.x.cx=microsecgt;gt;16;r.x.dx=microsec;int860x15,r,r;}void Init/*图象驱动开始*/{int gd=DETECT,gm;initgraph gd,g d:\\tc\\tc〃;叫〃cleardevice;InstallKeyboard;void End/*图象驱动结束*/ShutDownKeyboard;closegraph;}void DrawToneint x,int y/*画石头*/setfillstyleSOLID_FILL,7;bar100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9;void DrawWaterint x,int y/*画水*/!setfillstyleSOLID_FILL,BLUE;bar100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9;void DrawBrickint x,int y/*画石专*/setfillstyleSOLID FILL,6;bar100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9;setcolor15;line100+x*20-9,50+y*20-4,100+x*20+9,50+y*20-4;line100+x*20-9,50+y*20+4,100+x*20+9,50+y*20+4;line100+x*20-4,50+y*20-9,100+x*20-4,50+y*20+9;line100+x*20+4,50+y*20-9,100+x*20+4,50+y*20+9;void DrawHomeint x,int y/*画老家*/{setcolor0;setfillstyleSOLID_FILL,GREEN;fillellipse100+x*20,50+y*20,9,9;}void DrawBlackint x,int y/*去除内容*/{setcolor0;setfillstyleSOLID_FILL,0;bar100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9;void DrawPlayint x,int y/*画玩家*/setcolor4;/*玩家为红色*/circle100+x*20,50+y*20,7;switchPlayone.direction/*判断玩家方向*/case1:line100+x*20,50+y*20,100+x*20,50+y*20-9;break;/*_bcase2:line100+x*20,50+y*20,100+x*20+9,50+y*20;break;/*右case3:line100+x*20,50+y*20,100+x*20,50+y*20+9;break;/*下case4:line100+x*20,50+y*20,100+x*20-9,50+y*20;break;/*左void DrawAmyintx,int y,int i/*画敌人*/ifamy.color==12setcolor12;else if amy.color==13setcolor13;else/*这里是判断三种颜色的坦克*/setcolor14;circle100+x*20,50+y*20,7;switchamy.direction/*判断玩家方向*/{case1:line100+x*20,50+y*20,100+x*20,50+y*20-9;break;/*Jt*/case2:line100+x*20,50+y*20,100+x*20+9,50+y*20;break;/*右*/case3:line100+x*20,50+y*20,100+x*20,50+y*20+9;break;/*下*/case4:line100+x*20,50+y*20,100+x*20-9,50+y*20;break;/*左voidScore/*输出分数*/{char s
[10];Playone.score+=10;sprintfs,〃%d〃,Playone.score;setfillstyleSOLID_FILL,0;bar550,100,640,130;settextstyle0,0,2;setcolorYELLOW;outtextxy550,115,s;void DrawMapO/*画地图*/{int i,j,k;fori=0;ilt;20;i++forj=0;jlt;20;j++if map[j]==lDrawTone j,i;else ifmap[j]==2DrawBrick j,i;else ifmap[j]==3DrawWater j,i;else ifmap[j]==5DrawHome j,i;else ifmap[j]==8Playone.x=i;Playone.y=j;Playone.direction=l;DrawPlay j,i;for k=0;klt;5;k++Playone.fire[k].direction=-l;/*5颗子弹的方向都为T,表示不存在*/else ifmap[j]==9amy
[0].x=l;amy
[0].y=l;amy
[0].direction=amy
[0].directiontwo=3;/*第一个敌人*/amy
[0].color=12;DrawAmy j,i,0;}}fori=l;ilt;5;i++/*敌人都没出现*/amy.direction=amy.fire.direction=-l;outtextxy210,450,〃
2003.
10.1milo_zy〃;settextstyle0,0,2;/*首次输出得分*/setcolor9;outtextxy525,80,“Score;setcolor YELLOW;outtextxy550,115,/z0/z;void farinterrupt Newlnt9voidunsigned charScanCode,temp;ScanCode=inportb0x60;temp=inportb0x61;outportb0x61,temp|0x80;outportb0x61,temp0x7f;ifScanCode0x80ScanCode=0x7f;key_state[ScanCode]=0;}elsekey_state[ScanCode]=1;key_pressed[ScanCode]=1;}outportb0x20,0x20;void InstallKeyboardvoidint i;fori=0;ilt;128;i++key_state=key_pressed=O;01dInt9Handler=getvect9;/*中断向量值*/setvect9,Newlnt9;/*中断程序Newlnt9地址存入指定的中断向量表中INT09H*/}void ShutDownKeyboardvoidsetvect9,01dInt9Handler;}int GetKeyint ScanCodeint res;res=key_state[ScanCode]|key_pressed[ScanCode];key_pressed[ScanCode]=0;return res;void GameOver/*游戏失败*/setcolor0;setfillstyleSOLID_FILL,0;/*把老家给去除*/fillellipse100+9*20,50+18*20,9,9;nosound;setcolorRED;settextstyle0,0,4;outtextxy150,5,GAME OVER;while1{if GetKeyKEY_ESCbreak;}}void GamePlay/*玩游戏的过程*/int i,j,lose=0;/*lose是1的时候表示失败*/int t=0;randomize;while1for i=0;ilt;5;i++/*画敌人的子弹*/
二、功能分析进入游戏
1.进入游戏后,首先出现的是游戏片头在这里,您可以看到一个小小的动画以及制作人员名单等当然,你也可以按任意键调至游戏封面,也是主菜单主菜单
2.主菜单游戏标题、高分榜和菜单选项三部分右上角是高分榜,随其后的是姓名和得分如果你在游戏中打破了这些记录,那么你的名字和得分将会出现在这里屏幕中央自左向右依次是键盘设置、游戏参数设置、编辑器、开始游戏、和退出键这里使用鼠标控制的你可要管好你的鼠标,否则在两秒钟以后他会自己在屏幕上漫游鼠标的有效地点在他的尾巴上当他落在摸个按钮上时,这个键会出现彩色的边框提示你按键单击左键即进入你选择的项目退出游戏时会出现片尾画面,有演员表、游戏后记等你同样可以按任意键跳过直接回到操作系统ifamy.fire,directiongt;0putpixel100+amy.fire.y*20,50+amy.fire.x*20,11;}for i=0;ilt;=4;i++/*画玩家子弹*/if Playone.fire,directiongt;0/*大于0表示玩家子弹存在putpixel100+Playone.fire.y*20,50+Playone.fire.x*20,11;TimeDelay500000;/*关键的时间改动*/for i=0;ilt;5;i++/*去敌人的子弹*/ifamy.fire,directiongt;0putpixel100+amy.fire.y*20,50+amy.fire.x*20,0;}fori=0;ilt;=4;i++/*去玩家除子弹*/{ifPlayone.fire,directiongt;0putpixel100+Playone.fire.y*20,50+Playone.fire.x*20,0;for i=0;ilt;=4;i++/*玩家子弹位置的变化*/if Playone.fire,directionlt;0continue;if Playone.fire.direction==l{Playone.fire.x layone.fire.y=Playone.fire.y;}一一else ifPlayone.fire.direction==2{Playone.fire.y++layone.fire.y=Playone.fire,y;}else ifPlayone.fire.direction==3{Playone.fire.x++layone.fire.y=Playone.fire,y;}else ifPlayone.fire.direction==4{Playone.fire,y layone.fire,y=Playone fire,y;}一一/*打到石头或者破头的情况下减少子弹*/if map[Playone.fire,x][Playone.fire.y]==l/*打至U石头*/Playone.fire,direction1;/*子弹^肖失*/二一if map[Playone.fire,x][Playone.fire.y]==2/*打至U石专头*/Playone.fire.direction=-l;DrawBlack Playone.fire,y,Playone.fire,x;/*石专头打掉*/map[Playone.fire,x][Playone.fire.y]=0;/*被打掉的地方变成可走的地方*/if map[Playone.fire,x][Playone.fire.y]==5/*自己打至ll老家{lose=l;break;}forj=0;jlt;5;j++if amy[j].directionlt;0/*不存在的不判断*/continue;ifamy[j].x==Playone.fire.xamy[j].y==Playone.fire,y/*打中敌人*/Playone.fire,direction二一1;DrawBlack Playone.fire,y,Playone.fire,x;map[Playone.fire,x][Playone.fire.y]=0;/*被打掉的地方变成可走的地方*/amy[j].fire.direction=amy[j].direction=-l;/*这个敌人,肖失*/Score;/*输出得分*/amy.fire,directionlt;0ifamy.directionlt;0continue;if amy.fire.direction==l{amy.f ire.x amy.f ire.y=amy.f ire.y;}一一;else ifamy.fire,direction==2{amy.fire.y++;amy.fire.x=amy.fire,x;}else ifamy.fire,direction==3{amy.fire.x++;amy.fire.y=amy.fire,y;}else ifamy.fire,direction==4{amy.fire.y amy.fire.x=amy.fire,x;}一一;/*打到石头或者破头的情况下减少子弹*/if map[amy.fire,x][amy.fire,y[==1/*打至U石头*/amy.fire.direction=T;/*子弹消失*/if map[amy.fire,x][amy.fire.y]==2/*打至U砖头*/amy.fire.direction=-l;DrawBlackamy.fire,y,amy.fire,x;/*石专头打掉*/map[amy.fire,x][amy.fire.y]=0;/*被打掉的地方变成可走的地方*/if map[amy.fire,x][amy.fire.y]=5/*敌人打到老家*/{lose=1;break;}if amy.fire,x-Playone.xamy.fire,y-Playone.y/*打中玩家*/forj=0;j++Playone.fire[j].direction=T;/*玩家子弹都消失*/amy.fire,directional;DrawBlack amy.fire,y,amy.fire.x;map[amy.fire,x][amy.fire,y]=0;/*被打掉的地方变成可走的地方*/lose=1;break;/*好人被打掉后就失败*/}nosound;for i=0;ilt;5;i++/*敌人方向随机的改变*/if amy.directionlt;0continue;while1amy.directiontwo=random4+1;if amy.direction==lamy.directiontwo==3continue;ifamy.direction==3amy.directiontwo==lcontinue;ifamy.direction==2amy.directiontwo==4continue;if amy.direction==4amy.directiontwo==2/*这里4个if是判断有没有往返走*/continue;if amy.directiontwo==3map[amy.x+1][amy.y]==3||map[amy.x+1][amy.y]==l||map[amy.x+1][amy.y]==2continue;ifamy.directiontwo==lmap[amy.x-1][amy.y]==3||map[amy.x-1][amy.y]==l||map[amy.x-l][amy.y]==2continue;ifamy.directiontwo==2map[amy.x][amy.y+l]==3||map[amy.x__amy.y+l]==l||map[amy.x][amy.y+l]==2continue;if amy.directiontwo==4map[amy.x][amy.y-l]==3||map[amy.x_amy.y-l]==l map[amy.x][amy.y-l]==2continue;/*以上4个是是否碰到了墙壁或者水什么的*/DrawBlack amy.y,amy.x;/*把原来的地方擦掉*/amy.direction=amy.directiontwo;ifamy.direction==l{amy.x—;amy.y=amy.y;}ifamy.direction==3{amy.x++;amy.y=amy.y;}if amy.direction==2{amy.y++;amy.x=amy.x;}ifamy.direction==4{amy.y amy.x=amy.x;}一一;if amy.x==Playone.xamy.y==Playone.y/*相撞*/lose=l;if map[amy.x][amy.y]=5/*敌人撞到老家*/lose=l;DrawAmy amy.y,amy.x,i;/*画敌人*/ifamy.fire,directionlt;0amy.f ireplay=random4;if amy.fireplay==lamy.fire,directionlt;0/*发射*/amy.fire.direction=amy.direction;/*子弹方向与敌人方向一致*/amy.fire.x=amy.x;amy.fire.y=amy.y;break;}if lose/*因为失败而跳出循环显示失败*/{GameOver;break;}ifGetKeyKEY_ESCbreak;if GetKeyKEY_UP/*往上*/ifPlayone.direction==lmap[Playone.x-l][Playone.y]!=lmap[Playone.x-l][Playone.y]!=2ifmap[Playone.x-1][Playone.y]==3continue;DrawBlack Playone.y,Playone.x;/*这个if是移动,前提是方向与按下的到向一致*/Playone.x——;Playone.direction=l;DrawPlayPlayone.y,Playone.x;}else/*只调整炮头方向*/DrawBlackPlayone.y,Playone.x;Playone.direction=l;DrawPlayPlayone.y,Playone.x;}else if GetKeyKEY_DOWN/*往下*/ifPlayone.direction==3map[Playone.x+1][Playone.y]!=lmap[Playone.x+1][Playone.y]!=2if map[Playone.x+1][Playone.y]==3continue;DrawBlackPlayone.y,Playone.x;Playone.x++;Playone.direction=3;DrawPlayPlayone.y,Playone.x;elseDrawBlackPlayone.y,Playone.x;Playone.direction=3;DrawPlayPlayone.y,Playone.x;}if GetKeyKEY_RIGHT/*往右*/ifPlayone.direction==2map[Playone.x][Playone.y+1]!=lmap[Playone.x][Playone.y+1]!=2if map[Playone.x][Playone.y+l]==3continue;DrawBlackPlayone.y,Playone.x;Playone.y++;Playone.direction=2;DrawPlayPlayone.y,Playone.x;else
三、系统设计界面设计
1.输入方式设计
2.分别输入1,2,3,5,8,9是,输出为石头,砖头,水,老家,玩家和敌人输入xy时为坦克的坐标函数设计
3.文件中函数的功能如下函数原型函数功能Void Init图象驱动开始Void Draw画图Void End图象驱动结束Void Gameplay玩游戏过程延时函数传Void TimeDelay入微秒数Void direction判断玩家方向Void Score输出分数DrawBlackPlayone.y,Playone.x;Playone.direction=2;DrawPlayPlayone.y,Playone.x;}ifGetKeyKEY_LEFT/*往左*/ifPlayone.direction==4map[P1ayone.x][Playone.y-1]!=lmap[Playone.x][Playone.y-1]!=2ifmap[Playone.x][Playone.y-l]==3continue;DrawBlackPlayone.y,Playone.x;Playone.y一-;Playone.direction=4;DrawPlayPlayone.y,Playone.x;elseDrawBlackPlayone.y,Playone.x;Playone.direction=4;DrawPlayPlayone.y,Playone.x;}}ifGetKey KEY_SPACE/*发射子弹*/for i=0;ilt;5;i++/*用循环来找是否有子弹可以用*/ifPlayone.fire,directionlt;0sound300;Playone.fire,direction=Playone.direction;/*子弹方向与坦克方向一致*/Playone.fire,x=Playone,x;Playone.fire.y=Playone.y;break;/*找到后就跳出循环*/}if map[Playone.x][Playone.y]==5/*玩家自己撞到老家*/lose=l;for i=0;ilt;5;i++/*判断是否因自己控制撞到敌人*/if amy.directionlt;0continue;if amy.x==Playone.xamy.y==Playone.y/*相撞*/lose=l;}if lose/*因为失败而跳出循环显示失败*/{GameOver;break;}t++;/*加到一定的程序就出现新的敌人*/ift=30/*到了增加敌人的时候*/{t=0;fori=0;ilt;5;i++ifamy.directionlt;0amy.direction=amy.directiontwo=3;amy.x=l;amy.y=random3;/*方向随机*/ifamy.y==0amy.y=l;else ifamy.y==lamy.y=9;else/*这里和上面的两个判断是判断敌人的初始位置*/amy.y=18;amy.color=random3+12;/*颜色随机*/DrawAmy amy.y,amy.x,i;break;/*找到一个后就出循环*/
四、测试方法1按键测试检查正确的输入时,是否界面正确表现;错误输入时,是否无效2程序运行测试正确运行检查是否异常;运行时中断,程序是否退出
五、通过此次课程设计的学习,我对知识有了深一层次的理解也体会到语言编程所具有的独特魅力,它让我体会到了其中的乐趣在c编写,调试,更改的过程中我深深体会到函数模块化设计的优越性、重要性在这次的课程设计中,让我深深地体现到进行软件开发不是一件简单的事情,它需要设计者具有全面的专业知识、缜密的思维、严谨的工作态度以及较高的分析问题、解决问题的能力也体会到语C言编程所具有的独特魅力,它让我体会到了其中的乐趣附一.功能说明
1.通过本次的试训课程应该掌握开发坦克大战程序的基本方法和基础知识,对网络的程序设计有一定的认识和掌握并能通过一定的努力可以实现一定的网络思想综合运用所学知识
2.基本掌握面向对象的编程思想
3.掌握一些常用的编译方法.附二./*主函数*/#include graphics,h#include;stdlib.h^include dos.h#include;conio.h#include;bios.h^define KEY_ESC0x01ttdefine KEY_SPACE0x39ttdefine KEY_UP0x48ttdefine KEY_LEFT0x4b#define KEY_RIGHT0x4d#define KEYDOWN0x50Al石头,2砖块,3水,5老家,8玩家,9敌人*/int map
[20]
[20]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,2,2,2,2,0,0,2,2,2,2,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,2,0,0,2,0,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,1,1,0,1,1,1,1,3,3,3,3,0,0,0,0,0,0,0,2,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,3,3,3,0,1,1,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,3,3,3,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,2,2,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,1,0,2,2,0,0,0,0,2,2,2,0,0,0,2,2,0,0,0,1,1,0,0,0,0,0,0,8,2,5,2,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};struct fintx;int y;int direction;;struct play{intx;/*行坐标*/int y;/*列坐标坐int direction;/*方向*/struct ffire
[5];/*5颗子弹*/int score;/*分数*/JPlayone;struct a{intx;int y;int color;int direction;int fireplay;/*是否攻击的变量,随机生成*/struct ffire;}amy
[5];/*敌人的结构体,其实可以添加不同的颜色来表示不同种类的坦克*/char key_state
[128],key_pressed
[128];void Init;/*图象驱动开始*/void End;/*图象驱动结束*/void DrawMapO;/*画地图*/void DrawWaterintx,int y;/*画水*/void DrawBrickintx,int y;/*画石专*/void DrawToneintx,int y;/*画石头*/void DrawHomeintx,int y;/*画老家*/void DrawBlackintx,int y;/*去除内容*/void DrawPlayintx,int y;/*画玩家*/void Draw Amyintx,int y,inti;/*画敌人*/void Score;/*输出分数*/void GamePlay;/*玩游戏过程*/void GameOver;/*游戏失败*/void TimeDelayunsignedlongmicrosec;/*延时函数传入微秒数*/int GetKeyintScanCode;/*这里开始都是按键函数*/void interruptfar*01dInt9Handler;void farinterrupt Newlnt9;void InstallKeyboard;void ShutDownKeyboard;。