三国杀的代码
  • 板块灌水区
  • 楼主JustinJQian
  • 当前回复11
  • 已保存回复11
  • 发布时间2022/5/4 10:16
  • 上次更新2023/10/28 02:13:39
查看原帖
三国杀的代码
374523
JustinJQian楼主2022/5/4 10:16
#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;
}

/*
杀A
闪D
桃P
无懈W
无中Y 
拆桥C
顺手S 
南蛮M 
万箭J
乐不B
兵粮I 
决斗F 
诸葛连弩Z
贯石斧G 
退出N
看牌L
生命H*/
2022/5/4 10:16
加载中...