用c語言編的射箭游戲代碼_第1頁
用c語言編的射箭游戲代碼_第2頁
用c語言編的射箭游戲代碼_第3頁
用c語言編的射箭游戲代碼_第4頁
用c語言編的射箭游戲代碼_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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、*/*修訂數(shù)7.8*/*修訂數(shù)*/#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);/*鼠標狀態(tài)值初始化*/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;*/*把一個數(shù)字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);/*實現(xiàn)人機對抗的函數(shù)*/voidFire(

15、inta4,double*v,double*angle,intn)/*a數(shù)組存放對射的兩點,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;/*繪制生命線的函數(shù)*/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);/*繪制小屋的函數(shù)*/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);/*繪制箭的函數(shù)*/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);/*繪制小屋上箭的函數(shù)*/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;/*根據(jù)兩點坐標計算出兩點距離和向量(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數(shù)組內。*/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);/*響聲函數(shù)*/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;/*發(fā)射箭,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);/*響聲函數(shù)*/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);/*響聲函數(shù)*/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);/*響聲函數(shù)*/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;/*小屋移動的函數(shù)*/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表示兩人對戰(zhàn),5表示退出游戲*/intq,k,h=0;for(;l;)q=l;cleardevice。;/*清屏函數(shù)*/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);/*響聲函數(shù)*/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();/*清屏函數(shù)*/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);/*響聲函數(shù)*/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();/*清屏函數(shù)*/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");/*主函數(shù)*/voidmain()intgd=DETECT,gm;intq=0,schoose=l;intout=l;intpmc=l;intcla2s=l;structRenrenl,ren2;/*registerbgidriver(EGAVGA_driver);*/initgraph(&gd,&gm,"");cleardevice。;/*清屏函數(shù)*/MouseMath。;/*計算鼠標形狀,一開始必須使用,后面就不用了*/MouseSetY(0,479);MouseSetX(0,649);MouseSetXY(100,100);for(;out;)pmc=GameStar();cleardevice。;/*清屏函數(shù)*/settextstyle(l,O,l);/*初始化*/schoose=l;ren2,x=540;ren2.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論