用c编的简单潜艇大战
*简单潜艇大战<br> 全局变量speed一开始需要调整,大家的速度不同<br> 主要练习下这个游戏的基本算法,用简单的图形来模拟<br> ----跳蚤侦探-------<br>*/<br>#include <graphics.h><br>#include <stdlib.h><br>#include <dos.h><br>#include <graphics.h><br>#define KEY_ESC 0x01<br>#define KEY_SPACE 0x39<br>#define KEY_LEFT 0x4b<br>#define KEY_RIGHT 0x4d<br>int speed=10000;<br>char key_state[128],key_pressed[128];/*键盘操作用的变量*/<br>int score=0;/*得分*/<br>char scorestr[10];/*输出分数的变量*/<br>struct Fire/*子弹的结构体*/<br>{<br> int x;<br> int y;<br> int start;/*是否发射炮弹*/<br>}amyfire[6];/*屏幕上最多有5个敌人可以发子弹*/<br>struct Play/*玩家的结构体*/<br>{<br> int x;<br> int y;<br> struct Fire fire[6];<br> life;<br>}play;<br>struct Amy/*敌人的结构体*/<br>{<br> int x;<br> int y;<br> int speed;/*敌人的速度*/<br> int color;<br> int direction;<br> life;<br>}amy[6];<br>void InitGraph(void);/*图形初始化*/<br>void CloseGraph(void);/*图形结束*/<br>void GamePlay(void);/*具体玩游戏*/<br>void DrawPlay(void);/*画玩家*/<br>void DrawAmy(int i);/*画敌人*/<br>void DrawFire(int x,int y,int n);/*画子弹,0去除,1显示*/<br>void DrawAmyFire(int x,int y,int n);/*画子弹,0去除,1显示*/<br>void DrawBlack(int x,int y,int color);/*去除原来地方的物体*/<br>void PrScore();/*输出得分*/<br>int GetKey(int ScanCode);/*这里开始都是按键函数*/<br>void interrupt far (*OldInt9Handler)();<br>void far interrupt NewInt9();<br>void InstallKeyboard();<br>void ShutDownKeyboard();<br>void main(void)<br>{<br> InitGraph();/*图形初始化*/<br> GamePlay();/*具体玩游戏*/<br> CloseGraph();/*图形结束*/<br>}<br>void InitGraph(void)/*图形初始化*/<br>{<br> int gd=DETECT,gm;<br> initgraph(&gd,&gm,"c:\\tc");<br> cleardevice();<br> InstallKeyboard();<br>}<br>void DrawPlay(void)/*画玩家*/<br>{<br> setfillstyle(SOLID_FILL,6);<br> bar(play.x-20,play.y-10,play.x+20,play.y);<br> setfillstyle(SOLID_FILL,4);<br> bar(play.x-20,play.y-10,play.x-10,play.y);<br>}<br>void DrawAmy(int i)/*画敌人*/<br>{<br> setfillstyle(SOLID_FILL,amy[i].color);<br> bar(amy[i].x-20,amy[i].y-10,amy[i].x+20,amy[i].y);<br> setfillstyle(SOLID_FILL,GREEN);<br> if(amy[i].direction==1)<br> bar(amy[i].x-20,amy[i].y-10,amy[i].x-10,amy[i].y);<br> else<br> bar(amy[i].x+10,amy[i].y-10,amy[i].x+20,amy[i].y);<br>}<br>void DrawBlack(int x,int y,int color)/*去除原来地方的物体*/<br>{<br> setfillstyle(SOLID_FILL,color);<br> bar(x-20,y-10,x+20,y);<br>}<br>void DrawFire(int x,int y,int n)/*画子弹,0去除,1显示*/<br>{<br> if(n==0)<br> setfillstyle(SOLID_FILL,BLUE);<br> else<br> setfillstyle(SOLID_FILL,0);<br> setcolor(BLUE);<br> fillellipse(x,y,5,5);<br>}<br>void DrawAmyFire(int x,int y,int n)/*画子弹,0去除,1显示*/<br>{<br> if(n==0)<br> setfillstyle(SOLID_FILL,BLUE);<br> else<br> setfillstyle(SOLID_FILL,YELLOW);/*敌人的炮弹是黄的*/<br> setcolor(BLUE);<br> fillellipse(x,y,3,3);<br>}<br>void PrScore()/*输出得分*/<br>{<br> setfillstyle(SOLID_FILL,8);/*把原来分数去除*/<br> bar(30,0,200,40);<br> setcolor(11);/*输出新得分*/<br> settextstyle(0,0,2);<br> sprintf(scorestr,"%d",score);<br> outtextxy(30,20,scorestr);<br>}<br>void GamePlay(void)/*具体玩游戏*/<br>{<br> int i,j;<br> setfillstyle(SOLID_FILL,BLUE);<br> bar(0,100,640,480);<br> setfillstyle(SOLID_FILL,8);<br> bar(0,0,640,99);<br> play.x=200;play.y=99;/*玩家初始位置*/<br> for(i=0;i<6;i++)<br> {<br> play.fire[i].start=0;/*一开始的子弹都为没发射状态*/<br> amyfire[i].start=0;<br> amy[i].life=0;<br> }<br> play.life=1;<br> DrawPlay();/*玩家初始位置*/<br> PrScore();/*输出得分*/<br> randomize();<br> while(1)<br> {<br> for(i=0;i<6;i++)/*查找玩家是否有发射的子弹*/<br> {<br> if(play.fire[i].start==1)/*发射的子弹*/<br> {<br> DrawFire(play.fire[i].x,play.fire[i].y,0);/*去除原来子弹位置*/<br> play.fire[i].y+=3;<br> DrawFire(play.fire[i].x,play.fire[i].y,1);/*显示新位置*/<br> for(j=0;j<6;j++)/*判断子弹是否击中敌人*/ if(play.fire[i].x>(amy[j].x-22)&&play.fire[i].x<(amy[j].x+22)&&play.fire[i].y>(amy[j].y-14)&&play.fire[i].y<amy[j].y+5)/*击中敌人*/<br> {<br> play.fire[i].start=0;/*子弹消失*/<br> amy[j].life=0;/*敌人生命结束*/<br> score+=10;/*得分增加*/<br> DrawFire(play.fire[i].x,play.fire[i].y,0);/*去除原来子弹位置*/<br> DrawBlack(amy[j].x,amy[j].y,BLUE);/*去除敌人*/<br> PrScore();<br> }<br> if(play.fire[i].y>480)/*子弹超出屏幕就等于消失*/<br> {<br> play.fire[i].start=0;<br> DrawFire(play.fire[i].x,play.fire[i].y,0);<br> }<br> }<br> }<br> for(i=0;i<6;i++)/*敌人炮弹的产生*/<br> {<br> if(amy[i].life==1&&amy[i].color<14&&amyfire[i].start==0)/*敌人发射炮弹的条件*/<br> {<br> amyfire[i].start=1;<br> amyfire[i].x=amy[i].x;<br> amyfire[i].y=amy[i].y-10;<br> }<br> }<br> for(i=0;i<6;i++)/*敌人炮弹移动以及移动*/<br> {<br> if(amyfire[i].start==1)/*子弹存在*/<br> {<br> DrawAmyFire(amyfire[i].x,amyfire[i].y,0);<br> amyfire[i].y-=2;<br> DrawAmyFire(amyfire[i].x,amyfire[i].y,1);/*画敌人炮弹新位置*/<br> }<br> if(amyfire[i].x>(play.x-14)&&amyfire[i].x<(play.x+14)&&(amyfire[i].y+3)<100)/*击中玩家*/<br> {<br> play.life=0;<br> amyfire[i].start=0;<br> DrawAmyFire(amyfire[i].x,amyfire[i].y,0);<br> DrawBlack(play.x,play.y,8);/*去除玩家*/<br> break;<br> }<br> if(amyfire[i].y<96)/*敌人炮弹超出海洋就消失*/<br> {<br> amyfire[i].start=0;<br> setfillstyle(SOLID_FILL,8);<br> setcolor(8);<br> fillellipse(amyfire[i].x,amyfire[i].y,3,3);<br> }<br> }<br> delay(speed);/*间隔时间可以自己定*/<br> if(play.life!=1)/*玩家被击中*/<br> break;<br> for(i=0;i<6;i++)<br> {<br> if(amy[i].life==0)/*出现一个敌人后就跳出循环*/<br> {<br> amy[i].life=1;<br> amy[i].color=rand()%4+10;/*敌人的颜色*/<br> amy[i].y=rand()%300+130;/*高度随机*/<br> amy[i].speed=2+rand()%10;/*敌人的移动速度随机*/<br> amy[i].direction=rand()%2;/*敌人的移动方向,0左边,1右边出来*/<br> if(amy[i].direction==0)<br> amy[i].x=-20;<br> else<br> amy[i].x=660;<br> break;<br> }<br> }<br> if(GetKey(KEY_ESC))/*退出键*/<br> break;<br> if(GetKey(KEY_SPACE))/*发射*/<br> {<br> for(i=0;i<6;i++)<br> if(play.fire[i].start==0)/*发射一颗子弹后跳出循环*/<br> {<br> play.fire[i].x=play.x;<br> play.fire[i].y=105;<br> play.fire[i].start=1;<br> break;<br> }<br> }<br> if(GetKey(K <br><br>
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助