Krads
Chthollian · · 休闲·娱乐
1.3版本,加入第一张反制指令:科创反诈中心。
#include<bits/stdc++.h>
#define IT set<Node>::iterator
#define mpl pl[1].wz
#define mpr pl[2].wz
using namespace std;
const int kardstot=6;
const int MP_MAX=100000,MP_MIN=1;
string orkards[]= {"","前进","后退","攻击","洗牌","有限补给","科创反诈中心"};
int aknum[]= {0,10,10,10,4,7,3};
int kardsnum;
string kardsname[10000005]= {""};
string mapname[]= {"","p1","p2","空地","焦土"};
struct Player
{
int hp,wz,knum;
int fzok;//判定是否挂载反诈
int kards[100005];
} pl[3];
int action;//用于判断行为
int mp[100005];
mt19937 rng(time(0));
int rand(int l,int r)
{
return rng()%(r-l+1)+l;
}
bool find_winner()
{
if(pl[1].hp<=0)
{
cout<<"p2 win!\n";
return false;
}
if(pl[2].hp<=0)
{
cout<<"p1 win!\n";
return false;
}
return true;
}
void give_kard(int op,int num)
{
for(int i=1; i<=num; i++)
{
pl[op].kards[++pl[op].knum]=rand(1,kardsnum);
}
sort(pl[op].kards+1,pl[op].kards+pl[op].knum+1);
}
void qianjin(int op)
{
if(pl[1].wz==pl[2].wz-1)
{
return;
}
if(op==1)
{
mp[pl[1].wz]=0;
pl[1].wz++;
mp[pl[1].wz]=1;
}
else
{
mp[pl[2].wz]=0;
pl[2].wz--;
mp[pl[2].wz]=2;
}
}
void houtui(int op)
{
if(op==1)
{
if(pl[1].wz==MP_MIN)
{
if(pl[2].wz!=MP_MAX)
{
houtui(2);
}
return;
}
mp[pl[1].wz]=3;
pl[1].wz--;
mp[pl[1].wz]=1;
}
else
{
if(pl[2].wz==MP_MAX)
{
if(pl[1].wz!=MP_MIN)
{
houtui(2);
}
return;
}
mp[pl[2].wz]=3;
pl[2].wz++;
mp[pl[2].wz]=2;
}
}
void kill(int op,int killnum)
{
if(op==1)
{
int nxt=pl[1].wz+1;
if(mp[nxt]==2)
{
pl[2].hp-=killnum;
cout<<"p2 hp:"<<pl[2].hp<<"\n";
}
else if(mp[nxt]==3)
{
if(killnum<=2)
{
mp[nxt]=4;
}
else
{
qianjin(op);
}
}
else if(mp[nxt])
{
qianjin(op);
}
}
else
{
int nxt=pl[2].wz-1;
if(mp[nxt]==1)
{
pl[1].hp-=killnum;
cout<<"p1 hp:"<<pl[1].hp<<"\n";
}
else if(mp[nxt]==3)
{
if(killnum<=2)
{
mp[nxt]=4;
}
else
{
qianjin(op);
}
}
else if(mp[nxt])
{
qianjin(op);
}
}
}
void pop_kard(int op,int kid)
{
swap(pl[op].kards[pl[op].knum],pl[op].kards[kid]);
pl[op].kards[kid]=0;
pl[op].knum--;
sort(pl[op].kards+1,pl[op].kards+pl[op].knum+1);
}
void xipai(int op)
{
int ornum=pl[op].knum;
while(pl[op].knum)
{
pop_kard(op,rand(1,pl[op].knum));
}
give_kard(op,ornum);
}
void fanzha(int op)
{
if(op==1)
{
pl[2].fzok++;
}
else
{
pl[1].fzok++;
}
}
void youxianbuji(int op)
{
give_kard(op,min(2,max(0,10-pl[op].knum)));
}
void us_kard(int op,int kid)
{
string nowname=kardsname[pl[op].kards[kid]];
pl[op].kards[kid]=1e8;
sort(pl[op].kards+1,pl[op].kards+pl[op].knum+1);
pl[op].knum--;
if(pl[op].fzok)
{
cout<<"我恭喜你发财!!\n";
pl[op].fzok--;
return;
}
if(nowname=="前进")
{
qianjin(op);
}
else if(nowname=="后退")
{
houtui(op);
}
else if(nowname=="攻击")
{
kill(op,2);
}
else if(nowname=="洗牌")
{
xipai(op);
}
else if(nowname=="有限补给")
{
youxianbuji(op);
}
else if(nowname=="科创反诈中心")
{
fanzha(op);
}
}
void init()
{
for(int i=1; i<=kardstot; i++)
{
for(int j=1; j<=aknum[i]; j++)
{
kardsname[++kardsnum]=orkards[i];
}
}
pl[1].hp=pl[2].hp=10;
give_kard(1,5),give_kard(2,5);
pl[1].wz=1,pl[2].wz=5;
mp[1]=1,mp[2]=mp[3]=mp[4]=3,mp[5]=2;
}
void out_map(int l,int r)
{
cout<<"| ";
for(int i=l; i<=r; i++)
{
cout<<mapname[mp[i]]<<" | ";
}
cout<<"\n";
}
void out_kard(int op)
{
for(int i=1; i<=pl[op].knum; i++)
{
cout<<i<<":"<<kardsname[pl[op].kards[i]]<<" ";
}
cout<<"\n";
}
void cls()
{
system("cls");
for(int i=1; i<=5; i++)
{
cout<<"\n";
}
}//如果你使用的是VScode,请将cls()改为cls2()
void cls2()
{
for (int i = 1; i <= 30;i++)
{
cout << "\n";
}
}
int main()
{
init();
while(pl[1].hp>0 && pl[2].hp>0)
{
cout<<"p1 trun\n";
out_map(mpl,mpr),out_kard(1);
cin>>action;
while(action!=-1)
{
if(action>pl[1].knum)
{
cout<<"wrong kard\n";
cin>>action;
continue;
}
us_kard(1,action);
if(!find_winner())
{
return 0;
}
if(!pl[1].knum)
{
break;
}
out_map(mpl,mpr),out_kard(1);
cin>>action;
}
cls();
cout<<"p2 trun\n";
out_map(mpl,mpr),out_kard(2);
cin>>action;
while(action!=-1)
{
if(action>pl[2].knum)
{
cout<<"wrong kard\n";
cin>>action;
continue;
}
us_kard(2,action);
if(!find_winner())
{
return 0;
}
if(!pl[2].knum)
{
break;
}
out_map(mpl,mpr),out_kard(2);
cin>>action;
}
cls();
give_kard(1,min(2,max(0,10-pl[1].knum)));
give_kard(2,min(2,max(0,10-pl[2].knum)));
}
return 0;
}
1.2版本,增加手牌上限,增加新牌:有限补给。
#include<bits/stdc++.h>
#define IT set<Node>::iterator
#define mpl pl[1].wz
#define mpr pl[2].wz
using namespace std;
const int kardstot=5;
const int MP_MAX=100000,MP_MIN=1;
string orkards[]= {"","前进","后退","攻击","洗牌","有限补给"};
int aknum[]= {0,10,10,10,4,7};
int kardsnum;
string kardsname[10000005]= {""};
string mapname[]= {"","p1","p2","空地","焦土"};
struct Player
{
int hp,wz,knum;
int kards[100005];
} pl[3];
int action;//用于判断行为
int mp[100005];
mt19937 rng(time(0));
int rand(int l,int r)
{
return rng()%(r-l+1)+l;
}
bool find_winner()
{
if(pl[1].hp<=0)
{
cout<<"p2 win!\n";
return false;
}
if(pl[2].hp<=0)
{
cout<<"p1 win!\n";
return false;
}
return true;
}
void give_kard(int op,int num)
{
for(int i=1; i<=num; i++)
{
pl[op].kards[++pl[op].knum]=rand(1,kardsnum);
}
sort(pl[op].kards+1,pl[op].kards+pl[op].knum+1);
}
void qianjin(int op)
{
if(pl[1].wz==pl[2].wz-1)
{
return;
}
if(op==1)
{
mp[pl[1].wz]=0;
pl[1].wz++;
mp[pl[1].wz]=1;
}
else
{
mp[pl[2].wz]=0;
pl[2].wz--;
mp[pl[2].wz]=2;
}
}
void houtui(int op)
{
if(op==1)
{
if(pl[1].wz==MP_MIN)
{
if(pl[2].wz!=MP_MAX)
{
houtui(2);
}
return;
}
mp[pl[1].wz]=3;
pl[1].wz--;
mp[pl[1].wz]=1;
}
else
{
if(pl[2].wz==MP_MAX)
{
if(pl[1].wz!=MP_MIN)
{
houtui(2);
}
return;
}
mp[pl[2].wz]=3;
pl[2].wz++;
mp[pl[2].wz]=2;
}
}
void kill(int op,int killnum)
{
if(op==1)
{
int nxt=pl[1].wz+1;
if(mp[nxt]==2)
{
pl[2].hp-=killnum;
cout<<"p2 hp:"<<pl[2].hp<<"\n";
}
else if(mp[nxt]==3)
{
if(killnum<=2)
{
mp[nxt]=4;
}
else
{
qianjin(op);
}
}
else if(mp[nxt])
{
qianjin(op);
}
}
else
{
int nxt=pl[2].wz-1;
if(mp[nxt]==1)
{
pl[1].hp-=killnum;
cout<<"p1 hp:"<<pl[1].hp<<"\n";
}
else if(mp[nxt]==3)
{
if(killnum<=2)
{
mp[nxt]=4;
}
else
{
qianjin(op);
}
}
else if(mp[nxt])
{
qianjin(op);
}
}
}
void pop_kard(int op,int kid)
{
swap(pl[op].kards[pl[op].knum],pl[op].kards[kid]);
pl[op].kards[kid]=0;
pl[op].knum--;
sort(pl[op].kards+1,pl[op].kards+pl[op].knum+1);
}
void xipai(int op)
{
int ornum=pl[op].knum;
while(pl[op].knum)
{
pop_kard(op,rand(1,pl[op].knum));
}
give_kard(op,ornum);
}
void youxianbuji(int op)
{
give_kard(op,min(2,max(0,10-pl[op].knum)));
}
void us_kard(int op,int kid)
{
string nowname=kardsname[pl[op].kards[kid]];
pl[op].kards[kid]=1e8;
sort(pl[op].kards+1,pl[op].kards+pl[op].knum+1);
pl[op].knum--;
if(nowname=="前进")
{
qianjin(op);
}
else if(nowname=="后退")
{
houtui(op);
}
else if(nowname=="攻击")
{
kill(op,2);
}
else if(nowname=="洗牌")
{
xipai(op);
}
else if(nowname=="有限补给")
{
youxianbuji(op);
}
}
void init()
{
for(int i=1; i<=kardstot; i++)
{
for(int j=1; j<=aknum[i]; j++)
{
kardsname[++kardsnum]=orkards[i];
}
}
pl[1].hp=pl[2].hp=10;
give_kard(1,5),give_kard(2,5);
pl[1].wz=1,pl[2].wz=5;
mp[1]=1,mp[2]=mp[3]=mp[4]=3,mp[5]=2;
}
void out_map(int l,int r)
{
cout<<"| ";
for(int i=l; i<=r; i++)
{
cout<<mapname[mp[i]]<<" | ";
}
cout<<"\n";
}
void out_kard(int op)
{
for(int i=1; i<=pl[op].knum; i++)
{
cout<<i<<":"<<kardsname[pl[op].kards[i]]<<" ";
}
cout<<"\n";
}
void cls()
{
system("cls");
for(int i=1; i<=5; i++)
{
cout<<"\n";
}
}
int main()
{
init();
while(pl[1].hp>0 && pl[2].hp>0)
{
cout<<"p1 trun\n";
out_map(mpl,mpr),out_kard(1);
cin>>action;
while(action!=-1)
{
if(action>pl[1].knum)
{
cout<<"wrong kard\n";
cin>>action;
continue;
}
us_kard(1,action);
if(!find_winner())
{
return 0;
}
if(!pl[1].knum)
{
break;
}
out_map(mpl,mpr),out_kard(1);
cin>>action;
}
cls();
cout<<"p2 trun\n";
out_map(mpl,mpr),out_kard(2);
cin>>action;
while(action!=-1)
{
if(action>pl[2].knum)
{
cout<<"wrong kard\n";
cin>>action;
continue;
}
us_kard(2,action);
if(!find_winner())
{
return 0;
}
if(!pl[2].knum)
{
break;
}
out_map(mpl,mpr),out_kard(2);
cin>>action;
}
cls();
give_kard(1,min(2,max(0,10-pl[1].knum)));
give_kard(2,min(2,max(0,10-pl[2].knum)));
}
return 0;
}
1.1版本,增加稀有度。新卡牌:洗牌。
#include<bits/stdc++.h>
#define IT set<Node>::iterator
#define mpl pl[1].wz
#define mpr pl[2].wz
using namespace std;
const int kardstot=4;
const int MP_MAX=100000,MP_MIN=1;
string orkards[]={"","前进","后退","攻击","洗牌"};
int aknum[]={0,4,4,3,2};
int kardsnum;
string kardsname[10000005]={""};
string mapname[]={"","p1","p2","空地","焦土"};
struct Player
{
int hp,wz,knum;
int kards[100005];
} pl[3];
int action;//用于判断行为
int mp[100005];
mt19937 rng(time(0));
int rand(int l,int r)
{
return rng()%(r-l+1)+l;
}
bool find_winner()
{
if(pl[1].hp<=0)
{
cout<<"p2 win!\n";
return false;
}
if(pl[2].hp<=0)
{
cout<<"p1 win!\n";
return false;
}
return true;
}
void give_kard(int op,int num)
{
for(int i=1; i<=num; i++)
{
pl[op].kards[++pl[op].knum]=rand(1,kardsnum);
}
sort(pl[op].kards+1,pl[op].kards+pl[op].knum+1);
}
void qianjin(int op)
{
if(pl[1].wz==pl[2].wz-1)
{
return;
}
if(op==1)
{
mp[pl[1].wz]=0;
pl[1].wz++;
mp[pl[1].wz]=1;
}
else
{
mp[pl[2].wz]=0;
pl[2].wz--;
mp[pl[2].wz]=2;
}
}
void houtui(int op)
{
if(op==1)
{
if(pl[1].wz==MP_MIN)
{
if(pl[2].wz!=MP_MAX)
{
houtui(2);
}
return;
}
mp[pl[1].wz]=3;
pl[1].wz--;
mp[pl[1].wz]=1;
}
else
{
if(pl[2].wz==MP_MAX)
{
if(pl[1].wz!=MP_MIN)
{
houtui(2);
}
return;
}
mp[pl[2].wz]=3;
pl[2].wz++;
mp[pl[2].wz]=2;
}
}
void kill(int op,int killnum)
{
if(op==1)
{
int nxt=pl[1].wz+1;
if(mp[nxt]==2)
{
pl[2].hp-=killnum;
cout<<"p2 hp:"<<pl[2].hp<<"\n";
}
else if(mp[nxt]==3)
{
if(killnum<=2)
{
mp[nxt]=4;
}
else
{
qianjin(op);
}
}
else if(mp[nxt])
{
qianjin(op);
}
}
else
{
int nxt=pl[2].wz-1;
if(mp[nxt]==1)
{
pl[1].hp-=killnum;
cout<<"p1 hp:"<<pl[1].hp<<"\n";
}
else if(mp[nxt]==3)
{
if(killnum<=2)
{
mp[nxt]=4;
}
else
{
qianjin(op);
}
}
else if(mp[nxt])
{
qianjin(op);
}
}
}
void pop_kard(int op,int kid)
{
swap(pl[op].kards[pl[op].knum],pl[op].kards[kid]);
pl[op].kards[kid]=0;
pl[op].knum--;
sort(pl[op].kards+1,pl[op].kards+pl[op].knum+1);
}
void xipai(int op)
{
int ornum=pl[op].knum;
while(pl[op].knum)
{
pop_kard(op,rand(1,pl[op].knum));
}
give_kard(op,ornum);
}
void us_kard(int op,int kid)
{
if(kardsname[pl[op].kards[kid]]=="前进")
{
qianjin(op);
}
else if(kardsname[pl[op].kards[kid]]=="后退")
{
houtui(op);
}
else if(kardsname[pl[op].kards[kid]]=="攻击")
{
kill(op,2);
}
else if(kardsname[pl[op].kards[kid]]=="洗牌")
{
xipai(op);
}
pl[op].kards[kid]=1e8;
sort(pl[op].kards+1,pl[op].kards+pl[op].knum+1);
pl[op].knum--;
}
void init()
{
for(int i=1;i<=kardstot;i++)
{
for(int j=1;j<=aknum[i];j++)
{
kardsname[++kardsnum]=orkards[i];
}
}
pl[1].hp=pl[2].hp=10;
give_kard(1,5),give_kard(2,5);
pl[1].wz=1,pl[2].wz=5;
mp[1]=1,mp[2]=mp[3]=mp[4]=3,mp[5]=2;
}
void out_map(int l,int r)
{
cout<<"| ";
for(int i=l; i<=r; i++)
{
cout<<mapname[mp[i]]<<" | ";
}
cout<<"\n";
}
void out_kard(int op)
{
for(int i=1; i<=pl[op].knum; i++)
{
cout<<i<<":"<<kardsname[pl[op].kards[i]]<<" ";
}
cout<<"\n";
}
int main()
{
init();
while(pl[1].hp>0 && pl[2].hp>0)
{
cout<<"p1 trun\n";
out_map(mpl,mpr),out_kard(1);
cin>>action;
while(action!=-1)
{
if(action>pl[1].knum)
{
cout<<"wrong kard\n";
cin>>action;
continue;
}
us_kard(1,action);
if(!find_winner())
{
return 0;
}
if(!pl[1].knum)
{
break;
}
out_map(mpl,mpr),out_kard(1);
cin>>action;
}
cout<<"p2 trun\n";
out_map(mpl,mpr),out_kard(2);
cin>>action;
while(action!=-1)
{
if(action>pl[2].knum)
{
cout<<"wrong kard\n";
cin>>action;
continue;
}
us_kard(2,action);
if(!find_winner())
{
return 0;
}
if(!pl[2].knum)
{
break;
}
out_map(mpl,mpr),out_kard(2);
cin>>action;
}
give_kard(1,2),give_kard(2,2);
}
return 0;
}
1.0版本,实现前进,后退,攻击。
#include<bits/stdc++.h>
#define IT set<Node>::iterator
#define mpl pl[1].wz
#define mpr pl[2].wz
using namespace std;
const int kardsnum=3;
const int MP_MAX=100000,MP_MIN=1;
string kardsname[]= {"","前进","后退","攻击"};
string mapname[]={"","p1","p2","空地","焦土"};
struct Player
{
int hp,wz,knum;
int kards[100005];
} pl[3];
int action;//用于判断行为
int mp[100005];
mt19937 rng(time(0));
int rand(int l,int r)
{
return rng()%(r-l+1)+l;
}
bool find_winner()
{
if(pl[1].hp<=0)
{
cout<<"p2 win!\n";
return false;
}
if(pl[2].hp<=0)
{
cout<<"p1 win!\n";
return false;
}
return true;
}
void give_kard(int op,int num)
{
for(int i=1; i<=num; i++)
{
pl[op].kards[++pl[op].knum]=rand(1,kardsnum);
}
sort(pl[op].kards+1,pl[op].kards+pl[op].knum+1);
}
void qianjin(int op)
{
if(pl[1].wz==pl[2].wz-1)
{
return;
}
if(op==1)
{
mp[pl[1].wz]=0;
pl[1].wz++;
mp[pl[1].wz]=1;
}
else
{
mp[pl[2].wz]=0;
pl[2].wz--;
mp[pl[2].wz]=2;
}
}
void houtui(int op)
{
if(op==1)
{
if(pl[1].wz==MP_MIN)
{
if(pl[2].wz!=MP_MAX)
{
houtui(2);
}
return;
}
mp[pl[1].wz]=3;
pl[1].wz--;
mp[pl[1].wz]=1;
}
else
{
if(pl[2].wz==MP_MAX)
{
if(pl[1].wz!=MP_MIN)
{
houtui(2);
}
return;
}
mp[pl[2].wz]=3;
pl[2].wz++;
mp[pl[2].wz]=2;
}
}
void kill(int op,int killnum)
{
if(op==1)
{
int nxt=pl[1].wz+1;
if(mp[nxt]==2)
{
pl[2].hp-=killnum;
cout<<"p2 hp:"<<pl[2].hp<<"\n";
}
else if(mp[nxt]==3)
{
if(killnum<=2)
{
mp[nxt]=4;
}
else
{
qianjin(op);
}
}
else if(mp[nxt])
{
qianjin(op);
}
}
else
{
int nxt=pl[2].wz-1;
if(mp[nxt]==1)
{
pl[1].hp-=killnum;
cout<<"p1 hp:"<<pl[1].hp<<"\n";
}
else if(mp[nxt]==3)
{
if(killnum<=2)
{
mp[nxt]=4;
}
else
{
qianjin(op);
}
}
else if(mp[nxt])
{
qianjin(op);
}
}
}
void us_kard(int op,int kid)
{
if(kardsname[pl[op].kards[kid]]=="前进")
{
qianjin(op);
}
else if(kardsname[pl[op].kards[kid]]=="后退")
{
houtui(op);
}
else if(kardsname[pl[op].kards[kid]]=="攻击")
{
kill(op,2);
}
pl[op].kards[kid]=1e8;
sort(pl[op].kards+1,pl[op].kards+pl[op].knum+1);
pl[op].knum--;
}
void init()
{
pl[1].hp=pl[2].hp=10;
give_kard(1,5),give_kard(2,5);
pl[1].wz=1,pl[2].wz=5;
mp[1]=1,mp[2]=mp[3]=mp[4]=3,mp[5]=2;
}
void out_map(int l,int r)
{
cout<<"| ";
for(int i=l; i<=r; i++)
{
cout<<mapname[mp[i]]<<" | ";
}
cout<<"\n";
}
void out_kard(int op)
{
for(int i=1; i<=pl[op].knum; i++)
{
cout<<i<<":"<<kardsname[pl[op].kards[i]]<<" ";
}
cout<<"\n";
}
int main()
{
init();
while(pl[1].hp>0 && pl[2].hp>0)
{
cout<<"p1 trun\n";
out_map(mpl,mpr),out_kard(1);
cin>>action;
while(action!=-1)
{
if(action>pl[1].knum)
{
cout<<"wrong kard\n";
cin>>action;
continue;
}
us_kard(1,action);
if(!find_winner())
{
return 0;
}
if(!pl[1].knum)
{
break;
}
out_map(mpl,mpr),out_kard(1);
cin>>action;
}
cout<<"p2 trun\n";
out_map(mpl,mpr),out_kard(2);
cin>>action;
while(action!=-1)
{
if(action>pl[2].knum)
{
cout<<"wrong kard\n";
cin>>action;
continue;
}
us_kard(2,action);
if(!find_winner())
{
return 0;
}
if(!pl[2].knum)
{
break;
}
out_map(mpl,mpr),out_kard(2);
cin>>action;
}
give_kard(1,2),give_kard(2,2);
}
return 0;
}