?? display.c
字號(hào):
/*-----------------------------Display.c-------------------------------*/
/*------------------動(dòng)畫(huà)演示文件----------------------------*/
/*------------初始化圖形界面--------------------------*/
void InitGraph()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\tc\tc");
}
/*------------畫(huà)大本營(yíng)標(biāo)志--------------*/
void DrawEagle()
{
int i=6;
int x,y;
x=emp.x; y=emp.y;
setcolor(CYAN);
moveto(x-i/2,y-5*i);
lineto(x-i/2,y-i/2);
lineto(x-6*i,y-5*i);
lineto(x-3*i,y+2.5*i);
lineto(x-i,y+2*i);
lineto(x-i/2,y+2*i);
lineto(x-i/2,y+3.5*i);
lineto(x-2*i,y+5*i);
lineto(x-i/2,y+4.5*i);
lineto(x-i/2,y+5*i);
lineto(x+i/2,y+5*i);
lineto(x+i/2,y+4.5*i);
lineto(x+2*i,y+5*i);
lineto(x+i/2,y+3.5*i);
lineto(x+i/2,y+2*i);
lineto(x+i,y+2*i);
lineto(x+3*i,y+2.5*i);
lineto(x+6*i,y-5*i);
lineto(x+i/2,y-i/2);
lineto(x+i/2,y-4*i);
lineto(x+i,y-4*i);
lineto(x-i/2,y-5*i);
lineto(x-i/2,y-i/2);
setfillstyle(1,CYAN);
floodfill(x,y,CYAN);
}
/*--------------畫(huà)炮臺(tái)--------------------------------*/
void Emplacement()
{
int x1,y1;
emp.x=rect.left+rect.width/2,emp.y=rect.bottom-31; /*設(shè)置炮臺(tái)中心位置*/
emp.width=60,emp.lenth=40; /*設(shè)置炮臺(tái)大小*/
emp.color=YELLOW; /*炮臺(tái)邊框顏色*/
setfillstyle(1,0);
bar(emp.x-emp.width,emp.y-emp.lenth,emp.x+emp.width,emp.y+emp.lenth); /*先清除這片區(qū)域的背景*/
setcolor(emp.color);
rectangle(emp.x-emp.width,
emp.y-emp.lenth,
emp.x+emp.width,
emp.y+emp.lenth);
rectangle(emp.x-emp.width+10,
emp.y-emp.lenth+10,
emp.x+emp.width-10,
emp.y+emp.lenth-10);
setfillstyle(1,LIGHTGRAY);
floodfill(emp.x-emp.width+1,emp.y-emp.lenth+1,emp.color);
/*填充兩個(gè)矩形框之間的部分*/
DrawEagle();
}
/*--------------將整型轉(zhuǎn)化為字符型--------------------*/
void ShowInt(int data,int x,int y)
{
char *s;
sprintf(s,"%d",data);
outtextxy(x,y,s);
}
/*--------------畫(huà)坦克--------------------------------*/
void DrawTank(struct Target T,int Tcolor,int GunColor)
{
int i,j;
int x=T.x,y=T.y,r=T.r,d,t;
d=r/4;t=d*0.6;
setcolor(Tcolor);
/*------------------*/
line(x-r,y,x+r-t,y);
line(x-r,y,x-r+d,y+2*d);
line(x-r+d,y+2*d,x+3*d,y+2*d);
line(x+3*d,y+2*d,x+r-t,y);
/*----------------------*/
line(x-r,y,x-r+t,y-t);
line(x-r+t,y-t,x-2*d,y-t);
line(x-2*d,y-t,x-2*d+t,y-d-t);
line(x-2*d+t,y-d-t,x-3*d,y-d-t);
line(x-3*d,y-d-t,x-3*d+t,y-2*d);
line(x-3*d+t,y-2*d,x+r-t,y-2*d);
line(x+r-t,y-2*d,x+r-t,y);
/*---------------------------*/
line(x-3*d,y-d-t,x-2*d,y-t);
/*------------------------*/
line(x-r+d-t,y+2*(d-t),x+3*d+r*0.04,y+2*(d-t));
for(i=0;i<2*(r/d-1);i++)
line(x-3*d+i*d,y+2*(d-t),x-3*d+i*d,y+2*d);
/*---------------------------------*/
setfillstyle(1,Tcolor);
bar(x-d*1.2,y-d*0.6,x+d*2,y-d*0.2);
line(x-d*1.2,y-d*0.6,x-d*0.6,y-d*1.8);
line(x-d*0.6,y-d*1.8,x+d*2.4,y-d*1.8);
line(x+d*2.4,y-d*1.8,x+d*2,y-d*0.6);
line(x+d*2.4,y-d*1.8,x+d*2.4,y-d*1.4);
line(x+d*2,y-d*0.2,x+d*2.4,y-d*1.4);
sector(x+d*0.6,y-d,0,180,d*1.2,d*1.4);
for(i=0;i<d*0.3;i++)
line(x+d*0.2,y-d*1.8+i,x-d*2.5,y-d*1.8+i);
setfillstyle(1,GunColor); /*用顏色GunColor畫(huà)炮頭*/
bar(x-d*3,y-d*1.9,x-d*2.3,y-d*1.3);
setcolor(Tcolor);
ShowInt(T.ID,x,y-3*d-t); /*顯示該坦克的編號(hào)*/
}
/*--------------演示背景框的繪制------------------*/
void DisplayBG()
{
int i;
clearviewport();
/*--------畫(huà)演示矩形框----------*/
setbkcolor(0);
setcolor(LIGHTGRAY);
rect.width=550;
rect.height=450;
rect.d=70;
rect.left=30;
rect.top=20;
rect.right=rect.left+rect.width;
rect.bottom=rect.top+rect.height;
rectangle(rect.left,rect.top,rect.right,rect.bottom);
rectangle(rect.left-10,rect.top-10,rect.right+10,rect.bottom+10);
setfillstyle(1,LIGHTGRAY);
floodfill(rect.left-1,rect.top-2,LIGHTGRAY);
/*--------畫(huà)炮臺(tái)----------------*/
Emplacement();
}
/*--------------------初始化目標(biāo)并顯示-------------------*/
void InitTarget()
{
int i,t;
randomize();
for(i=0;i<n;i++) /*給n輛坦克各成員變量預(yù)先賦初值*/
{
Tank[i].color=color[random(3)];
/*從預(yù)先定義的三種顏色中隨機(jī)產(chǎn)生一種賦給該坦克*/
Tank[i].r=20; /*坦克半徑均設(shè)為20(當(dāng)然也可設(shè)為不同的值)*/
Tank[i].x=rect.left+Tank[i].r+random(rect.width-2*Tank[i].r);
/*坦克初始x坐標(biāo)為在矩形框范圍內(nèi)一隨機(jī)的坐標(biāo)*/
Tank[i].y=rect.top+Tank[i].r+
random(rect.height-2*emp.lenth-2*Tank[i].r);
/*坦克y坐標(biāo)范圍為矩形框內(nèi)炮臺(tái)之上的任意值*/
Tank[i].ID=i+1; /*坦克標(biāo)識(shí)符ID值為從1號(hào)依次遞增*/
t=random(2);
/*隨機(jī)產(chǎn)生初始方向值。由于方向值沒(méi)有0,且關(guān)于0對(duì)稱,
因而采用如下方式來(lái)隨機(jī)產(chǎn)生*/
if(t==0)
Tank[i].direction=1+random(4); /*產(chǎn)生正的方向值*/
else
Tank[i].direction=0-(1+random(4)); /*產(chǎn)生負(fù)的方向值*/
DrawTank(Tank[i],Tank[i].color,RED); /*顯示該坦克*/
}
}
/*----------------畫(huà)初始星空背景------------------------*/
void DrawStarBG()
{
int i,pixel_x,pixel_y;
for(i=0;i<100;i++) /*初始狀態(tài)下共隨機(jī)產(chǎn)生100個(gè)點(diǎn)*/
{
do
{ /*在演示矩形框內(nèi)隨機(jī)產(chǎn)生坐標(biāo)點(diǎn)*/
pixel_x=rect.left+10+random(rect.width-20);
pixel_y=rect.top+10+random(rect.height-20);
}while((pixel_x>emp.x-emp.width) && (pixel_x<emp.x+emp.width)
&& (pixel_y>emp.y-emp.lenth));
/*如果產(chǎn)生的該坐標(biāo)位于大本營(yíng)區(qū)域內(nèi),則重新產(chǎn)生一個(gè)坐標(biāo),
直到位于大本營(yíng)區(qū)域外*/
putpixel(pixel_x,pixel_y,StarColor); /*在產(chǎn)生的坐標(biāo)處畫(huà)一個(gè)點(diǎn)*/
}
}
/*----------------在坐標(biāo)(x,y)處畫(huà)閃爍的星的圖案------------------------*/
void DrawShineStar(int x,int y,int i,int color)
{
setcolor(color);
line(x+i,y-i,x+4*i,y);
line(x+i,y-i,x,y-4*i);
line(x-i,y-i,x-4*i,y);
line(x-i,y-i,x,y-4*i);
line(x+i,y+i,x+4*i,y);
line(x+i,y+i,x,y+4*i);
line(x-i,y+i,x-4*i,y);
line(x-i,y+i,x,y+4*i);
}
/*----------------星空閃爍效果------------------------------*/
void Shine()
{
int i,r=2,x,y;
do
{ /*在演示矩形框內(nèi)隨機(jī)產(chǎn)生坐標(biāo)點(diǎn)*/
x=rect.left+10+random(rect.width-20);
y=rect.top+10+random(rect.height-20);
}while((x>emp.x-emp.width-15) && (x<emp.x+emp.width+15)
&& (y>emp.y-emp.lenth-15));
/*如果產(chǎn)生的該坐標(biāo)位于大本營(yíng)區(qū)域內(nèi),則重新產(chǎn)生一個(gè)坐標(biāo),
直到位于大本營(yíng)區(qū)域外*/
for(i=0;i<r;i++)
{
/*由小到大畫(huà)閃爍的星圖,i代表該圖的一個(gè)基本單位*/
DrawShineStar(x,y,i,StarColor);
delay(3000);
DrawShineStar(x,y,i,DisplayColor); /*延時(shí)后再將原星圖用背景色清除*/
}
for(i=r;i>=0;i--)
{
/*再?gòu)拇蟮叫‘?huà)閃爍的星圖*/
DrawShineStar(x,y,i,StarColor);
delay(3000);
DrawShineStar(x,y,i,DisplayColor);
}
/*閃爍之后在該坐標(biāo)處畫(huà)一個(gè)點(diǎn)*/
putpixel(x,y,StarColor);
}
/*-------決定當(dāng)前坦克是否按當(dāng)前方向值運(yùn)動(dòng),或是碰到邊框而須改變方向------*/
int IsXYValid(struct Target T,int x,int y)
{
int i;
if((x>rect.left+T.r) && (x<rect.right-T.r) &&
(y>rect.top+T.r) && (y<rect.bottom-T.r*5/6))
/*判斷嘗試改變后的坐標(biāo)如果位于演示矩形框內(nèi)*/
{
if((x+T.r<emp.x-emp.width) || (x-T.r>emp.x+emp.width) ||
(y+T.r<emp.y-emp.lenth)) /*如果未碰到大本營(yíng)邊框*/
{
/*則表示可以向該方向運(yùn)動(dòng),在這個(gè)新的位置畫(huà)出該坦克*/
return 1; /*函數(shù)返回1*/
}
else /*否則,如果碰到大本營(yíng)邊框,則函數(shù)返回0*/
return 0;
}
else /*否則,如果碰到演示矩形邊框,則函數(shù)返回0*/
return 0;
}
/*--------------鎖定目標(biāo)的效果-------------------------*/
int Lock(struct Target T)
{
int i,r=T.r,x,y;
int s;
char ch;
s=r/4;
for(i=0;i<3;i++)
circle(T.x,T.y,r+i);
line(T.x-r-2*s,T.y,T.x+r+2*s,T.y);
line(T.x,T.y-r-2*s,T.x,T.y+r+2*s);
line(T.x+r+2*s,T.y,T.x+r+2*s-5,T.y-5);
line(T.x+r+2*s,T.y,T.x+r+2*s-5,T.y+5);
line(T.x,T.y-r-2*s,T.x-5,T.y-r-2*s+5);
line(T.x,T.y-r-2*s,T.x+5,T.y-r-2*s+5);
while(1) /*顯示目標(biāo)閃爍效果,并等待用戶按鍵*/
{
if(kbhit())
{
ch=getch();
if(ch==Enter) return 1; /*如果按Enter鍵則開(kāi)始攻擊*/
if(ch==ESC) return 0; /*如果按ESC鍵則取消此次攻擊*/
}
DrawTank(Tank[best],DisplayColor,DisplayColor);
delay(30000);
DrawTank(Tank[best],Tank[best].color,LockColor);
delay(30000);
}
}
/*--------------繪制導(dǎo)彈---------------------------*/
void DrawMissile(int x,int y,int r,int color)
{
int i;
setcolor(color);
for(i=0;i<r;i++)
circle(x,y,i);
}
/*---------------攻擊效果-------------------------*/
void Attack(int x1,int y1,int x2,int y2,int color)
{
int i,size,trackColor,missileR,missileColor=WHITE;
int x,y;
void *buf;
x=x1;
y=y1;
missileR=5;
trackColor=BLUE;
setcolor(trackColor);
line(x1,y1,x2,y2);
if(y1==y2)
while(x!=x2)
{
size=imagesize(x-100,y-missileR,x+100,y+missileR);
buf=malloc(size);
getimage(x-100,y-missileR,x+100,y+missileR,buf);
DrawMissile(x,y,missileR,missileColor);
delay(3000);
putimage(x-100,y-missileR,buf,COPY_PUT);
if(x>x2)
x--;
else
x++;
free(buf);
}
else
while(y!=y2)
{
size=imagesize(x-100,y-missileR,x+100,y+missileR);
buf=malloc(size);
getimage(x-100,y-missileR,x+100,y+missileR,buf);
for(i=-50;i<=50;i++)
if(getpixel(x+i,y)==trackColor)
{
DrawMissile(x+i,y,missileR,missileColor);
delay(3000);
putimage(x-100,y-missileR,buf,COPY_PUT);
x=x+i;
break;
}
if(y>y2)
y--;
else
y++;
free(buf);
}
}
/*---------------爆炸效果----------------------------*/
void Blast(int x,int y,int r,int color)
{
int i,j;
for(i=0;i<r;i++)
{
for(j=0;j<i;j++)
{
DrawShineStar(x,y,j,color);
delay(3000);
DrawShineStar(x,y,j,DisplayColor);
}
delay(1000);
}
}
/*------顯示目標(biāo)全部清除-------------------*/
void ShowClear()
{
int x=150,y=150;
setfillstyle(1,WHITE);
bar(x,y,x+5,y+100);
setcolor(RED);
line(x,y+5,x,y+45);
line(x,y+5,x+70,y+45);
line(x,y+45,x+70,y+45);
setfillstyle(1,RED);
floodfill(x+1,y+20,RED);
settextstyle(0,0,5);
setcolor(WHITE);
outtextxy(x+100,y+50,"Clear!");
}
/*----------------動(dòng)畫(huà)演示函數(shù)--------------------------*/
int Display()
{
int i,t,x,y;
int count=0;
char ch;
DisplayBG();
Repeat:
DrawStarBG();
while(1)
{
if(kbhit()) /*如果用戶按Enter鍵則鎖定目標(biāo)*/
{
ch=getch();
if(ch==Enter)
break;
if(ch==ESC)
return 0;
}
/*以下是顯示星空閃現(xiàn)效果*/
count++; /*循環(huán)的次數(shù)*/
if((count=count%5)==0) /*如果循環(huán)次數(shù)正好是5的倍數(shù),則*/
{
if(random(5)==1) /*如果產(chǎn)生的隨機(jī)數(shù)恰好等于1*/
Shine(); /*那么閃爍一次*/
}
/*各目標(biāo)按照預(yù)定的當(dāng)前方向運(yùn)動(dòng)*/
for(i=0;i<n;i++)
{
l1:
x=Tank[i].x; /*首先保留原目標(biāo)的坐標(biāo)而用x,y代替*/
y=Tank[i].y;
switch(Tank[i].direction) /*根據(jù)當(dāng)前方向值來(lái)試著改變坐標(biāo)*/
{
/*以下是根據(jù)八個(gè)方向來(lái)改變坐標(biāo)值*/
case -1: x--;break; /*左*/
case 1: x++;break; /*右*/
case -2: y--;break; /*上*/
case 2: y++;break; /*下*/
case -3: x--; y--;break; /*左上*/
case 3: x++; y++; break; /*右下*/
case -4: x--; y++;break; /*左下*/
case 4: x++; y--;break; /*右上*/
default: break;
}
/*嘗試改變后,如果改變后的坐標(biāo)未超過(guò)邊界,則在新的坐標(biāo)處顯示該目標(biāo),
并擦去原坐標(biāo)點(diǎn)的目標(biāo)。同時(shí)將改變后的坐標(biāo)作為該目標(biāo)的新的當(dāng)前坐標(biāo)*/
if(IsXYValid(Tank[i],x,y)) /*如果坐標(biāo)合法,則在新的坐標(biāo)處畫(huà)該坦克*/
{
DrawTank(Tank[i],DisplayColor,DisplayColor);
Tank[i].x=x;
Tank[i].y=y;
DrawTank(Tank[i],Tank[i].color,GunColor);
delay(100);
}
else
{
/*否則,重新產(chǎn)生一個(gè)方向值,并返回根據(jù)新的方向值重新嘗試改變坐標(biāo)*/
t=random(2);
if(t==0)
Tank[i].direction=1+random(4);
else
Tank[i].direction=0-(1+random(4));
goto l1;
}
}
}
Arithmetic(); /*調(diào)用算法求得當(dāng)前最優(yōu)目標(biāo)*/
if(Lock(Tank[best])==0)
/*表示用戶按了ESC鍵,則取消此次攻擊,返回到多目標(biāo)動(dòng)態(tài)顯示的畫(huà)面*/
{
setfillstyle(1,DisplayColor);
bar(Tank[best].x-Tank[best].r*4,Tank[best].y-
Tank[best].r*4,Tank[best].x+Tank[best].r*4,Tank[best].y+
Tank[best].r*4);
DisplayBG();
for(i=0;i<n;i++)
DrawTank(Tank[i],Tank[i].color,GunColor);
goto Repeat;
}
Attack(emp.x,emp.y,Tank[best].x,Tank[best].y,TankColor);
/*攻擊最優(yōu)目標(biāo)*/
Blast(Tank[best].x,Tank[best].y,Tank[best].r-5,LockColor); /*爆炸效果*/
/*以下為重新畫(huà)界面和剩余的坦克,以顯示攻擊了最優(yōu)目標(biāo)后的效果*/
setcolor(DisplayColor);
line(emp.x,emp.y,Tank[best].x,Tank[best].y);
setfillstyle(1,DisplayColor);
bar(Tank[best].x-Tank[best].r*4,Tank[best].y-
Tank[best].r*4,Tank[best].x+Tank[best].r*4,Tank[best].y+
Tank[best].r*4);
DisplayBG();
for(i=0;i<n;i++)
{
if(i==best)
continue;
DrawTank(Tank[i],Tank[i].color,GunColor);
}
if(n==0)
{
ShowClear();
getch();
}
return 1;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -