- BC20270078's blog
塔防
- 2024-11-1 10:04:22 @
#include<bits/stdc++.h> #include<windows.h> #include<stdio.h> #include<conio.h> #include<time.h> using namespace std; typedef BOOL (WINAPI PROCSETCONSOLEFONT)(HANDLE, DWORD); PROCSETCONSOLEFONT SetConsoleFont; POINT Windowpos(){POINT pt;GetCursorPos(&pt);HWND h=GetForegroundWindow();ScreenToClient(h,&pt);pt.x=(pt.x+4)/10+0.5;pt.y=pt.y/8+0.5;swap(pt.x,pt.y);return pt;} int mouse;POINT pt;float kx,ky;int ti(float a) {return ((int)(a10+5))/10;} void Setpos(float x,float y){COORD pos;pos.X=ti(y4)/2;pos.Y=ti(x);SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);} //Setpos中,横5和竖5是一样的长度,在C,N中我们把y2存入,/2输出 ,所以 支持4.5 struct node {float x,y,fx,fy;int kind,staytime,blood,CD,enemy,turn;bool life;} M[100001],E[100001];//Mytower Enemy Bullet struct bullet {float x,y,vx,vy,h;int kind,staytime,enemy,endx,endy,up;bool life;} B[100001]; float Espeed[7]= {-1, 0.140.9, 0.20.9, 0.080.9, 0.30.9, 0.30.9, 0.10.9,};//敌人速度 float Bspeed[7]= {-1, 0.6, 0.6, 0.6, 1, 0.1, 0.6,};//打塔的子弹速度 float Bfspeed[7]= {-1, 0.45, 0.6, -1, 0.55, 1, 0.35,};//打敌的子弹速度 float MR[7]= {-1, 120.9, 100.9, 250.9, 100.9, 150.9, 200.9,}; float ER[7]= {-1, 60.9, 1.80.9, 80.9, 70.9, 10.9, 100.9,}; int MCDmax[7]= {10000, 10, 7, 60, 2, 90, 50}; int ECDmax[7]= {-1, 30, 10, 40, 25, 1, 40}; int Mblood[7]= {-1,200,150,300,250,400,300}; int Eblood[7]= {-1,50,100,30,100,10,200}; bool Zhan[50][50]; //Pk_Pb : personkill_or_placeboom int m[51][101],n[51][101],o[51][101],T,CD,CDmax,Day,ml,mr,el,er,bl,br,money,Level=1,endless; void Color(int a){ if(a==-2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN); if(a==-1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); if(a0) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); if(a1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE); if(a2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN); if(a3) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE); if(a4) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED); if(a5) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN); if(a>=6) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE); } void C(int i,int j){Color(0); Setpos(i,j/2.0);int N=n[i][j];if(N==-1) printf(" ");if(N>=0&&N<=9) printf("%d",N); if(N==-2) printf("+");if(N==-3) Color(5),printf("+"),n[i][j]=-1,o[i][j]=4;if(N==-4) Color(3),printf("+"),n[i][j]=-1,o[i][j]=4; //以下字符占2格 if(N11) Color(1),printf("О ");if(N13) Color(3),printf("◎ ");if(N14) Color(4),printf("+ ");if(N16) Color(5),printf("◎ "); if(N==-11) Color(1),printf("⊙ ");if(N==-12) Color(2),printf("⊙ ");if(N==-13) Color(3),printf("⊙ ");if(N==-14) Color(4+rand()%2),printf("█ ");if(N==-15) Color(1),printf("● ");if(N==-16) Color(5),printf("¤ "); if(N49) Color(0),printf("营 ");if(N50) Color(0),printf("墙 ");if(N51) Color(1),printf("● ");if(N52) Color(2),printf("■ ");if(N53) Color(3),printf("▲ ");if(N54) Color(4),printf("▼ ");if(N55) Color(6),printf("◆ ");if(N56) Color(5),printf("★ "); if(N81) Color(1),printf("○ ");if(N82) Color(2),printf("□ ");if(N83) Color(3),printf("△ ");if(N84) Color(4),printf("▽ ");if(N85) Color(6),printf("◇ ");if(N86) Color(5),printf("☆ "); if(N1001) printf("╔");if(N1003) printf("╗");if(N1004) printf("╠");if(N1005) printf("╣");if(N1006) printf("╚");if(N1007) printf("╩");if(N1008) printf("╝"); if(N1012) printf("↑ "); } void Map(int a){if(a1){for(int i=1;i<=39;i++)for(int j=2;j<=99;j++){ if(n[i][j]!=m[i][j]||T%8000){C(i,j);if(n[i][j]>=50||n[i][j]<=-10) n[i][j+1]=-1,j++;} if(o[i][j]1) C(i,j);if(o[i][j]>0) o[i][j]--;} for(int i=1;i<=50;i++)for(int j=1;j<=100;j++){m[i][j]=n[i][j];}} } void N(float x,float y,int w){int xx=(int)(x+0.5),yy=(int)(y*2.0+0.5);if(xx>49||yy>98||xx<1||yy<1) return;else n[xx][yy]=w;} int Turn[9][2]={{0,0},{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}; void Circle(int x,int y,int kind,int ex) {int R; if(kind1){int k=M[ex].kind;R=MR[k];int next=20-0.5R; for(int i=0;i<=360;i+=next) N(x+Rsin(3.1416i/180),y+Rcos(3.1416i/180),-2); if(k==3) for(int i=0;i<=360;i+=15) R=10,N(x+Rsin(3.1416i/180),y+Rcos(3.1416i/180),-2); } if(kind==-1){int k=M[ex].kind;R=MR[k];int next=20-0.5R; for(int i=0;i<=360;i+=next) N(x+Rsin(3.1416i/180),y+Rcos(3.1416i/180),-1); if(k3) for(int i=0;i<=360;i+=15) R=10,N(x+Rsin(3.1416i/180),y+Rcos(3.1416i/180),-1); } if(kind2){R=ex;int next=20-0.5R; for(int i=0;i<=360;i+=next) N(x+Rsin(3.1416i/180),y+Rcos(3.1416i/180),-3); } if(kind==-2){R=ex;int next=20-0.5R; for(int i=0;i<=360;i+=next) N(x+Rsin(3.1416i/180),y+Rcos(3.1416i/180),-4); } } void Cout(int a,int kind){ if(kind1)//炮台 { float x=M[a].x,y=M[a].y; N(x,y,M[a].kind+50); if(a1) N(x,y,49); int i=1;if(M[a].blood>=100) i=2; for(i;i<=8;i++) N(x+Turn[i][0],y+Turn[i][1],1000+i),Zhan[(int)x+Turn[i][0]][(int)y+Turn[i][1]]=1; int t=M[a].turn; int b=max(0,M[a].blood),bb=0;while(b>0){bb++;N(x-1,y+1-0.5bb,b%10);b/=10;} } if(kind==2)//人 { float x=E[a].x,y=E[a].y; N(x,y,E[a].kind+80); N(x+1,y,1012); Zhan[(int)x][(int)y]=Zhan[(int)x+1][(int)y]=1; int b=max(0,E[a].blood),bb=0;while(b>0){bb++;N(x-1,y+1-0.5bb,b%10);b/=10;} } if(kind3)//对塔子弹 { float x=B[a].x,y=B[a].y; N(x,y,10+B[a].kind); } if(kind4)//对人子弹 { float x=B[a].x,y=B[a].y; N(x-B[a].h,y,-10+B[a].kind); } } int Find_enemy(int Who,int good_or_bad){ int ans=-1,r=rand()%2;float ansx=1e9,x;//搜敌人 if(good_or_bad>=1){float X=M[Who].x,Y=M[Who].y; if(good_or_bad2) X=E[Who].x,Y=E[Who].y; for(int i=el;i<=er;i++){if(E[i].life0) continue;x=sqrt((E[i].x-X)(E[i].x-X)+(E[i].y-Y)(E[i].y-Y)); if(good_or_bad2&&E[i].kind4) continue; if(M[Who].kind3&&x<10) continue;//迫击炮 if(M[Who].kind6&&ans!=-1&&ansx>x) ansx=x;//火箭炮 if(ansx>x) ansx=x,ans=i; if(ansxx) {int r=rand()%2;if(r1) ansx=x,ans=i;}}} if(good_or_bad0){float X=E[Who].x,Y=E[Who].y;for(int i=ml;i<=mr;i++) {if(M[i].life0) continue;x=sqrt((M[i].x-X)(M[i].x-X)+(M[i].y-Y)(M[i].y-Y));if(ansx>x) ansx=x,ans=i;if(ansxx) {int r=rand()%2;if(r1) ansx=x,ans=i;}}} return ans; } void Find_boomkill(int Who,float r,bool good_or_bad,int kill){ float x,X=B[Who].x,Y=B[Who].y;int kk=(float)kill/2.5;kill+=rand()%kk-kk/5; if(good_or_bad1){for(int i=el;i<=er;i++){if(E[i].life0) continue;x=sqrt((E[i].x-X)(E[i].x-X)+(E[i].y-Y)(E[i].y-Y));if(r>=x) E[i].blood=min(E[i].blood-kill,Eblood[E[i].kind]+Day+50);} }//搜敌人 else{for(int i=ml;i<=mr;i++){if(M[i].life0) continue;x=sqrt((M[i].x-X)(M[i].x-X)+(M[i].y-Y)(M[i].y-Y));if(r>=x) M[i].blood-=kill;} }//搜炮台 } void Die(){ for(int i=ml;i<=mr;i++)if(M[i].blood<=0) { M[i].life=0;if(iml) ml++; } for(int i=el;i<=er;i++)if(E[i].blood<=0) { E[i].life=0;if(iel) el++; } for(int i=bl;i<=br;i++){ if(B[i].x+B[i].vx<1||B[i].x+B[i].vx>49||B[i].y+B[i].vy<1||B[i].y+B[i].vy>98) {B[i].life=0;} if(B[i].staytime>=100) B[i].life=0; } } void Move(int a){ if(a2) { for(int i=ml;i<=mr;i++){if(M[i].life0) continue;Cout(i,1);} for(int i=el;i<=er;i++){if(E[i].life0) continue;Cout(i,2);} return; } for(int i=ml;i<=mr;i++){ if(M[i].life0) continue; else{M[i].staytime++;int e=M[i].enemy;if(E[e].life0) M[i].enemy=-1;
if(M[i].kind==5&&M[i].enemy==-1&&M[i].CD<=70&&T%2==0) M[i].CD++;
if(M[i].kind==0&&M[i].blood<500&&T%20==0) M[i].blood++;
if(M[i].enemy==-1||M[i].kind==4) M[i].enemy=Find_enemy(i,1);//喷火器
if(M[i].enemy!=-1)
{int k=M[i].enemy;
float X=M[i].x,Y=M[i].y,Ax=E[k].x-X,Ay=E[k].y-Y;if(Ay==0) Ay=1e-6;float Turnn=abs(Ax/Ay*1.0),Dis=sqrt((E[k].x-X)*(E[k].x-X)+(E[k].y-Y)*(E[k].y-Y));
if(Dis>MR[M[i].kind]){M[i].enemy=-1;}
else
{M[i].CD++;
if((M[i].kind!=6&&M[i].CD>=MCDmax[M[i].kind])||(M[i].kind==6&&M[i].CD<=21&&M[i].CD%4==0))//火箭炮
{
if(M[i].kind==6) M[i].enemy=Find_enemy(i,1);
if(Turnn>=sqrt(2)+1){if(Ay>0) M[i].turn=2;else M[i].turn=7;}
else if(Turnn>=1.0/(sqrt(2)+1)*1.0){if(Ax>0&&Ay>0) M[i].turn=1;else if(Ax<0&&Ay>0) M[i].turn=3;else if(Ax<0&&Ay<0) M[i].turn=8;else M[i].turn=6;}
else {if(Ax>0) M[i].turn=5;else M[i].turn=4;}
br++,B[br].x=X,B[br].y=Y;
B[br].kind=-M[i].kind;
B[br].life=1,B[br].enemy=M[i].enemy,B[br].endx=E[M[i].enemy].x,B[br].endy=E[M[i].enemy].y,B[br].staytime=0;
}
if(M[i].CD>=MCDmax[M[i].kind]) M[i].CD=0;
}
}Cout(i,1);}}
for(int i=el;i<=er;i++){
if(E[i].life==0) continue;
else{E[i].staytime++;E[i].CD++;
int e=E[i].enemy;if(M[e].life==0||(E[i].kind==4&&E[e].life==0)) E[i].enemy=-1;
if(E[i].enemy==-1) {E[i].enemy=Find_enemy(i,0);if(E[i].kind==4) E[i].enemy=Find_enemy(i,2);}
if(E[i].enemy!=-1){int k=E[i].enemy;int Mkx=M[k].x;int Mky=M[k].y;if(E[i].kind==4) Mkx=E[k].x,Mky=E[k].y;
float X=E[i].x,Y=E[i].y;float Dis=sqrt((Mkx-X)*(Mkx-X)+(Mky-Y)*(Mky-Y));
float Ax=Mkx-X,Ay=Mky-Y,S=Espeed[E[i].kind];if(Ay==0) Ay=1e-6;float Turnn=abs(Ax/Ay*1.0);
if(Dis>ER[E[i].kind]){float vx=Ax*S/Dis*1.0,vy=Ay*S/Dis*1.0;E[i].x+=vx,E[i].y+=vy;}
else{
if(E[i].CD>=ECDmax[E[i].kind]){
if(E[i].kind==5) E[i].blood=-1;//炮灰
if(E[i].kind==4){
br++,B[br].x=X,B[br].y=Y;
B[br].kind=4;
B[br].life=1,B[br].enemy=E[i].enemy,B[br].endx=E[E[i].enemy].x,B[br].endy=E[E[i].enemy].y,B[br].staytime=0;
}
else{
br++,B[br].x=X,B[br].y=Y;
B[br].kind=E[i].kind;
B[br].life=1,B[br].enemy=E[i].enemy,B[br].endx=M[E[i].enemy].x,B[br].endy=M[E[i].enemy].y,B[br].staytime=0;
}
E[i].CD=0;}}}Cout(i,2);
}}
for(int i=bl;i<=br;i++){
if(B[i].life==0) continue;
else if(B[i].kind>0)//对塔子弹 >0
{
B[i].staytime++;
int k=B[i].enemy;
int Mkl=M[k].life,Mkx=M[k].x,Mky=M[k].y;
if(B[i].kind==4) Mkl=B[k].life,Mkx=B[k].x,Mky=B[k].y;
if(k!=-1&&Mkl==1) B[i].endx=Mkx,B[i].endy=Mky;
float kx=B[i].endx,ky=B[i].endy,X=B[i].x,Y=B[i].y;float Ax=kx-X,Ay=ky-Y,S=Bspeed[B[i].kind];float Dis=sqrt(Ax*Ax+Ay*Ay);float vx=Ax*S/Dis*1.0,vy=Ay*S/Dis*1.0;
B[i].x+=vx,B[i].y+=vy;//别改,对的!
if(Dis<=S){//打中了,减血
B[i].x=B[i].endx,B[i].y=B[i].endy;
if(B[i].kind==1) Find_boomkill(i,1.5,0,20),Circle(B[i].endx,B[i].endy,-2,1);
if(B[i].kind==2) Find_boomkill(i,1.5,0,10),Circle(B[i].endx,B[i].endy,-2,1);
if(B[i].kind==3) Find_boomkill(i,3,0,20),Circle(B[i].endx,B[i].endy,-2,3);
if(B[i].kind==4) Find_boomkill(i,2,1,-5),Circle(B[i].endx,B[i].endy,-2,2);
if(B[i].kind==5) Find_boomkill(i,3,0,50),Circle(B[i].endx,B[i].endy,-2,3);//炮灰
if(B[i].kind==6) Find_boomkill(i,2,0,20),Circle(B[i].endx,B[i].endy,-2,2);
B[i].life=0;continue;
}
Cout(i,3);
}
else//对人子弹 <0
{
B[i].staytime++;
int k=B[i].enemy;if(k!=-1&&E[k].life==1) B[i].endx=E[k].x,B[i].endy=E[k].y;
float kx=B[i].endx,ky=B[i].endy,X=B[i].x,Y=B[i].y;float Ax=kx-X,Ay=ky-Y,S=Bfspeed[-B[i].kind];float Dis=sqrt(Ax*Ax+Ay*Ay);float vx=Ax*S/Dis*1.0,vy=Ay*S/Dis*1.0;
if(B[i].kind==-3){B[i].x+=1.0/(49.0-B[i].staytime)*Ax;B[i].y+=1.0/(49.0-B[i].staytime)*Ay;
if(T%2==0){
if(B[i].up==1){if(B[i].h<3) B[i].h++;else if(B[i].h<6) B[i].h+=0.5;else B[i].up++;}else if(B[i].up<=6) B[i].up++;else{if(B[i].h>3) B[i].h-=0.5;else B[i].h--;}}
}
else B[i].x+=vx,B[i].y+=vy;//抛物线
if(B[i].kind==-3&&B[i].staytime>=48) {B[i].x=B[i].endx,B[i].y=B[i].endy,Find_boomkill(i,5,1,30),Circle(B[i].endx,B[i].endy,2,4);B[i].life=0;continue;}
else if(B[i].kind!=-3&&Dis<=S)//打中了,减血
{
if(B[br].kind==-2) B[i].endx+=rand()%7-2,B[i].endy+=rand()%7-2,Find_boomkill(i,2,1,20);//重机枪
B[i].x=B[i].endx,B[i].y=B[i].endy;
if(B[i].kind==-1) Find_boomkill(i,2,1,20),Circle(B[i].endx,B[i].endy,2,2);
if(B[i].kind==-2) Find_boomkill(i,2,1,10),Circle(B[i].endx,B[i].endy,2,2);
if(B[i].kind==-4) Find_boomkill(i,2,1,5),Circle(B[i].endx,B[i].endy,2,2);
if(B[i].kind==-5) Find_boomkill(i,3,1,120),Circle(B[i].endx,B[i].endy,2,3);
if(B[i].kind==-6) Find_boomkill(i,3,1,35),Circle(B[i].endx,B[i].endy,2,3);
B[i].life=0;continue;
}
Cout(i,4);
}
}
Die();//开始处理 life=0,前面不要有 life=0
} void StartWar(int D) { for(int i=-1;i<=(int)T/1000;i++){ int XY=rand()%4,Wx=rand()%38+1,Wy=rand()%48+2,x,y,k,R=rand()%100; if(Level2) XY=3;if(Level3) XY=3*(rand()%2); if(XY0) x=2,y=Wy;if(XY1) x=38,y=Wy;if(XY2) x=Wx,y=1;if(XY3) x=Wx,y=49; k=rand()%6+1; er++,E[er].x=x,E[er].y=y,E[er].kind=k,E[er].life=1,E[er].blood=Eblood[k]+Day; } } void Start() {Color(0); Setpos(41,0),printf(" ┏━━━━━┓ ┏━━━━━┓ ┏━━━━━┓ ┏━━━━━┓ ┏━━━━━┓ ┏━━━━━┓"); Setpos(42,0),printf(" ┃$100 ┃ ┃$120 ┃ ┃$150 ┃ ┃$150 ┃ ┃$200 ┃ ┃$250 ┃"); Setpos(43,0),printf(" ┃ ● ┃ ┃ ■ ┃ ┃ ▲ ┃ ┃ ▼ ┃ ┃ ◆ ┃ ┃ ★ ┃");Setpos(43,30),printf("Money: %d ",money); Setpos(44,0),printf(" ┗━━━━━┛ ┗━━━━━┛ ┗━━━━━┛ ┗━━━━━┛ ┗━━━━━┛ ┗━━━━━┛");Setpos(43,40),printf("Day: %d ",Day); } void Put_Frame(){int x=39,y=49;Color(-1);for(int i=0;i<=x+1;i++)for(int j=0;j<=y+1;j++){if(i0||j0||ix+1||jy+1) Setpos(i,j),printf("[]");}} void Click() { int What; pt=Windowpos();int Ww=(int)((pt.y)/2+1); if((int)((pt.x-2)/2.2-3)<40||Ww>28) return; else if(Ww<=6) What=1;else if(Ww<=10) What=2;else if(Ww<=15) What=3;else if(Ww<=19) What=4;else if(Ww<=23) What=5;else if(Ww<=28) What=6; if(What1) if(money>=100) money-=100;else return; if(What2) if(money>=120) money-=120;else return; if(What3) if(money>=150) money-=150;else return; if(What4) if(money>=150) money-=150;else return; if(What5) if(money>=200) money-=200;else return; if(What6) if(money>=250) money-=250;else return; Color(0),Setpos(43,30);printf("Money: %d 通过 鼠标点按后 拖拽 下方的图标来安放炮塔,松手确定!",money); mr++;M[mr].kind=What;M[mr].blood=Mblood[What];M[mr].life=1;M[mr].CD=MCDmax[What]-1; while(mouse) { mouse=GetAsyncKeyState(VK_LBUTTON)&0x8000; pt=Windowpos(); M[mr].x=min(38,max(2,(int)((pt.x-2)/2.2-3))),M[mr].y=min(48,max(2,(int)((pt.y-1)/2-1))); Circle(M[mr].x,M[mr].y,1,mr); Move(2);Map(1);Sleep(30); for(int i=0;i<=8;i++) N(M[mr].x+Turn[i][0],M[mr].y+Turn[i][1],-1),N(M[mr].x+Turn[i][0],M[mr].y+Turn[i][1]+0.5,-1); Circle(M[mr].x,M[mr].y,-1,mr); } system("cls");memset(n,-1,sizeof(n));memset(m,-1,sizeof(m));Start();Put_Frame(); } void Key(char g) { int What=g-'0'; if(What1) if(money>=100) money-=100;else return; if(What2) if(money>=120) money-=120;else return; if(What3) if(money>=150) money-=150;else return; if(What4) if(money>=150) money-=150;else return; if(What5) if(money>=200) money-=200;else return; if(What6) if(money>=250) money-=250;else return; Color(0),Setpos(43,30);printf("Money: %d 通过 键盘按1~6 选择炮台后,使用上下左右移动炮塔位置,按ENTER键确定!",money); mr++;M[mr].kind=What;M[mr].blood=Mblood[What];M[mr].life=1;M[mr].CD=MCDmax[What]-1; M[mr].x=38,M[mr].y=4What+1; while(1) { if(GetAsyncKeyState(VK_UP)&0x8000) M[mr].x--; if(GetAsyncKeyState(VK_DOWN)&0x8000) M[mr].x++; if(GetAsyncKeyState(VK_LEFT)&0x8000) M[mr].y--; if(GetAsyncKeyState(VK_RIGHT)&0x8000) M[mr].y++; M[mr].x=min(38,max(2,(int)M[mr].x)),M[mr].y=min(48,max(2,(int)M[mr].y)); Circle(M[mr].x,M[mr].y,1,mr); Move(2);Map(1);Sleep(30); for(int i=0;i<=8;i++) N(M[mr].x+Turn[i][0],M[mr].y+Turn[i][1],-1),N(M[mr].x+Turn[i][0],M[mr].y+Turn[i][1]+0.5,-1); Circle(M[mr].x,M[mr].y,-1,mr); if(GetAsyncKeyState(VK_RETURN)&0x8000) break; Sleep(30); }while(kbhit()) char g=_getch(); system("cls");memset(n,-1,sizeof(n));memset(m,-1,sizeof(m));Start();Put_Frame(); } void Menu() {Color(0); Setpos(5,7);cout<<"欢迎来到 海岛奇胎 !";Setpos(5,20);Color(-2);cout<<"【win11升级适配版】";Color(0); Setpos(7,12);cout<<"作者:wzryyds";Setpos(7,24);Color(-2);cout<<"【 记住开全屏! 】";Color(0); Setpos(8,12);cout<<"别名:城市守卫战 3.0";Setpos(8,24);Color(-2);cout<<"【 全屏!全屏!全屏! 】";Color(0); Setpos(10,2);cout<<"规则:通过 鼠标点按后 拖拽 下方的图标来安放炮塔。 坚持100天通关!"; Setpos(11,2);cout<<" 或:通过 键盘按1~6 选择炮台后,使用上下左右移动炮塔位置,按ENTER键确定!"; Setpos(13,2);cout<<"炮塔的设定: 加农炮物美廉,重机枪可溅射,迫击炮范围大,喷火器近必死,电磁炮一发入魂,火箭炮六边形战士。"; Setpos(9,24);Color(-2);cout<<"【 现在就开!NOW!! 】";Color(0); Setpos(16,26);Color(-2);cout<<"【全屏游戏】";Color(0); Setpos(14,2);cout<<"敌人的设定: 步兵小菜一碟,骑兵骑脸输出,炮兵速慢手长,药兵无限加血,炮灰贴脸自爆,坦克(这个逼)难以评价"; Setpos(9,24);Color(-2);cout<<"【 现在就开!NOW!! 】";Color(0); Setpos(16,5);cout<<"请选择地图:";Setpos(17,7);cout<<"1.围城 (孤城争雄!!)";Setpos(18,7);cout<<"2.长城 (南蛮入侵!!)";Setpos(19,7);cout<<"3.王者 (你猜猜为什么叫这个名字)";Setpos(20,7);cout<<"4.放射 (不知道为什么特别难?)";Setpos(21,7);cout<<"5.真空 (你打不过的,相信我)";Setpos(23,7);cout<<"输入负数则开启无尽模式";Setpos(24,9);cout<<"例:-1:无尽围城"; endless=0;A:char a=_getch();if(a=='-') {endless=1;goto A;}else if(a<'1'||a>'5') goto A;else Level=a-'0';system("cls"); }int Clocknum; int main(){ CONSOLE_CURSOR_INFO cursor_info={1,0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);srand((unsigned)time(NULL)); St:Menu();Start();Put_Frame(); memset(n,-1,sizeof(n));memset(m,-1,sizeof(m));memset(M,0,sizeof(M));memset(E,0,sizeof(E));memset(B,0,sizeof(B)); T=ml=mr=el=er=bl=br=0;CDmax=160;Day=1; money=1000;if(Level5) money=1500; mr++,M[mr].x=20,M[mr].y=25,M[mr].kind=0,M[mr].life=1,M[mr].blood=2000; if(Level2) M[mr].y=5; if(Level3) M[mr].x=38,M[mr].y=2; if(Level1) for(int i=0;i<=360;i+=30) mr++,M[mr].x=20+9sin(3.1416i/180),M[mr].y=25+9cos(3.1416i/180),M[mr].kind=0,M[mr].life=1,M[mr].blood=500; if(Level2) for(int i=5;i<40;i+=6) mr++,M[mr].x=i,M[mr].y=19,M[mr].kind=0,M[mr].life=1,M[mr].blood=500,mr++,M[mr].x=i,M[mr].y=13,M[mr].kind=0,M[mr].life=1,M[mr].blood=500; if(Level3) for(int i=-90;i<=0;i+=45) mr++,M[mr].x=38+8sin(3.1416i/180),M[mr].y=2+8cos(3.1416i/180),M[mr].kind=0,M[mr].life=1,M[mr].blood=500,mr++,M[mr].x=38+15sin(3.1416i/180),M[mr].y=2+15cos(3.1416i/180),M[mr].kind=0,M[mr].life=1,M[mr].blood=500,mr++,M[mr].x=38+25sin(3.1416i/180),M[mr].y=2+25cos(3.1416i/180),M[mr].kind=0,M[mr].life=1,M[mr].blood=500; if(Level==4) for(int i=30;i<=390;i+=60) mr++,M[mr].x=20+6sin(3.1416i/180),M[mr].y=25+6cos(3.1416i/180),M[mr].kind=0,M[mr].life=1,M[mr].blood=500,mr++,M[mr].x=20+11sin(3.1416i/180),M[mr].y=25+11cos(3.1416*i/180),M[mr].kind=0,M[mr].life=1,M[mr].blood=500; while(M[1].life1) if(clock()-Clocknum>=30) { T++;Clocknum=clock(); memset(n,-1,sizeof(n));//这里默认全输空格 //鼠标,键盘,暂停操作 mouse=GetAsyncKeyState(VK_LBUTTON)&0x8000; pt=Windowpos();N((pt.x-2)/2.2-3,(pt.y)/2+1,-2); if(mouse) Click(); if(kbhit()) {char g=_getch();if(g>='1'&&g<='6') Key(g);} if(Day>=100&&endless0) break; CD--;if(CD<=0){CD=CDmax;StartWar(Day);Day++;Setpos(43,40),printf("Day: %d ",Day);} if(T%50==0) {money=min(money+10,2000);if(money<100) money=min(money+5,2000);if(Day>60) money=min(money+10,2000);if(Day>85) money=min(money+5,2000); Setpos(43,30),printf("Money: %d ",money); } Move(1);Map(1); } if(Day>=100) {system("color 6E"),Sleep(1000);for(int i=1;i<=1000;i++) cout<<"YOU WIN !! ";system("pause");system("color 0F");} else {system("color 7F"),Sleep(1000);for(int i=1;i<=1000;i++) cout<<"GAME OVER... ";system("pause");system("color 0F");} system("cls"); goto St; return 0; }