//游戏名:《酋长追寻》,作者:xtmg·xsf ,特别感谢cjb,核弹djb,zdw
//游戏简介:让‘杜’绕过‘坤’的阻碍成功到达‘章’,‘套’可以增加 破冰次数、左上次数并且还有隐藏功能。
//操作:1上,2左上,3左,0重启(另外加一行列),4核弹(破冰)
//新增: 人机模式,颜色字体,胜率计算,自定义棋盘
//于2023.6.19日更新完毕
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int a[1005][1005];
int cnt1,cnt2,cnt3;// 使用次数
int boom=1;
bool zhufu=0;
int cnt=60;//初始行列数
bool renji=0;
bool replay=0;
int shengju=0;
float shenglv;
void pobing()//破冰!!!
{
Sleep(500);
char k='B';
for(int i=1;i<=150;i++)
{
for(int j=1;j<=i;j++)cout<<k;
cout<<endl;
}
cout<<"必";
Sleep(500);
cout<<"杀";
Sleep(500);
cout<<"技:"<<endl;
Sleep(500);
cout<<"破冰!";
Sleep(1000);
cout<<endl;
cout<<endl;
}
void print()//打印棋盘(表格)
{
for(int i=cnt;i>0;i--)
{
for(int j=cnt;j>0;j--)
{
if(a[i][j]==0)printf("%*s",2,"");
else if(a[i][j]==1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2);
printf("%s","杜");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
else if(a[i][j]==2)
{
printf("%s","坤");
}
else if(a[i][j]==3)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 6);
printf("%s","蔚");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
else if(a[i][j]==4)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
printf("%s","套");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
}
cout<<endl;
}
printf("%s%i%*s","上:",cnt1,2,"");
printf("%s%i%*s","左上:",cnt2,2,"");
printf("%s%i%*s","左:",cnt3,2,"");
printf("%s%i%*s","破冰:",boom,2,"");
printf("%s%i%*s","行列数:",cnt,2,"");
printf("%s%i%*s","胜局:",shengju,2,"");
printf("%s%.1f%s%*s\n","胜率:",shenglv,"%",2,"");
}
void add(int xnow,int ynow)//增加障碍物
{
if(a[xnow+1][ynow]==2&&a[xnow][ynow+1]==2&&a[xnow+1][ynow+1]==2)return;
if(zhufu==1)
{
int kk=rand()%4+1;
if(kk==1)return;
}
int k=rand()%3+1;
if(k==1&&a[xnow+1][ynow]!=3&&a[xnow+1][ynow]!=4)
{
if(a[xnow+1][ynow]==2)
{
add(xnow,ynow);
return;
}
a[xnow+1][ynow]=2;
}
else if(k==2&&a[xnow+1][ynow+1]!=3&&a[xnow+1][ynow+1]!=4)
{
if(a[xnow+1][ynow+1]==2)
{
add(xnow,ynow);
return;
}
a[xnow+1][ynow+1]=2;
}
else if(k==3&&a[xnow][ynow+1]!=3&&a[xnow][ynow+1]!=4)
{
if(a[xnow][ynow+1]==2)
{
add(xnow,ynow);
return;
}
a[xnow][ynow+1]=2;
}
return;
}
void play()//开始游戏
{
zhufu=0;
boom=true;
cnt1=cnt;
cnt2=sqrt(3*cnt)+int(cnt/30)-1;
cnt3=cnt;
replay=0;
for(int i=1;i<=cnt;i++)
{
for(int j=1;j<=cnt;j++)
{
a[i][j]=0;
}
}
a[cnt/4][3*cnt/5]=4;
a[3*cnt/5][cnt/4]=4;
a[cnt/2][cnt/2]=4;
a[3*cnt/4][3*cnt/4]=4;
a[cnt/4][cnt/4]=4;
a[1][1]=1;
a[cnt][cnt]=3;
int xnow=1,ynow=1;
print();
print();
print();
for(int i=1;i<=cnt+1;i++)
{
a[i][cnt+1]=2;
a[cnt+1][i]=2;
}
while(a[cnt][cnt]==3)
{
int i=getchar()-48;
if(i>=0&&i<=4)
{
if(i==4&&boom>=1)
{
boom--;
for(int k=1;k<=cnt;k++)for(int l=1;l<=cnt;l++)if(a[k][l]==2)a[k][l]=0;
pobing();
}
if(i==0)
{
replay=1;
cnt++;
return;
}
if(i==1&&a[xnow+1][ynow]!=2&&cnt1>0)
{
a[xnow][ynow]=0;
xnow++;
a[xnow][ynow]=1;
cnt1--;
add(xnow,ynow);
}
if(i==2&&a[xnow+1][ynow+1]!=2&&cnt2>0)
{
a[xnow][ynow]=0;
ynow++;
xnow++;
a[xnow][ynow]=1;
cnt2--;
add(xnow,ynow);
}
if(i==3&&a[xnow][ynow+1]!=2&&cnt3>0)
{
a[xnow][ynow]=0;
ynow++;
a[xnow][ynow]=1;
cnt3--;
add(xnow,ynow);
}
if(xnow==cnt/4&&ynow==3*cnt/5)
{
cout<<"获得祝福:有1/4概率不生成'坤'"<<endl;
zhufu=1;
}
if(xnow==3*cnt/5&&ynow==cnt/4)
{
cout<<"酒店大套餐(3次左上,1个破冰)"<<endl;
boom+=1;
cnt2+=3;
}
if((xnow==cnt/2)&&(ynow==cnt/2)||(xnow==cnt/4&&ynow==cnt/4)||(xnow==3*cnt/4&&ynow==3*cnt/4))
{
int p=rand()%12+1;
if(p==1||p==2)
{
cout<<"这是‘三无劣质’(随机生成一个‘坤’)"<<endl;
add(xnow,ynow);
}
else if(p==3||p==4||p==5||p==6)
{
cout<<"这是2和3的(加2次左上)"<<endl;
cnt2+=2;
}
else if(p==7||p==8)
{
cout<<"春意套(灵魂出窍套)(隐藏功能)"<<endl;
xnow+=3;
ynow+=3;
a[xnow][ynow]=1;
}
else{
cout<<"这是安全的(加一次破冰)"<<endl;
boom++;
}
}
//胜率计算
int aaa=min(cnt-xnow,cnt-ynow)+1;
shenglv=((cnt2+boom)*150.0/aaa);
int bbb=abs(xnow-ynow);
int bianliang1=aaa-cnt2-boom;
if(bianliang1<=0)bianliang1=1;
shenglv-=(bbb-boom)*150.0/bianliang1;
if(shenglv<=0)shenglv=0.99;
if(shenglv>=100)shenglv=100;
print();
}
}
cnt++;
shengju++;
return;
}
void renzhiyin()
{
zhufu=0;
boom=true;
cnt1=cnt-2;
cnt2=sqrt(3*cnt)+int(cnt/30)-1;
cnt3=cnt-2;
replay=0;
for(int i=1;i<=cnt+1;i++)
{
for(int j=1;j<=cnt+1;j++)
{
a[i][j]=0;
}
}
a[cnt/4][3*cnt/5]=4;
a[3*cnt/5][cnt/4]=4;
a[cnt/2][cnt/2]=4;
a[3*cnt/4][3*cnt/4]=4;
a[cnt/4][cnt/4]=4;
a[1][1]=1;
a[cnt][cnt]=3;
int xnow=1,ynow=1;
print();
print();
print();
for(int i=1;i<=cnt+1;i++)
{
a[i][cnt+1]=2;
a[cnt+1][i]=2;
}
while(a[cnt][cnt]==3)
{
int i=99;
if(a[xnow+1][ynow]==2&&a[xnow][ynow+1]==2&&a[xnow+1][ynow+1]==2)
{
if(boom>0)
{
i=4;
}
if(boom==0)i=0;
}
else if(a[xnow+1][ynow]==2&&a[xnow][ynow+1]==2)
{
if(cnt2>0)i=2;
if(cnt2==0)
{
if(boom>0)
{
i=4;
}
if(boom==0)i=0;
}
}
else if(a[xnow+1][ynow]==2)i=3;
else if(a[xnow][ynow+1]==2)i=1;
if(i==99)
{
if(xnow>=ynow)i=3;
if(xnow<ynow)i=1;
}
if(i>=0&&i<=4)
{
if(i==4&&boom>=1)
{
boom--;
for(int k=1;k<=cnt;k++)for(int l=1;l<=cnt;l++)if(a[k][l]==2)a[k][l]=0;
pobing();
}
if(i==0)
{
replay=1;
cnt++;
return;
}
if(i==1&&a[xnow+1][ynow]!=2&&cnt1>0)
{
a[xnow][ynow]=0;
xnow++;
a[xnow][ynow]=1;
cnt1--;
add(xnow,ynow);
}
if(i==2&&a[xnow+1][ynow+1]!=2&&cnt2>0)
{
a[xnow][ynow]=0;
ynow++;
xnow++;
a[xnow][ynow]=1;
cnt2--;
add(xnow,ynow);
}
if(i==3&&a[xnow][ynow+1]!=2&&cnt3>0)
{
a[xnow][ynow]=0;
ynow++;
a[xnow][ynow]=1;
cnt3--;
add(xnow,ynow);
}
if(xnow==cnt/4&&ynow==3*cnt/5)
{
cout<<"获得祝福:有1/4概率不生成'坤'"<<endl;
zhufu=1;
}
if(xnow==3*cnt/5&&ynow==cnt/4)
{
cout<<"酒店大套餐(3次左上,2个破冰)"<<endl;
boom+=2;
cnt2+=3;
}
if((xnow==cnt/2)&&(ynow==cnt/2)||(xnow==cnt/4&&ynow==cnt/4)||(xnow==3*cnt/4&&ynow==3*cnt/4))
{
int p=rand()%12+1;
if(p==1||p==2)
{
cout<<"这是‘三无劣质’(随机生成一个‘坤’)"<<endl;
add(xnow,ynow);
}
else if(p==3||p==4||p==5||p==6)
{
cout<<"这是2和3的(加2次左上)"<<endl;
cnt2+=2;
}
else if(p==7||p==8)
{
cout<<"春意套(灵魂出窍套)(隐藏功能)"<<endl;
xnow+=2;
ynow+=2;
a[xnow][ynow]=1;
}
else{
cout<<"这是安全的(加一次破冰)"<<endl;
boom++;
}
}
//胜率计算
int aaa=min(cnt-xnow,cnt-ynow)+1;
if(zhufu==1)shenglv=((cnt2*2+boom)*150.0/aaa);
else shenglv=((cnt2+boom)*150.0/aaa);
int bbb=abs(xnow-ynow);
int bianliang1=aaa-cnt2-boom;
if(bianliang1<=0)bianliang1=1;
shenglv-=(bbb-boom)*150.0/bianliang1;
if(shenglv<=0)shenglv=0.99;
if(shenglv>=100)shenglv=99.9;
print();
}
Sleep(450);
}
shengju++;
cnt++;
return;
}
int main()//主程序
{
std::ios::sync_with_stdio(false);
srand(time(NULL));
cout<<"欢迎来到《酋长追寻》,作者xsf,特别感谢cjb,djb,zdw"<<endl;
Sleep(1000);
cout<<"模式选择:1——自己操作 2——人机模式 (输入1或2)"<<endl;
int ans;
cin>>ans;
cout<<"请输入行列数(建议20~60)";
int cntc;
cin>>cntc;
cnt=cntc;
//人机模式
if(ans==2){
renji=1;
if(renji=1)
{
renzhiyin();
while(replay=1)renzhiyin();
}
}
//正常模式
else{
play();
while(replay=1)play();
}
return 0;
}