




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include<stdlib.h>#include<dos.h>#include<conio.h>#include<math.h>#include<malloc.h>#defineG9.8#definePI#defineLI#defineT1#defineRI#defineBl#defineAMD1#defineAMD2#include<graphics.h>/*重力加速度*/3.141593/*圆周率*/601002004507.81.78/*鼠标信息宏定义*/#defineWAITINGOxffOO/*小屋运动的范围
2、*/*修订数7.8*/*修订数*/#defineLEFTPRESSOxffOl#defineLEFTCLICKOxfflO#defineLEFTDRAG0xffl9#defineRIGHTPRESSOxffO2#defineRIGHTCLICKOxff2O10/31#defineRIGHTDRAGOxff2a#defineMIDDLEPRESS0xff04#defineMIDDLECLICK0xff40#defineMIDDLEDRAG0xff4c#defineMOUSEMOVE0xff08intKeystate;intMouseExist;intMouseButton;intMouseX;i
3、ntMouseY;intup1616,down1616,mouse_draw1616,pixel_save1616;voidMouseMath。/*计算鼠标的样子*/intijjj,k;longUpNum16=0x3fff,0xlfff,0x0fff,0x07ff,0x03ff,0x01ff,0x00ff,0x007f,OxOO3f,OxOOff,OxOlff,OxlOff,0x30ff,0xf87f,0xf87f,0xfc3f);longDownNum16=0x00,0x7c00,0x6000,0x7000,0x7800,0x7c00,0x7e00,0x7f00,0x7f80,0x7e00,
4、0x7c00,0x4600,0x0600,0x0300,0x0300,0x0180;for(i=0;i<16;i+)j=jj=15;while(UpNumi!=0)upij=UpNumi%2;j-;UpNumi/=2;while(DownNumi!=0)downijj-=DownNumi%2;DownNumi/=2;for(k=j;k>=0;k-)upik=0;for(k=jj;k>=0;k-)downik=0;for(k=0;k<16;k+)/*四种组合方式*/if(upik=0&&down皿k=0)mouse_drawik=l;elseif(upik
5、=0&&downik=l)mouse_drawik=2;elseif(upik=l&&downik=0)mouse_drawik=3;elsemouse_drawik=4;010心6_#3/712=4;/*特殊点*/*鼠标光标显示*/voidMouseOn()intx=MouseX,y=MouseY;intij;intcolor;for(i=0;i<16;i+)/*画Klfe*/for(j=0;j<16;j+)pixel_saveij=getpixel(x+j,y+i);/*保存原来的颜色*/if(mouse_drawij=l)putpixel(x+
6、j,y+i,O);elseif(mouse_drawij=2)putpixel(x+j,y+i,15);/*隐藏鼠标*/voidMouseOff()inti,j,x,y,color;x=MouseX;y=MouseY;for(i=0;i<16;i+)/*原位置异或消去消for(j=0;j<16;j+)if(mouse_drawij=311mouse_drawij=4)continue;color=getpixel(x+j,y+i);putpixel(x+j,y+i,colorAcolor);putpixel(x+j,y+i,pixel_saveij);/*鼠标状态值初始化*/voi
7、dMouseReset()_AX=OxOO;geninterrupt(0x33);/*设置鼠标左右边界lx:左边界rx:右边界*/voidMouseSetX(intlx,intrx)_CX=lx;_DX=rx;_AX=0x07;geninterrupt(0x33);/*设置鼠标上下边界uy:上边界dy:下边界*/voidMouseSetY(intuy,intdy)_CX=uy;_DX=dy;AX=0x08;MM,geninterrupt(0x33);/*设置鼠标当前位置x:横向坐标y:纵向坐标*/voidMouseSetXYfintx,inty)_CX=x;_DX=y;AX=0x04;MM,g
8、eninterrupt(0x33);/*获取鼠标按下键的信息*/*是否按下左键返回值:I二按下0二释放*/intLeftPress()_AX=OxO3;geninterrupt(0x33);return(_BX&l/*是否按下中键返回值同上*/intMiddlePress()_AX=OxO3;geninterrupt(0x33);return(_BX&4);/*是否按下右键返回值同上*/intRightPress()_AX=0x03;geninterrupt(0x33);return(_BX&2);/*获取鼠标当前位置*/voidMouseGetXY()_AX=0x03
9、;geninterrupt(0x33);MouseX=_CX;MouseY=_DX;/*鼠标按键情况,返回0表示只移动,返回1表示左右键同时按下,2表示只按了左键,3表示只按了右键*/intMouseStatus()intx,y;intstatus;intpress=O;inti,j,color;status=0;/*默认鼠标没有移动*/x=MouseX;y=MouseY;while(x=MouseX&&y=MouseY&&status=0&&press=0)if(LeftPress()&&RightPress()press=l;
10、elseif(LeftPress()press=2;elseif(RightPress()press=3;MouseGetXY();if(MouseX!=x|MouseY!=y)status=l;if(status)/*移动情况才重新显示鼠标*/for(i=0;i<16;i+)/*原位置异或消去*/for(j=0;j<16;j+)if(mouse_drawij=311mouse_drawij=4)continue;color=getpixel(x+j,y+i);putpixel(x+j,y+i,colorAcolor);putpixel(x+j,y+i,pixel_saveij);
11、MouseOn();/*新位置显示*/if(press!=0)/*有按键的情况*/returnpress;return0;/*只移动的情况*/*定义玩家的结构体*/structRenintx,y;intlife;intcolor;int卜;/*1表示左,2表示右。*/;/*绘制游戏界面*/voidDesktop()setcolor(14);line(320,0,320,480);rectangle(Ll-20,Tl-40,Rl+20,Bl+10);rectangle(640-(Rl+20),(71-40),640-(11-20),61+10);outtextxy(25,20,"Pl&
12、quot;);。出6乂1乂丫(345,20,叩2");/*判断点仅4)是否在以©对)为圆心,以r为半径的圆内*/*intPointCircle(intex,intcy,intr,int*x,int*y)doubleg;if(cx-(*x)*(cx-(*x)+(cy-(*y)*(cy-(*y)<=r*r)return1;elseg=sqrt(double)(*x-cx)*(*x-cx)+(*y-cy)*(*y-cy)/(double)(r);*x=(int)(double)(*x-cx)/g)+cx;*y=(int)(double)(*y-cy)/g)+cy;retur
13、n0;*/*把一个数字n转换成字符串,并存储在a中,带符号+-*/voidnumtostr(intn,chara5)intw,e;e=n;n=abs(n);a3=(n%10)+'0'w=n/10;a2=(w%10)+'0'w=w/10;al=(w%10)+'0'a4='0'if(e<0)a0='-';elsea0='+'/*把速度和角度装换成字符串输出*/voidAngleSpeed(doubles,doubleangle)intss,aa;charzzs5,zza5;intleft,top,
14、right,bottom;left=275;top=50;right=left+90;bottom=top+10;ss=(int)(s);aa=(int)(angle)*180/PI);numtostr(ss,zzs);numtostr(aa,zza);setfillstyle(l,15);setcolor(10);bar(left,top,right,bottom);outtextxy(left+5,top+3,zzs);outtextxy(left+right)/2+5,top+3,zza);circle(right£top+3,2);/*实现人机对抗的函数*/voidFire(
15、inta4,double*v,double*angle,intn)/*a数组存放对射的两点,v和angle存放机器射击的角度和速度,n表式机器射击的准确度*/intt;doublevx,vy;doublesx,sy;intm;m=12*4/n;randomize();m=random(m)-m/2;t=20;sx=(double)(a2-a0);sy=(double)(a3-al);vx=sx/(double)(t);vy=(sy-0.5*PI*(double)(t*t)/(double)(t);*angle=atan(-vy)/vx);*v=sqrt(vx*vx+vy*vy);*v=(*v)
16、*(AMD2+0.01*(double)(m);AngleSpeed(*ang;/*绘制生命线的函数*/voidLifePicture(intlifejntcolor,intlocation)charlm5;intl,t/Gb;1=50;t=20;r=l+200;b=t+10;numtostr(lifejm);setfillstyle(l,color);setcolor(15);if(location=l11location=3)bar(l,t,r,b);setfillstyle(l,4);bar(l,t+(b-t)/4,l+life,t+3*(b-t)/4);setfillstyle(l,c
17、olor);bar(r+10,t,r+50,b);outtextxy(r+10+5,t+2,lm);else1=320+50;r=l+200;bar(l,t,r,b);setfillstyle(l,4);bar(l,t+(b-t)/4,l+life,t+3*(b-t)/4);setfillstyle(l,color);bar(r+10,t,r+50,b);outtextxy(r+10+5,t+2,lm);/*绘制小屋的函数*/voidRenPicture(intx,inty,intcolor)setcolor(color);setwritemode(1);line(x,y40,x10,y30)
18、;/*画头*/line(x,y-40,x+10,y-30);line(x-10,y-30,x+10,y-30);line(x-5y30,x5,y10);/*画脖子*/line(x+5,y-30,x+5,y-10);line(x20,y-10,x+20,y-10);/*画身子*/line(x-20,y+10,x+20,y+10);line(x-20,y-10,x-20,y+10);line(x+20,y10,x+20,y+10);/*绘制箭的函数*/voidPictureBullets(intwx,intwyjnttx,intty)setcolor(RED);line(wx,wy,tx,ty);
19、line(wx-l,wy-l,tx,ty);line(wx+l,wy+l,tx,ty);/*绘制小屋上箭的函数*/voidInitialArrow(intx,inty,intc4)intaddx=0,addy=0;inta2,b2;intbowb=7;intbowx=2;doublebow=80.0;bow=bow/2;a0=x;al=Y;b0=x;bi=y;if(c0=c2)&&(cl=c3)addx=(c2-c0)/6;addy=(c3-cl)/6;PictureBullets(x+addx,y+addy,x-addx/4,y-addy/4);setcolor(bowb);
20、line(aO,al,bO,bl);setcolor(bowx);line(aO,al,x+addx,y+addy);line(bO,bl,x+addx,y+addy);elseaddx=(c2-c0)/6;addy=(c3-cl)/6;PictureBullets(x+addx,y+addy,x-addx/4,y-addy/4);if(addx=O&&addy!=O)aO=bO=x;al=y-(int)(bow);bl=y+(int)(bow);if(addxl=0&&addy=0)al=bl=y;a0=x-(int)(bow);b0=x+(int)(bow)
21、;if(addx!=0&&addyl=0)a0=x+(int)(bow*sqrt(double)(addy)*(double)(addy)/(double)(addx)*(double)(addx)+(double)(addy)*(double)(addy);al=y(aOx)*(addx)/addy;b0=x-(int)(bow*sqrt(double)(addy)*(double)(addy)/(double)(addx)*(double)(addx)+(double)(addy)*(double)(addy);bl=y-(b0-x)*(addx)/addy;setcolo
22、r(bowb);line(a0,al,b0,bl);setcolor(bowx);line(aO,al,x+addx,y+addy);line(bO,bl,x+addx,y+addy);/*判断点qx,qy在直线的什么位置*/intPointPlace(intqxjntqy,intxljntyl,intx2jnty2)/*返回0表示在直线上,当斜率存在时:1表示在直线的上面,2表示在直线的下面,当斜率不存在时:3表示在左面,4表示在右面*/ints;if(xl=x2)if(qx<xl)return3;elseif(qx>xl)return4;elsereturn0;elses=(i
23、nt)(double)(yl-y2)/(double)(xl-x2)*(double)(qx-xl)+(double)(yl);if(qy<s)return1;elseif(qy>s)return2;elsereturn0;/*根据两点坐标计算出两点距离和向量(twoxy0-twoxy2,twoxyltwoxy)与(vectorx,vectory)的夹角。*/voidDistanceAngle(inttwoxy4,intvectorxjntvectory,double*distance,double*angle)doublea,b;doubles;if(twoxy0=twoxy2)
24、&&twoxyl=twoxy3)*distance=0;*angle=O;elseb=(double)(double)(twoxy3-twoxyl)*(double)(twoxy3-twoxyl)+(double)(twoxy2-twoxy0)*(double)(twoxy2-twoxy0);b=sqrt(b);*distance=b;s=(double)(double)(vectorx)*(double)(vectorx)+(double)(vectory)*(double)(vectory);s=sqrt(s);a=(double)(double)(twoxy0-twoxy
25、2)*(double)(vectorx)+(double)(twoxyl-twoxy3)*(double)(vectory);a=a/(b*s);a=acos(a);if(twoxy3>=twoxyl)*angle=a;else*angle=a+(PIa)*2;/*由速度角度算sx,sy随时间的变化*/voidRelativePosition(int*sx,int*sy,doublev,doubleangle,doublet)*sx=(int)(v*cos(angle)*t);*sy=(int)(v*sin(angle)*t0.5*G*t*t);/*用鼠标画一条直线,把直线的两点坐标放在
26、twoxy数组内。*/voidTwoPoints(inttwoxy4,intdx,intdy)intizq=l;doublespeed=0.0,angle=0.0;twoxy0=0;twoxyl=0;setcolor(13);line(0,dy,640,dy);setcolor;MouseOn。;/*显示鼠标*/setwritemode(1);i=0;while(q)if(i=l)MouseOff();DistanceAngle(twoxy,l/0;&speed,&angle);AngleSpeed(speed/AMDl,angle);InitialArrow(dx,dy,tw
27、oxy);setcolor;line(twoxy0,twoxyl,twoxy2,twoxy3);MouseOn();if(twoxy2!=MouseX)11(twoxy3!=MouseY)twoxy2=MouseX;twoxy3=MouseY;/*PointCircle(twoxy0,twoxyl,50,&(twoxy2),&(twoxy3);*/l/louseOff();DistanceAngle(twoxy,l/0;&speed,&angle);AngleSpeed(speed/AMDl,angle);InitialArrow(dx,dy,twoxy);se
28、tcolor;line(twoxy0,twoxyl,twoxy2,twoxy3);MouseOn();if(MouseStatus()sound(1000);/*响声函数*/delay(100);nosound();delay(1000);delay(1000);delay(1000);delay(1000);if(i=0)twoxy0=MouseX;twoxyl=MouseY;twoxy2=MouseX;twoxy3=MouseY;i=l;elseMouseOff();DistanceAngle(twoxy,l,0,&speed,&angle);AngleSpeed(spee
29、d/AMDI,angle);InitialArrow(dx,dy,twoxy);setcolor;line(twoxy0,twoxyl,twoxy2,twoxy3);setcolor(13);line(0,dy,640,dy);q=o;>=0;/*发射箭,speedl和speed2控制速度,返回中弹位置*/intLaunch(intlx,intly,inttxjntty,inthm,intgrade)doublespeedl=0.01;intspeed2=1000;inta4;intxx2,xy2;doubles=0.0,angle=0.0,t=0.0;lx=lx;ly=ly-40;if
30、(hm=3)a0=lx;ai=iy;a2=tx;a3=ty;Fire(a,&s,&angle,grade);elseTwoPoints(a,lx,ly);DistanceAngle(a,l,O,&s,&angle);s=s/AMDl;RelativePosition(&xx0,&xy0,s,angle,t-1);RelativePosition(&xxl,&xyl,s,angle,t);for(t=0.0;ly-xyl<480;t=t+speedl)RelativePosition(&xx0,&xy0,s,a
31、ngle,t-l);RelativePosition(&xxl,&xyl,s,angle,t);if(PointPlace(lx+xxl,ly-xyl,tx,ty-40,tx+10,ty-30)=2&&PointPlace(lx+xxl,ly-xyl,tx,ty-40,tx-10,ty-30)=2&&PointPlace(lx+xxlJy-xyl,tx-10,ty-30,tx+10,ty-30)=l)sound(4000);/*响声函数*/delay(100);nosound();returnl;if(PointPlace(lx+xxl,ly-x
32、yl,tx-5,ty-30,tx+5,ty-30)=2&&PointPlace(lx+xxlJy-xyl,tx-5,ty-10,tx+5,ty-10)=l&&PointPlace(lx+xxlJy-xyl,tx-5,ty-30,tx-5,ty-10)=4&&PointPlace(lx+xxl,ly-xyl,tx+5,ty-30,tx+5,ty-10)=3)sound(3000);/*响声函数*/delay(100);nosound();return2;if(PointPlace(lx+xxl,ly-xyl,tx-20,ty-10,tx-20,ty
33、+10)=4&&PointPlace(lx+xxl,ly-xyl,tx+20,ty-10,tx+20,ty+10)=3&&RointRlace(lx+xxlJy-xyl,tx-20,ty-10,tx+20,ty-10)=2&&PointPlace(lx+xxlJy-xyl,tx-20,ty+10,tx+20,ty+10)=l)sound(2000);/*响声函数*/delay(100);nosound();return3;if(ly-xyl<l)delay(speed2);continue;if(lx+xxl<l11lx+xxl>
34、;640-l)return0;PictureBullets(lx+xx0,ly-xyOJx+xxl,ly-xyl);delay(speed2);PictureBullets(lx+xxOJy-xyO,lx+xxl,ly-xyl);return0;/*小屋移动的函数*/intMoveRen(structRen*p)inta,k=19200,b=0,d;intq=l;randomize();for(;q;)if(b=l)p->lr=3;RenPicture(p->x,p->y,p->color);if(p->lr=3)b=l;delay(100);delay(100)
35、;delay(100);delay(100);delay(100);delay(100);/sleep(1);d=random(10);if(d=0)k=19200;if(d=l)k=19712;if(d=2)k=18432;if(d=3)k=20480;if(d=4)k=7181;p->lr=l;elsek=bioskey(0);RenPicture(p->x,p->y,p->color);switch(k)case19200:/*按向左键*/a=(p->x)-5;if(p->lr=l)if(a>Ll&&a<Rl)p->x
36、=a;break;elseif(a>640-Rl&&a<640-Ll)p->x=a;break;break;case19712:/*按向右键*/a=(p->x)+5;if(p->lr=l)if(a>Ll&&a<Rl)p->x=a;break;elseif(a>640-Rl&&a<640-Ll)p->x=a;break;break;case18432:/*按向上键*/a=(p->y)-5;if(p->lr=l)if(a>Tl&&a<Bl)p-&
37、gt;y=a;break;elseif(a>Tl&&a<Bl)p->y=a;break;break;case20480:/*按向下键*/a=(p->y)+5;if(a>Tl&&a<Bl)p->y=a;break;case7181:/*enter键的扫描码*/if(b=l)p->lr=3;q=o;break;case283:return0;RenPicture(p->x,p->y,p->color);return1;/*游戏开始前画面*/intGameStar。/*返回1表示单人游戏初级,2表示单人
38、游戏中级,3表示单人游戏高级,4表示两人对战,5表示退出游戏*/intq,k,h=0;for(;l;)q=l;cleardevice。;/*清屏函数*/setcolor(15);settextstyle(0,0,5);outtextxy(100,100,"StartGame!");settextstyle(O,O,l);outtextxy(20,300/'keysused:");Arrow keys");The left mouse button");Enter");Esc to Quit!");outtextxy(
39、20,300,"outtextxy(20,310,"outtextxy(20,320,"outtextxy(20,330,"setcolor;outtextxy(250,400,"0neplayer!");outtextxy(250,420,"Twoplayers!");outtextxy(250,440,"Quit!");setwritemode(1);setcolor;rectangle(245,395+h*20,345,415+h*20);for(;q;)setcolor(6);k=bio
40、skey(0);sound(1000);/*响声函数*/delay(100);nosound();if(k=20480)rectangle(245,395+h*20,345,415+h*20);h=(h+l)%3;rectangle(245,395+h*20,345,415+h*20);elseif(k=7181)if(h=0)/*单人游戏,选择等级*/cleardevice();/*清屏函数*/setcolor;outtextxy(20,30,"Esctoback!");outtextxy(250,240,"Lower");outtextxy(250,
41、260JMiddle“);outtextxy(250,280JHigher“);setcolor;rectangle(245,235+h*20,300,255+h*20);for(;q;)k=bioskey(0);sound(1000);/*响声函数*/delay(100);nosound();if(k=20480)rectangle(245,235+h*20,300,255+h*20);h=(h+l)%3;rectangle(245,235+h*20,300,255+h*20);elseif(k=7181)returnh+1;elseif(k=283)h=0;k=l;q=o;break;el
42、seif(h=l)/*两人对抗*/return4;if(h=2)/*退出游戏*/return5;elseif(k=283)return5;else/*退出游戏画面*/voidGameOver()cleardevice();/*清屏函数*/setcolor(14);settextstyIe(0,0,6);outtextxy(100,200,"GameOver!");settextstyle(l,O,l);outtextxy(400,400,"Producer:Chen");outtextxy(400,410,"QQ:7");outtex
43、txy(400,420,"Time:2010.5.28");/*主函数*/voidmain()intgd=DETECT,gm;intq=0,schoose=l;intout=l;intpmc=l;intcla2s=l;structRenrenl,ren2;/*registerbgidriver(EGAVGA_driver);*/initgraph(&gd,&gm,"");cleardevice。;/*清屏函数*/MouseMath。;/*计算鼠标形状,一开始必须使用,后面就不用了*/MouseSetY(0,479);MouseSetX(0,649);MouseSetXY(100,100);for(;out;)pmc=GameStar();cleardevice。;/*清屏函数*/settextstyle(l,O,l);/*初始化*/schoose=l;ren2,x=540;ren2.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司电商活动策划方案
- 公司职员会议活动方案
- 可摘义齿固位技术-洞察及研究
- 2025年供热通风与空调工程师考试试题及答案
- 2025年法律与生物伦理的考试试题及答案
- 2025年中国类人胶原蛋白行业市场全景分析及前景机遇研判报告
- 2024年度浙江省护师类之主管护师典型题汇编及答案
- 公寓防火安全教育
- 员工入职三级安全培训
- DB43-T 2864-2023 土家族非遗乐器咚咚喹通.用技术要求
- 2023年黑龙江省文化和旅游系统事业单位人员招聘笔试模拟试题及答案解析
- 2023年江西新余市数字产业投资发展有限公司招聘笔试题库含答案解析
- LY/T 3323-2022草原生态修复技术规程
- 部编版六年级语文下册课件第1课《北京的春节》《腊八粥》
- 涂装工模拟练习题含答案
- 2023-2024学年河南省永城市小学数学二年级下册期末评估测试题
- 乳腺疾病的超声诊断 (超声科)
- 服务精神:马里奥特之路
- 《建筑施工安全检查标准》JGJ59-2011图解
- 华为大学人才培养与发展实践
- 医疗垃圾废物处理课件
评论
0/150
提交评论