当前位置: 首页 > news >正文

C++控制台打飞机小游戏

我终于决定还是把这个放出来。

视频在这:https://v.youku.com/v_show/id_XNDQxMTQwNDA3Mg==.html

具体信息主界面上都有写。

按空格暂停,建议暂停后再升级属性。

记录最高分的文件进行了加密。

有boss(上面视频2分47秒)。

挺好玩的。

可能有bug,不想改了,整体体验不错就行了。

更多控制台操作可以看之前写的鼠标操作的文章(https://blog.csdn.net/C20190102/article/details/79301667),也可以直接在这个上面复制。

MinGW编译无错误,只有lld输出的几个警告。

只有一个文件,没有任何其他的东西。

可以直接扒下来编译。

一开始写的时候打了很多注释,后来就不想打了。

大家凑合着看吧,不清楚的就评论,如果我还记得到就答一下哈。

对了,为了防止暂停作弊,暂停过后开始时鼠标会回到飞机的位置。

这个代码我一个人可能总共肝了20多个小时,如果你能帮我改得更有趣,bug更少的话可以找我。

更多内容看代码:

#include<set>
#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<windows.h>
#include<algorithm>
#include<iostream>
#include<conio.h>
#include<fstream>
using namespace std;#define fblack 0
#define fblue 1
#define fgreen 2
#define fcyan 3
#define fred 4
#define fpurple 5
#define fyellow 6
#define fwhite 7
#define fgray 8
#define flight 8
#define bblack 0
#define bblue 16
#define bgreen 32
#define bcyan 48
#define bfred 64
#define bpurple 80
#define byellow 96
#define bwhite 112
#define bgray 128
#define blight 128
#define dirkey -32
#define upkey 72
#define downkey 80
#define leftkey 75
#define rightkey 77
#define wclear system("cls")
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
#define LL long longvoid flash(int times){while(times--){system("color 08");Sleep(300);system("color 80");Sleep(300);}//Sleep(1000);system("color 08");
}
void HindCursor(){HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(handle,&CursorInfo);CursorInfo.bVisible=false;SetConsoleCursorInfo(handle,&CursorInfo);
}
struct Button{int x,y,color;const char *name;int len;
};
void GetPos(POINT &pt){HWND hwnd=GetForegroundWindow();GetCursorPos(&pt);ScreenToClient(hwnd,&pt);pt.y=pt.y/16,pt.x=pt.x/8;swap(pt.x,pt.y);
}
void color(int a){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void gto(int x,int y){COORD pos;pos.X=y;pos.Y=x;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
Button NewButton(int x,int y,int color,const char *name){Button t;t.x=x,t.y=y,t.name=name;t.color=color;t.len=strlen(name);return t;
}
bool Preserve(Button A){gto(A.x,A.y),color(A.color),printf("%s",A.name);POINT pt;GetPos(pt);if(pt.x==A.x&&(pt.y>=A.y&&pt.y<=A.y+A.len)){color(112),gto(A.x,A.y),printf("%s",A.name);if(KEY_DOWN(MOUSE_MOVED)) return 1;}return 0;
}
pair<int,int> GetXY(){HANDLE hStdout;CONSOLE_SCREEN_BUFFER_INFO pBuffer;hStdout = GetStdHandle(STD_OUTPUT_HANDLE);GetConsoleScreenBufferInfo(hStdout, &pBuffer);return make_pair(pBuffer.dwCursorPosition.Y,pBuffer.dwCursorPosition.X);
}
template <typename T>void Tprint(int Nx,int Ny,int Color,T a){int x=GetXY().first,y=GetXY().second;gto(Nx,Ny),color(Color),cout<<a;gto(x,y);
}
void ColorPrint(){for(int i=0;i<256;i++)color(i),printf("%d\n",i);
}
void SetWindow(const char *name,int c,int w){char str[30];sprintf(str,"title %s",name);system(str);sprintf(str,"mode con cols=%d lines=%d",w,c);system(str);
}
void SetWindow(const char *name,int c,int w,int x,int y){SetConsoleTitle(name);HWND hwnd;hwnd=GetForegroundWindow();SetWindowPos(hwnd,HWND_TOP,y,x,w*8,c*16,SWP_SHOWWINDOW);
}
int read(){color(fwhite+flight);int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}#define TP Tprint
#define WINDOWC 45
#define WINDOWW 55
#define INF 0x3f3f3f3f
#define OC fwhite+flight+bblack //original colorbool InRange(int x){return x>=0&&x<=WINDOWC;
}int BossFlag;
int OwnShotTimes,OwnLoseBlood,OwnShotOnTimes;
int MoneyFlash,ScoreFlash;const int ConstNewDy[4]={-1,0,1};
#define MAX_BULLET_TYPE_NUM 3
const int ConstBulletColor[MAX_BULLET_TYPE_NUM+5]={0,fyellow,fred+flight,fred+flight,fblue+flight,fred+bwhite};
const char ConstBulletShape[MAX_BULLET_TYPE_NUM+5]={0,'*','*','O','|','%'};
const int ConstBulletDamage[MAX_BULLET_TYPE_NUM+5]={0,50,80,500,20,300};
/*Move 1 block every 100-Speed ms*/
const int ConstBulletSpeed[MAX_BULLET_TYPE_NUM+5]={0,50,30,10,80,20};
/*The color of the full block in the blood line*/
const int ConstBloodColor[4]={0,fred,fyellow,fgreen};#define MAX_BOSS_NUM 10
const int ConstBossFullBlood[MAX_BOSS_NUM+5]={0,1000,3000,5000,10000,30000,50000,100000,300000,500000,1000000};
const int ConstBossShotSpeed[MAX_BOSS_NUM+5][2]={{0,0},{30,-3900},{30,-3400},{50,-2900},{50,-2400},{70,-1900},{70,-1400},{90,-900},{90,-400},{100,-400},{100,-400}};
const int ConstBossStopCD[MAX_BOSS_NUM+5]={0,3200,3400,3600,3800,4000,4200,4400,4600,4800,5000};
const int ConstBossStopTime[MAX_BOSS_NUM+5]={0,3000,2800,2600,2400,2200,2000,1800,1600,1400,1200};
const int ConstBossMoveSpeed[MAX_BOSS_NUM+5]={0,800,800,800,850,850,850,900,900,900,950};
const int ConstBossScore[MAX_BOSS_NUM+5]={0,10000,20000,40000,80000,160000,320000,640000,1280000,2560000,5120000};
const int ConstBossMoney[MAX_BOSS_NUM+5]={0,100,200,500,1000,2000,5000,8000,10000,20000,50000};
const int ConstBossNeedScore[MAX_BOSS_NUM+5]={0,500,1000,1500,2000,2500,3000,3500,4000,4500,5000};struct Bullet{int isExist;int x,y,Type;int dx,dy,LastBulletRefreshTime;Bullet(){LastBulletRefreshTime=-INF;}Bullet(int isExist_,int x_,int y_,int Type_,int dx_,int dy_):isExist(isExist_),x(x_),y(y_),Type(Type_),dx(dx_),dy(dy_){}
};void MoveBullet(Bullet&);
/*We must use Bullet*, or we can't change the data(position of the bullet) in the set*/
set<Bullet*> Ammo;
void BulletsRefresh(){vector<set<Bullet*>::iterator> Throw;for(set<Bullet*>::iterator it=Ammo.begin();it!=Ammo.end();it++){Bullet *New=*it;MoveBullet(*New);/*We can't erase it right away*/if(!New->isExist)Throw.push_back(it);}for(int i=0;i<int(Throw.size());i++)Ammo.erase(Throw[i]);
}int BEGINTIME;int UFOAddBlood,UFOAddShotSpeed,UFOAddMoveSpeed,Added;struct UFO{/*Shape of the UFO:0000/0000@@@(OOO)\-/V*/int isExist;int x,y;//position of the headint dx,dy;int Blood,FullBlood;int ShotSpeed,LastShotTime;int MoveSpeed;int LastMoveTime;int Score,Money;UFO(){if(BossFlag&&!Added)UFOAddBlood+=100,UFOAddShotSpeed+=100,UFOAddMoveSpeed+=100,Added=1;if(!BossFlag&&Added)UFOAddBlood-=100,UFOAddShotSpeed-=100,UFOAddMoveSpeed-=100,Added=0;isExist=1;x=0,y=rand()%(WINDOWW-4)+4;//Must be in the screenFullBlood=rand()%300+100+UFOAddBlood;Blood=FullBlood;ShotSpeed=rand()%1000+UFOAddShotSpeed;/*Move 1 block every 1000-MoveSpeed ms*/MoveSpeed=rand()%600+300+UFOAddMoveSpeed;LastMoveTime=LastShotTime=-INF;dx=1,dy=0;Score=FullBlood/30+((clock()-BEGINTIME)/10000);Money=MoveSpeed/100.0+FullBlood/100.0;}/*effects when being hit*/void Flash(){/*the head is sure to be in the screen so we needn't check*/if(!isExist)return;if(x>0&&x<WINDOWC)TP(x,y,fpurple+bwhite,'V');if(x-1>0&&x-1<WINDOWC)TP(x-1,y-1,fpurple+bwhite,"\\-/");//Sleep(100);if(x>0&&x<WINDOWC)TP(x,y,fpurple+bblack,'V');if(x-1>0&&x-1<WINDOWC)TP(x-1,y-1,fpurple+bblack,"\\-/");}/*Check if hit only on the body*/bool Hit(int tx,int ty){return (tx==x&&ty==y)||(tx==x-1&&ty>=y-1&&ty<=y+1);}/*To check if it will hit another UFO*/void BloodRefresh(int NewX,int NewY){/*To appear gradually, we should check the position*/if(x-2>=0){TP(x-2,y-1,OC,"   ");if(isExist)if(NewX-2<WINDOWC){/*Round up*/int FullBlock=(Blood*3+FullBlood-1)/FullBlood;   //Number of "@"int EmptyBlock=3-FullBlock;                      //Number of "O"int BloodColor=ConstBloodColor[FullBlock];/*Print the blood line*/for(int i=1;i<=FullBlock;i++)TP(NewX-2,NewY-2+i,BloodColor+bblack,'@');for(int i=1;i<=EmptyBlock;i++)TP(NewX-2,NewY-2+FullBlock+i,fgray+bblack,'O');}}/*Print the blood/fullblood number*//*Due to %06d we can't use TP*/if(x-3>=0){TP(x-3,y-4,OC,"         ");if(isExist){if(NewX-3<WINDOWC){gto(NewX-3,NewY-4),color(fcyan+bblack),printf("%04d",Blood);TP(NewX-3,NewY,fcyan+bblack,'/');gto(NewX-3,NewY+1),color(fcyan+bblack),printf("%04d",FullBlood);}}}if(x-3>=WINDOWC)isExist=0;}/*Clear the shape after it died*/void ClearPrint(){BloodRefresh(x,y);if(x-1>=0&&x-1<WINDOWC)TP(x-1,y-1,OC,"   ");if(x>=0&&x<WINDOWC)TP(x,y,OC,' ');}void Shot(){int t=clock();if(!ShotSpeed||LastShotTime>=t-(5000-ShotSpeed))return;LastShotTime=t;if(x>0){Bullet *tmp=new Bullet(1,x+1,y,2,1,0);Ammo.insert(tmp);}}
};
/*It is similar to set<Bullet*> in struct Plane*/
set<UFO*> Enemy;bool UFOCrash(int,int);
bool UFOCrash(UFO,int,int,set<UFO*>::iterator);/*Move the plane to a new place*/
void UFOMovePrint(UFO &me,set<UFO*>::iterator id){int t=clock();if(me.LastMoveTime>=t-(1000-me.MoveSpeed))return;me.LastMoveTime=t;/*Change the direction*/if(rand()%3==0)me.dy=ConstNewDy[rand()%3];int NewX=me.x+me.dx,NewY=me.y+me.dy;if(UFOCrash(me,NewX,NewY,id)||NewY-4<0||NewY+4>=WINDOWW)//||NewX<0||NewY-4<0||NewX>=WINDOWC||NewY+4>=WINDOWW){for(int i=0;i<3;i++){me.dy=ConstNewDy[rand()%3];NewX=me.x+me.dx,NewY=me.y+me.dy;if(!(UFOCrash(me,NewX,NewY,id)||NewY-4<0||NewY+4>=WINDOWW))//||NewX<0||NewY-4<0||NewX>=WINDOWC||NewY+4>=WINDOWW))break;}if(UFOCrash(me,NewX,NewY,id)||NewY-4<0||NewY+4>=WINDOWW)//||NewX<0||NewY-4<0||NewX>=WINDOWC||NewY+4>=WINDOWW)return;//TP(me.x,me.y,OC,' ');if(NewX<WINDOWC){TP(me.x,me.y,fwhite+flight+bblack,' ');if(me.isExist) TP(NewX,NewY,fwhite+flight+bblack,'V');}if(NewX-1>=0&&NewX-1<WINDOWC){TP(me.x-1,me.y-1,fwhite+flight+bblack,"   ");if(me.isExist) TP(NewX-1,NewY-1,fwhite+flight+bblack,"\\-/");}me.BloodRefresh(NewX,NewY);me.x=NewX,me.y=NewY;
}
int UFORefreshTime=3000,LastUFORefreshTime=0;
void UFORefresh(){int t=clock();if(LastUFORefreshTime<t-UFORefreshTime){UFO *tmp=new UFO;Enemy.insert(tmp);LastUFORefreshTime=t;}vector<set<UFO*>::iterator> Throw;for(set<UFO*>::iterator it=Enemy.begin();it!=Enemy.end();it++){UFO *New=*it;if(!New->isExist)Throw.push_back(it);UFOMovePrint(*New,it);New->Shot();}for(int i=0;i<int(Throw.size());i++)Enemy.erase(Throw[i]);
}#define MAX_BUFF_NUM 5
const int ConstBuffAppearPossibility[2][1000]={{1,2,2,2,2,2,2,3,4,5},{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,5}
};
const int ConstBuffAppearTime[MAX_BUFF_NUM+5]={0,5000,5000,5000,5000,5000};
const int ConstBuffLastTime[MAX_BUFF_NUM+5]={0,5000,0,5000,10000,5000};
const char ConstBuffName[MAX_BUFF_NUM+5]={0,'B','C','P','D','S'};
const char ConstBuffColor[MAX_BUFF_NUM+5]={0,fblue+flight,fgreen+flight,fred+flight,fyellow+flight,fpurple+flight};struct Plane{/*Shape of the plane:^             (x,y)/ \            (x+1,y-1) to (x+1,y+1)|---------|        (x+2,y-5) to (x+2,y+5)|             (x+3,y)---            (x+4,y-1) to (x+4,y+1)@@@@@@@@@         (x+5,y-4) to (x+5,y+4)(OOOOOOOOO)000000/000000       (x+6,y-6) to (x+6,y+6)  (Blood and full blood)*/int x,y;//position of the headint Blood,FullBlood;int LastShotTime;int ShotSpeed;LL Score,BossScore;int Buffs[10],GetBuffTime[10];double AddAtack,AddShotSpeed;int Money;int MeetBossTimes;void Init(bool isDebug){if(isDebug){Ammo.clear();LastShotTime=-INF;/*It shot one time in at most 1000-ShotSpeed ms*/ShotSpeed=20;Blood=10000,FullBlood=10000;x=WINDOWC/2,y=WINDOWW-8;Score=BossScore=0;AddAtack=AddShotSpeed=50.0;MeetBossTimes=1;memset(Buffs,0,sizeof Buffs);}else{Ammo.clear();LastShotTime=-INF;/*It shot one time in at most 1000-ShotSpeed ms*/ShotSpeed=500;Blood=500,FullBlood=500;x=WINDOWC/2,y=WINDOWW-8;Score=BossScore=0;AddAtack=AddShotSpeed=1.0;MeetBossTimes=1;memset(Buffs,0,sizeof Buffs);}}bool NeedBoss(){if(Score>=ConstBossNeedScore[MeetBossTimes])return MeetBossTimes++,1;return 0;}void Flash(int fcolor){TP(x,y,fcolor+bwhite,'^');TP(x+1,y-1,fcolor+bwhite,'/'),TP(x+1,y+1,fcolor+bwhite,'\\');TP(x+2,y-5,fcolor+bwhite,'|');for(int i=y-4;i<=y+4;i++)TP(x+2,i,fcolor+bwhite,'-');TP(x+2,y+5,fcolor+bwhite,'|');TP(x+3,y,fcolor+bwhite,'|');TP(x+4,y-1,fcolor+bwhite,'-'),TP(x+4,y,fcolor+bwhite,'-'),TP(x+4,y+1,fcolor+bwhite,'-');Sleep(200);TP(x,y,OC,'^');TP(x+1,y-1,OC,'/'),TP(x+1,y+1,OC,'\\');TP(x+2,y-5,OC,'|');for(int i=y-4;i<=y+4;i++)TP(x+2,i,OC,'-');TP(x+2,y+5,OC,'|');TP(x+3,y,OC,'|');TP(x+4,y-1,OC,'-'),TP(x+4,y,OC,'-'),TP(x+4,y+1,OC,'-');}/*Check if hit only on the body*/bool Hit(int tx,int ty){return (tx==x&&ty==y)||(tx==x+1&&ty>=y-1&&ty<=y+1)||(tx==x+2&&ty>=y-5&&ty<=y+5)||(tx==x+3&&ty==y)||(tx==x+4&&ty>=y-1&&ty<=y+1);}/*Move the blood line(just move)*//*Remember to check if the position is OK before using*//*And it won't update the plane's position (x and y)*/void BloodRefresh(int NewX,int NewY){TP(x+5,y-4,OC,"         ");TP(x+6,y-6,OC,"             ");/*Round up*/int FullBlock=(Blood*9+FullBlood-1)/FullBlood;   //Number of "@"int EmptyBlock=9-FullBlock;                      //Number of "O"int BloodColor=ConstBloodColor[(FullBlock+2)/3];/*Print the blood line*/for(int i=1;i<=FullBlock;i++)TP(NewX+5,NewY-5+i,BloodColor+bblack,'@');for(int i=1;i<=EmptyBlock;i++)TP(NewX+5,NewY-5+FullBlock+i,fgray+bblack,'O');/*Print the blood/fullblood number*//*Due to %06d we can't use TP*/gto(NewX+6,NewY-6),color(fgray+bblack),printf("%06d",Blood);TP(NewX+6,NewY,OC,'/');gto(NewX+6,NewY+1),color(fgray+bblack),printf("%06d",FullBlood);}/*Move the plane to a new place*/void MovePrint(int NewX,int NewY,int flag=1){/*Insure that player can control the plane when the mouse is out of screen*/NewX=min(NewX,WINDOWC-7);NewY=min(max(NewY,6),WINDOWW-7);if(flag&&NewX==x&&NewY==y)return;//gto(WINDOWC-1,0),color(OC),printf("%3d %3d",NewX,NewY);//Debug/*Clear the plane in the old position*/TP(x,y,OC,' ');TP(x+1,y-1,OC,' '),TP(x+1,y+1,OC,' ');for(int i=y-5;i<=y+5;i++) TP(x+2,i,OC,' ');TP(x+3,y,OC,' ');TP(x+4,y-1,OC,' '),TP(x+4,y,OC,' '),TP(x+4,y+1,OC,' ');/*Move the blood line*/BloodRefresh(NewX,NewY);/*Print in the new position*/x=NewX,y=NewY;TP(x,y,OC,'^');TP(x+1,y-1,OC,'/'),TP(x+1,y+1,OC,'\\');TP(x+2,y-5,OC,'|');for(int i=y-4;i<=y+4;i++)TP(x+2,i,OC,'-');TP(x+2,y+5,OC,'|');TP(x+3,y,OC,'|');TP(x+4,y-1,OC,'-'),TP(x+4,y,OC,'-'),TP(x+4,y+1,OC,'-');/*Refresh the bullets*/}void Shot(){/*Buff 5*//*Faster shot*/int t=clock();if(Buffs[5]==1)ShotSpeed+=100,Buffs[5]=-1;if(Buffs[5]==-1&&t-GetBuffTime[5]>=ConstBuffLastTime[5]){ShotSpeed-=100;Buffs[5]=0;GetBuffTime[5]=0;}if(!ShotSpeed||LastShotTime>=t-(1000-ShotSpeed*AddShotSpeed))return;LastShotTime=t;if(x>0){OwnShotTimes++;int Type=1;/*Buff 3*//*Get bullets more powerful*/if(Buffs[3]){if(t-GetBuffTime[3]>=ConstBuffLastTime[3])Buffs[3]=0,GetBuffTime[3]=0;elseType=3;}Ammo.insert(new Bullet(1,x-1,y,Type,-1,0));/*Buff 1*//*5 lines of bullets*/if(Buffs[1]){if(t-GetBuffTime[1]>=ConstBuffLastTime[1]){Buffs[1]=0;GetBuffTime[1]=0;return;}Ammo.insert(new Bullet(1,x-1,y-2,Type,-1,0));Ammo.insert(new Bullet(1,x-1,y-1,Type,-1,0));Ammo.insert(new Bullet(1,x-1,y+1,Type,-1,0));Ammo.insert(new Bullet(1,x-1,y+2,Type,-1,0));}}}
}Own;struct Buff{int x,y;int Type;int DisappearTime;Buff(){}Buff(int t){x=rand()%(WINDOWC-3)+1,y=rand()%(WINDOWW-2)+1,Type=t,DisappearTime=clock()+ConstBuffAppearTime[t];}
};
set<Buff*> BuffIn;
int LastBuffAppearTime;
int BuffAppearCD=3000;
void BuffRefresh(){int T=clock();/*New buff in the screen*/if(LastBuffAppearTime+BuffAppearCD<=T){int id=rand();int t=ConstBuffAppearPossibility[BossFlag][id%10];if(t)BuffIn.insert(new Buff(t));LastBuffAppearTime=T;}vector<set<Buff*>::iterator> Throw;for(set<Buff*>::iterator it=BuffIn.begin();it!=BuffIn.end();it++){Buff *p=*it;TP(p->x,p->y,ConstBuffColor[p->Type],ConstBuffName[p->Type]);if(Own.Hit(p->x,p->y)){/*Buff 2*//*Recover 100 blood*/if(p->Type==2){Own.Blood=min(Own.Blood+100,Own.FullBlood);Own.BloodRefresh(Own.x,Own.y);}else{Own.Buffs[p->Type]=1;Own.GetBuffTime[p->Type]=T;}Throw.push_back(it);TP(p->x,p->y,OC,' ');}else if(T>=p->DisappearTime){Throw.push_back(it);TP(p->x,p->y,OC,' ');}}for(int i=0;i<int(Throw.size());i++)BuffIn.erase(Throw[i]);//for(int i=1;i<=MAX_BUFF_NUM;i++)//    if(Own.Buffs[i]&&clock()-Own.GetBuffTime[i]>=ConstBuffLastTime[i])//        Own.Buffs[i]=0;
}const char CHART[15]={'|','?','^','&','=','!','@',':','p','\\'};void GameOver(){color(OC);system("cls");/*Get max score before*/LL MaxScore=0;LL num=((MaxScore*18-2)*38-1314)/2*100+52;ifstream R("./MaxScore.sc");if(!R.is_open())TP(0,0,OC,"ERROR");string str;R>>str;if(str.length()){num=0;for(int i=0;i<int(str.length());i++)if(isdigit(str[i]))num=num*10ll+str[i]-'0';}R.close();/*unlock*/MaxScore=(((num-52)/100*2+1314)/38+2)/18;TP(WINDOWC/2-2,(WINDOWW+40-10)/2,fred+flight+bblack,"Game Over!");TP(WINDOWC/2-1,(WINDOWW+40-15)/2,OC,"Your score: ");gto(WINDOWC/2-1,(WINDOWW+40-15)/2+12),color(OC),printf("%08lld",Own.Score+Own.BossScore);TP(WINDOWC/2,(WINDOWW+40-15)/2,OC,"MaxScore: ");gto(WINDOWC/2,(WINDOWW+40-15)/2+12),color(OC),printf("%08lld",max(Own.Score+Own.BossScore,MaxScore));if(Own.Score+Own.BossScore>MaxScore){TP(WINDOWC/2+1,(WINDOWW+40-15)/2+2,fred+flight+bblack,"(Refreshed!)"),MaxScore=Own.Score+Own.BossScore;/*lock*/num=((MaxScore*18-2)*38-1314)/2*100+52;string New;for(int i=1;i<=30;i++){if(rand()%2)New+=CHART[rand()%10];else if(num)New+=num%10+'0',num/=10;}while(num)New+=num%10+'0',num/=10;while(New.length()<30)New+=CHART[rand()%10];reverse(New.begin(),New.end());fstream CLEAR("./MaxScore.sc", ios::trunc);CLEAR.close();ofstream T("./MaxScore.sc");if(!T.is_open())TP(0,0,OC,"ERROR");T<<New;T.close();}TP(WINDOWC/2+2,(WINDOWW+40-15)/2-3,OC,"(Press any key to exit)");getch();gto(WINDOWC/2+4,0),exit(0);
}bool isHit(int,int,int);void MoveBullet(Bullet &me){int t=clock();if(me.LastBulletRefreshTime>=t-(100-ConstBulletSpeed[me.Type]))return;me.LastBulletRefreshTime=t;int tx=me.x+me.dx,ty=me.y+me.dy;TP(me.x,me.y,OC,' ');/*It runs out of the screen => erase it*/if(tx<0||tx>=WINDOWC||ty<0||ty>=WINDOWW||isHit(tx,ty,me.Type)){me.isExist=0;return;}TP(me.x=tx,me.y=ty,ConstBulletColor[me.Type],ConstBulletShape[me.Type]);
}#define MAX_BUFFFULLNAME_LEN 16
const int ConstBuffTipPosition[MAX_BUFF_NUM+5][2]={{0,0},{13,WINDOWW+3},{14,WINDOWW+3},{15,WINDOWW+3},{16,WINDOWW+3},{17,WINDOWW+3}};
const char ConstBuffFullName[MAX_BUFF_NUM+5][MAX_BUFFFULLNAME_LEN+5]={"","4 more bullets","recover 50 blood","more powerful","double score","shot faster"};
const int ConstMaxBuffFullNameLen[MAX_BUFF_NUM+5]={0,16,16,16,16,16};
void BuffTipRefresh(){/*TP(12,WINDOWW+3,OC,"---------Details of Buffs---------");TP(18,WINDOWW+3,OC,"----------------------------------");*/int C=fgray;for(int i=1;i<=MAX_BUFF_NUM;i++){TP(ConstBuffTipPosition[i][0],ConstBuffTipPosition[i][1],C,ConstBuffName[i]);TP(ConstBuffTipPosition[i][0],ConstBuffTipPosition[i][1]+1,C,": ");TP(ConstBuffTipPosition[i][0],ConstBuffTipPosition[i][1]+3,C+(Own.Buffs[i]?bwhite+blight:0),ConstBuffFullName[i]);gto(ConstBuffTipPosition[i][0],ConstBuffTipPosition[i][1]+3+ConstMaxBuffFullNameLen[i]),color(C+(Own.Buffs[i]?bwhite+blight:0)),printf("[%02d S]",int(Own.Buffs[i]?(ConstBuffLastTime[i]-(clock()-Own.GetBuffTime[i])+999)/1000:0));}
}void EnemyClear(){int tmp=UFORefreshTime;UFORefreshTime=INF;for(set<UFO*>::iterator it=Enemy.begin();it!=Enemy.end();it++)(*it)->isExist=0;UFORefresh();UFORefreshTime=tmp;
}double Performance();//D C B A S
const int PerfColor[10]={fblack+bwhite,fgray+bwhite,fpurple+bwhite,fgreen+bwhite,fred+bwhite};
const char PerfLevel[10][8]={"D.","C.","B.","A!","S!!"};struct BOSS{/*Shape of the boss:0000000/0000000           (x-7,y-7) to (x-7,y+7)@@@@@@@@@@@@@@@           (x-6,y-7) to (x-6,y+7)(OOOOOOOOOOOOOOO)[-----------]            (x-5,y-6) to (x-5,y+6)\OOXXXOO/              (x-4,y-4) to (x-4,y+4)+---\XXOXX/---+           (x-3,y-7) to (x-3,y+7)V    \OOO/    V           (x-2,y-7) to (x-2,y+7)\O/                 (x-1,y-1) to (x-1,y+1)V                  (x,y)*/int isExist;int x,y;//position of the headint dx,dy;int Blood,FullBlood;int ShotSpeed1,ShotSpeed2,LastShotTime1,LastShotTime2,flag2;int MoveSpeed,LastMoveTime;int Score,AppearTime;int StopCD,StopTime,LastStopTime,isStop;int Money;bool Hit(int tx,int ty){return (tx==x-5&&ty>=y-6&&ty<=y+6)||(tx==x-4&&ty>=y-4&&ty<=y+4)||(tx==x-3&&ty>=y-7&&ty<=y+7)||(tx==x-2&&((ty==y-7)||(ty==y+7)||(ty>=y-2&&ty<=y+2)))||(tx==x-1&&ty>=y-1&&ty<=y+1)||(tx==x&&ty==y);}void Die(){flash(3);BossFlag=0;double tmp=Performance();int Add=int(Score*tmp);Own.BossScore+=Add;Own.Money+=Money*(tmp/3.0);ScoreFlash=MoneyFlash=1;TP(WINDOWC/2-1,WINDOWW/2-18,OC,"+-----------------------------------+");TP(WINDOWC/2  ,WINDOWW/2-18,OC,'|'),gto(WINDOWC/2,WINDOWW/2-7),color(PerfColor[int(tmp)]),printf("%s",PerfLevel[int(tmp)]),printf("  + %d scores !",Add),TP(WINDOWC/2  ,WINDOWW/2+18,OC,'|');TP(WINDOWC/2+1,WINDOWW/2-18,OC,"+-----------------------------------+");Sleep(1500);TP(WINDOWC/2-1,WINDOWW/2-18,OC,"                                     ");TP(WINDOWC/2  ,WINDOWW/2-18,OC,"                                     ");TP(WINDOWC/2+1,WINDOWW/2-18,OC,"                                     ");if(x-7>=0) TP(x-7,y-7,OC,"               ");if(x-6>=0) TP(x-6,y-7,OC,"               ");if(InRange(x)) TP(x,y,OC,' ');if(InRange(x-1)) TP(x-1,y-1,OC,"   ");if(InRange(x-2)) TP(x-2,y-7,OC,"               ");if(InRange(x-3)) TP(x-3,y-7,OC,"               ");if(InRange(x-4)) TP(x-4,y-4,OC,"         ");if(InRange(x-5)) TP(x-5,y-6,OC,"             ");EnemyClear();}void Flash(){if(InRange(x-5)) TP(x-5,y-6,fblack+bwhite,"[-----------]");if(InRange(x-4)) TP(x-4,y-4,fblack+bwhite,'\\'),TP(x-4,y-3,fblack+bwhite,"OO"),TP(x-4,y-1,fblack+bwhite,"XXX"),TP(x-4,y+2,fblack+bwhite,"OO"),TP(x-4,y+4,fblack+bwhite,"/");if(InRange(x-3)) TP(x-3,y-7,fblack+bwhite,"+---\\XX"),TP(x-3,y,fblack+bwhite,'O'),TP(x-3,y+1,fblack+bwhite,"---+");if(InRange(x-2)) TP(x-2,y-7,fblack+bwhite,'V'),TP(x-2,y-2,fblack+bwhite,'\\'),TP(x-2,y-1,fblack+bwhite,"OOO"),TP(x-2,y+2,fblack+bwhite,'/'),TP(x-2,y+7,fblack+bwhite,'V');if(InRange(x-1)) TP(x-1,y-1,fblack+bwhite,'\\'),TP(x-1,y,fblack+bwhite,'O'),TP(x-1,y+1,fblack+bwhite,'/');if(InRange(x-5)) TP(x-5,y-6,OC,"[-----------]");if(InRange(x-4)) TP(x-4,y-4,OC,'\\'),TP(x-4,y-3,fgray+bblack,"OO"),TP(x-4,y-1,OC,"XXX"),TP(x-4,y+2,fgray+bblack,"OO"),TP(x-4,y+4,OC,"/");if(InRange(x-3)) TP(x-3,y-7,OC,"+---\\XX"),TP(x-3,y,fgray+bblack,'O'),TP(x-3,y+1,OC,"---+");if(InRange(x-2)) TP(x-2,y-7,fgray+bblack,'V'),TP(x-2,y-2,OC,'\\'),TP(x-2,y-1,fgray+bblack,"OOO"),TP(x-2,y+2,OC,'/'),TP(x-2,y+7,fgray+bblack,'V');if(InRange(x-1)) TP(x-1,y-1,OC,'\\'),TP(x-1,y,fgray+bblack,'O'),TP(x-1,y+1,OC,'/');if(InRange(x)) TP(x,y,OC,' ');if(InRange(x)) TP(x,y,OC,'V');}void Init(int S){Blood=FullBlood=ConstBossFullBlood[S];x=0,y=rand()%(WINDOWW-14)+7;//Must be in the screendx=1,dy=0;LastShotTime1=LastShotTime2=0;flag2=0;ShotSpeed1=ConstBossShotSpeed[S][0],ShotSpeed2=ConstBossShotSpeed[S][1];MoveSpeed=ConstBossMoveSpeed[S];LastMoveTime=0;Score=ConstBossScore[S];AppearTime=clock();isExist=1;StopTime=ConstBossStopTime[S],StopCD=ConstBossStopCD[S],LastStopTime=isStop=0;Money=ConstBossMoney[S];}void BloodRefresh(int NewX,int NewY){/*Print the blood/fullblood number*//*Due to %06d we can't use TP*/if(x-7>=0){dx=0;TP(x-7,y-7,OC,"               ");if(isExist){if(NewX-7<WINDOWC){gto(NewX-7,NewY-7),color(fcyan+bblack),printf("%07d",Blood);TP(NewX-7,NewY,fcyan+bblack,'/');gto(NewX-7,NewY+1),color(fcyan+bblack),printf("%07d",FullBlood);}}}/*To appear gradually, we should check the position*/if(x-6>=0){TP(x-6,y-7,OC,"               ");if(isExist)if(NewX-6<WINDOWC){/*Round up*/int FullBlock=(Blood*15+FullBlood-1)/FullBlood;   //Number of "@"int EmptyBlock=15-FullBlock;                       //Number of "O"int BloodColor=ConstBloodColor[(FullBlock+4)/5];/*Print the blood line*/for(int i=1;i<=FullBlock;i++)TP(NewX-6,NewY-8+i,BloodColor+bblack,'@');for(int i=1;i<=EmptyBlock;i++)TP(NewX-6,NewY-8+FullBlock+i,fgray+bblack,'O');}}if(x-7>=WINDOWC)isExist=0;}/*Only one boss so we don't have to make the function out*/void MovePrint(){int t=clock();if(LastMoveTime>=t-(1000-MoveSpeed))return;LastMoveTime=t;/*Change the direction*/if(rand()%10==0)dy=ConstNewDy[rand()%3];int NewX=x+dx,NewY=y+dy;if(UFOCrash(NewX,NewY)||NewY-7<0||NewY+7>=WINDOWW)for(int i=0;i<3;i++){dy=ConstNewDy[rand()%3];NewX=x+dx,NewY=y+dy;if(!(UFOCrash(NewX,NewY)||NewY-7<0||NewY+7>=WINDOWW))break;}if(UFOCrash(NewX,NewY)||NewY-7<0||NewY+7>=WINDOWW)return;if(InRange(x)) TP(x,y,OC,' ');if(InRange(NewX)) TP(NewX,NewY,OC,'V');if(InRange(x-1)) TP(x-1,y-1,OC,"   ");if(InRange(NewX-1))TP(NewX-1,NewY-1,OC,'\\'),TP(NewX-1,NewY,fgray+bblack,'O'),TP(NewX-1,NewY+1,OC,'/');if(InRange(x-2)) TP(x-2,y-7,OC,"               ");if(InRange(NewX-2)) TP(NewX-2,NewY-7,fgray+bblack,'V'),TP(NewX-2,NewY-2,OC,'\\'),TP(NewX-2,NewY-1,fgray+bblack,"OOO"),TP(NewX-2,NewY+2,OC,'/'),TP(NewX-2,NewY+7,fgray+bblack,'V');if(InRange(x-3)) TP(x-3,y-7,OC,"               ");if(InRange(NewX-3)) TP(NewX-3,NewY-7,OC,"+---\\XX"),TP(NewX-3,NewY,fgray+bblack,'O'),TP(NewX-3,NewY+1,OC,"XX/---+");if(InRange(x-4)) TP(x-4,y-4,OC,"         ");if(InRange(NewX-4)) TP(NewX-4,NewY-4,OC,'\\'),TP(NewX-4,NewY-3,fgray+bblack,"OO"),TP(NewX-4,NewY-1,OC,"XXX"),TP(NewX-4,NewY+2,fgray+bblack,"OO"),TP(NewX-4,NewY+4,OC,"/");if(InRange(x-5)) TP(x-5,y-6,OC,"             ");if(InRange(NewX-5)) TP(NewX-5,NewY-6,OC,"[-----------]");BloodRefresh(NewX,NewY);x=NewX,y=NewY;}void Shot(){int t=clock();if(LastShotTime1<t-(100-ShotSpeed1)){LastShotTime1=t;if(x-1>=0){Ammo.insert(new Bullet(1,x-1,y-7,4,1,0));Ammo.insert(new Bullet(1,x-1,y+7,4,1,0));}}if(LastShotTime2<t-(100-ShotSpeed2-500)){LastShotTime2=t,flag2=1;TP(x,y,fred+flight+bgray,'V');}if(flag2&&t>=LastShotTime2+500){flag2=0;if(x+1>=0)Ammo.insert(new Bullet(1,x+1,y,5,1,0));}}
}Boss;/*There's an awful problem that set<UFO*>Enemy will be use in the struct UFO but it needs the declaration of struct UFO so we can neither put it in front of the struct UFO nor put it after the struct UFO...*/
/*So we have to get the function Crash out of the struct UFO.*/ /*Eating shit*/
/*To check if it will hit another UFO*/
void UFOMovePrint(UFO&,set<UFO*>::iterator);
bool UFOCrash(UFO me,int NewX,int NewY,set<UFO*>::iterator ID){for(set<UFO*>::iterator it=Enemy.begin();it!=Enemy.end();it++){int ox=(*it)->x,oy=(*it)->y;if(it==ID||ox<NewX) continue;if(NewX<=ox+4&&NewX>=ox-4&&NewY>=oy-8&&NewY<=oy+8){/*avoid disfluency*/UFO *New=*it;UFOMovePrint(*New,it);return 1;}}if(BossFlag&&NewX<=Boss.x&&NewX>=Boss.x-5&&NewY>=Boss.y-9&&NewY<=Boss.y+9)return 1;return 0;
}
bool UFOCrash(int NewX,int NewY){for(set<UFO*>::iterator it=Enemy.begin();it!=Enemy.end();it++){int ox=(*it)->x,oy=(*it)->y;if(ox<NewX) continue;if(NewX<=ox+9&&NewX>=ox-9&&NewY>=oy-9&&NewY<=oy+9)return 1;}return 0;
}//OwnShotTimes,OwnLoseBlood,OwnShotOnTimes;
double Performance(){//(0,5]double p1=double(OwnShotOnTimes)/max(OwnShotTimes,1);double p2=max(double(Own.FullBlood-OwnLoseBlood)/Own.FullBlood,0.0);return min((p1+p2)*2.5,4.999999);
}void BossRefresh(){Boss.MovePrint();int t=clock();if(!Boss.isStop)Boss.Shot();if(!Boss.isStop&&Boss.LastStopTime+Boss.StopTime+Boss.StopCD<=t)Boss.LastStopTime=t,Boss.isStop=1;if(Boss.isStop&&t-Boss.LastStopTime>=Boss.StopTime)Boss.isStop=0;
}void Init(){srand((unsigned)time(NULL));//SetWindow("HPF",WINDOWC+12,WINDOWW+45,0,500);SetWindow("HPF",WINDOWC+2,WINDOWW+40);HindCursor();TP(0,0,OC,"+---------------------------------------------------------------------------------------------+");TP(2,(WINDOWW+40)/2-7,OC,"Hape Flying Game");TP(7,0,OC,"+---------------------------------------------------------------------------------------------+");Button Start=NewButton(4,(WINDOWW+40)/2-4,OC,"> Start <");Button More=NewButton(5,(WINDOWW+40)/2-4,OC,"> More  <");while(1){if(Preserve(Start)){Own.Init(0);break;}if(Preserve(More)){TP(6,3,fred,"Input the password: ");gto(6,22),color(fgray);char Key[15];fgets(Key,10,stdin);if(!strcmp(Key,"cxhsdsb\n")){Own.Init(1);break;}fflush(stdin);color(OC);system("cls");TP(0,0,OC,"+---------------------------------------------------------------------------------------------+");TP(2,(WINDOWW+40)/2-7,OC,"Hape Flying Game");TP(7,0,OC,"+---------------------------------------------------------------------------------------------+");}Sleep(50);}color(OC);system("cls");
}/*Meet the awful problem again*/
bool isHit(int NewX,int NewY,int Type){if(Type==1||Type==3){int DM=int(ConstBulletDamage[Type]*Own.AddAtack);for(set<UFO*>::iterator it=Enemy.begin();it!=Enemy.end();it++){if((*it)->Hit(NewX,NewY)){/*Mention the order, or it won't be cleared*/UFO *t=*it;t->Flash();t->Blood=max(t->Blood-DM,0);t->BloodRefresh(t->x,t->y);if(t->Blood<=0){Own.Money+=t->Money;MoneyFlash=1;ScoreFlash=1;t->isExist=0;t->ClearPrint();int Add=t->Score;/*Buff 4*//*Double score*/if(Own.Buffs[4]){if(Own.GetBuffTime[4]+ConstBuffLastTime[4]>=clock()){Own.Buffs[4]=0;Own.GetBuffTime[4]=0;}Add+=t->Score;}if(BossFlag)Add/=10;Own.Score+=Add;}return 1;}}if(BossFlag&&Boss.Hit(NewX,NewY)){Boss.Flash();Boss.Blood=max(Boss.Blood-DM/2,0);Boss.BloodRefresh(Boss.x,Boss.y);OwnShotOnTimes++;if(Boss.Blood<=0)Boss.Die(),BossFlag=0;return 1;}}else if(Own.Hit(NewX,NewY)){Own.Flash(fred+flight);OwnLoseBlood+=min(Own.Blood,ConstBulletDamage[Type]);Own.Blood=max(Own.Blood-ConstBulletDamage[Type],0);Own.BloodRefresh(Own.x,Own.y);if(Own.Blood<=0)GameOver();return 1;}return 0;
}#define MAX_GRADE 10
const int ConstUpgradeCost[MAX_GRADE+5]={10,20,50,100,200,500,1000,2000,5000,10000,INF};
const char ConstUpgradeCostStr[MAX_GRADE+5][10]={"(M 10)","(M 20)","(M 50)","(M 100)","(M 200)","(M 500)","(M 1000)","(M 2000)","(M 5000)","(M 10000)","(M INF)  "};
const int ConstGradeColor[MAX_GRADE+5]={fgreen+flight+bblack,fgreen+flight+bblack,fgreen+bblack,fblue+flight+bblack,fblue+flight+bblack,fblue+bblack,fyellow+flight+bblack,fyellow+bblack,fyellow+bblack,fred+flight+bblack,fred+bblack,fred+bblack};
const char ConstGradeName[MAX_GRADE+5][20]={"[G0]","[G1]","[G2]","[G3]","[G4]","[G5]","[G6]","[G7]","[G8]","[G9]","[G10]"};int main(){//GameOver();//ColorPrint();//getchar();Init();HWND hd;hd=GetForegroundWindow();TP(12,WINDOWW+3,OC,"---------Details of Buffs---------");TP(18,WINDOWW+3,OC,"----------------------------------");//Own.Blood=100;int cnt=1;BossFlag=0;int LastT=clock()/1000-2,LastMoney=-1;BEGINTIME=clock();int _____=0,STOP=0,LastPreserveTime=-INF;Button AddFullBlood,AddAttack,AddShotSpeed;int FullBloodGrade=0,AttackGrade=0,ShotSpeedGrade=0;string AddFullBloodTip("> Add your max blood by 500"),AddAttackTip("> Add your attack by 10%"),AddShotSpeedTip("> Add your shot speed by 10%");AddFullBlood=NewButton(5,WINDOWW+3,OC,"> Add your max blood by 200");AddAttack=NewButton(6,WINDOWW+3,OC,"> Add your attack by 10%");AddShotSpeed=NewButton(7,WINDOWW+3,OC,"> Add your shot speed by 5%");//Own.Money=10000000;while(1){if(!STOP){if(_____%10==0){gto(0,0),color(OC);for(int i=1;i<=WINDOWW+40;i++)putchar('-');gto(WINDOWC,0),color(OC);for(int i=1;i<=WINDOWW+40;i++)putchar('-');}_____++;POINT k;GetPos(k);Own.MovePrint(min(max(int(k.x)-3,1),WINDOWC-1),min(max(int(k.y),0),WINDOWW-1));if(KEY_DOWN(MOUSE_MOVED))Own.Shot();BulletsRefresh();if(BossFlag)BossRefresh();UFORefresh();BuffRefresh(),BuffTipRefresh();if(ScoreFlash){ScoreFlash=0;TP(10,WINDOWW+3,fred+flight+bwhite,"[ "),TP(10,WINDOWW+5,OC-bblack+bwhite,"Score: "),gto(10,WINDOWW+12),color(OC-bblack+bwhite),printf("%04lld + %08lld",Own.Score,Own.BossScore),TP(10,WINDOWW+27,fred+flight+bwhite," ]");Sleep(100);}TP(10,WINDOWW+3,fred+flight+bblack,"[ "),TP(10,WINDOWW+5,OC,"Score: "),gto(10,WINDOWW+12),color(OC),printf("%04lld + %08lld",Own.Score,Own.BossScore),TP(10,WINDOWW+27,fred+flight+bblack," ]");int T=(clock()-BEGINTIME)/1000;if(T!=LastT){TP(9,WINDOWW+3,fred+flight+bblack,"[ "),TP(9,WINDOWW+5,OC,"Time: "),gto(9,WINDOWW+11),color(OC),printf("%05d",T),TP(9,WINDOWW+16,fred+flight+bblack," ]");LastT=T;}}if(Own.Money!=LastMoney){if(MoneyFlash){MoneyFlash=0;TP(1,WINDOWW+3,fred+flight+bwhite,"[ "),TP(1,WINDOWW+6,OC-bblack+bwhite,"Money: "),gto(1,WINDOWW+13),color(OC-bblack+bwhite),printf("%08d",LastMoney=Own.Money),TP(1,WINDOWW+21,fred+flight+bwhite," ]");Sleep(100);}TP(1,WINDOWW+3,fred+flight+bblack,"[ "),TP(1,WINDOWW+6,OC,"Money: "),gto(1,WINDOWW+13),color(OC),printf("%08d",LastMoney=Own.Money),TP(1,WINDOWW+21,fred+flight+bblack," ]");}if(clock()-LastPreserveTime>=100){LastPreserveTime=clock();if(Preserve(AddFullBlood)){if(Own.Money>=ConstUpgradeCost[FullBloodGrade]){Own.Money-=ConstUpgradeCost[FullBloodGrade];Own.FullBlood+=200;MoneyFlash=1;FullBloodGrade++;}}if(Preserve(AddAttack)){if(Own.Money>=ConstUpgradeCost[AttackGrade]){Own.Money-=ConstUpgradeCost[AttackGrade];Own.AddAtack+=0.1;MoneyFlash=1;AttackGrade++;}}if(Preserve(AddShotSpeed)){if(Own.Money>=ConstUpgradeCost[ShotSpeedGrade]){Own.Money-=ConstUpgradeCost[ShotSpeedGrade];Own.AddShotSpeed+=0.05;MoneyFlash=1;ShotSpeedGrade++;}}TP(5,WINDOWW+31,ConstGradeColor[FullBloodGrade+1],ConstUpgradeCostStr[FullBloodGrade]);TP(2,WINDOWW+3,OC,"Max Blood: "),gto(2,WINDOWW+18),color(OC),printf("%06d",Own.FullBlood);TP(2,WINDOWW+25,ConstGradeColor[FullBloodGrade],ConstGradeName[FullBloodGrade]);Own.MovePrint(Own.x,Own.y,0);TP(6,WINDOWW+31,ConstGradeColor[AttackGrade+1],ConstUpgradeCostStr[AttackGrade]);TP(3,WINDOWW+3,OC,"Attack: "),gto(3,WINDOWW+18),color(OC),printf("%06d",int((Own.Buffs[3]?ConstBulletDamage[3]:ConstBulletDamage[1])*Own.AddAtack));TP(3,WINDOWW+25,ConstGradeColor[AttackGrade],ConstGradeName[AttackGrade]);TP(7,WINDOWW+31,ConstGradeColor[ShotSpeedGrade+1],ConstUpgradeCostStr[ShotSpeedGrade]);TP(4,WINDOWW+3,OC,"Attack Speed: "),gto(4,WINDOWW+18),color(OC),printf("%06d",int(Own.ShotSpeed*Own.AddShotSpeed));TP(4,WINDOWW+25,ConstGradeColor[ShotSpeedGrade],ConstGradeName[ShotSpeedGrade]);}if(kbhit()){char c=getch();if(c==' '){if(!STOP){TP(WINDOWC/2-1,WINDOWW/2-16,OC,"+----------------------------------+");TP(WINDOWC/2  ,WINDOWW/2-16,OC,"|   Press space bar to continue.   |");TP(WINDOWC/2+1,WINDOWW/2-16,OC,"+----------------------------------+");STOP=1;}else{TP(WINDOWC/2-1,WINDOWW/2-16,OC,"                                    ");TP(WINDOWC/2  ,WINDOWW/2-16,OC,"                                    ");TP(WINDOWC/2+1,WINDOWW/2-16,OC,"                                    ");STOP=0;RECT W;GetWindowRect(hd,&W);SetCursorPos(W.left+Own.y*8+10,W.top+Own.x*16+80);}}}/*Boos*/if(!BossFlag&&Own.NeedBoss()){//if(!BossFlag)Sleep(200);flash(3);OwnShotTimes=OwnLoseBlood=OwnShotOnTimes=0;EnemyClear();//UFORefreshTime=5000;//BuffAppearCD=5000;Boss.Init(cnt);BossFlag=1;cnt++;}}
}

相关文章:

C++控制台打飞机小游戏

我终于决定还是把这个放出来。 视频在这&#xff1a;https://v.youku.com/v_show/id_XNDQxMTQwNDA3Mg.html 具体信息主界面上都有写。 按空格暂停&#xff0c;建议暂停后再升级属性。 记录最高分的文件进行了加密。 有boss&#xff08;上面视频2分47秒&#xff09;。 挺好…...

Pinna的使用以及pinna的持续化存储(两种方法)

一、简介 pinia是 vue3 新的状态管理工具&#xff0c;简单来说相当于之前 vuex&#xff0c;它去掉了 Mutations 但是也是支持 vue2 的&#xff0c;需要的朋友可以参考下 二、使用方法 1.安装 npm install pinia -S 2..引入 import { createPinia,PiniaPluginContext } from p…...

开发中造成空指针的常见用法,如何避免

1. 前言 《手册》的第 7 页和 25 页有两段关于空指针的描述&#xff1a; 【强制】Object 的 equals 方法容易抛空指针异常&#xff0c;应使用常量或确定有值的对象来调用 equals。 【推荐】防止 NPE&#xff0c;是程序员的基本修养&#xff0c;注意 NPE 产生的场景: 返回类型为…...

MySQL事务和索引

目录 事务的概念 事务的四大特性&#xff08;ACID&#xff09; 原子性 隔离性 持久性 一致性 什么是脏读、幻读和不可重复读&#xff1f; 脏读 幻读 不可重复读 事务的隔离级别 读未提交 读已提交 可重复读 串行化 索引 索引优点 索引缺点 索引分类 索引设…...

Kali工具集简介

Kali Linux提供了数种经过定制的专门为渗透测试设计的工具。工具都会按下图中下拉选单所示的方式按组分类聚合。了解工具是做渗透测试第一个认知。 口Information Gathering(信息收集) 这些都是侦察工具,用来收集目标网络和设备的数据。在这类工具中,从找出设备的工具到查看使…...

离散数学 | 图论 | 欧拉图 | 哈密顿图 | 割点 | 桥(欧拉图和哈密顿图有没有割点和桥?)

本文主要解决以下几个问题&#xff1a; 1.欧拉图能不能有割点&#xff0c;能不能有桥&#xff1f; 2.哈密顿图能不能有割点&#xff0c;能不能有桥&#xff1f; 首先我们要明白几个定义 割点的定义就是在一个图G中&#xff0c;它本来是连通的&#xff0c;去掉一个点v以后这个…...

Android生命周期:理解与应用

摘要&#xff1a;Android生命周期是开发Android应用程序时至关重要的概念。本文将介绍Android生命周期的概念、生命周期方法的执行顺序以及如何在应用程序中正确地管理生命周期。我们还将讨论生命周期对于应用程序的重要性&#xff0c;并提供一些实际应用中的最佳实践和注意事项…...

00后真的是内卷王中王,真的想离职了....

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;前段时间我们公司来了个00年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。…...

linux Fd以及重定向讲解

感谢你的阅读&#xff0c;是对我最大的鼓励&#xff01;&#xff01;&#xff01;&#xff01; 目录 fd理解 文件操作重定向 让我们回顾C语言文件操作 首选我们要知道2个知识点&#xff1a; 额外知识点 如何理解一切皆文件呢&#xff1f; 当父进程fork创建子进程是否创建…...

Moonbeam近日提案公投一览

正在跟进Moonbeam治理的小伙伴&#xff0c;一起来快速浏览一下近期生态中正在发生的事情吧&#xff01;其中包含多个去中心化应用的Grant加速计划提案、HRMP开拓提案以及优化质押相关平台的内容。许多提案都与网络的运作息息相关&#xff0c;一起了解和参与Moonbeam的发展吧&am…...

凝聚青年力量,打造数字化人才队伍

当代青年人勇于探索、敢于创新、勤于变革&#xff0c;积极承担社会责任。这与ABeam倡导的「Build Beyond As One.™」的品牌理念不谋而合。ABeam的青年员工是未来社会的中坚力量&#xff0c;也正用他们的青春能量助力ABeam在中国的发展。 01 新兴青年力量 对ABeam而言&#…...

蓝牙资讯|智能家居标准Matter 1.1 发布,智能家居产品兼容更丰富

据“CSA 连接标准联盟”官方微信号&#xff0c;Matter 1.1 版本已发布&#xff0c;“1.1 版本带来的更新使设备制造商和开发者上手更容易、产品获取认证更方便&#xff0c;也让产品能更快地交付给用户。该版本还为电池供电设备提供了更大支持&#xff0c;而这类设备涉及多种类型…...

Cube Map 系列之:手把手教你 实现天空盒(Sky Box)

什么是天空盒 An skybox is a box with textures on it to look like the sky in all directions or rather to look like what is very far away including the horizon.天空盒是一个使用纹理贴图构建的盒子&#xff0c;人在其中朝任何一个方向看去&#xff0c;其纹理彷佛天空…...

腾讯VS百度:在AI上下大赌注

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 腾讯控股(00700)最近已经把基础模型和生成式人工智能应用方面的行业突破视为其业务的新增长机会了&#xff0c;并且正在大力投资人工智能&#xff0c;从而增强其现有产品的竞争力和拓展新的机会&#xff0c;比如腾讯已经把…...

字节原来这么容易进,是面试官放水,还是公司实在是太缺人?

本人211非科班&#xff0c;之前在字节和腾讯实习过&#xff0c;这次其实没抱着什么特别大的希望投递&#xff0c;没想到字节可以再给我一次机会&#xff0c;还是挺开心的。 本来以为有个机会就不错啦&#xff01;没想到能成功上岸&#xff0c;在这里要特别感谢帮我内推的同学&…...

生死疲劳|因为此书莫言获得诺贝尔奖

&#x1f4da;书名&#xff1a;《生死疲劳》 ✏️作者&#xff1a;莫言 历经六世的生死轮回&#xff0c; 三代人无尽的生死疲劳&#xff1b; 触碰极致的痛苦与快乐&#xff0c; 感受不灭的热情与希望。 &#x1f525;虽然本书长达39万字&#xff0c;但阅读过程却是无比的酣畅…...

Linux系统编程总结

day2 vim的三种工作模式 命令模式 vi hello.c zz 保存退出 2.编辑模式 i a o s &#xff08;有大写&#xff09;可以写东西 3.末行模式&#xff1a; 文本和末行模式不能直接切换 要切换回命令模式 再到末行模式&#xff0c;w:保存 q:退出 按两次esc回到命令模式 vim的基本…...

javascript基础二:Javscript字符串的常用方法有哪些?

在日常开发中&#xff0c;我们对字符串也是操作蛮多&#xff0c;这里我们来整理下字符串的一下最常用的方法 一、操作方法 字符串常用的操作方法归纳为增、删、改、查 增 这里增的意思并不是说直接增添内容&#xff0c;而是创建字符串的一个副本&#xff0c;再进行操作 除了…...

面了个 Java 实习生,小伙很优秀!

大家好&#xff0c;我是鱼皮&#xff0c;前几天给自己的公司面试了一位 Java 暑期实习生&#xff0c;候选人目前是大三。 整个过程我都录屏了&#xff0c;并且在征得候选人的同意后&#xff0c;把面试过程分享出来。一方面是希望对其他在学编程找工作的小伙伴有一些启发和参考…...

Java -并发(多线程)-Interview面试题收集

1、多线程并发 1&#xff09;多线程中 synchronized 锁升级的原理是什么&#xff1f; synchronized 锁升级原理&#xff1a;在锁对象的对象头里面有一个 threadid 字段&#xff0c;在第一次访问的时候 threadid 为空&#xff0c;jvm 让其持有偏向锁&#xff0c;并将 threadid…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...