/*簡單潛艇大戰
全局變量speed一開始需要調整,大家的速度不同
主要練習下這個游戲的基本算法,用簡單的圖形來模擬
----跳蚤偵察-------
*/
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#include <graphics.h>
#define KEY_ESC 0x01
#define KEY_SPACE 0x39
#define KEY_LEFT 0x4b
#define KEY_RIGHT 0x4d
int speed=10000;
char key_state[128],key_pressed[128];/*鍵盤操作用的變量*/
int score=0;/*得分*/
char scorestr[10];/*輸出分數的變量*/
strUCt Fire/*子彈的結構體*/
{
int x;
int y;
int start;/*是否發射炮彈*/
}amyfire[6];/*屏幕上最多有5個敵人可以發子彈*/
struct Play/*玩家的結構體*/
{
int x;
int y;
struct Fire fire[6];
life;
}play;
struct Amy/*敵人的結構體*/
{
int x;
int y;
int speed;/*敵人的速度*/
int color;
int direction;
life;
}amy[6];
void InitGraph(void);/*圖形初始化*/
void CloseGraph(void);/*圖形結束*/
void GamePlay(void);/*具體玩游戲*/
void DrawPlay(void);/*畫玩家*/
void DrawAmy(int i);/*畫敵人*/
void DrawFire(int x,int y,int n);/*畫子彈,0去除,1顯示*/
void DrawAmyFire(int x,int y,int n);/*畫子彈,0去除,1顯示*/
void DrawBlack(int x,int y,int color);/*去除原來地方的物體*/
void PrScore();/*輸出得分*/
int GetKey(int ScanCode);/*這裡開始都是按鍵函數*/
void interrupt far (*OldInt9Handler)();
void far interrupt NewInt9();
void InstallKeyboard();
void ShutDownKeyboard();
void main(void)
{
InitGraph();/*圖形初始化*/
GamePlay();/*具體玩游戲*/
CloseGraph();/*圖形結束*/
}
void InitGraph(void)/*圖形初始化*/
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c: c");
cleardevice();
InstallKeyboard();
}
void DrawPlay(void)/*畫玩家*/
{
setfillstyle(SOLID_FILL,6);
bar(play.x-20,play.y-10,play.x+20,play.y);
setfillstyle(SOLID_FILL,4);
bar(play.x-20,play.y-10,play.x-10,play.y);
}
void DrawAmy(int i)/*畫敵人*/
{
setfillstyle(SOLID_FILL,amy[i].color);
bar(amy[i].x-20,amy[i].y-10,amy[i].x+20,amy[i].y);
setfillstyle(SOLID_FILL,GREEN);
if(amy[i].direction==1)
bar(amy[i].x-20,amy[i].y-10,amy[i].x-10,amy[i].y);
else
bar(amy[i].x+10,amy[i].y-10,amy[i].x+20,amy[i].y);
}
void DrawBlack(int x,int y,int color)/*去除原來地方的物體*/
{
setfillstyle(SOLID_FILL,color);
bar(x-20,y-10,x+20,y);
}
void DrawFire(int x,int y,int n)/*畫子彈,0去除,1顯示*/
{
if(n==0)
setfillstyle(SOLID_FILL,BLUE);
else
setfillstyle(SOLID_FILL,0);
setcolor(BLUE);
fillellipse(x,y,5,5);
}
void DrawAmyFire(int x,int y,int n)/*畫子彈,0去除,1顯示*/
{
if(n==0)
setfillstyle(SOLID_FILL,BLUE);
else
setfillstyle(SOLID_FILL,YELLOW);/*敵人的炮彈是黃的*/
setcolor(BLUE);
fillellipse(x,y,3,3);
}
void PrScore()/*輸出得分*/
{
setfillstyle(SOLID_FILL,8);/*把原來分數去除*/
bar(30,0,200,40);
setcolor(11);/*輸出新得分*/
settextstyle(0,0,2);
sprintf(scorestr,"%d",score);
outtextxy(30,20,scorestr);
}
void GamePlay(void)/*具體玩游戲*/
{
int i,j;
setfillstyle(SOLID_FILL,BLUE);
bar(0,100,640,480);
setfillstyle(SOLID_FILL,8);
bar(0,0,640,99);
play.x=200;play.y=99;/*玩家初始位置*/
for(i=0;i<6;i++)
{
play.fire[i].start=0;/*一開始的子彈都為沒發射狀態*/
amyfire[i].start=0;
amy[i].life=0;
}
play.life=1;
DrawPlay();/*玩家初始位置*/
PrScore();/*輸出得分*/
randomize();
while(1)
{
for(i=0;i<6;i++)/*查找玩家是否有發射的子彈*/
{
if(play.fire[i].start==1)/*發射的子彈*/
{
DrawFire(play.fire[i].x,play.fire[i].y,0);/*去除原來子彈位置*/
play.fire[i].y+=3;
DrawFire(play.fire[i].x,play.fire[i].y,1);/*顯示新位置*/
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)/*擊中敵人*/
{
play.fire[i].start=0;/*子彈消失*/
amy[j].life=0;/*敵人生命結束*/
score+=10;/*得分增加*/
DrawFire(play.fire[i].x,play.fire[i].y,0);/*去除原來子彈位置*/
DrawBlack(amy[j].x,amy[j].y,BLUE);/*去除敵人*/
PrScore();
}
if(play.fire[i].y>480)/*子彈超出屏幕就等於消失*/
{
play.fire[i].start=0;
DrawFire(play.fire[i].x,play.fire[i].y,0);
}
}
}
for(i=0;i<6;i++)/*敵人炮彈的產生*/
{
if(amy[i].life==1&&amy[i].color<14&&amyfire[i].start==0)/*敵人發射炮彈的條件*/
{
amyfire[i].start=1;
amyfire[i].x=amy[i].x;
amyfire[i].y=amy[i].y-10;
}
}
for(i=0;i<6;i++)/*敵人炮彈移動以及移動*/
{
if(amyfire[i].start==1)/*子彈存在*/
{
DrawAmyFire(amyfire[i].x,amyfire[i].y,0);
amyfire[i].y-=2;
DrawAmyFire(amyfire[i].x,amyfire[i].y,1);/*畫敵人炮彈新位置*/
}
if(amyfire[i].x>(play.x-14)&&amyfire[i].x<(play.x+14)&&(amyfire[i].y+3)<100)/*擊中玩家*/
{
play.life=0;
amyfire[i].start=0;
DrawAmyFire(amyfire[i].x,amyfire[i].y,0);
DrawBlack(play.x,play.y,8);/*去除玩家*/
break;
}
if(amyfire[i].y<96)/*敵人炮彈超出海洋就消失*/
{
amyfire[i].start=0;
setfillstyle(SOLID_FILL,8);
setcolor(8);
fillellipse(amyfire[i].x,amyfire[i].y,3,3);
}
}
delay(speed);/*間隔時間可以自己定*/
if(play.life!=1)/*玩家被擊中*/
break;
for(i=0;i<6;i++)
{
if(amy[i].life==0)/*出現一個敵人後就跳出循環*/
{
amy[i].life=1;
amy[i].color=rand()%4+10;/*敵人的顏色*/
amy[i].y=rand()%300+130;/*高度隨機*/
amy[i].speed=2+rand()%10;/*敵人的移動速度隨機*/
amy[i].direction=rand()%2;/*敵人的移動方向,0左邊,1右邊出來*/
if(amy[i].direction==0)
amy[i].x=-20;
else
amy[i].x=660;
break;
}
}
if(GetKey(KEY_ESC))/*退出鍵*/
break;
if(GetKey(KEY_SPACE))/*發射*/
{
for(i=0;i<6;i++)
if(play.fire[i].start==0)/*發射一顆子彈後跳出循環*/
{
play.fire[i].x=play.x;
play.fire[i].y=105;
play.fire[i].start=1;
break;
}
}
if(GetKey(K