傀影与猩红孤钻·改
傀影与猩红孤钻·改
说明
此控制台游戏与题目基于《明日方舟》的集成战略改编。
当你通过最后一关后,依然可以招募,但是我们不打算改,因为不会影响什么。
作者链接(顺序不分先后):
(luogu)
https://www.luogu.com.cn/user/429147
https://www.luogu.com.cn/user/218376
(codeforces)
https://codeforces.com/profile/hxhhxh
https://codeforces.com/profile/tujunbo
编译环境
建议:-std=c++14 -Wall -Wextra -Wno-sign-compare -Wunreachable-code -Wpointer-arith -Wfloat-equal
推荐使用 DevC++。
可选文件
castle.txt 请存至同一路径下。
附加题面
这里
更新日志
2023.3.14:
平衡了作战难度,调整了不期而遇的损失。
2023.3.16:
增加了娱乐节点(幕间余兴)。
2023.3.30:
增加了可视化,取消了键盘输入改为按键交互(大多时候可用 Ctrl 刷新界面)。
代码
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
#define int long long
#define f(i,j,k) for(register int i=j;i<=k;++i)
#define g(i,j,k) for(register int i=j;i>=k;--i)
int n,m,s,l;
namespace Win_EX{
string itos(int x){
string st="";
char ch;
do{
ch=x%10+'0';
st=ch+st;
x/=10;
}while(x);
return st;
}
inline int InitColor(){
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hOut == INVALID_HANDLE_VALUE)return GetLastError();
DWORD dwMode = 0;
if (!GetConsoleMode(hOut, &dwMode))return GetLastError();
dwMode |= 0x0004;
if (!SetConsoleMode(hOut, dwMode))return GetLastError();
return 1;
}
inline void SetColor(int r=-1,int g=-1,int b=-1){
static int lstr,lstg,lstb;
if(lstr==r&&lstg==g&&lstb==b)return;
lstr=r,lstg=g,lstb=b;
if(r<0)printf("\033[0m");
else printf("\x1b[38;2;%lld;%lld;%lldm",r,g,b);
}
inline void FontSize(int x){
CONSOLE_FONT_INFOEX cfi;
cfi.cbSize = sizeof(cfi);
cfi.nFont = 0;
cfi.dwFontSize.X = 0;
cfi.dwFontSize.Y = x;
cfi.FontFamily = FF_DONTCARE;
cfi.FontWeight = FW_NORMAL;
std::wcscpy(cfi.FaceName, L"Consolas");
SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
}
inline void TableSize(int x,int y,int p=0){
if(p)SetWindowPos(GetForegroundWindow(),HWND_TOP,0,0,100,100,0);
system(("mode con cols="+itos(x)+" lines="+itos(y)).data());
}
void setpos(int x=0,int y=0){static HANDLE m=GetStdHandle(STD_OUTPUT_HANDLE);COORD cp={x,y};SetConsoleCursorPosition(m,cp);}
#define Push(x) (GetAsyncKeyState(x)&0xffff)
};
namespace BackGround{
using namespace Win_EX;
char c[300]="0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM=-",a[999999];
int to[300];
void out(int x){
if(x<10) putchar(x+'0');
else putchar(x+'a'-10);
}
inline void init(){
FILE*f=fopen("castle.txt","r");
fscanf(f,"%s",a);
for(int i=0;i<=63;i++) to[c[i]]=i;
n=strlen(a);
if(n<3) return;
FontSize(2);TableSize(600,97,1);
f(i,1,n){
if(a[i-1]=='*') SetColor(),putchar('\n');
else{
int x=to[a[i-1]]*64+to[a[i]];
SetColor(x/256*16+8,(x/16)%16*16+8,x%16*16+8);
putchar(168);
putchar(128);
i++;
}
}
system("pause");
}
}
using namespace Win_EX;
const int INF=1e15+225;
const int Wd=150,Hd=60,S=10;
mt19937 mt(time(NULL));
int red(int x,int y){return mt()%(y-x+1)+x;}
int score,CS,SP,SSR,SR,X,zl,sm=6,lsm=1,xw=6,ysd=18,scp,steps=0,zm=0,dj=0,jy=0;
string jdlx[10]={"《傀影与猩红孤钻》","|--作战--|","|紧急作战|","|险路恶敌|","|不期而遇|","|古堡馈赠|","|安全节点|","|幕间余兴|","|诡意行商|","欢迎游玩"};
int aaa[10]={10,20,36,40,55,65,70,75,80,INF};//指挥等级升级所需经验
int bbb[10]={4,4,5,6,6,6,7,8,8,INF};//指挥等级升级给的希望
int ccc[10]={4,4,6,6,7};//每层步数
int ddd[10]={0,30,80,150,270,400,550};//层数得分
int eee[10]={0,12,18,36};//作战经验
int fff[10]={10,18,30,50,75,110};//每层难度
int ggg[10][3]={{88,88,88},{239,187,25},{234,125,97},{255,82,80},{80,207,220},{80,207,220},{0,161,233},{80,207,220},{22,198,12}};//节点颜色
int dv[10],id[10][10],bian[10][10][5],el[2020],er[2020],giv[2020];
int visit[202],spv[202],W[202][30303],NOWP;
vector<int>q[202020];
#define zdl(x) (1<=(x)&&(x)<=3)
#define wisl(x) for(;x;Sleep(10))
#define pss(x,y...) setpos(Wd/3*2+2,x),printf(y)
inline int HARD_EX(int cs){return (cs==2)?25+8*SP:(cs==4)?75+9*SP:(cs==5)?105+10*SP:0;}
inline void out(int x,int col,int width){
int numw=1;
if(x>9) numw++;
if(x>99) numw++;
if(x>999) numw++;
if(x>9999) numw++;
if(x>99999) numw++;
f(i,1,width-numw)putchar(' ');
printf("\033[%lldm%lld\033[0m",col,x);
}
inline void Mat(int xl,int xr,int yl,int yr){
setpos(xl,yl);
f(i,xl,xr)printf("━");
setpos(xl,yr);
f(i,xl,xr)printf("━");
f(i,yl,yr){
setpos(xl,i);printf("┃");
setpos(xr,i);printf("┃");
}
setpos(xl,yl);printf("┏");
setpos(xr,yl);printf("┓");
setpos(xl,yr);printf("┗");
setpos(xr,yr);printf("┛");
}
inline void pst(){
Mat(Wd/3*2,Wd,0,10);
setpos(Wd/3*2,0);printf("┳");
setpos(Wd/3*2,10);printf("┻");
setpos(Wd,10);printf("┫");
}
inline void print_node(int i,int j=-1){
if(!i)return;
int sp=j;
if(j<0){
f(ii,1,s)f(jj,1,dv[ii])if(id[ii][jj]==i){
i=ii;j=jj;break;
}
}
int k=id[i][j],ek=spv[id[i][j]],ke=spv[id[i][j]];
int ex=(Wd+2-s*20)/2,em=1,sx=S+8-2*dv[i]+(j-1)*4;
if(!visit[k])ek=0;
if(visit[k]==2)em=2;
setpos((i-1)*20+ex,sx);
if(k^NOWP)SetColor(ggg[ek][0]/em,ggg[ek][1]/em,ggg[ek][2]/em);
else SetColor(ggg[ek][0]/4,ggg[ek][1]/4,ggg[ek][2]/4);
printf("┏━━━━━━━━━━━━━━━┓");
if(sp==-2){
SetColor(255,255,255);
setpos((i-1)*20+ex+2,sx);
printf(" <- next to ");
}
SetColor(ggg[ek][0]/em,ggg[ek][1]/em,ggg[ek][2]/em);
setpos((i-1)*20+ex,sx+1);
printf("┃%3lld=",id[i][j]);cout<<jdlx[ke]<<" ┃";
if(k==NOWP){
SetColor(ggg[ek][0]/4,ggg[ek][1]/4,ggg[ek][2]/4);
setpos((i-1)*20+ex,sx+1);printf("┃");
setpos((i-1)*20+ex+16,sx+1);printf("┃");
}
setpos((i-1)*20+ex,sx+2);
printf("┗ ->");
if(i!=s){
f(kk,1,3){
if(kk<=q[id[i][j]].size()){
printf("%2lld",q[id[i][j]][kk-1]);
if(kk^q[id[i][j]].size())putchar(',');
}
else printf(" ");
}
}else{
printf(" ");
}
printf(" ┛");
SetColor();
}
inline void pg(int cs){
system("cls");
Mat(1,Wd,0,10);pst();
setpos(3,2);printf("基础状态\n\n");
setpos(3,3);printf("战力:");out(zl,101,14);printf(" | 目标生命:");out(sm,104,10);printf(" | 临时目标生命:");out(lsm,100,10);printf("\n");
setpos(3,4);printf("希望: \033[93m%10lld\033[0m | 源石锭: \033[92m%10lld\033[0m | 收藏品数: \033[97m%10lld\033[0m\n",xw,ysd,scp);
setpos(3,5);printf("通过层数:\033[97m%10lld\033[0m | 通过步数:\033[97m%10lld\033[0m | 招募干员次数:\033[97m%10lld\033[0m\n",cs,steps,zm);
setpos(3,6);printf("指挥等级:\033[94m%10lld\033[0m | 指挥经验:\033[94m%10lld\033[0m | (战斗)得分:\033[96m%10lld\033[0m\n",dj,jy,score);
setpos(3,8);printf("现在是第 %lld 层",cs+1);
setpos(0,11);
Mat(1,Wd,S,S+14);
setpos(1,S);printf("┣");
setpos(Wd,S);printf("┫");
setpos(1,S+1);
int n=id[s][dv[s]],m;
f(i,0,n)visit[i]=0;
queue<int>Q;
for(Q.push(NOWP);Q.size();Q.pop()){
m=Q.front();
if(visit[m])continue;visit[m]=1;
for(int w:q[m])Q.push(w);
}
int el=1;
f(i,1,s)f(j,1,dv[i])if(id[i][j]==NOWP)el=i;
f(i,el+1,s)f(j,1,dv[i])if(!visit[id[i][j]])visit[id[i][j]]=2;
f(i,1,s)f(j,1,dv[i])print_node(i,j);
pst();
}
struct Flametail{int w,h,d,x,c,v;};
inline bool operator <(const Flametail&p,const Flametail&q){return p.w^q.w?p.w>q.w:p.x>q.x;}
inline bool operator ==(const Flametail&p,const Flametail&q){return p.w==q.w&&p.h==q.h&&p.d==q.d&&p.x==q.x&&p.c==q.c&&p.v==q.v;}
inline int mt_(int x,int y){if(mt()%100<90)return x;return y;}
inline void ADD(Flametail a){zl+=a.w;sm+=a.h;lsm+=a.d;xw+=a.x;ysd+=a.c;scp+=a.v;SSR+=a.v*(a.c>0);}
inline Flametail NEW(int val){return (Flametail){mt()%3,mt()%5,mt_(0,1),mt_(mt()%3,8),val,1};}
inline int clac_low(int hd,int maxg,int nzl){
double b=maxg,c=0.3;
double le=-101010,ri=1010101,mid;
while(ri-le>1e-9){
mid=(le+ri)/2;
if(floor(b*(1-1/(1+exp(-c*(hd-mid)))))>0) ri=mid;
else le=mid;
}
return floor(b*(1-1/(1+exp(-c*(nzl-le)))));
}
inline void clac_hard(int cs){
int Hard=fff[cs],nh,ep=3000;
f(i,1,n)if(zdl(spv[i])){
nh=red(Hard-3,Hard+cs/2+1)+spv[i]-1;//算难度
int totg=red(nh,114);
if(spv[i]==3)nh=HARD_EX(cs);
f(j,0,ep)W[i][j]=0;
g(j,nh-1,0)W[i][j]=-clac_low(nh,totg,j);
g(j,nh-1,0)if(spv[i]==3&&cs==4&&W[i][j]<-129)W[i][j]=-129;
giv[i]=(spv[i]==1?red(2,3):spv[i]==2?red(4,6):red(8,10));//给多少源石锭
}
}
inline int decision_(vector<Flametail>a){
int n=a.size(),p=0,kp=0;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int fl=1,ep=0,el=1;
wisl(Push(VK_RETURN));
wisl(1){
if(Push(VK_RETURN))ep=1;
if((el|=Push(VK_CONTROL))||fl||ep){
if(el){
pg(CS);
setpos(0,S+15);
if(n){
printf("你有 %lld 个决策,分别表示战力,目标生命,临时目标生命,希望,源石锭,收藏品数的增加量。\n",n);
printf("请按照从 1 开始的编号选择其一,或者输出 0 什么也不要。\n");
}else{
printf("什么也没有了,你只能离开。\n");
}
printf("\033[91m");
cout<<"decision "<<n<<"\n";
f(i,1,n)cout<<a[i-1].w<<" "<<a[i-1].h<<" "<<a[i-1].d<<" "<<a[i-1].x<<" "<<a[i-1].c<<" "<<a[i-1].v<<"\n";
printf("\033[0m");
}
if(kp){
setpos(0,S+17+kp);
Flametail h=a[kp-1];
printf("\033[91m%lld %lld %lld %lld %lld %lld\033[0m\n",h.w,h.h,h.d,h.x,h.c,h.v);
}
if(p){
Flametail h=a[p-1];
pss(1,"你选择第 %3lld 个决策:",p);
pss(2,"增加 %3lld 战力,%3lld 目标生命,",h.w,h.h);
pss(3,"%3lld 临时目标生命,%3lld 希望,",h.d,h.x);
pss(4,"%3lld 源石锭,%3lld 收藏品数。",h.c,h.v);
setpos(0,S+17+p);kp=p;
printf("\033[91m\033[100m%lld %lld %lld %lld %lld %lld\033[0m\n",h.w,h.h,h.d,h.x,h.c,h.v);
}
else{
pss(1,"你什么都不拿。 ");
pss(2," ");
pss(3," ");
pss(4," ");
}
if(ep){
if(1<=p&&p<=n)ADD(a[p-1]);
return p;
}
fl=el=0;
wisl(Push(VK_CONTROL));
}
if(Push(VK_UP)){
p=(p+n)%(n+1);fl=1;
wisl(Push(VK_UP));
}
if(Push(VK_DOWN)){
p=(p+1)%(n+1);fl=1;
wisl(Push(VK_DOWN));
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
return 0;
}
inline void shop_(int n=7,int sp=1){
int x;vector<Flametail>a,b;
f(i,1,n)b.push_back(NEW(sp*(-8-(signed int)(mt()%3)*4)+(mt()%30==0)*25));
while(1){
a.clear();
f(i,1,b.size())if(ysd+b[i-1].c>=0)a.push_back(b[i-1]);
x=decision_(a);
if(!(1<=x&&x<=a.size())||!sp)break;
for(auto it=b.begin();it!=b.end();++it)if((*it)==a[x-1]){
b.erase(it);break;
}
}
}
inline void person_(){
int val,n=mt()%15;vector<Flametail>a;//实际上此处的最大值可能与交互库中不同,别处同理
if(mt_(0,mt()&1)==1)a.push_back((Flametail){4,0,0,0,0,0});
f(i,2,n){
val=mt()%6+1;
if(xw-val>=0)a.push_back((Flametail){val/2+1,0,0,-val,0,0});
}
sort(a.begin(),a.end());//未必排序
a.push_back((Flametail){1,0,0,0,0,0});
zm+=(decision_(a)==1);
}
inline void fight_(int h,int c,int v,int sp){
int x=0;score+=sp*10;h=min(h+lsm,0ll);
for(jy+=eee[sp]+(h==0)*(sp==1?3:sp==2?5:0);jy>=aaa[dj];jy-=aaa[dj++])x+=bbb[dj];
sm=max(sm+h,0ll);xw+=x;ysd+=c;v+=mt_(0,1);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
pg(CS);setpos(0,S+15);
printf("你扣了 %lld 目标生命,获得了 %lld 希望,%lld 源石锭,掉落了 %lld 个收藏品。\n",-h,x,c,v);
printf("\033[91m");
cout<<"fight "<<h<<" "<<x<<" "<<c<<" "<<v<<endl;
printf("\033[0m");
system("pause");
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(!sm)return;
f(i,1,v)shop_(1,0);
v=mt_(1,2);
f(i,1,v)person_();
}
inline void try_(int h,int c,int v){
int x=0,fl=1;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
wisl(Push(VK_UP));wisl(Push(VK_DOWN));
wisl(1){
if(Push(VK_CONTROL)||fl){
pg(CS);fl=0;
setpos(0,S+15);
printf("\033[91m");
cout<<"try "<<h<<" "<<c<<" "<<v<<endl;
printf("\033[0m");
printf("点击“上”;程序输出 1 进行一场损失 %lld 目标生命(未计算临时),获得 %lld 源石锭和至少 %lld 个收藏品的战斗。\n",-h,c,v);
printf("点击“下”;程序输出 0 离开此节点。\n你的选择:");
}
if(Push(VK_UP)){x=1;break;}
if(Push(VK_DOWN)){x=0;break;}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(x)fight_(h,c,v,2);
}
inline void update_(Flametail a){
ADD(a);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
pg(CS);///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
setpos(0,S+15);
printf("以下分别表示战力,目标生命,临时目标生命,希望,源石锭,收藏品数的增加量。\n");///////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
printf("\033[91m");
cout<<"update "<<a.w<<" "<<a.h<<" "<<a.d<<" "<<a.x<<" "<<a.c<<" "<<a.v<<endl;
printf("\033[0m");
system("pause");//////////////////////////////////////////////////////////////////////////////////////////////////////////
}
inline void ENCOUNTER(){
if(mt_(0,1)||mt_(0,1))return try_(-clac_low(red(30,100),mt()%20+4,zl),mt()%30,mt()%3+1);
int n=mt()%3+1;vector<Flametail>a;
f(i,1,n){
a.push_back((Flametail){red(-min(zl,3ll),3),red(-min(sm-1,5ll),10),mt()%2,red(-min(xw,2ll),3),red(-ysd,5),mt()%2});
}
decision_(a);
}
inline void BOONS(){
update_(NEW(0));
}
inline void SAFE_HOUSE(){
Flametail c[10];vector<Flametail>a;
c[0]=(Flametail){4,0,0,0,0,0};
c[1]=(Flametail){0,3,0,0,0,0};
c[2]=(Flametail){0,0,1,0,0,0};
c[3]=(Flametail){0,0,0,3,0,0};
c[4]=(Flametail){0,0,0,0,5,0};
shuffle(c,c+5,mt);
f(i,0,2)a.push_back(c[i]);
decision_(a);
}
inline void DOWNTIME_RECREATION(){
int x;vector<Flametail>a,b;
int sp=mt()&1;
int n=mt()%2+2-sp;
if(sp){//交换不同种类的资源
int lp=10,lq=10;
f(i,1,n){
Flametail c=(Flametail){0,0,0,0,0,0};int p=0,q=0;
for(;p==q||(lp==q&&lq==p);p=mt()%3)q=mt()%3;
lp=p;lq=q;
(p==0?c.h-=red(2,6):p==1?c.x-=red(1,2):c.c-=red(5,10));
(q==0?c.h+=red(2,10):q==1?c.x+=red(3,6):c.c+=red(4,8));
b.push_back(c);
}
}else{//消耗资源换取随机奖励
f(i,1,n){
Flametail c=(Flametail){0,0,0,0,0,0};int p=mt()%3;
(p==0?c.h-=red(2,6):p==1?c.x-=red(1,2):c.c-=red(5,6));
b.push_back(c);
}
}
while(1){
a.clear();
f(i,1,b.size())if(sm+b[i-1].h>0&&xw+b[i-1].x>=0&&ysd+b[i-1].c>=0)a.push_back(b[i-1]);
x=decision_(a);
if(!(1<=x&&x<=a.size()))break;
if(!sp){
if(red(0,3)==0)BOONS();
else update_((Flametail){0,0,0,0,0,0});
}
}
}
inline void ROGUE_TRADER(){
shop_();
}
inline int GetSP(int SP=1){
int fl=1;
wisl(Push(VK_RETURN));
while(!Push(VK_RETURN)){
if(Push(VK_CONTROL)||fl){
fl=0;
FontSize(30);
TableSize(16,3);
system("cls");
setpos(2,0);printf("\033[%dm\033[%dm( 古堡观光 )\033[0m",SP==1?102:92,SP==1?90:40);
setpos(2,1);printf("\033[%dm\033[%dm( 正式调查 )\033[0m",SP==2?103:93,SP==2?90:40);
setpos(2,2);printf("\033[%dm\033[%dm( 直面灾厄 )\033[0m",SP==3?101:91,SP==3?90:40);
printf("\033[?25l");
wisl(Push(VK_CONTROL));
}
if(Push(VK_UP)){
SP=(SP+1)%3+1;fl=1;
wisl(Push(VK_UP));
}
if(Push(VK_DOWN)){
SP=SP%3+1;fl=1;
wisl(Push(VK_DOWN));
}
}
FontSize(16);
TableSize(Wd+3,Hd+3);
system("cls");
return SP;
}
signed main(int argc, char* argv[]){
InitColor();
BackGround::init();
SP=1;
SP=GetSP(SP);
cout<<SP<<endl;
if(SP==1)X=114514,zl=35,scp=1;
if(SP==2)X=555,zl=20;
if(SP==3)X=444,zl=10,scp=2;
f(cs,0,4){
CS=cs;
//###地图输入
s=ccc[cs];
//设置每层节点数量
f(i,1,s)dv[i]=red(2,(i==1||i==s)?2:3);
if(cs==2||cs==4)dv[s]=1;dv[1]=cs?2:1;l=0;
//连边,出入度非0
f(i,1,s)f(j,1,dv[i])id[i][j]=++l;n=l;
f(i,1,s-1)f(j,1,dv[i]){l=0;
f(k,1,dv[i+1])l|=bian[i][j][k]=(red(0,2)==0);
if(!l)bian[i][j][red(1,dv[i+1])]=1;
}
f(i,2,s)f(j,1,dv[i]){l=0;
f(k,1,dv[i-1])l|=bian[i-1][k][j];
if(!l)bian[i-1][red(1,dv[i-1])][j]=1;
}
f(i,1,n)q[i].clear();m=0;
//1作战4不期而遇
f(i,1,n)spv[i]=red(0,1)*3+1;
int exn=cs/2+red(cs/2,2);//选几个变为高级节点
f(i,1,exn)spv[red(1,n-dv[s])]=red(5,7);
// f(i,1,n)spv[i]=7;//全改成测试的
f(i,1,n)if(spv[i]==1&&red(1,3)==1)spv[i]=2;
f(i,1,dv[1])spv[i]=1;//普通作战开
f(i,1,dv[s])spv[id[s][i]]=(cs==0?8:(cs==1||cs==3)?5:3);//结尾有特殊要求
f(i,1,s-1)f(j,1,dv[i])f(k,1,dv[i+1])if(bian[i][j][k])++m;
f(i,1,s-1)f(j,1,dv[i])f(k,1,dv[i+1])if(bian[i][j][k])q[id[i][j]].push_back(id[i+1][k]);
f(j,1,dv[1])q[0].push_back(id[1][j]);
//设置战斗类节点难度
clac_hard(cs);
int now=NOWP=0;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
pg(cs);
setpos(0,S+15);
printf("\033[91m");
cout<<"new "<<n<<" "<<m<<endl;
f(i,1,n)cout<<spv[i]<<" ";cout<<endl;
f(i,1,s-1)f(j,1,dv[i])f(k,1,dv[i+1])if(bian[i][j][k])cout<<id[i][j]<<" "<<id[i+1][k]<<endl;
printf("\033[0m");
system("pause");
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
for(;!now||q[now].size();){
vector<int>ctn;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
pg(cs);
setpos(0,S+15);
printf("按上或下键可以开始选择去到的节点。");
printf("你现在处于节点 %3lld,对于你的程序,输出[a ?]表示询问节点的信息,输出[a !]表示确认前往某个节点。\n",now);
printf("你可以前往一下节点(标*的为可询问信息的作战类节点):\n");
if(now)for(int i:q[now])printf("[%3lld%c] ",i,zdl(spv[i])?'*':'-'),ctn.push_back(i);
else f(i,1,dv[1])printf("[%3lld%c] ",i,zdl(spv[i])?'*':'-'),ctn.push_back(i);
putchar('\n');
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//###移动位置
int x;string a;
printf("\033[91m");
cout<<"move"<<endl;
printf("\033[0m");
int fl=2,e,yx=0;x=NOWP=now;
sort(ctn.begin(),ctn.end());
x=ctn[mt()%ctn.size()];
wisl(Push(VK_RETURN));
while(!Push(VK_RETURN)||x==now){
if((e=Push(VK_CONTROL))||fl){
if(e||fl==2)pg(cs);
print_node(yx);yx=x;fl=e=0;
print_node(x,x==now?-1:-2);
wisl(Push(VK_CONTROL));
//////////////////////////////////////////////////////////////////////////////////////////////////////////
setpos(0,S+15);
printf("按上或下键可以开始选择去到的节点。");
printf("你现在处于节点 %3lld,对于你的程序,输出[a ?]表示询问节点的信息,输出[a !]表示确认前往某个节点。\n",now);
printf("你可以前往一下节点(标*的为可询问信息的作战类节点):\n");
if(now)for(int i:q[now])printf("[%3lld%c] ",i,zdl(spv[i])?'*':'-'),ctn.push_back(i);
else f(i,1,dv[1])printf("[%3lld%c] ",i,zdl(spv[i])?'*':'-'),ctn.push_back(i);
putchar('\n');
if(x^now){
printf("\033[92m");
cout<<x<<" ? \n";
printf("\033[0m");
int yp=0;
if(!now)yp=(1<=x&&x<=dv[1]);
else f(i,1,q[now].size())yp|=(q[now][i-1]==x);
yp&=zdl(spv[x]);
printf("\033[91m");
if(!yp)cout<<"will "<<-INF<<" "<<-INF<<" \n";
else cout<<"will "<<W[x][zl]<<" "<<giv[x]<<" \n";
printf("\033[0m");
if(yp)printf("\n即你会损失 %lld(未计算临时)点目标生命,获得至少 %lld 源石锭 \n",-W[x][zl],giv[x]);
else printf("\n你的程序不应该询问这个节点的信息(但是你依然能到) \n");
pss(1,"接下来去到节点 %lld ",x);
}else{
printf("\033[91m");
cout<<"move"<<endl;
printf("\033[0m");
pss(1,"你还未选择接下来去到的节点 ");
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
}
if(Push(VK_UP)){
e=lower_bound(ctn.begin(),ctn.end(),x)-ctn.begin();
x=ctn[(e-1+ctn.size())%ctn.size()];fl=1;
wisl(Push(VK_UP));
}
if(Push(VK_DOWN)){
e=lower_bound(ctn.begin(),ctn.end(),x)-ctn.begin();
x=ctn[(e+1)%ctn.size()];fl=1;
wisl(Push(VK_DOWN));
}
}
a="!";
if(a=="?"){
int yp=0;
if(!now)yp=(1<=x&&x<=dv[1]);
else f(i,1,q[now].size())yp|=(q[now][i-1]==x);
yp&=zdl(spv[x]);
if(!yp)cout<<"will "<<-INF<<" "<<-INF<<endl;
else cout<<"will "<<W[x][zl]<<" "<<giv[x]<<endl;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(yp)printf("\n即你会损失 %lld(未计算临时)点目标生命,获得至少 %lld 源石锭\n",-W[x][zl],giv[x]);//////////
else printf("\n即你输出不合法,实际上未必会返回一个很小的数,可能直接答案错误\n");
system("pause");/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
}else if(a=="!"){
int yp=0;
if(!now)yp=(1<=x&&x<=dv[1]);
else f(i,1,q[now].size())yp|=(q[now][i-1]==x);
if(!yp){
score+=ddd[cs];
goto ut;
}
NOWP=now=x;++steps;
switch(spv[now]){
case 1:
case 2:
case 3:
fight_(W[now][zl],giv[now],0,spv[now]);break;
case 4:
ENCOUNTER();break;
case 5:
BOONS();break;
case 6:
SAFE_HOUSE();break;
case 7:
DOWNTIME_RECREATION();break;
case 8:
ROGUE_TRADER();break;
}
}else{
score=ddd[cs];
goto ut;
}
if(sm<=0){
score=ddd[cs];
goto ut;
}
}
}
score=ddd[++CS];ut:;
score+=steps+zm*2+scp*5;
if(SP==1)score/=2;if(SP==3)score=score*6/5;
pg(CS);setpos(0,S+15);printf("\n已结束\n");///////////////////////////////////////////////////////////////////////////////
if(SSR>9)printf("获得成就[Elysia,无瑕之人]-同局游戏获得(%lld/10)次增加源石锭的收藏品。",SSR); /////////////////////////
return 0;
}