#include <iostream>
#include <cstdio>
#include <map>
#include <cstdlib>
#include <ctime>
#include <cmath>
#define random(x) rand()%(x)
using namespace std;
struct node{
int cs,hp,num,last,next;
char id;
map <char,int> card;
int weapon;
bool atc_hor;
bool def_hor;
bool lbs;
bool blc;
node(){
this->card['A'] = 0;
this->card['D'] = 0;
this->card['P'] = 0;
this->card['W'] = 0;
this->card['Y'] = 0;
this->card['C'] = 0;
this->card['S'] = 0;
this->card['M'] = 0;
this->card['J'] = 0;
this->card['B'] = 0;
this->card['I'] = 0;
this->card['F'] = 0;
this->card['T'] = 0;
this->card['Z'] = 0;
this->card['G'] = 0;
this->card['+'] = 0;
this->card['-'] = 0;
}
}a[20];
char kpd[2010],sss[10];char c[21] = "ADPWYCSMJBIFZG+-",cp[50]="AAAAADDDPPWWYCCSSMMJJBIFFTZG++--";
int n,m=1000,fz,now;
bool ed,live[20];
void mp(int x){
if(!m) m++;
a[x].card[kpd[m]]++;
m--;
}
char ask(){
char c1;
cin >> c1;
return c1;
}
int siz(int x1){
int s;
for(int i = 0;i < 17;i++){
s += a[x1].card[c[i]];
}
return s;
}
void pc(int x1){
for(int i = 0;i < 17;i++){
for(int j = 0;j < a[x1].card[c[i]];j++){
cout << c[i] << " ";
}
}
cout << "\n";
}
void kill(int x1,int x2){
cout << x1 <<"号玩家使"<< x2 << "号玩家进入濒死状态\n";
for(int i = 1;i <= n;i++){
cout <<"@"<< i <<"\n你愿意救" << x2 << "号玩家吗?\n";
if(ask()=='y'&&a[i].card['P']){
a[i].card['P']--;
a[x2].hp++;
cout << i << "号玩家救了" << x2 << "号玩家\n";
return;
}
}
cout << x2 << "号玩家死亡\n";
cout << x2 <<"号玩家的真实身份是" << a[x2].id<<"\n";
a[a[x2].next].last=a[x2].last;
a[a[x2].last].next=a[x2].next;
if(x2==1){ed=true ; cout << "反贼赢了\n" ; return; }
if(a[x2].id=='F') fz--;
if(!fz) {ed=true ; cout << "主公赢了\n" ; return;}
if(a[x2].id=='F') mp(x1),mp(x1),mp(x1);
if(a[x2].id=='Z' && a[x1].id=='M') a[x1].cs=0,a[x1].weapon=0;
}
void atc(int x1,int x2){
cout << x1 <<"号玩家杀了" <<x2 <<"号玩家\n";
if(a[x2].card['D']){
pc(x2);
cout <<"@"<< x2 << "\n你要不要出闪?\n" ;
if(ask() == 'y'){
cout<<x2<<"号玩家出了闪\n";
a[x2].card['D']--;
if(a[x1].weapon == 2){
cout<<"@"<<x1<<"\n你要不要使用贯石斧?\n";
if(ask()=='y'){
pc(x1);
for(int i = 0;i < 2;i++){
char ans = ask();
if(a[x1].card[ans]){
a[x1].card[ans]--;
}
}
cout << x2 << "号玩家扣一滴血\n";
a[x2].hp--;
if(!a[x2].hp) kill(x1,x2);
}
}
return;
}
}
cout << x2 << "号玩家没有出闪\n";
a[x2].hp--;
if(!a[x2].hp) kill(x1,x2);
}
bool wxkj(int x1,int x2){
int i = x1;
while(1){
if(a[i].card['W']){
pc(i);
cout << "@"<<i<<"\n你要不要帮助"<<x2<<"号玩家对抗"<<x1<<"号玩家出无懈可击?\n";
if(ask()=='y'){
a[i].card['W']--;
cout << i << "号玩家使用了无懈可击\n";
return !wxkj(i,x1);
}
}
i=a[i].next;
if(i==x1) break;
}
return 0;
}
void wzsy(int x1){
cout << x1<<"号玩家使用了无中生有\n";
if(wxkj(x1,0)) return;
mp(x1);mp(x1);
cout << "使用完毕\n";
}
void ghcq(int x1,int x2){
cout << x1 <<"号玩家对" << x2 << "号玩家使用了过河拆桥\n";
if(wxkj(x1,x2)) return;
srand((int)time(0));
int r;
r = random(siz(x2));
for(int i = 0;i < 17;i++){
r-=a[x2].card[c[i]];
if(r <= 0){
a[x2].card[c[i]]--;
a[x1].card[c[i]]++;
cout << "被拆掉了"<<c[i]<< "\n";
return;
}
}
}
void ssqy(int x1,int x2){
cout << x1 <<"号玩家对" << x2 << "号玩家使用了顺手牵羊\n";
if(wxkj(x1,x2)) return;
srand((int)time(0));
int r;
r = random(siz(x2));
for(int i = 0;i < 17;i++){
r-=a[x2].card[c[i]];
if(r <= 0){
a[x2].card[c[i]]--;
a[x1].card[c[i]]++;
cout << "被顺走了"<<c[i]<< "\n";
return;
}
}
}
void nmrq(int x1){
cout << x1 <<"号玩家使用了南蛮入侵\n";
for(int x2=a[x1].next;x2!=x1;x2=a[x2].next){
if(!wxkj(x1,x2)){
pc(x2);
cout<<"@" << x2<< "你要不要出杀?\n";
if(ask()=='y'&&a[x2].card['A']){
a[x2].card['A']--;
cout << x2 <<"号玩家出了杀\n";
}
else{
a[x2].hp--;
cout << x2 <<"号玩家没有出杀\n";
if(!a[x2].hp) kill(x1,x2);
}
}
}
}
void wjqf(int x1){
cout << x1 <<"号玩家使用了万箭齐发\n";
for(int x2=a[x1].next;x2!=x1;x2=a[x2].next){
if(!wxkj(x1,x2)){
pc(x2);
cout<<"@" << x2<< "你要不要出闪?\n";
if(ask()=='y'&&a[x2].card['D']){
a[x2].card['D']--;
cout << x2 <<"号玩家出了闪\n";
}
else{
a[x2].hp--;
cout << x2 <<"号玩家没有出闪\n";
}
}
}
}
bool lbss(int x1){
cout << x1 << "号玩家的乐不思蜀开始判定\n";
int rl = random(4);
if(rl == 1) {
cout << "第一张牌是红桃\n";
return 0;
}
cout << "第一张牌是"<<(rl==2?"黑桃":rl==3?"梅花":"方块")<<"\n";
return 1;
}
bool blcd(int x1){
cout << x1 << "号玩家的兵粮寸断";
cout << "开始判定\n";
int rl = random(4);
if(rl == 1) {
cout << "第一张牌是梅花\n";
return 0;
}
cout << "第一张牌是"<<(rl==2?"黑桃":rl==3?"红桃":"方块")<<"\n";
return 1;
}
void jd(int x1,int x2){
int t;
cout << x1 <<"号玩家对" << x2 << "号玩家使用了决斗\n";
if(wxkj(x1,x2)) return;
for(;;t = x1,x1 = x2,x2 = t){
pc(x2);
cout<<"@" << x2<< "你要不要出杀?\n";
if(ask()=='y'&&a[x2].card['A']){
a[x2].card['A']--;
cout << x2 << "号玩家出了杀\n";
}
else{
a[x2].hp--;
cout << x2 << "号玩家没出杀" << "\n";
if(!a[x2].hp) kill(x1,x2);
return;
}
}
}
void tyjy(int x1){
cout << x1 <<"号玩家使用了桃园结义\n";
if(wxkj(x1,0)) return;
for(int i = x1;i != x1;i = a[i].next){
if(a[x1].hp < 4){
a[x1].card['P']--;
a[x1].hp++;
cout << x1 <<"号玩家回了一滴血\n";
}
else{
cout << "满血\n" ;
}
}
}
void hh(int x1){
bool play=1,draw=1;
cout << "回合开始\n";
cout << "进入判定阶段\n";
if(a[x1].lbs&&lbss(x1)) play = 0;
a[x1].lbs = 0;
if(a[x1].blc&&blcd(x1)) draw = 0;
a[x1].blc = 0;
if(draw){
cout << "进入摸牌阶段\n";
mp(x1);mp(x1);
}
else{
cout << "跳过摸牌阶段\n";
}
if(play){
cout << "进入出牌阶段\n";
bool atcn =1;
for(;;){
cout << "@" << x1 <<"\n你想出什么牌";
char ans = ask();cout << "\n";
if(ed) return;
if(ans == 'N') break;
if(ans == 'A'&&a[x1].card['A']&&(atcn==1||a[x1].weapon==1)){
cout << atcn;
a[x1].card['A']--;
ans = ask();ans-='0';
if(abs(ans-x1)+a[ans].atc_hor-a[x1].def_hor<=1||
(x1==1&&ans==n&&(a[ans].atc_hor==0||a[ans].def_hor==1))||
(x1==n&&ans==1&&(a[ans].atc_hor==0||a[ans].def_hor==1))){
atc(x1,ans);
atcn = 0;
}
else{
a[x1].card['A']++;
cout << "打不到";
}
}
if(ans == 'P'&&a[x1].card['P']){
if(a[x1].hp < 4){
a[x1].card['P']--;
a[x1].hp++;
cout << x1 <<"号玩家使用了桃\n";
}
else{
cout << "你满血\n" ;
}
}
if(ans == 'Y'&&a[x1].card['Y']){
a[x1].card['Y']--;
wzsy(x1);
}
if(ans == 'C'&&a[x1].card['C']){
a[x1].card['C']--;
ghcq(x1,ask()-'0');
}
if(ans == 'S'&&a[x1].card['S']){
a[x1].card['S']--;
ans = ask() - '0';
if(abs(ans-x1)+a[ans].atc_hor-a[x1].def_hor<=1||
(x1==1&&ans==n&&(a[ans].atc_hor==0||a[ans].def_hor==1))||
(x1==n&&ans==1&&(a[ans].atc_hor==0||a[ans].def_hor==1))){
ssqy(x1,ans);
}
else{
a[x1].card['S']++;
}
}
if(ans == 'M'&&a[x1].card['M']){
a[x1].card['M']--;
nmrq(x1);
}
if(ans == 'J'&&a[x1].card['J']){
a[x1].card['J']--;
wjqf(x1);
}
if(ans == 'B'&&a[x1].card['B']){
a[x1].card['B']--;
ans = ask() - '0';
if(abs(ans-x1)+a[ans].atc_hor-a[x1].def_hor<=1||
(x1==1&&ans==n&&(a[ans].atc_hor==0||a[ans].def_hor==1))||
(x1==n&&ans==1&&(a[ans].atc_hor==0||a[ans].def_hor==1))){
a[(int)ans].lbs = 1;
cout << x1 << "号玩家对" << (int)ans <<"号玩家使用了乐不思蜀\n";
}
else{
a[x1].card['B']++;
}
}
if(ans == 'I'&&a[x1].card['I']){
a[x1].card['I']--;
ans = ask() - '0';
if(abs(ans-x1)+a[ans].atc_hor-a[x1].def_hor<=1||
(x1==1&&ans==n&&(a[ans].atc_hor==0||a[ans].def_hor==1))||
(x1==n&&ans==1&&(a[ans].atc_hor==0||a[ans].def_hor==1))){
a[(int)ans].blc = 1;
cout << x1 << "号玩家对" << (int)ans <<"号玩家使用了兵粮寸断\n";
}
else{
a[x1].card['I']++;
}
}
if(ans == 'F'&&a[x1].card['F']){
a[x1].card['F']--;
jd(x1,ask()-'0');
}
if(ans == 'Z'&&a[x1].card['Z']){
a[x1].card['Z']--;
a[x1].weapon = 1 ;
cout << x1 <<"号玩家装备了诸葛连弩\n";
}
if(ans == 'G'&&a[x1].card['G']){
a[x1].card['G']--;
a[x1].weapon = 2;
cout << x1 <<"号玩家装备了贯石斧\n";
}
if(ans == '+'&&a[x1].card['+']){
a[x1].card['+']--;
a[x1].atc_hor=1;
cout << x1 <<"号玩家装备了+1马\n";
}
if(ans == '-'&&a[x1].card['-']){
a[x1].card['-']--;
a[x1].def_hor=1;
cout << x1 <<"号玩家装备了-1马\n";
}
if(ans == 'L'){
if(x1 == ans = ask()){
pc(x1);
}
else{
cout << ans << "号玩家有" << siz(ans)<<"张牌";
}
}
if (ans == 'H'){
ans = ask() - '0';
cout << ans <<"号玩家的血量为"<< a[ans].hp << "\n";
}
}
}
else{
cout << "跳过出牌阶段\n";
}
cout << "进入弃牌阶段\n";
if(siz(x1) > a[x1].hp){
pc(x1);
for(int i = 0;i + a[x1].hp <= siz(x1) ;i++){
char ans = ask();
if(a[x1].card[ans]){
a[x1].card[ans]--;
}
}
}
cout << "回合结束\n";
}
void yx(){
for(int i = 1;i;i = a[i].next){
cout <<"@#$";
hh(i);
if(ed) break;
}
}
int main(){
FILE *fin ;
fin = fopen("三国杀.in","rb");
fscanf(fin,"%d",&n);
srand((int)time(0));
for(int i=1;i<=n;i++){
a[i].next = i + 1,a[i].last=i-1;
}
a[n].next=1,a[1].last=n;
for(int i=1;i<=n;i++){
fscanf(fin,"%s",sss);
a[i].id = sss[0];a[i].id=='F'?fz++:fz;
a[i].hp=4;
a[i].weapon=0;
}
for(int i=1;i<=m;i++){
kpd[m-i+1]=cp[random(32)];
}
for(int i = 1;i <= n;i++){
mp(i);mp(i);mp(i);mp(i);;
}
fclose(fin);
yx();
return 0;
}