有很多~~但我不是~~
by a13968943778 @ 2024-04-27 17:17:08
@[a13968943778](/user/1221432) 你有吗,能不能给点,求求了【跪】
by liuziyang2010 @ 2024-04-27 17:20:11
@[liuziyang2010](/user/1313187)
https://blog.csdn.net/qq_42366672/article/details/128952636
这个网站
by Jerry_rat @ 2024-04-27 17:25:18
@[liuziyang2010](/user/1313187) [有一款游戏他好玩但又不好玩只有你发现了他的乐趣你就知道了](https://www.luogu.com.cn/problem/list)
by OJ_killer @ 2024-04-27 18:19:39
@[liuziyang2010](/user/1313187) [link](https://belivesinkinto.gitee.io/2022/07/31/C++%E6%8E%A7%E5%88%B6%E5%8F%B0%E6%B8%B8%E6%88%8F/)
by xiangzhenze611 @ 2024-04-27 18:25:45
直接去網上搜不就完了
by chy85592 @ 2024-04-27 19:39:45
@[xiangzhenze611](/user/1005749) nb
by liuziyang2010 @ 2024-04-27 19:42:22
@[liuziyang2010](/user/1313187)
[this](https://www.luogu.com.cn/article/s9cnpesi)
```cpp
#include <bits/stdc++.h>
#include <windows.h>
#include <conio.h>
#define keydown(Key)((GetAsyncKeyState(Key))?1:0)
#define setcolor(x) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x)
using namespace std;
void srand(){int*_=new int;srand(time(0)+*_);delete _;_=0;}
inline int bigrand(){return rand()*32768+rand();}
inline long long hugerand(){return 1ll*rand()*32768*32768*32768+rand()*32768*32768+rand()*32768+rand();}
inline int randrange(int l,int r){return bigrand()%(r-l+1)+l;}
inline bool randpercentage(int p){return bigrand()%100<p;}
inline double rand01(){return bigrand()/32768.0/32768.0;}
int stringtoint(string a)
{
static int ret;
ret=0;
for(int i=0;i<a.size();i++) ret=ret*10+a[i]-'0';
return ret;
}
string inttostring(int a)
{
static string ret;
ret="";
while(a)
{
ret+=char(a%10+'0');
a/=10;
}
reverse(ret.begin(),ret.end());
return ret;
}
void gotoxy(int x,int y)
{
COORD coord;
coord.X=x;coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
void hidecursor()
{
CONSOLE_CURSOR_INFO cursor;
cursor.bVisible=FALSE;
cursor.dwSize=sizeof(cursor);
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle,&cursor);
}
void showcursor()
{
CONSOLE_CURSOR_INFO cursor;
cursor.bVisible=TRUE;
cursor.dwSize=sizeof(cursor);
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle,&cursor);
}
int getmousex(bool x=1,bool n=1)
{
HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
HWND h=GetForegroundWindow();
CONSOLE_FONT_INFO consoleCurrentFont;
POINT p;
if(x)
{
GetCursorPos(&p);
ScreenToClient(h,&p);
}
else
{
GetCursorPos(&p);
}
if(n)
{
GetCurrentConsoleFont(hOutput,FALSE,&consoleCurrentFont);
p.x/=consoleCurrentFont.dwFontSize.X;
p.y/=consoleCurrentFont.dwFontSize.Y;
}
return p.y+1;
}
int getmousey(bool x=1,bool n=1)
{
HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
HWND h=GetForegroundWindow();
CONSOLE_FONT_INFO consoleCurrentFont;
POINT p;
if(x)
{
GetCursorPos(&p);
ScreenToClient(h,&p);
}
else
{
GetCursorPos(&p);
}
if(n)
{
GetCurrentConsoleFont(hOutput,FALSE,&consoleCurrentFont);
p.x/=consoleCurrentFont.dwFontSize.X;
p.y/=consoleCurrentFont.dwFontSize.Y;
}
return p.x+1;
}
inline void cls(){system("cls");gotoxy(0,0);}
int getkey()//↑921 ↓923 ←925 →926
{
static int ch;
if(_kbhit())
{
ch=_getch();
fflush(stdin);
if(ch==0 || ch==224)
{
ch=_getch();
if(ch==72) return 921;
if(ch==80) return 923;
if(ch==75) return 925;
if(ch==77) return 926;
}
else return ch;
}
return -1;
}
string getinputstring(int x,int y,string init="",bool hidden=false)
{
static int ch;
string ret=init;
while(1)
{
gotoxy(x,y);
for(int i=0;i<ret.size()+2;i++) printf(" ");
gotoxy(x,y);
if(hidden) for(int i=0;i<ret.size();i++) printf("*");
else cout<<ret;
while(1)
{
ch=getkey();
if(ch!=-1) break;
}
if(ch==8 && ret.size()) ret.pop_back();
if(string("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*").find(ch)!=string::npos) ret.push_back(ch);
if(ch==10 || ch==13)
{
return ret;
}
if(ch==27) return "__Error__Quitted__";
}
}
void disableselect()
{
HANDLE hStdin=GetStdHandle(STD_INPUT_HANDLE);
DWORD mode;
GetConsoleMode(hStdin,&mode);
mode&=~ENABLE_QUICK_EDIT_MODE;
SetConsoleMode(hStdin,mode);
}
inline bool presslbutton(){return GetKeyState(VK_LBUTTON)<0;}
void test();
int num[105][105];//0=space -1=path + =对应防御塔编号
int n,m,r,TIME;
bool used[300];
int xx=1,yy=1;
ifstream inf;
ofstream outf;
ofstream admin_log;
bool _debug=false;
int sta;
bool pause;
int quick;
int mode;
string cursave="save";
string abspth;
int barriercnt=3;
int unlocknd[]={-1,0,1,2};
struct userinfo
{
string username;
int cursor;
int background;
int tower;
int road;
int normalmob;
int skilledmobbck;
int skilledmobtxt;
int barrierstatus[10020];
int barrierpassed;
void initialize()
{
cursor=4;
background=3;
tower=15;
road=15;
normalmob=0;
skilledmobbck=13;
skilledmobtxt=15;
}
void updateuserinfo()
{
outf.open(("C:\\ProgramData\\SilvefishGames\\BWJL\\users\\"+username+"\\barrierprogress.txt").c_str());
for(int i=1;i<=barriercnt;i++)
{
outf<<barrierstatus[i]<<" ";
}
outf.close();
}
};
userinfo user;
struct way_node
{
int x,y;
bool operator == (const way_node a) const
{
return x==a.x && y==a.y;
}
bool operator != (const way_node a) const
{
return !((*this)==a);
}
} emptyway;
vector<way_node> way;
struct towerinfo
{
int dmg,ran,frq,nd;
};
towerinfo tower_data[5][12]=
{
//tower A dmg ran frq
{
(towerinfo){0,0,1,100},
(towerinfo){23,2,5,100},
(towerinfo){49,2,5,200},
(towerinfo){76,2,5,300},
(towerinfo){107,2,5,400},
(towerinfo){116,2,4,500},
(towerinfo){131,3,4,600},
(towerinfo){148,3,4,700},
(towerinfo){166,3,4,800},
(towerinfo){183,3,4,900},
(towerinfo){197,3,3,1000},
(towerinfo){216,4,3,0}
},
//tower B dmg ran frq
{
(towerinfo){0,0,1,150},
(towerinfo){5,2,1,150},
(towerinfo){11,2,1,200},
(towerinfo){18,2,1,250},
(towerinfo){26,3,1,300},
(towerinfo){35,3,1,350},
(towerinfo){45,3,1,400},
(towerinfo){56,4,1,450},
(towerinfo){68,4,1,500},
(towerinfo){81,4,1,550},
(towerinfo){95,5,1,600},
(towerinfo){110,5,1,0}
},
//tower C dmg ran frq
{
(towerinfo){0,0,1,200},
(towerinfo){1,1,5,200},
(towerinfo){2,1,4,300},
(towerinfo){3,1,4,400},
(towerinfo){4,1,3,500},
(towerinfo){5,1,3,600},
(towerinfo){6,2,2,700},
(towerinfo){7,2,2,800},
(towerinfo){8,2,1,900},
(towerinfo){9,2,1,1000},
(towerinfo){10,3,1,1100},
(towerinfo){11,3,1,0}
},
//tower D dmg ran frq
{
(towerinfo){0,0,1,500},
(towerinfo){10,0,10,250},
(towerinfo){15,0,9,400},
(towerinfo){20,0,9,650},
(towerinfo){25,0,8,1000},
(towerinfo){30,0,8,1450},
(towerinfo){35,0,7,2000},
(towerinfo){40,0,7,2650},
(towerinfo){45,0,6,3400},
(towerinfo){50,0,6,4250},
(towerinfo){55,0,5,5200},
(towerinfo){60,0,5,0}
},
//tower E dmg ran frq
{
(towerinfo){0,0,1,500},
(towerinfo){5,3,60,500},
(towerinfo){6,3,58,750},
(towerinfo){7,3,56,1000},
(towerinfo){8,3,54,1250},
(towerinfo){9,3,52,1500},
(towerinfo){10,3,50,1750},
(towerinfo){11,3,48,2000},
(towerinfo){12,3,46,2250},
(towerinfo){13,3,44,2500},
(towerinfo){14,3,42,2750},
(towerinfo){15,3,40,0}
}
};
struct tower
{
int x,y;
int dmg,lvl,ran;
int typ;
int frq;
int tm;
int str;
bool exi;
int nd;//energy needed to upgrade to next level
tower operator = (const towerinfo a)
{
dmg=a.dmg;
ran=a.ran;
frq=a.frq;
nd=a.nd;
return *this;
}
void initialize(int _x,int _y,int _typ,int _tm)
{
x=_x;y=_y;typ=_typ;tm=_tm;
str=0;lvl=1;exi=true;
*this=tower_data[typ][lvl];
}
void upgrade()
{
if(lvl==11) return;
lvl++;
*this=tower_data[typ][lvl];
}
};
tower a[10005];
struct barriermonsterinfo
{
int mxhp;
int typ;
int skl[5];
int energylt;
int diamondlt;
bool isnewwv;
bool isenwv;
} empty_barriermonsterinfo;
struct monster
{
int hp,mxhp;
int poi;
int typ;//-1=empty 0=normal 1=skilled
int skl[5];//0=regeneration(hp/s) 1=damage_reduction(%) 2=hide_from_damage(probability) 3=damage_spread(%) 4=revive(%hp)
int id;//used in barrier
monster operator = (const barriermonsterinfo x)
{
hp=mxhp=x.mxhp;
poi=0;
typ=x.typ;
for(int i=0;i<5;i++) skl[i]=x.skl[i];
return *this;
}
} mon[105][105],empty_mon;
monster randommonster(int hp,int skl_prob,int skl_str,bool is_skl=false)//hp=diffi skl_prob:10-50 skl_str:0-gap*200 (0-200)
{
monster ret=empty_mon;
if(bigrand()%5==0 || is_skl)
{
ret.typ=1;
ret.hp=bigrand()%hp+hp*5/3;
for(int i=0;i<5;i++)
{
if(randpercentage(skl_prob))
{
if(i==0)
{
ret.skl[0]=ceil((skl_str+randrange(-skl_str/10,skl_str/10))/2.0)+0.5;
}
if(i==1)
{
ret.skl[1]=max(1.0*skl_str/40.0,1.0*skl_str/40.0+15.0+randrange(-5,5));//15%-40%
}
if(i==2)
{
ret.skl[2]=max(1.0*skl_str/40.0,1.0*skl_str/40.0+5.0+randrange(-5,5));//5%-25%
}
if(i==3)
{
ret.skl[3]=min(100.0,max(1.0*skl_str/20.0,1.0*skl_str/20.0+50.0+randrange(-10,10)));//50%-100%
}
if(i==4)
{
ret.skl[4]=min(100.0,max(1.0*skl_str/12.5,1.0*skl_str/12.5+20.0+randrange(-5,5)));//20%-100%
}
}
}
}
else
{
ret.typ=0;
ret.hp=bigrand()%hp+hp;
}
ret.mxhp=ret.hp;
return ret;
}
bool checkfile(string filename,bool relative=true)
{
if(relative) inf.open((abspth+filename+".txt").c_str());
else inf.open(filename.c_str());
if(inf.get()==EOF)
{
inf.close();
return false;
}
inf.close();
return true;
}
string findnxtemptyfile(string pattern)
{
static int pos;
static bool f;
pos=1;
while(1)
{
if(pos==1) f=checkfile(pattern);
else f=checkfile(pattern+inttostring(pos));
if(!f) return pattern+(pos==1 ? "" : inttostring(pos));
pos++;
}
}
int a_len;
int diffi,deldiffi=1,difficnt,gap;
int skldiffi,sklgap;
int energy=2160,delenergy=1;
int diamond,strpr=1000;
int mobcnt;
namespace __pth__
{
using namespace std;
inline way_node Node(int x,int y){return (way_node){x,y};}
int xp[]={-1,0,1,0};
int dy[]={0,-1,0,1};
int val[]={5,5,2,2};
bool vis[101][101];
bool vis2[101][101];
int a[101][101];
bool f;
bool success;
bool cango2(int x,int y,int prex,int prey)
{
for(int i=0;i<4;i++)
{
if(x+xp[i]==prex && y+dy[i]==prey) continue;
if(vis[x+xp[i]][y+dy[i]]) return false;
}
return true;
}
bool cango(int x,int y)
{
memset(vis2,false,sizeof(vis2));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(!vis[i][j]) continue;
vis2[i][j]=true;
for(int k=0;k<4;k++)
{
vis2[i+xp[k]][j+dy[k]]=true;
}
}
}
queue<way_node> q;
while(!q.empty()) q.pop();
q.push(Node(x,y));
while(!q.empty())
{
way_node tmp=q.front();q.pop();
int xx=tmp.x,yy=tmp.y;
if(xx+yy==m+n) return true;
for(int i=0;i<4;i++)
{
if(xx+xp[i]<1 || xx+xp[i]>n || yy+dy[i]<1 || yy+dy[i]>m) continue;
if(!vis2[xx+xp[i]][yy+dy[i]])
{
vis2[xx+xp[i]][yy+dy[i]]=true;
q.push(Node(xx+xp[i],yy+dy[i]));
}
}
}
return false;
}
void dfs(int x,int y)
{
static int ch;
ch=getkey();
if(tolower(ch)=='m')
{
success=false;
return;
}
if(vis[x][y]) return;
vis[x][y]=true;
way.push_back(Node(x,y));
if(x==n && y==m)
{
f=true;
return;
}
vector<int> rng;
rng.clear();
int cnt=0;
for(int i=0;i<4;i++)
{
int xx=x+xp[i],yy=y+dy[i];
if(cango2(xx,yy,x,y) && cango(xx,yy))
{
for(int j=0;j<val[i];j++) rng.push_back(i);
cnt++;
}
}
bool ok[4]={false,false,false,false};
for(int i=1;i<=cnt;i++)
{
int pos;
while(1)
{
pos=rng[rand()%rng.size()];
if(!ok[pos]) break;
}
ok[pos]=true;
dfs(x+xp[pos],y+dy[pos]);
if(f || !success) return;
}
vis[x][y]=false;
way.pop_back();
}
bool generatepath(int n,int m)
{
srand();
a[1][1]=1;
memset(vis,false,sizeof(vis));
memset(vis2,false,sizeof(vis2));
memset(a,0,sizeof(a));
f=false;
success=true;
way.clear();
memset(num,0,sizeof(num));
dfs(1,1);
for(int i=0;i<way.size();i++)
{
num[way[i].x][way[i].y]=-1;
}
return success;
}
}
void updateenergy()
{
mobcnt++;
energy+=delenergy+4;
if(1.0*mobcnt>=delenergy/9.25) delenergy++,mobcnt=0;
}
struct userdata
{
int id;
int userhsh[10];
int pwdhsh[10];
};
vector<userdata> users;
int hshmod[10]={998244353,1000000007,2147483647,145141981,2161314,5211314,9251314,29261314,36461314,37441314};
int hshbase=97;
int gethsh(string a,int mod)
{
int ret=0;
for(int i=0;i<a.size();i++)
{
ret=(1ll*ret*hshbase+int(a[i]))%mod;
}
return ret;
}
int checkuser(userdata dat,string usr,string pwd)//0=ok 1=user not found 2=password wrong
{
for(int i=0;i<10;i++)
{
if(gethsh(usr,hshmod[i])!=dat.userhsh[i]) return 1;
}
for(int i=0;i<10;i++)
{
if(gethsh(pwd,hshmod[i])!=dat.pwdhsh[i]) return 2;
}
return 0;
}
void readuserinfo()
{
user.barrierpassed=0;
memset(user.barrierstatus,0,sizeof(user.barrierstatus));
inf.open(("C:\\ProgramData\\SilvefishGames\\BWJL\\users\\"+user.username+"\\barrierprogress.txt").c_str());
for(int i=1;i<=barriercnt;i++)
{
inf>>user.barrierstatus[i];
user.barrierpassed+=user.barrierstatus[i]==2;
}
inf.close();
}
long long selecttime(int x,int y)
{
static int row,year,month,day,hour,minute,second;
static int ch;
row=1;year=month=day=hour=minute=second=0;
while(1)
{
gotoxy(x,y);
printf(" ");setcolor(row==1 ? 0x4f : 0x0f);printf("%2d",year);setcolor(0x0f);printf("年\n");
printf(" ");setcolor(row==2 ? 0x4f : 0x0f);printf("%2d",month);setcolor(0x0f);printf("月\n");
printf(" ");setcolor(row==3 ? 0x4f : 0x0f);printf("%2d",day);setcolor(0x0f);printf("天\n");
printf(" ");setcolor(row==4 ? 0x4f : 0x0f);printf("%2d",hour);setcolor(0x0f);printf("时\n");
printf(" ");setcolor(row==5 ? 0x4f : 0x0f);printf("%2d",minute);setcolor(0x0f);printf("分\n");
printf(" ");setcolor(row==6 ? 0x4f : 0x0f);printf("%2d",second);setcolor(0x0f);printf("秒\n");
while(1)
{
ch=getkey();
if(ch==921 && row>1)
{
row--;
break;
}
if(ch==923 && row<6)
{
row++;
break;
}
if(ch==925)
{
if(row==1) year--;
if(row==2) month--;
if(row==3) day--;
if(row==4) hour--;
if(row==5) minute--;
if(row==6) second--;
if(second==-1) second=59,minute--;
if(minute==-1) minute=59,hour--;
if(hour==-1) hour=23,day--;
if(day==-1) day=29,month--;
if(month==-1) month=11,year--;
if(year==-1) year=99;
break;
}
if(ch==926)
{
if(row==1) year++;
if(row==2) month++;
if(row==3) day++;
if(row==4) hour++;
if(row==5) minute++;
if(row==6) second++;
if(second==60) second=0,minute++;
if(minute==60) minute=0,hour++;
if(hour==24) hour=0,day++;
if(day==30) day=0,month++;
if(month==12) month=0,year++;
if(year==100) year=0;
break;
}
if(ch==' ') return 1ll*year*31104000+month*2592000+day*86400+hour*3600+minute*60+second;
}
}
}
void readusers()
{
users.clear();
static userdata tmp;
inf.open("C:\\ProgramData\\SilvefishGames\\BWJL\\users.txt");
while(inf>>tmp.id)
{
for(int i=0;i<10;i++) inf>>tmp.userhsh[i];
for(int i=0;i<10;i++) inf>>tmp.pwdhsh[i];
users.push_back(tmp);
}
inf.close();
}
void updateusers()
{
outf.open("C:\\ProgramData\\SilvefishGames\\BWJL\\users.txt");
for(int i=0;i<users.size();i++)
{
outf<<users[i].id<<" ";
for(int j=0;j<10;j++) outf<<users[i].userhsh[j]<<" ";
for(int j=0;j<10;j++) outf<<users[i].pwdhsh[j]<<" ";
outf<<endl;
}
outf.close();
}
void login()
{
system("mkdir C:\\ProgramData\\SilvefishGames\\BWJL");
system("cls");
inf.open("C:\\ProgramData\\SilvefishGames\\BWJL\\admin.txt");
char ch=inf.get();
inf.close();
if(ch==EOF)
{
string s;
int _0,_2,_1,_6;
bool ok;
s="";
wr:;
_0=0,_2=0,_1=0,_6=0;ok=true;
gotoxy(0,0);
printf("欢迎使用 保卫John Lee V.1.0.0。\n");
printf("请输入密钥: ");
for(int i=0;i<s.size();i++) printf(" ");
gotoxy(12,1);
s="";
getline(cin,s);
for(int i=0;i<s.size();i++)
{
if(s[i]=='0') _0++;
if(s[i]=='2') _2++;
if(s[i]=='1') _1++;
if(s[i]=='6') _6++;
}
if(_0*_2*_1*_6!=1) ok=false;
if(ok)
{
if(!(s.find("0")+1<s.find("2") && s.find("2")+1<s.find("1") && s.find("1")+1<s.find("6"))) ok=false;
}
if(!ok)
{
MessageBox(NULL,"密钥错误,请重新输入。","错误",MB_OK);
goto wr;
}
system("cls");
printf("密钥正确。按下任意键开始游戏...");
int ans=MessageBox(NULL,"密钥正确。是否保存密钥(下次游玩时无需重新输入)?","成功",MB_YESNO);
if(ans==6)
{
outf.open("C:\\ProgramData\\SilvefishGames\\BWJL\\admin.txt");
outf<<"Password saved : "<<s;
outf.close();
}
system("pause>nul");
}
bool logined=false;
if(checkfile("C:\\ProgramData\\SilvefishGames\\BWJL\\login.txt",false))
{
string usr;
userdata tmp;
long long tm;
inf.open("C:\\ProgramData\\SilvefishGames\\BWJL\\login.txt");
inf>>usr;
for(int i=0;i<10;i++) inf>>tmp.userhsh[i];
inf>>tm;
inf.close();
bool f=true;
for(int i=0;i<10;i++) if(gethsh(usr,hshmod[i])!=tmp.userhsh[i]) f=false;
if(time(0)>tm) f=false;
if(f)
{
user.username=usr;
readuserinfo();
logined=true;
}
else system("del C:\\ProgramData\\SilvefishGames\\BWJL\\login.txt");
}
if(!logined)
{
readusers();
userdata tmp;
string usr,pwd;
while(1)
{
cls();
printf("登录或注册\n\n");
printf("用户名: \n");
printf("密码: \n");
usr=getinputstring(8,2,"",false);
pwd=getinputstring(6,3,"",true);
int f=1;
for(int i=0,res;i<users.size();i++)
{
res=checkuser(users[i],usr,pwd);
if(res==0)
{
f=0;
break;
}
if(res==2)
{
f=2;
break;
}
}
if(f==0)
{
user.username=usr;
readuserinfo();
break;
}
if(f==1)
{
int ans=MessageBox(NULL,"用户不存在。是否创建用户?","错误",MB_YESNO);
if(ans==6)
{
tmp.id=users.size();
for(int i=0;i<10;i++) tmp.userhsh[i]=gethsh(usr,hshmod[i]);
for(int i=0;i<10;i++) tmp.pwdhsh[i]=gethsh(pwd,hshmod[i]);
users.push_back(tmp);
memset(user.barrierstatus,false,sizeof(user.barrierstatus));
for(int i=1;i<=barriercnt;i++) user.barrierstatus[i]=unlocknd[i]==0;
user.username=usr;
system(("mkdir C:\\ProgramData\\SilvefishGames\\BWJL\\users\\"+user.username).c_str());
user.updateuserinfo();
break;
}
}
if(f==2) MessageBox(NULL,"密码错误。请重新输入。","错误",MB_OK);
}
updateusers();
cls();
printf("欢迎,%s\n",user.username.c_str());
printf("请选择保持账号自动登录的时间(若不想保存账号,请直接按下空格键):\n");
long long tm=selecttime(0,3);
if(tm)
{
outf.open("C:\\ProgramData\\SilvefishGames\\BWJL\\login.txt");
outf<<usr<<endl;
for(int i=0;i<10;i++) outf<<gethsh(usr,hshmod[i])<<" ";
outf<<time(0)+tm;
outf.close();
}
}
system(("mkdir C:\\ProgramData\\SilvefishGames\\BWJL\\users\\"+user.username+"\\saves").c_str());
abspth="C:\\ProgramData\\SilvefishGames\\BWJL\\users\\"+user.username+"\\saves\\";
}
map<string,bool> saves;
void updatesave(bool ask=false)
{
if(ask)
{
cls();
printf("请输入你的新存档的文件名(无需输入文件扩展名): ");
string newsave=getinputstring(46,0,findnxtemptyfile("save"));
cursave=newsave;
}
saves.clear();
inf.open(("C:\\Programdata\\SilvefishGames\\BWJL\\users\\"+user.username+"\\saves.txt").c_str());
static string tmp;
while(inf>>tmp)
{
saves[tmp]=true;
}
inf.close();
saves[cursave]=true;
outf.open(("C:\\Programdata\\SilvefishGames\\BWJL\\users\\"+user.username+"\\saves.txt").c_str());
for(map<string,bool>::iterator ii=saves.begin();ii!=saves.end();ii++)
{
outf<<(ii->first)<<endl;
}
outf.close();
outf.open((abspth+cursave+".txt").c_str());
outf<<endl;
outf<<TIME<<" "<<energy<<" "<<delenergy<<" "<<diamond<<" "<<strpr<<" "<<mobcnt<<" "<<diffi<<" "<<deldiffi<<" "<<difficnt<<" "<<gap<<" "<<sklgap<<endl;
outf<<n<<" "<<m<<" "<<xx<<" "<<yy<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
outf<<num[i][j]<<" "<<mon[i][j].hp<<" "<<mon[i][j].mxhp<<" "<<mon[i][j].poi<<" "<<mon[i][j].typ<<endl;
for(int i=0;i<5;i++) outf<<mon[i][j].skl[i]<<" ";outf<<endl;
}
}
outf<<way.size()<<endl;
for(int i=0;i<way.size();i++)
{
outf<<way[i].x<<" "<<way[i].y<<endl;
}
outf<<a_len<<endl;
for(int i=1;i<=a_len;i++)
{
outf<<a[i].x<<" "<<a[i].y<<" "<<a[i].dmg<<" "<<a[i].lvl<<" "<<a[i].ran<<" "<<a[i].typ<<" "<<a[i].frq<<" "<<a[i].tm<<" "<<a[i].str<<" "<<a[i].exi<<endl;
}
outf.close();
}
bool readsave(string cursave)
{
if(_debug) return false;
inf.open((abspth+cursave+".txt").c_str());
if(inf.get()==EOF)
{
inf.close();
return false;
}
inf>>TIME>>energy>>delenergy>>diamond>>strpr>>mobcnt>>diffi>>deldiffi>>difficnt>>gap>>sklgap;
inf>>n>>m>>xx>>yy;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
inf>>num[i][j]>>mon[i][j].hp>>mon[i][j].mxhp>>mon[i][j].poi>>mon[i][j].typ;
for(int i=0;i<5;i++) inf>>mon[i][j].skl[i];
}
}
int sz;
way.clear();
inf>>sz;
for(int i=0,x,y;i<sz;i++)
{
inf>>x>>y;
way.push_back(__pth__::Node(x,y));
}
inf>>a_len;
for(int i=1;i<=a_len;i++)
{
inf>>a[i].x>>a[i].y>>a[i].dmg>>a[i].lvl>>a[i].ran>>a[i].typ>>a[i].frq>>a[i].tm>>a[i].str>>a[i].exi;
}
inf.close();
return true;
}
//回血 减伤 闪避 分伤 复活
// 0 1 2 3 4
int selectdifficulty()
{
int pos=1;
setcolor(0x0f);
static int ch;
while(1)
{
cls();
printf("请选择难度(上下键选择,空格键选取):\n");
for(int i=1;i<=10;i++)
{
if(i==pos) setcolor(0x4f);
if(i==1) printf("非常简单");
if(i==2) printf("简单");
if(i==3) printf("普通");
if(i==4) printf("困难");
if(i==5) printf("不可能");
if(i==6) printf("真·不可能");
if(i==7) printf("真·真·不可能");
if(i==8) printf("真·真·真·不可能");
if(i==9) printf("真·真·真·真·不可能");
if(i==10) printf("真·真·真·真·真·不可能");
if(i==pos) setcolor(0x0f);
printf("\n");
}
gotoxy(0,0);
while(1)
{
ch=getkey();
if(ch==921 && pos>1)
{
pos--;
break;
}
if(ch==923 && pos<10)
{
pos++;
break;
}
if(ch==' ') return pos;
}
}
}
void printbarrierpage(int page,int x,int y)
{
cls();
setcolor(0x0f);
printf("选择关卡:\n");
printf("\n");
for(int i=1,pos;i<=5;i++)
{
for(int j=1;j<=5;j++)
{
pos=(page-1)*25+(i-1)*5+j;
printf(" ");
setcolor(0x40*(i==x && j==y)+(user.barrierstatus[pos]==2 ? 0x02 : (user.barrierstatus[pos]==1 ? 0x0f : 0x08)));
if(pos==100) printf("MX");
else if((page-1)*25+(i-1)*5+j<=barriercnt) printf("%02d",pos);
else printf(" ");
setcolor(0x0f);
}
printf("\n\n");
}
printf("第 %d/%d 页 (按下<键或>键翻页)\n",page,(barriercnt-1)/25+1);
printf("\n");
static int pos;
pos=(page-1)*25+(x-1)*5+y;
printf("选择的关卡 : 第%d关\n",pos);
if(pos>barriercnt) printf("关卡不存在\n");
else if(unlocknd[pos]<=user.barrierpassed) printf("已解锁\n");
else
{
printf("需要先完成至少其他%d关才能解锁此关\n",unlocknd[pos]);
printf("进度 : %d/%d\n",user.barrierpassed,unlocknd[pos]);
}
}
int selectbarrier()
{
int page=1,x=1,y=1;
static int ch;
while(1)
{
printbarrierpage(page,x,y);
while(1)
{
ch=getkey();
if(ch==921 && x>1)
{
x--;
break;
}
if(ch==923 && x<5)
{
x++;
break;
}
if(ch==925 && y>1)
{
y--;
break;
}
if(ch==926 && y<5)
{
y++;
break;
}
if((ch==',' || ch=='<') && page>1)
{
page--;
break;
}
if((ch=='.' || ch=='>') && page<(barriercnt-1)/25)
{
page++;
break;
}
if(ch==' ' && user.barrierstatus[(page-1)*25+(x-1)*5+y]) return (page-1)*25+(x-1)*5+y;
if(ch==27) return -1;
}
}
}
vector<string> saves2;
void printsaves(int l,int r,int pos,string search)
{
cls();
setcolor(0x0f);
printf("选择存档:\n");
printf("\n");
if(l!=-1) printf("...\n");
else printf("\n");
for(int i=l;i<=r;i++)
{
if(i==pos) setcolor(0x4f);
if(i==-1) printf("新建...\n");
else cout<<saves2[i]<<endl;
if(i==pos) setcolor(0x0f);
}
if(r!=saves2.size()-1) printf("...\n");
else printf("没有更多了...\n");
gotoxy(0,15);
printf("搜索: ");cout<<search;
gotoxy(0,0);
}
string selectsave()
{
static string tmp,search;
static int pos,l,r;
static int ch;
static bool edit;
search="";
while(1)
{
inf.open(("C:\\Programdata\\SilvefishGames\\BWJL\\users\\"+user.username+"\\saves.txt").c_str());
saves2.clear();
while(inf>>tmp)
{
if(search=="" || tmp.find(search)!=string::npos) saves2.push_back(tmp);
}
inf.close();
edit=false;
pos=-1;
l=-1,r=min(int(saves2.size()-1),7);
while(1)
{
printsaves(l,r,pos,search);
while(1)
{
ch=getkey();
if(ch==921)
{
if(pos!=-1) pos--;
if(pos==l && pos!=-1) l--,r--;
break;
}
if(ch==923)
{
if(pos!=saves2.size()-1) pos++;
if(pos==r && pos!=saves2.size()-1) l++,r++;
break;
}
if(ch==' ')
{
if(pos!=-1) return saves2[pos];
else return "";
}
if(isalpha(ch) || isdigit(ch))
{
search.push_back(ch);
edit=true;
break;
}
if(ch==8 && search.size())
{
search.pop_back();
edit=true;
break;
}
if(ch==27) return "__Error__Quitted__";
}
if(edit) break;
}
}
}
way_node findpremon(way_node x)
{
int p;
for(int i=0;i<way.size();i++)
{
if(way[i]==x)
{
p=i;
break;
}
}
// printf("pos now: x=%d y=%d\n",way[p].x,way[p].y);
int cnt=0;
for(int i=p-1;i>=0 && cnt<=4;i--)
{
cnt++;
if(mon[way[i].x][way[i].y].mxhp)
{
// printf("found pre: x=%d y=%d\n",way[i].x,way[i].y);
return way[i];
}
}
return emptyway;
}
way_node findnxtmon(way_node x)
{
int p;
for(int i=0;i<way.size();i++)
{
if(way[i]==x)
{
p=i;
break;
}
}
// printf("pos now: x=%d y=%d\n",way[p].x,way[p].y);
int cnt=0;
for(int i=p+1;i<way.size() && cnt<=4;i++)
{
cnt++;
if(mon[way[i].x][way[i].y].mxhp)
{
// printf("found nxt: x=%d y=%d\n",way[i].x,way[i].y);
return way[i];
}
}
return emptyway;
}
void damagemonster(way_node x,monster &mon2,int dmg)
{
if(mon2.typ==0)
{
mon2.hp-=dmg;
return;
}
if(randpercentage(mon2.skl[2])) return;
dmg=ceil(0.01*(100-mon2.skl[1])*dmg)+0.5;
if(mon2.skl[3])
{
int shdmg=ceil(0.01*mon2.skl[3]*dmg);
dmg-=shdmg;
if(shdmg%2) shdmg--,dmg++;
way_node pre=findpremon(x),nxt=findnxtmon(x);
int cnt=int(pre!=emptyway)+int(nxt!=emptyway);
gotoxy(0,25);
// printf("real damage: %d\n",dmg);
// printf("fake damage: %d\n",shdmg);
// printf("cnt=%d\n",cnt);
if(cnt)
{
// if(pre!=emptyway) mon[pre.x][pre.y].hp-=shdmg/cnt,printf("pre: mon[%d][%d].hp-=%d\n",pre.x,pre.y,shdmg/cnt);
// if(nxt!=emptyway) mon[nxt.x][nxt.y].hp-=shdmg/cnt,printf("nxt: mon[%d][%d].hp-=%d\n",nxt.x,nxt.y,shdmg/cnt);
}
else mon2.hp-=shdmg;
gotoxy(0,0);
}
mon2.hp-=dmg;
}
void attackmonster(way_node x,monster &mon2,tower tow)
{
if(tow.typ==0)
{
int dmg=tow.dmg;
if(tow.str>=2) dmg*=3;
damagemonster(x,mon2,dmg);
}
if(tow.typ==1)
{
int dmg=0;
if(tow.str==3) dmg+=ceil(0.01*mon2.hp)+0.5;
if(tow.str>=2) dmg+=tow.dmg*5;
else dmg+=tow.dmg;
damagemonster(x,mon2,dmg);
}
if(tow.typ==2)
{
int dmg=0;
if(tow.str>=2) dmg+=tow.dmg*2;
else dmg+=tow.dmg;
mon2.poi+=dmg;
}
if(tow.typ==3) return;
if(tow.typ==4)
{
int dmg=100;
dmg+=ceil(0.01*tow.dmg*mon2.hp)+0.5;
if(tow.str==3 && rand()%20==0) mon2.hp=0;
else damagemonster(x,mon2,dmg);
}
}
void generatemob()
{
TIME++;
skldiffi=0.01*sklgap*TIME;
if(TIME%2==0)
{
diffi+=deldiffi;
difficnt++;
if(difficnt%gap==0) deldiffi++;
}
if(TIME%3==0){
if(mon[way[way.size()-1].x][way[way.size()-1].y].hp && !_debug) sta=2;
for(int i=way.size()-1;i>=1;i--){
mon[way[i].x][way[i].y]=mon[way[i-1].x][way[i-1].y];
}
r=bigrand()%diffi+diffi;
if(TIME%9==0)
{
if(_debug) mon[1][1]=randommonster(diffi,10.0+40.0*TIME/20000.0,skldiffi,true);
else mon[1][1]=randommonster(diffi,10.0+40.0*TIME/20000.0,skldiffi);
}
else
{
mon[1][1]=empty_mon;
}
}
if(TIME>20000) sta=1;
}
void move()
{
static int ch;
ch=getkey();
if(ch==925 && yy>1) yy--;
if(ch==926 && yy<m) yy++;
if(ch==921 && xx>1) xx--;
if(ch==923 && xx<n) xx++;
if(tolower(ch)=='q' && num[xx][yy]==0 && (!pause || _debug))
{
if(energy>=tower_data[0][0].nd)
{
num[xx][yy]=++a_len;
a[a_len].initialize(xx,yy,0,TIME);
energy-=tower_data[0][0].nd;
}
}
if(tolower(ch)=='w' && num[xx][yy]==0 && (!pause || _debug))
{
if(energy>=tower_data[1][0].nd)
{
num[xx][yy]=++a_len;
a[a_len].initialize(xx,yy,1,TIME);
energy-=tower_data[1][0].nd;
}
}
if(tolower(ch)=='e' && num[xx][yy]==0 && (!pause || _debug))
{
if(energy>=tower_data[2][0].nd)
{
num[xx][yy]=++a_len;
a[a_len].initialize(xx,yy,2,TIME);
energy-=tower_data[2][0].nd;
}
}
if(tolower(ch)=='r' && num[xx][yy]==0 && (!pause || _debug))
{
if(energy>=tower_data[3][0].nd)
{
num[xx][yy]=++a_len;
a[a_len].initialize(xx,yy,3,TIME);
energy-=tower_data[3][0].nd;
}
}
if(tolower(ch)=='t' && num[xx][yy]==0 && (!pause || _debug))
{
if(energy>=tower_data[4][0].nd)
{
num[xx][yy]=++a_len;
a[a_len].initialize(xx,yy,4,TIME);
energy-=tower_data[4][0].nd;
}
}
if(tolower(ch)=='a' && (!pause || _debug))
{
if(num[xx][yy]>0 && a[num[xx][yy]].lvl<=10)
{
if(energy>=a[num[xx][yy]].nd)
{
energy-=a[num[xx][yy]].nd;
a[num[xx][yy]].upgrade();
}
}
}
if(tolower(ch)=='s' && (!pause || _debug))
{
if(num[xx][yy]<=0) return;
int pos=num[xx][yy];
if(a[pos].str==0 && a[pos].lvl>=4)
{
if(energy>=strpr && diamond>=150)
{
a[pos].str=1;
energy-=strpr;
diamond-=150;
strpr+=200;
}
}
else if(a[pos].str==1 && a[pos].lvl>=7)
{
if(energy>=strpr && diamond>=250)
{
a[pos].str=2;
energy-=strpr;
diamond-=250;
strpr+=500;
}
}
else if(a[pos].str==2 && a[pos].lvl>=10)
{
if(energy>=strpr && diamond>=350)
{
a[pos].str=3;
energy-=strpr;
diamond-=350;
strpr+=1000;
}
}
}
if(tolower(ch)=='z' && (!pause || _debug))
{
if(num[xx][yy]>0)
{
if(a[num[xx][yy]].exi) a[num[xx][yy]].exi=false;
num[xx][yy]=0;
}
}
if(tolower(ch)=='x' && (!pause || _debug)) updatesave();
if(ch==' ')
{
pause=!pause;
quick=1;
}
if(tolower(ch)=='c')
{
quick*=3;
if(quick==27) quick=1;
}
if(tolower(ch)=='m')
{
int ans=MessageBox(NULL,"你按下了退出键。是否确认退出?","确认",MB_YESNO);
if(ans==6)
{
int ans=MessageBox(NULL,"是否保存存档?","确认",MB_YESNO);
if(ans==6) updatesave();
else system(("del "+abspth+cursave+".txt").c_str());
sta=3;
}
}
}
void checkdeadmob()
{
for(int i=0;i<way.size();i++)
{
if(mon[way[i].x][way[i].y].hp<=0 && mon[way[i].x][way[i].y].mxhp>0)
{
updateenergy();
if(mon[way[i].x][way[i].y].typ==1) diamond+=5;
else diamond+=2;
mon[way[i].x][way[i].y]=empty_mon;
}
}
}
void attack()
{
for(int i=1;i<=a_len;i++)
{
if(!a[i].exi) continue;
if(a[i].typ==0 && (TIME-a[i].tm)%(a[i].frq-(a[i].str==0 ? 0 : 1))==0)
{
if(a[i].str==3)
{
for(int j=1;j<=n;j++)
{
for(int k=1;k<=m;k++)
{
if(mon[j][k].hp>0)
{
attackmonster(__pth__::Node(a[i].x,a[i].y),mon[j][k],a[i]);
}
}
}
}
else
{
for(int j=-a[i].ran;j<=a[i].ran;j++)
{
for(int k=-a[i].ran;k<=a[i].ran;k++)
{
int tmpx=a[i].x+j,tmpy=a[i].y+k;
if(tmpx<1||tmpx>n||tmpy<1||tmpy>m) continue;
if(mon[tmpx][tmpy].hp>0)
{
attackmonster(__pth__::Node(tmpx,tmpy),mon[tmpx][tmpy],a[i]);
}
}
}
}
}
if(a[i].typ==1 && (TIME-a[i].tm)%a[i].frq==0)
{
int atkcnt=(a[i].str==0 ? 1 : 2);
for(int j=way.size()-1;j>=0;j--)
{
if(mon[way[j].x][way[j].y].hp>0 && abs(way[j].x-a[i].x)<=a[i].ran && abs(way[j].y-a[i].y)<=a[i].ran)
{
attackmonster(__pth__::Node(way[j].x,way[j].y),mon[way[j].x][way[j].y],a[i]);
atkcnt--;
if(atkcnt==0) break;
}
}
}
if(a[i].typ==2 && (TIME-a[i].tm)%a[i].frq==0)
{
int atkcnt=(a[i].str==0 ? 1 : ((a[i].str==1 || a[i].str==2) ? 2 : 5));
for(int j=way.size()-1;j>=0;j--)
{
if(mon[way[j].x][way[j].y].hp>0 && abs(way[j].x-a[i].x)<=a[i].ran && abs(way[j].y-a[i].y)<=a[i].ran)
{
attackmonster(__pth__::Node(way[j].x,way[j].y),mon[way[j].x][way[j].y],a[i]);
atkcnt--;
if(atkcnt==0) break;
}
}
}
if(a[i].typ==3 && (TIME-a[i].tm)%(a[i].frq-(a[i].str==0 ? 0 : (a[i].str==1 ? 2 : 3)))==0)
{
if(a[i].str==3) energy+=min(int(energy*0.01),216);
energy+=a[i].dmg;
}
if(a[i].typ==4 && (TIME-a[i].tm)%(a[i].frq-((a[i].str==0 || a[i].str==1) ? 0 : 10))==0)
{
int atkcnt=(a[i].str==0 ? 2 : 3);
for(int j=way.size()-1;j>=0;j--)
{
if(mon[way[j].x][way[j].y].hp>0 && abs(way[j].x-a[i].x)<=a[i].ran && abs(way[j].y-a[i].y)<=a[i].ran)
{
attackmonster(__pth__::Node(way[j].x,way[j].y),mon[way[j].x][way[j].y],a[i]);
atkcnt--;
if(atkcnt==0) break;
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(mon[i][j].mxhp)
{
mon[i][j].hp-=mon[i][j].poi;
mon[i][j].hp=min(mon[i][j].mxhp,mon[i][j].hp+mon[i][j].skl[0]);
if(mon[i][j].skl[4] && mon[i][j].hp*10<mon[i][j].mxhp)
{
mon[i][j].hp=ceil(0.01*mon[i][j].skl[4]*mon[i][j].mxhp)+0.5;
mon[i][j].skl[4]=0;
}
}
}
}
}
struct barrier
{
int id;
int n,m;
tower a[1020];
int a_len;
int num[25][25];
vector<way_node> way;
int energy,diamond;
int strpr;
int xx,yy;
barriermonsterinfo mons[10020];
monster mon[25][25];
int TIME,mobpos,wv,mxwv;
int en;
int sta;
bool pause;
int quick;
bool canuse[5];
int mxTIME;
void addpth(int x,int y)
{
way.push_back((way_node){x,y});
num[x][y]=-1;
}
void initialize(int pos)
{
memset(a,0,sizeof(a));
a_len=0;
memset(num,0,sizeof(num));
for(int i=1;i<=10000;i++) mons[i]=empty_barriermonsterinfo;
for(int i=1;i<25;i++)
{
for(int j=1;j<25;j++)
{
mon[i][j]=empty_mon;
}
}
way.clear();
id=pos;
xx=yy=1;
TIME=0;
mobpos=0;
sta=0;
wv=0;
pause=false;
quick=1;
strpr=1000;
if(pos==1)
{
energy=1000;
diamond=0;
n=3,m=10;
mxwv=10;
int pthx[]={2,2,2,2,2,2,2,2,2,2};
int pthy[]={1,2,3,4,5,6,7,8,9,10};
for(int i=0;i<10;i++) addpth(pthx[i],pthy[i]);
int p=0;
for(int i=1;i<=10;i++)
{
for(int j=1;j<=10;j++)
{
p++;
mons[p].isnewwv=j==1;
mons[p].isenwv=j==10;
mons[p].typ=0;
for(int k=0;k<5;k++) mons[p].skl[k]=0;
mons[p].energylt=10+(p-1)/10;
mons[p].diamondlt=0;
mons[p].mxhp=p*3;
}
p+=5;
}
p++;
mons[p].isnewwv=true;
canuse[0]=true;canuse[1]=false;canuse[2]=false;canuse[3]=false;canuse[4]=false;
mxTIME=p*9;
}
if(pos==2)
{
energy=1000;
diamond=0;
n=m=7;
mxwv=11;
int pthx[]={1,1,2,2,3,4,4,4,5,6,7,7,7,6,6,6,5,4,3,3,3,4,5,6,7};
int pthy[]={1,2,2,3,3,3,2,1,1,1,1,2,3,3,4,5,5,5,5,6,7,7,7,7,7};
for(int i=0;i<25;i++) addpth(pthx[i],pthy[i]);
int p=0;
for(int i=1;i<=10;i++)
{
for(int j=1;j<=12;j++)
{
p++;
mons[p].isnewwv=j==1;
mons[p].isenwv=j==12;
if(j<=10)
{
mons[p].typ=0;
for(int k=0;k<5;k++) mons[p].skl[k]=0;
}
else
{
mons[p].typ=1;
mons[p].skl[0]=i*2;
for(int k=1;k<5;k++) mons[p].skl[k]=0;
}
mons[p].energylt=i*3+7;
mons[p].diamondlt=0;
mons[p].mxhp=(i*20+j/2*3)*3;
if(mons[p].typ==1) mons[p].energylt*=3,mons[p].mxhp*=2;
}
p+=3;
}
p++;
mons[p].isnewwv=true;
mons[p].isenwv=true;
mons[p].typ=1;
for(int i=0;i<5;i++) mons[p].skl[i]=0;
mons[p].skl[0]=60;
mons[p].mxhp=2000;
mons[p].energylt=mons[p].diamondlt=0;
p+=30;
mons[p].isnewwv=true;
canuse[0]=true;canuse[1]=true;canuse[2]=false;canuse[3]=false;canuse[4]=false;
mxTIME=p*9;
}
if(pos==3)
{
energy=2000;
diamond=0;
n=m=9;
mxwv=12;
int pthx[]={1,1,1,1,1,1,1,1,1,2,3,4,5,6,7,8,9,9,9,9,9,9,9,9,9,8,7,6,5,4,3};
int pthy[]={1,2,3,4,5,6,7,8,9,9,9,9,9,9,9,9,9,8,7,6,5,4,3,2,1,1,1,1,1,1,1};
for(int i=0;i<31;i++) addpth(pthx[i],pthy[i]);
int p=0;
for(int i=1;i<=10;i++)
{
for(int j=1;j<=15;j++)
{
p++;
mons[p].isnewwv=j==1;
mons[p].isenwv=j==15;
for(int k=0;k<5;k++) mons[p].skl[i]=0;
if(j%3==0)
{
mons[p].typ=1;
if(j==3 || j==6 || j==15) mons[p].skl[0]=i*2;
if(j==9 || j==12 || j==15) mons[p].skl[1]=i*3;
}
else mons[p].typ=0;
mons[p].energylt=i*5;
mons[p].diamondlt=0;
mons[p].mxhp=i*100;
if(mons[p].typ==1) mons[p].mxhp*=3,mons[p].energylt*=5;
}
p+=5;
}
mons[121].isnewwv=true;
for(int i=1;i<=20;i++)
{
p++;
mons[p].isnewwv=i==1;
mons[p].isenwv=i==20;
for(int k=0;k<5;k++) mons[p].skl[i]=0;
mons[p].typ=1;
mons[p].skl[0]=i*5;
mons[p].energylt=10;
mons[p].diamondlt=0;
mons[p].mxhp=5000-i*200;
}
p+=15;
for(int i=1;i<=20;i++)
{
p++;
mons[p].isnewwv=i==1;
mons[p].isenwv=i==20;
for(int k=0;k<5;k++) mons[p].skl[i]=0;
mons[p].typ=1;
mons[p].skl[1]=i*3;
mons[p].energylt=10;
mons[p].diamondlt=0;
mons[p].mxhp=5000-i*200;
}
p+=15;p++;
admin_log<<p<<endl;
mons[p].isnewwv=true;
canuse[0]=true;canuse[1]=true;canuse[2]=true;canuse[3]=false;canuse[4]=false;
mxTIME=p*9;
}
}
void checkdeadmob()
{
for(int i=0;i<way.size();i++)
{
if(mon[way[i].x][way[i].y].hp<=0 && mon[way[i].x][way[i].y].mxhp>0)
{
energy+=mons[mon[way[i].x][way[i].y].id].energylt;
diamond+=mons[mon[way[i].x][way[i].y].id].diamondlt;
mon[way[i].x][way[i].y]=empty_mon;
}
}
}
void generatemob()
{
TIME++;
if(TIME%3==0)
{
if(mon[way.back().x][way.back().y].hp>0)
{
sta=1;
}
for(int i=way.size()-1;i>0;i--)
{
mon[way[i].x][way[i].y]=mon[way[i-1].x][way[i-1].y];
}
if(TIME%9==0)
{
mobpos++;
mon[way[0].x][way[0].y]=mons[mobpos];
mon[way[0].x][way[0].y].id=mobpos;
if(mons[mobpos].isnewwv) wv++;
if(wv>mxwv) sta=2;
}
else mon[way[0].x][way[0].y]=empty_mon;
}
}
void attack()
{
for(int i=1;i<=a_len;i++)
{
if(!a[i].exi) continue;
if(a[i].typ==0 && (TIME-a[i].tm)%(a[i].frq-(a[i].str==0 ? 0 : 1))==0)
{
if(a[i].str==3)
{
for(int j=1;j<=n;j++)
{
for(int k=1;k<=m;k++)
{
if(mon[j][k].hp>0)
{
attackmonster(__pth__::Node(a[i].x,a[i].y),mon[j][k],a[i]);
}
}
}
}
else
{
for(int j=-a[i].ran;j<=a[i].ran;j++)
{
for(int k=-a[i].ran;k<=a[i].ran;k++)
{
int tmpx=a[i].x+j,tmpy=a[i].y+k;
if(tmpx<1||tmpx>n||tmpy<1||tmpy>m) continue;
if(mon[tmpx][tmpy].hp>0)
{
attackmonster(__pth__::Node(tmpx,tmpy),mon[tmpx][tmpy],a[i]);
}
}
}
}
}
if(a[i].typ==1 && (TIME-a[i].tm)%a[i].frq==0)
{
int atkcnt=(a[i].str==0 ? 1 : 2);
for(int j=way.size()-1;j>=0;j--)
{
if(mon[way[j].x][way[j].y].hp>0 && abs(way[j].x-a[i].x)<=a[i].ran && abs(way[j].y-a[i].y)<=a[i].ran)
{
attackmonster(__pth__::Node(way[j].x,way[j].y),mon[way[j].x][way[j].y],a[i]);
atkcnt--;
if(atkcnt==0) break;
}
}
}
if(a[i].typ==2 && (TIME-a[i].tm)%a[i].frq==0)
{
int atkcnt=(a[i].str==0 ? 1 : ((a[i].str==1 || a[i].str==2) ? 2 : 5));
for(int j=way.size()-1;j>=0;j--)
{
if(mon[way[j].x][way[j].y].hp>0 && abs(way[j].x-a[i].x)<=a[i].ran && abs(way[j].y-a[i].y)<=a[i].ran)
{
attackmonster(__pth__::Node(way[j].x,way[j].y),mon[way[j].x][way[j].y],a[i]);
atkcnt--;
if(atkcnt==0) break;
}
}
}
if(a[i].typ==3 && (TIME-a[i].tm)%(a[i].frq-(a[i].str==0 ? 0 : (a[i].str==1 ? 2 : 3)))==0)
{
if(a[i].str==3) energy+=min(int(energy*0.01),216);
energy+=a[i].dmg;
}
if(a[i].typ==4 && (TIME-a[i].tm)%(a[i].frq-((a[i].str==0 || a[i].str==1) ? 0 : 10))==0)
{
int atkcnt=(a[i].str==0 ? 2 : 3);
for(int j=way.size()-1;j>=0;j--)
{
if(mon[way[j].x][way[j].y].hp>0 && abs(way[j].x-a[i].x)<=a[i].ran && abs(way[j].y-a[i].y)<=a[i].ran)
{
attackmonster(__pth__::Node(way[j].x,way[j].y),mon[way[j].x][way[j].y],a[i]);
atkcnt--;
if(atkcnt==0) break;
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(mon[i][j].mxhp)
{
mon[i][j].hp-=mon[i][j].poi;
mon[i][j].hp=min(mon[i][j].mxhp,mon[i][j].hp+mon[i][j].skl[0]);
if(mon[i][j].skl[4] && mon[i][j].hp*10<mon[i][j].mxhp)
{
mon[i][j].hp=ceil(0.01*mon[i][j].skl[4]*mon[i][j].mxhp)+0.5;
mon[i][j].skl[4]=0;
}
}
}
}
}
void move()
{
static int ch;
ch=getkey();
if(ch==921 && xx>1) xx--;
if(ch==923 && xx<n) xx++;
if(ch==925 && yy>1) yy--;
if(ch==926 && yy<m) yy++;
if(ch==' ')
{
pause=!pause;
quick=1;
}
if(tolower(ch)=='q' && num[xx][yy]==0 && (!pause || _debug) && canuse[0])
{
if(energy>=tower_data[0][0].nd)
{
num[xx][yy]=++a_len;
a[a_len].initialize(xx,yy,0,TIME);
energy-=tower_data[0][0].nd;
}
}
if(tolower(ch)=='w' && num[xx][yy]==0 && (!pause || _debug) && canuse[1])
{
if(energy>=tower_data[1][0].nd)
{
num[xx][yy]=++a_len;
a[a_len].initialize(xx,yy,1,TIME);
energy-=tower_data[1][0].nd;
}
}
if(tolower(ch)=='e' && num[xx][yy]==0 && (!pause || _debug) && canuse[2])
{
if(energy>=tower_data[2][0].nd)
{
num[xx][yy]=++a_len;
a[a_len].initialize(xx,yy,2,TIME);
energy-=tower_data[2][0].nd;
}
}
if(tolower(ch)=='r' && num[xx][yy]==0 && (!pause || _debug) && canuse[3])
{
if(energy>=tower_data[3][0].nd)
{
num[xx][yy]=++a_len;
a[a_len].initialize(xx,yy,3,TIME);
energy-=tower_data[3][0].nd;
}
}
if(tolower(ch)=='t' && num[xx][yy]==0 && (!pause || _debug) && canuse[4])
{
if(energy>=tower_data[4][0].nd)
{
num[xx][yy]=++a_len;
a[a_len].initialize(xx,yy,4,TIME);
energy-=tower_data[4][0].nd;
}
}
if(tolower(ch)=='a' && (!pause || _debug))
{
if(num[xx][yy]>0 && a[num[xx][yy]].lvl<=10)
{
if(energy>=a[num[xx][yy]].nd)
{
energy-=a[num[xx][yy]].nd;
a[num[xx][yy]].upgrade();
}
}
}
if(tolower(ch)=='c')
{
quick*=3;
if(quick==27) quick=1;
}
}
void printscreen()
{
gotoxy(0,0);
printf("保卫John Lee V.1.0.0 关卡%d 波次: %d/%d \n",id,wv,mxwv);
printf("能量: %d 强化材料: %d \n",energy,diamond);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(xx==i && yy==j)
{
setcolor(0x4f);
}
if(num[i][j]!=-1)
{
if(!(xx==i && yy==j)) setcolor(0x3f);
if(num[i][j]==0) printf(" ");
else
{
if(a[num[i][j]].typ==0) printf("※");
else if(a[num[i][j]].typ==1) printf("☆");
else if(a[num[i][j]].typ==2) printf("△");
else if(a[num[i][j]].typ==3) printf("○");
else if(a[num[i][j]].typ==4) printf("@");
else printf(" ");
}
}
else if(num[i][j]==-1)
{
if(!(xx==i && yy==j)) setcolor(0xf0);
if(mon[i][j].hp>0)
{
if(!(i==xx&&j==yy))
{
if(mon[i][j].typ==1) setcolor(0xdf);
else setcolor(0xf0);
}
else if(mon[i][j].typ==1) setcolor(0x45);
if(mon[i][j].hp>=1000000000ll) printf("∞");
else if(mon[i][j].hp>=1000000000) printf("%dB",mon[i][j].hp/1000000000);
else if(mon[i][j].hp>=100000000) printf("%dY",mon[i][j].hp/100000000);
else if(mon[i][j].hp>=10000000) printf("%dQ",mon[i][j].hp/10000000);
else if(mon[i][j].hp>=1000000) printf("%dM",mon[i][j].hp/1000000);
else if(mon[i][j].hp>=100000) printf("%dS",mon[i][j].hp/100000);
else if(mon[i][j].hp>=10000) printf("%dW",mon[i][j].hp/10000);
else if(mon[i][j].hp>=1000) printf("%dK",mon[i][j].hp/1000);
else if(mon[i][j].hp>=100) printf("%dH",mon[i][j].hp/100);
else printf("%02d",mon[i][j].hp);
}
else printf(" ");
}
setcolor(0x0f);
}
printf("\n");
}
printf("关卡进度 : %.1lf",100.0*TIME/mxTIME);
cout<<"%\n\n";
if(num[xx][yy]>0)
{
if(a[num[xx][yy]].typ==0)
{
int pos=num[xx][yy];
printf("选中的防御塔: ※ \n");
if(a[pos].lvl<=10)
{
printf("等级 : %d (->%d) \n",a[pos].lvl,a[pos].lvl+1);
printf("强化 : %d \n",a[pos].str);
printf("伤害 : %d (->%d) \n",a[pos].dmg*((a[pos].str==0 || a[pos].str==1) ? 1 : 3),tower_data[a[pos].typ][a[pos].lvl+1].dmg*((a[pos].str==0 || a[pos].str==1) ? 1 : 3));
printf("攻击范围 : %d (->%d) \n",a[pos].ran*2+1,tower_data[a[pos].typ][a[pos].lvl+1].ran*2+1);
printf("攻击频率(刻) : %d (->%d) \n",a[pos].frq-(a[pos].str==0 ? 0 : 1),tower_data[a[pos].typ][a[pos].lvl+1].frq-(a[pos].str==0 ? 0 : 1));
printf("升级所需能量 : %d \n",tower_data[a[pos].typ][a[pos].lvl].nd);
}
else
{
printf("等级 : MAX \n");
printf("强化 : %d \n",a[pos].str);
printf("伤害 : %d \n",a[pos].dmg*((a[pos].str==0 || a[pos].str==1) ? 1 : 3));
printf("攻击范围 : %d \n",a[pos].ran*2+1);
printf("攻击频率(刻) : %d \n",a[pos].frq-(a[pos].str==0 ? 0 : 1));
printf("升级所需能量 : - \n");
}
if(a[pos].str==0)
{
if(a[pos].lvl>=4)
{
printf("强化所需材料 : %d能量 %d强化材料 \n",strpr,150);
printf("强化效果 : 攻击频率 -1 \n");
}
else
{
printf("将等级提升至4级及以上即可强化 \n");
printf(" \n");
}
}
else if(a[pos].str==1)
{
if(a[pos].lvl>=7)
{
printf("强化所需材料 : %d能量 %d强化材料 \n",strpr,250);
printf("强化效果 : 攻击伤害 *3 \n");
}
else
{
printf("将等级提升至7级及以上即可强化 \n");
printf(" \n");
}
}
else if(a[pos].str==2)
{
if(a[pos].lvl>=10)
{
printf("强化所需材料 : %d能量 %d强化材料 \n",strpr,350);
printf("强化效果 : 攻击范围变为整张地图 \n");
}
else
{
printf("将等级提升至10级及以上即可强化 \n");
printf(" \n");
}
}
else
{
printf(" \n");
printf(" \n");
}
}
if(a[num[xx][yy]].typ==1)
{
int pos=num[xx][yy];
printf("选中的防御塔: ☆ \n");
if(a[pos].lvl<=10)
{
printf("等级 : %d (->%d) \n",a[pos].lvl,a[pos].lvl+1);
printf("伤害 : %d (->%d) \n",a[pos].dmg*((a[pos].str==0 || a[pos].str==1) ? 1 : 5),tower_data[a[pos].typ][a[pos].lvl+1].dmg*((a[pos].str==0 || a[pos].str==1) ? 1 : 5));
printf("攻击范围 : %d (->%d) \n",a[pos].ran*2+1,tower_data[a[pos].typ][a[pos].lvl+1].ran*2+1);
printf("升级所需能量 : %d \n",tower_data[a[pos].typ][a[pos].lvl].nd);
}
else
{
printf("等级 : MAX \n");
printf("伤害 : %d \n",a[pos].dmg*((a[pos].str==0 || a[pos].str==1) ? 1 : 5));
printf("攻击范围 : %d \n",a[pos].ran*2+1);
printf("升级所需能量 : - \n");
}
if(a[pos].str==0)
{
if(a[pos].lvl>=4)
{
printf("强化所需材料 : %d能量 %d强化材料 \n",strpr,150);
printf("强化效果 : 攻击数量变为2个 \n");
}
else
{
printf("将等级提升至4级及以上即可强化 \n");
printf(" \n");
}
}
else if(a[pos].str==1)
{
if(a[pos].lvl>=7)
{
printf("强化所需材料 : %d能量 %d强化材料 \n",strpr,250);
printf("强化效果 : 攻击伤害 *5 \n");
}
else
{
printf("将等级提升至7级及以上即可强化 \n");
printf(" \n");
}
}
else if(a[pos].str==2)
{
if(a[pos].lvl>=10)
{
printf("强化所需材料 : %d能量 %d强化材料 \n",strpr,350);
printf("强化效果 : 攻击时对怪物额外造成1%生命值的伤害 \n");
}
else
{
printf("将等级提升至10级及以上即可强化 \n");
printf(" \n");
}
}
else
{
printf(" \n");
printf(" \n");
}
for(int i=1;i<=1;i++) printf(" \n");
}
if(a[num[xx][yy]].typ==2)
{
int pos=num[xx][yy];
printf("选中的防御塔: △ \n");
if(a[pos].lvl<=10)
{
printf("等级 : %d (->%d) \n",a[pos].lvl,a[pos].lvl+1);
printf("伤害 : %d (->%d) \n",a[pos].dmg*((a[pos].str==0 || a[pos].str==1) ? 1 : 2),tower_data[a[pos].typ][a[pos].lvl+1].dmg*((a[pos].str==0 || a[pos].str==1) ? 1 : 2));
printf("攻击范围 : %d (->%d) \n",a[pos].ran*2+1,tower_data[a[pos].typ][a[pos].lvl+1].ran*2+1);
printf("攻击频率(刻) : %d (->%d) \n",a[pos].frq,tower_data[a[pos].typ][a[pos].lvl+1].frq);
printf("升级所需能量 : %d \n",tower_data[a[pos].typ][a[pos].lvl].nd);
}
else
{
printf("等级 : MAX \n");
printf("伤害 : %d \n",a[pos].dmg*((a[pos].str==0 || a[pos].str==1) ? 1 : 2));
printf("攻击范围 : %d \n",a[pos].ran*2+1);
printf("攻击频率(刻) : %d \n",a[pos].frq);
printf("升级所需能量 : - \n");
}
if(a[pos].str==0)
{
if(a[pos].lvl>=4)
{
printf("强化所需材料 : %d能量 %d强化材料 \n",strpr,150);
printf("强化效果 : 攻击数量变为2个 \n");
}
else
{
printf("将等级提升至4级及以上即可强化 \n");
printf(" \n");
}
}
else if(a[pos].str==1)
{
if(a[pos].lvl>=7)
{
printf("强化所需材料 : %d能量 %d强化材料 \n",strpr,250);
printf("强化效果 : 攻击伤害 *2 \n");
}
else
{
printf("将等级提升至7级及以上即可强化 \n");
printf(" \n");
}
}
else if(a[pos].str==2)
{
if(a[pos].lvl>=10)
{
printf("强化所需材料 : %d能量 %d强化材料 \n",strpr,350);
printf("强化效果 : 攻击数量变为5个 \n");
}
else
{
printf("将等级提升至10级及以上即可强化 \n");
printf(" \n");
}
}
else
{
printf(" \n");
printf(" \n");
}
}
if(a[num[xx][yy]].typ==3)
{
int pos=num[xx][yy];
printf("选中的防御塔: ○ \n");
if(a[pos].lvl<=10)
{
printf("等级 : %d (->%d) \n",a[pos].lvl,a[pos].lvl+1);
printf("能量产量 : %d (->%d) \n",a[pos].dmg,tower_data[a[pos].typ][a[pos].lvl+1].dmg);
printf("生产频率(刻) : %d (->%d) \n",a[pos].frq-(a[pos].str==0 ? 0 : (a[pos].str==1 ? 2 : 3)),tower_data[a[pos].typ][a[pos].lvl+1].frq-(a[pos].str==0 ? 0 : (a[pos].str==1 ? 2 : 3)));
printf("升级所需能量 : %d \n",tower_data[a[pos].typ][a[pos].lvl].nd);
}
else
{
printf("等级 : MAX \n");
printf("能量产量 : %d \n",a[pos].dmg);
printf("生产频率(刻) : %d \n",a[pos].frq-(a[pos].str==0 ? 0 : (a[pos].str==1 ? 2 : 3)));
printf("升级所需能量 : - \n");
}
if(a[pos].str==0)
{
if(a[pos].lvl>=4)
{
printf("强化所需材料 : %d能量 %d强化材料 \n",strpr,150);
printf("强化效果 : 生产效率 -2 \n");
}
else
{
printf("将等级提升至4级及以上即可强化 \n");
printf(" \n");
}
}
else if(a[pos].str==1)
{
if(a[pos].lvl>=7)
{
printf("强化所需材料 : %d能量 %d强化材料 \n",strpr,250);
printf("强化效果 : 生产效率 -1 \n");
}
else
{
printf("将等级提升至7级及以上即可强化 \n");
printf(" \n");
}
}
else if(a[pos].str==2)
{
if(a[pos].lvl>=10)
{
printf("强化所需材料 : %d能量 %d强化材料 \n",strpr,350);
printf("强化效果 : 额外生产1%所拥有的能量,最多额外生产216能量 \n");
}
else
{
printf("将等级提升至10级及以上即可强化 \n");
printf(" \n");
}
}
else
{
printf(" \n");
printf(" \n");
}
for(int i=1;i<=1;i++) printf(" \n");
}
if(a[num[xx][yy]].typ==4)
{
int pos=num[xx][yy];
printf("选中的防御塔: @ \n");
if(a[pos].lvl<=10)
{
printf("等级 : %d (->%d) \n",a[pos].lvl,a[pos].lvl+1);
printf("百分比伤害 : %d (->%d) \n",a[pos].dmg,tower_data[a[pos].typ][a[pos].lvl+1].dmg);
printf("攻击频率(刻) : %d (->%d) \n",a[pos].frq-((a[pos].str==0 || a[pos].str==1) ? 0 : 10),tower_data[a[pos].typ][a[pos].lvl+1].frq-((a[pos].str==0 || a[pos].str==1) ? 0 : 10));
printf("升级所需能量 : %d \n",tower_data[a[pos].typ][a[pos].lvl].nd);
}
else
{
printf("等级 : MAX \n");
printf("百分比伤害 : %d \n",a[pos].dmg);
printf("攻击频率(刻) : %d \n",a[pos].frq-((a[pos].str==0 || a[pos].str==1) ? 0 : 10));
printf("升级所需能量 : - \n");
}
if(a[pos].str==0)
{
if(a[pos].lvl>=4)
{
printf("强化所需材料 : %d能量 %d强化材料 \n",strpr,150);
printf("强化效果 : 攻击数量变为3个 \n");
}
else
{
printf("将等级提升至4级及以上即可强化 \n");
printf(" \n");
}
}
else if(a[pos].str==1)
{
if(a[pos].lvl>=7)
{
printf("强化所需材料 : %d能量 %d强化材料 \n",strpr,250);
printf("强化效果 : 攻击频率 -10 \n");
}
else
{
printf("将等级提升至7级及以上即可强化 \n");
printf(" \n");
}
}
else if(a[pos].str==2)
{
if(a[pos].lvl>=10)
{
printf("强化所需材料 : %d能量 %d强化材料 \n",strpr,350);
printf("强化效果 : 攻击时每个怪物有5%概率秒杀 \n");
}
else
{
printf("将等级提升至10级及以上即可强化 \n");
printf(" \n");
}
}
else
{
printf(" \n");
printf(" \n");
}
for(int i=1;i<=1;i++) printf(" \n");
}
}
else
{
int endlcnt=6;
if(num[xx][yy]==0) printf("选中了空地 \n");
if(num[xx][yy]==-1)
{
printf("选中了怪物路径 \n");
if(mon[xx][yy].mxhp==0)
{
printf("此处无怪物 \n");
}
else if(mon[xx][yy].typ==0)
{
printf("怪物类型: 普通 %d/%d \n",mon[xx][yy].hp,mon[xx][yy].mxhp);
}
else if(mon[xx][yy].typ==1)
{
printf("怪物类型: 精英 %d/%d \n",mon[xx][yy].hp,mon[xx][yy].mxhp);
printf("拥有的技能: \n");
endlcnt--;
for(int i=0;i<5;i++)
{
if(mon[xx][yy].skl[i])
{
if(i==0) printf("回血: %d 生命/秒\n",mon[xx][yy].skl[i]);
else endlcnt--;
if(i==1) printf("减伤: %d",mon[xx][yy].skl[i]),cout<<"% \n";
else endlcnt--;
if(i==2) printf("闪避: %d",mon[xx][yy].skl[i]),cout<<"% \n";
else endlcnt--;
if(i==3) printf("分伤: %d",mon[xx][yy].skl[i]),cout<<"% 所受伤害 \n";
else endlcnt--;
if(i==4) printf("重生: %d",mon[xx][yy].skl[i]),cout<<"% 最大生命值 \n";
else endlcnt--;
}
}
}
}
for(int i=1;i<=endlcnt;i++) printf(" \n");
}
gotoxy(0,25);
if(pause)
{
printf("游戏已暂停。按下空格键继续游戏...\n");
printf("按下C键可以切换速度... \n");
}
else
{
printf("游戏进行中。按下空格键暂停游戏...\n");
printf("当前速度 : %d倍速 (按下C键切换)\n",quick);
}
}
void playbarrier(int pos)
{
cls();
while(1)
{
for(int i=1;i<=quick;i++)
{
if(!pause) generatemob();
move();
if(!pause) attack();
if(!pause) checkdeadmob();
}
printscreen();
if(sta==2) break;
Sleep(200);
}
if(sta==1)
{
MessageBox(NULL,"不好意思,您输了。下次走运!","失败",MB_OK);
}
if(sta==2)
{
MessageBox(NULL,"恭喜您通过本关!","胜利",MB_OK);
if(user.barrierstatus[pos]!=2)
{
user.barrierstatus[pos]=2;
user.barrierpassed++;
}
}
if(sta==3)
{
;
}
}
};
barrier bar;
void printchangelog()
{
cls();
printf("保卫John Lee 更新日志\n");
printf("\n");
printf("2023-04-04\n");
printf("发布了保卫John Lee V0.1.0版本。\n");
}
void printinstructionspage(int page)
{
cls();
if(page==1)
{
printf("保卫John Lee V1.0.0 游戏说明\n");
printf("按下左右键翻页\n");
}
if(page==2)
{
printf("游戏介绍\n");
printf("\n");
printf("怪物们源源不断地从左上角涌出,他们的目标是右下角,你的家园。\n");
printf("在空地上建造防御塔,击败他们,升级你的防御塔以变得更强!\n");
printf("怪物们死亡后,会留下用于建造、升级防御塔的能量和更加珍贵的强化材料。\n");
printf("使用强化材料强化防御塔,创造属于你的不可逾越的防线!\n");
}
if(page==3)
{
printf("操作指南\n");
printf("\n");
printf("按下方向键控制光标移动\n");
printf("如果光标处为空地,按下Q/W/E/R/T键建造防御塔\n");
printf("如果光标处已经有防御塔,按下a键消耗能量升级防御塔\n");
printf("如果光标处已经有等级足够高的防御塔,按下S键消耗能量和强化材料强化防御塔,最高可以强化3级\n");
printf("按下Z键拆除防御塔,但不会返还能量\n");
printf("按下空格键暂停/恢复游戏进行\n");
printf("如果您认为游戏进度过慢,可以按下C键进行加速(依次为1、3、9倍速)\n");
}
if(page==4)
{
printf("防御塔的类型\n");
printf("\n");
printf("※ : 对范围内所有怪物进行群体攻击 (Q键)\n");
printf("☆ : 对范围内最靠前的怪物进行单体攻击,伤害较高 (W键)\n");
printf("△ : 对范围内最靠前的怪物增加毒伤(可叠加),此后该怪物每一刻都会受到毒伤伤害,直到死亡 (E键)\n");
printf("○ : 每隔一段时间生产能量 (R键)\n");
printf("@ : 对范围内最靠前的2个怪物进行单体攻击,每次攻击扣除怪物一定百分比的生命值,攻击频率较低 (T键)\n");
}
if(page==5)
{
printf("怪物的技能\n");
printf("\n");
printf("游戏中可能会出现精英怪。精英怪可能拥有不同的技能。一共有5种技能:\n");
printf("回血:怪物每秒会增加生命值,但不能超过原有的生命值上限\n");
printf("减伤:怪物所有受到的伤害都会降低一个百分比\n");
printf("闪避:防御塔攻击怪物时,有一定概率失败(\"闪避攻击\")\n");
printf("分伤:怪物受到的部分伤害会分担给附近的怪物,不能连锁分担\n");
printf("复活:怪物生命值过低时,其生命值会恢复至最大生命值的一个百分比,且只能复活一次\n");
}
if(page==6)
{
printf("其他事项\n");
printf("\n");
printf("游戏会每隔一段时间自动保存游戏进度。您也可以按下X键手动保存游戏进度。\n");
printf("如果您有任何疑问、意见或建议,请联系开发者DX和UDF。\n");
printf("\n");
printf("按下右移键退出游戏说明");
}
}
//回血 减伤 闪避 分伤 复活
// 0 1 2 3 4
void instructions()
{
//毒伤不会被分伤技能分摊
cls();
int page=1;
while(1)
{
printinstructionspage(page);
while(1)
{
if(keydown(VK_LEFT))
{
while(keydown(VK_LEFT));
if(page>1)
{
page--;
break;
}
}
if(keydown(VK_RIGHT))
{
while(keydown(VK_RIGHT));
if(page<7)
{
page++;
break;
}
}
}
if(page==7) break;
}
}
void printscreen()
{
gotoxy(0,0);
printf("能量: %d 强化材料: %d \n",energy,diamond);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i==xx&&j==yy) setcolor(0x4f);
if(mon[i][j].hp==0)
{
if(num[i][j]==-1)
{
if(!(i==xx&&j==yy)) setcolor(0xf0);
printf(" ");
if(!(i==xx&&j==yy)) setcolor(0x0f);
}
else
{
if(!(i==xx&&j==yy)) setcolor(0x3f);
if(num[i][j]>0 && a[num[i][j]].exi)
{
if(a[num[i][j]].typ==0) printf("※");
else if(a[num[i][j]].typ==1) printf("☆");
else if(a[num[i][j]].typ==2) printf("△");
else if(a[num[i][j]].typ==3) printf("○");
else if(a[num[i][j]].typ==4) printf("@");
}
else printf(" ");
if(!(i==xx&&j==yy)) setcolor(0x0f);
}
}
else{
if(!(i==xx&&j==yy))
{
if(mon[i][j].typ==1) setcolor(0xdf);
else setcolor(0xf0);
}
else if(mon[i][j].typ==1) setcolor(0x45);
if(mon[i][j].hp>=1000000000ll) printf("∞");
else if(mon[i][j].hp>=1000000000) printf("%dB",mon[i][j].hp/1000000000);
else if(mon[i][j].hp>=100000000) printf("%dY",mon[i][j].hp/100000000);
else if(mon[i][j].hp>=10000000) printf("%dQ",mon[i][j].hp/10000000);
else if(mon[i][j].hp>=1000000) printf("%dM",mon[i][j].hp/1000000);
else if(mon[i][j].hp>=100000) printf("%dS",mon[i][j].hp/100000);
else if(mon[i][j].hp>=10000) printf("%dW",mon[i][j].hp/10000);
else if(mon[i][j].hp>=1000) printf("%dK",mon[i][j].hp/1000);
else if(mon[i][j].hp>=100) printf("%dH",mon[i][j].hp/100);
else printf("%02d",mon[i][j].hp);
setcolor(0x0f);
}
if(i==xx&&j==yy) setcolor(0x0f);
}
printf("\n");
}
printf("游戏进度 : %.1lf",100.0*TIME/20000);
cout<<"%\n\n";
if(num[xx][yy]>0)
{
if(a[num[xx][yy]].typ==0)
{
int pos=num[xx][yy];
printf("选中的防御塔: ※ \n");
if(a[pos].lvl<=10)
{
printf("等级 : %d (->%d) \n",a[pos].lvl,a[pos].lvl+1);
printf("强化 : %d \n",a[pos].str);
printf("伤害 : %d (->%d) \n",a[pos].dmg*((a[pos].str==0 || a[pos].str==1) ? 1 : 3),tower_data[a[pos].typ][a[pos].lvl+1].dmg*((a[pos].str==0 || a[pos].str==1) ? 1 : 3));
printf("攻击范围 : %d (->%d) \n",a[pos].ran*2+1,tower_data[a[pos].typ][a[pos].lvl+1].ran*2+1);
printf("攻击频率(刻) : %d (->%d) \n",a[pos].frq-(a[pos].str==0 ? 0 : 1),tower_data[a[pos].typ][a[pos].lvl+1].frq-(a[pos].str==0 ? 0 : 1));
printf("升级所需能量 : %d \n",tower_data[a[pos].typ][a[pos].lvl].nd);
}
else
{
printf("等级 : MAX \n");
printf("强化 : %d \n",a[pos].str);
printf("伤害 : %d
by zhanghuanrui @ 2024-04-28 08:17:23
@[zhanghuanrui](/user/570352) 好像不全~~但我不会改~~
by liuziyang2010 @ 2024-05-04 16:12:39
@[liuziyang2010](/user/1313187) 可能是评论区发不了那么长的回复,但是链接里的应该是全的
by zhanghuanrui @ 2024-05-04 20:20:23