作者 | ixRic
责编 | 郭芮
出品 | CSDN博客
我终于决定还是把这个放出来。
这是我在纪中颓废的时候写的。
视频在这: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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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 long
void 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.yif(c=='-')f=-1;c=getchar();}-1,0,1};0,fyellow,fred+flight,fred+flight,fblue+flight,fred+bwhite};0,'*','*','O','|','%'};0,50,80,500,20,300};0,50,30,10,80,20};0,fred,fyellow,fgreen};0,1000,3000,5000,10000,30000,50000,100000,300000,500000,1000000};{0,0},{30,-3900},{30,-3400},{50,-2900},{50,-2400},{70,-1900},{70,-1400},{90,-900},{90,-400},{100,-400},{100,-400}};0,3200,3400,3600,3800,4000,4200,4400,4600,4800,5000};0,3000,2800,2600,2400,2200,2000,1800,1600,1400,1200};0,800,800,800,850,850,850,900,900,900,950};0,10000,20000,40000,80000,160000,320000,640000,1280000,2560000,5120000};0,100,200,500,1000,2000,5000,8000,10000,20000,50000};0,500,1000,1500,2000,2500,3000,3500,4000,4500,5000};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}0,5000,5000,5000,5000,5000};0,5000,0,5000,10000,5000};0,'B','C','P','D','S'};0,fblue+flight,fgreen+flight,fred+flight,fyellow+flight,fpurple+flight};
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'|','?','^','&','=','!','@',':','p','\\'};
>str;
if(str.length()){
num=0;
for(int i=0;iMaxScore){
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{0,0},{13,WINDOWW+3},{14,WINDOWW+3},{15,WINDOWW+3},{16,WINDOWW+3},{17,WINDOWW+3}};"","4 more bullets","recover 50 blood","more powerful","double score","shot faster"};0,16,16,16,16,16};"D.","C.","B.","A!","S!!"};
=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 screen
dx=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
=0){
TP(x-6,y-7,OC," ");
if(isExist)
if(NewX-6
x,oy=(*it)->y;
if(it==ID||ox=oy-8&&NewY
=Boss.y-9&&NewY
x,oy=(*it)->y;
if(ox=oy-9&&NewY//(0,5]
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
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.Blood10,20,50,100,200,500,1000,2000,5000,10000,INF};"(M 10)","(M 20)","(M 50)","(M 100)","(M 200)","(M 500)","(M 1000)","(M 2000)","(M 5000)","(M 10000)","(M INF) "};"[G0]","[G1]","[G2]","[G3]","[G4]","[G5]","[G6]","[G7]","[G8]","[G9]","[G10]"};
=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++;
}
}
}
声明:本文为CSDN博主「ixRic」的原创文章,原文链接:https://blog.csdn.net/C20190102/article/details/102727963
热 文 推 荐
☞抢饭碗?00 后程序员来了!
☞程序员并不适合创业,请不要无脑崇拜!
☞网络安全人才平均年薪 24.09 万,跳槽周期 31 个月,安全工程师现状大曝光!
☞华为生产不含美国芯片的手机!
☞“掘金”金融AI落地,英特尔趟出一套通关攻略
☞【图解】记一次手撕算法面试:字节跳动的面试官把我四连击了
☞2020年,区块链开发者还有哪些期待?
你点的每个“在看”,我都认真当成了喜欢
