有没人用c++做游戏

灌水区

有很多~~但我不是~~
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


| 下一页