风火林山除张角外部分武将的部分技能已写好,框架是按65张武将搭的(含8神将),可自行填补,也可改用mfc改成带GUI的。通过后续对卡牌的调查发现阴雷包和四张阴雷神将,一将成名2011,2012,2013和部分界限突破武将,以及部分星河璀璨武将以及部分始计篇武将均可扩展。
#include<cmath>
#include<cstdio>
#include<iostream>
#include<ctime>
#include<cstring>
#include<algorithm>
//有可能造成死亡的操作要返回
using namespace std;
#define SK 50
struct WarCard{//武将类型牌
char Name[21];//名称
int Nation;//势力
bool Emperor;//是否有主公技能
int Blood;//血上限
int Skillnumber;//技能数量
int Sex;//性别
int Pack;//所属扩展包
int Number;//编号,见三国杀武将大全
int Rnd;//用于洗牌的随机数
bool Back;//是否翻面
bool Wakeup;//觉醒技是否已经发动
};
WarCard AllWarCard[58]={//全部游戏武将
{"",0,0,0,0,0,0},
{"刘备",1,1,4,2,0,1,1},
{"刘禅",1,1,3,3,0,5,2},
{"曹操",2,1,4,2,0,1,3},
{"曹丕",2,1,3,3,0,4,4},
{"孙权",3,1,4,2,0,1,5},
{"孙策",3,1,4,3,0,5,6},
{"张角",4,1,3,3,0,2,7},
{"董卓",4,1,8,4,0,4,8},
{"袁绍",4,1,4,2,0,3,9},
{"关羽",1,0,4,1,0,1,10},
{"张飞",1,0,4,1,0,1,11},
{"诸葛亮",1,0,3,2,0,1,12},
{"赵云",1,0,4,1,0,1,13},
{"马超",1,0,4,2,0,1,14},
{"黄月英",1,0,3,2,1,1,15},
{"魏延",1,0,4,1,0,2,16},
{"黄忠",1,0,4,1,0,2,17},
{"庞统",1,0,3,2,0,3,18},
{"卧龙诸葛亮",1,0,3,3,0,3,19},
{"祝融",1,0,4,2,1,4,20},
{"孟获",1,0,4,2,0,4,21},
{"姜维",1,0,4,2,0,5,22},
{"徐晃",2,0,4,1,0,4,23},
{"荀彧",2,0,3,2,0,3,24},
{"典韦",2,0,4,1,0,3,25},
{"夏侯惇",2,0,4,1,0,1,26},
{"张辽",2,0,4,1,0,1,27},
{"许褚",2,0,4,1,0,1,28},
{"郭嘉",2,0,3,2,0,1,29},
{"司马懿",2,0,3,2,0,1,30},
{"甄姬",2,0,3,2,1,1,31},
{"张郃",2,0,4,1,0,5,32},
{"邓艾",2,0,4,2,0,5,33},
{"夏侯渊",2,0,4,1,0,2,34},
{"曹仁",2,0,4,1,0,2,35},
{"孙坚",3,0,4,1,0,4,36},
{"鲁肃",3,0,3,2,0,4,37},
{"张昭&张纮",3,0,3,2,0,5,38},
{"陆逊",3,0,3,2,0,1,39},
{"甘宁",3,0,4,1,0,1,40},
{"吕蒙",3,0,4,1,0,1,41},
{"黄盖",3,0,4,1,0,1,42},
{"周瑜",3,0,3,2,0,1,43},
{"大乔",3,0,3,2,1,1,44},
{"孙尚香",3,0,3,2,1,1,45},
{"太史慈",3,0,4,1,0,3,46},
{"周泰",3,0,4,1,0,2,47},
{"小乔",3,0,3,2,1,2,48},
{"于吉",4,0,3,1,0,2,49},
{"贾诩",4,0,3,3,0,4,50},
{"左慈",4,0,3,2,0,5,51},
{"蔡文姬",4,0,3,2,1,5,52},
{"庞德",4,0,4,2,0,3,53},
{"颜良&文丑",4,0,4,1,0,3,54},
{"华佗",4,0,3,2,0,1,55},
{"吕布",4,0,4,1,0,1,56},
{"貂蝉",4,0,3,2,1,1,57},
};
int TotalWarCard=57;//武将牌总数量
WarCard EmperorHeap[31];//主公牌堆
int EmperorNum;//主公牌数量
WarCard UnEmperorHeap[601];//非主公牌堆
int UnEmperorNum;//非主公牌数量
WarCard WarCardHeap[601];//战士牌堆
int WarCardNumber;//战士牌堆数量
WarCard WarriorChoosing[101][30];//英雄选择阶段
int ChoosingNumber[101]={0,2,3,3,3,3,3,3,3,3,3,3,3};//每个人可以选的英雄数量
int OnField[601];
/*
势力 1-蜀 2-魏 3-吴 4-群
是否为主公 1-是 0-不是
血量
技能数
性别 0-男 1-女
类型 1-标准 2-风 3-火 4-林 5-山 6-雷 7-阴 8-神将 9-SP 10-界限突破
11-一将成名2011 12-一将成名2012 13-一将成名2013 14一将成名2014 15-一将成名2015 16-原创2016 17-原创2017
*/
struct GameCard{//游戏类型牌
char Name[11];//名称
int Color;//花色
int Point;//点数
int Function;//功能类型 1-基本牌 2-非延时锦囊牌 3-延时类锦囊 4-装备牌
int Pack;//所属包
int Type;//牌类型,与名称对应
int Number;//每个牌有一个自己的编号1~160(标准+EX+军争)
int Rnd;//用于洗牌的随机数
bool NationBeauty;
bool NoGrain;
};
int MemberNow;
int Aim[101],AimNumber;
struct Damageinfo{
int Attribute;//伤害类型
int Type;//伤害牌种类 1-杀 2-火杀 3-雷杀......
int Number;//伤害值
int Color;//伤害来源牌的颜色
int FromMember;//伤害来源座位号
int FromCardNumber;//伤害来源牌数量 1-普通 2-丈八蛇矛 0-无伤害来源牌
int Card[10];//记录伤害来源牌的编号 1-160
};
GameCard AllGameCard[201]={//全部游戏牌 标准+军争
{"",0,0,0,0},
{"杀",1,10,1,1,1,1},
{"杀",1,10,1,1,1,2},
{"杀",1,11,1,1,1,3},
{"杀",2,6,1,1,1,4},
{"杀",2,7,1,1,1,5},
{"杀",2,8,1,1,1,6},
{"杀",2,9,1,1,1,7},
{"杀",2,10,1,1,1,8},
{"杀",2,13,1,1,1,9},
{"杀",3,7,1,1,1,10},
{"杀",3,8,1,1,1,11},
{"杀",3,8,1,1,1,12},
{"杀",3,9,1,1,1,13},
{"杀",3,9,1,1,1,14},
{"杀",3,10,1,1,1,15},
{"杀",3,10,1,1,1,16},
{"杀",4,2,1,1,1,17},
{"杀",4,3,1,1,1,18},
{"杀",4,4,1,1,1,19},
{"杀",4,5,1,1,1,20},
{"杀",4,6,1,1,1,21},
{"杀",4,7,1,1,1,22},
{"杀",4,8,1,1,1,23},
{"杀",4,8,1,1,1,24},
{"杀",4,9,1,1,1,25},
{"杀",4,9,1,1,1,26},
{"杀",4,10,1,1,1,27},
{"杀",4,10,1,1,1,28},
{"杀",4,11,1,1,1,29},
{"杀",4,11,1,1,1,30},
{"火杀",1,4,1,3,2,31},
{"火杀",1,7,1,3,2,32},
{"火杀",1,10,1,3,2,33},
{"火杀",2,4,1,3,2,34},
{"火杀",2,5,1,3,2,35},
{"雷杀",3,4,1,3,3,36},
{"雷杀",3,5,1,3,3,37},
{"雷杀",3,6,1,3,3,38},
{"雷杀",3,7,1,3,3,39},
{"雷杀",3,8,1,3,3,40},
{"雷杀",4,5,1,3,3,41},
{"雷杀",4,6,1,3,3,42},
{"雷杀",4,7,1,3,3,43},
{"雷杀",4,8,1,3,3,44},
{"闪",1,2,1,1,4,45},
{"闪",1,2,1,1,4,46},
{"闪",1,13,1,1,4,47},
{"闪",2,2,1,1,4,48},
{"闪",2,2,1,1,4,49},
{"闪",2,3,1,1,4,50},
{"闪",2,4,1,1,4,51},
{"闪",2,5,1,1,4,52},
{"闪",2,6,1,1,4,53},
{"闪",2,7,1,1,4,54},
{"闪",2,8,1,1,4,55},
{"闪",2,9,1,1,4,56},
{"闪",2,10,1,1,4,57},
{"闪",2,11,1,1,4,58},
{"闪",2,11,1,1,4,59},
{"闪",1,8,1,3,4,60},
{"闪",1,9,1,3,4,61},
{"闪",1,11,1,3,4,62},
{"闪",1,12,1,3,4,63},
{"闪",2,6,1,3,4,64},
{"闪",2,7,1,3,4,65},
{"闪",2,8,1,3,4,66},
{"闪",2,10,1,3,4,67},
{"闪",2,11,1,3,4,68},
{"桃",1,3,1,1,5,69},
{"桃",1,4,1,1,5,70},
{"桃",1,6,1,1,5,71},
{"桃",1,7,1,1,5,72},
{"桃",1,8,1,1,5,73},
{"桃",1,9,1,1,5,74},
{"桃",1,12,1,1,5,75},
{"桃",2,12,1,1,5,76},
{"桃",1,5,1,3,5,77},
{"桃",1,6,1,3,5,78},
{"桃",2,2,1,3,5,79},
{"桃",2,3,1,3,5,80},
{"酒",2,9,1,3,6,81},
{"酒",3,3,1,3,6,82},
{"酒",3,9,1,3,6,83},
{"酒",4,3,1,3,6,84},
{"酒",4,9,1,3,6,85},
{"过河拆桥",1,12,2,1,7,86},
{"过河拆桥",3,3,2,1,7,87},
{"过河拆桥",3,4,2,1,7,88},
{"过河拆桥",3,12,2,1,7,89},
{"过河拆桥",4,3,2,1,7,90},
{"过河拆桥",4,4,2,1,7,91},
{"顺手牵羊",2,3,2,1,8,92},
{"顺手牵羊",2,4,2,1,8,93},
{"顺手牵羊",3,3,2,1,8,94},
{"顺手牵羊",3,4,2,1,8,95},
{"顺手牵羊",3,11,2,1,8,96},
{"无中生有",1,7,2,1,9,97},
{"无中生有",1,8,2,1,9,98},
{"无中生有",1,9,2,1,9,99},
{"无中生有",1,11,2,1,9,100},
{"决斗",2,1,2,1,10,101},
{"决斗",3,1,2,1,10,102},
{"决斗",4,1,2,1,10,103},
{"借刀杀人",4,12,2,1,11,104},
{"借刀杀人",4,13,2,1,11,105},
{"桃园结义",1,1,2,1,12,106},
{"五谷丰登",1,3,2,1,13,107},
{"五谷丰登",1,4,2,1,13,108},
{"南蛮入侵",3,7,2,1,14,109},
{"南蛮入侵",3,13,2,1,14,110},
{"南蛮入侵",4,7,2,1,14,111},
{"万箭齐发",1,1,2,1,15,112},
{"无懈可击",3,11,2,1,16,113},
{"无懈可击",4,12,2,1,16,114},
{"无懈可击",4,13,2,1,16,115},
{"无懈可击",2,12,2,2,16,116},
{"无懈可击",1,1,2,3,16,117},
{"无懈可击",1,13,2,3,16,118},
{"无懈可击",3,13,2,3,16,119},
{"火攻",1,2,2,3,17,120},
{"火攻",1,3,2,3,17,121},
{"火攻",2,12,2,3,17,122},
{"铁索连环",3,11,2,3,18,123},
{"铁索连环",3,12,2,3,18,124},
{"铁索连环",4,10,2,3,18,125},
{"铁索连环",4,11,2,3,18,126},
{"铁索连环",4,12,2,3,18,127},
{"铁索连环",4,13,2,3,18,128},
{"乐不思蜀",1,6,3,1,19,129},
{"乐不思蜀",3,6,3,1,19,130},
{"乐不思蜀",4,6,3,1,19,131},
{"兵粮寸断",3,10,3,3,20,132},
{"兵粮寸断",4,4,3,3,20,133},
{"闪电",3,1,3,1,21,134},
{"闪电",1,12,3,2,21,135},
{"诸葛连弩",2,1,4,1,22,136},
{"诸葛连弩",4,1,4,1,22,137},
{"青釭剑",3,6,4,1,23,138},
{"雌雄双股剑",3,2,4,1,24,139},
{"贯石斧",2,5,4,1,25,140},
{"青龙偃月刀",3,5,4,1,26,141},
{"丈八蛇矛",3,12,4,1,27,142},
{"方天画戟",2,12,4,1,28,143},
{"麒麟弓",1,5,4,1,29,144},
{"寒冰剑",3,2,4,2,30,145},
{"朱雀羽扇",2,1,4,3,31,146},
{"古锭刀",3,1,4,3,32,147},
{"八卦阵",3,2,5,1,33,148},
{"八卦阵",4,2,5,1,33,149},
{"仁王盾",4,2,5,2,34,150},
{"白银狮子",4,1,5,3,35,151},
{"藤甲",3,2,5,3,36,152},
{"藤甲",4,2,5,3,36,153},
{"爪黄飞电",1,13,6,1,37,154},
{"的卢",4,5,6,1,37,155},
{"绝影",3,5,6,1,37,156},
{"骅骝",2,13,6,3,37,157},
{"赤兔",1,5,7,1,38,158},
{"紫骍",2,13,7,1,38,159},
{"大宛",3,13,7,1,38,160}
};
int TotalGameCard=160;//游戏牌总数量
GameCard GameCardHeap[200];//游戏牌堆
int GameCardNumber;//牌堆数量
GameCard NotSurrender[21];//不屈牌堆
int NotSurrenderNumber;//不屈牌数量
GameCard DiscardHeap[200];//弃牌堆
int DiscardNumber;//弃牌堆牌数量
GameCard TableCard[201];
int TableCardNumber;
int TurnsNumber;//第几轮牌堆
int TotalPeopleNumber;//游戏人数
int DeadPeopleNumber;//死亡人数
GameCard JudgeCard;//判定牌
/*
花色 1-红桃 2-方片 3-黑桃 4-梅花
数字 1~13 2~10-2~10 1-A 11-J 12-Q 13-K
功能 1-基本牌 2-非延时锦囊牌 3-延时锦囊牌 4-武器 5-防具 6-防御马 7-进攻马
牌的类型 1-标准 2-EX 3-军争
*/
struct IdentityCard{//身份类型牌
int Type;
int Rnd;
};
IdentityCard AllIdentityCard[101]={{0},{1}/*1人*/,{4}/*2人*/,{3}/*3人*/,{2}/*4人*/,{4}/*5人*/,{4}/*6人*/,{2}/*7人*/,{4}/*8人*/,{3}/*9人*/,{2}/*10人*/,{4}/*11人*/,{4}/*12人*/,{4}/*13人*/,{4}/*14人*/,{2}/*15人*/,{4}/*16人*/,{4}/*17人*/,{4}/*18人*/,{2}/*19人*/,{4}/*20人*/};//所有身份牌
IdentityCard IdentityCardHeap[101];//身份牌牌堆
/*`
身份 1-主公 2-忠臣 3-内奸 4-反贼
*/
struct Member{//每个玩家的游戏区
GameCard HandCard[161];//手牌
WarCard WarriorCard;//武将牌
int HandCardNumber;//手牌数量
int Identity;//身份
int Nation;//势力
int Sex;//性别
int Aim[101];//第一视角几号位距离
int BloodCeiling;//血量上限
int BloodNow;//当前血量
GameCard Equipment[5];
bool EquipmentExist[5];
GameCard JudgeArea[4];//判定区判定牌
bool JudgeCardExist[4];//某种判定牌是否存在
//1-乐不思蜀 2-兵粮寸断 3-闪电
int JudgeCardNumber;//判定牌数量
int Wine;//1-喝过酒状态解除 2-喝过酒处于醉酒状态 0-还没喝酒
};
bool Dead[101];
int Across[101];
Member Player[101];//取决于玩家数量
int Distance[101][101]={
{},//0人场
{},//1人场
{0,1},//2人场
{0,1,1},//3人场
{0,1,2,1},//4人场
{0,1,2,2,1},//5人场
{0,1,2,3,2,1},//6人场
{0,1,2,3,3,2,1},//7人场
{0,1,2,3,4,3,2,1},//8人场
{0,1,2,3,4,4,3,2,1},//9人场
{0,1,2,3,4,5,4,3,2,1},//10人场
{0,1,2,3,4,5,5,4,3,2,1},//11人场
{0,1,2,3,4,5,6,5,4,3,2,1},//12人场
{0,1,2,3,4,5,6,6,5,4,3,2,1},//13人场
{0,1,2,3,4,5,6,7,6,5,4,3,2,1},//14人场
{0,1,2,3,4,5,6,7,7,6,5,4,3,2,1},//15人场
{0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1},//16人场
{0,1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1},//17人场
{0,1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1},//18人场
{0,1,2,3,4,5,6,7,8,9,9,8,7,6,5,4,3,2,1},//19人场
{0,1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1}//20人场
};
int IdentityNumber[5];
bool naked;//许褚裸衣标记
int skyjustice;//太史慈天义标记
int KillChance;//回合剩余杀次数
int BalanceChance;//孙权--制衡是否还能发动
int SkyJusticeChance;//太史慈--天义剩余次数
int CyanPackChance;//华佗--青囊剩余次数
int NationBeautyChance;//大乔--国色剩余次数
int MarryChance;//孙尚香--结姻剩余次数
int AlienateChance;//貂蝉--离间剩余次数
int ReverseSchemeChance;//周瑜--反间剩余次数
int KindheartednessNumber;//刘备--仁德剩余次数
int YellowSkyChance;//群势力(张角为主公)--剩余黄天次数
int Unreasonablestrike;//典韦--剩余强袭次数
bool JumpJudging;//跳过弃牌阶段标志
bool JumpInCard;//跳过摸牌阶段标志
bool JumpOutCard;//跳过出牌阶段标志
bool JumpDiscard;//跳过弃牌阶段标志
//bool cmp(WarCard u,WarCard v){return u.pack<v.pack;}//按照扩展包排序
bool GameRnd(GameCard u,GameCard v){return u.Rnd<v.Rnd;}//游戏牌洗牌
bool WarRnd(WarCard u,WarCard v){return u.Rnd<v.Rnd;}//武将牌洗牌
bool IdentityRnd(IdentityCard u,IdentityCard v){return u.Rnd<v.Rnd;}//身份牌洗牌
char* nation(int a){//显示所属势力
if(a==1) return "蜀";
if(a==2) return "魏";
if(a==3) return "吴";
if(a==4) return "群";
}
char* emperor(int a){//显示是否为君主
if(a==0) return "不是";
if(a==1) return "是";
}
char* sex(int a){//显示性别
if(a==0) return "男";
if(a==1) return "女";
}
char* whichpack(int a){//显示所属包
if(a==1) return "标准";
if(a==2) return "风";
if(a==3) return "火";
if(a==4) return "林";
if(a==5) return "山";
}
char* color(int a){//显示花色
if(a==1) return "红桃";
if(a==2) return "方块";
if(a==3) return "黑桃";
if(a==4) return "梅花";
}
char* point(int a){//显示点数
if(a==1) return "A";
if(a==2) return "2";
if(a==3) return "3";
if(a==4) return "4";
if(a==5) return "5";
if(a==6) return "6";
if(a==7) return "7";
if(a==8) return "8";
if(a==9) return "9";
if(a==10) return "10";
if(a==11) return "J";
if(a==12) return "Q";
if(a==13) return "K";
}
char* identity(int a){//显示身份
if(a==1) return "主公";
if(a==2) return "忠臣";
if(a==3) return "内奸";
if(a==4) return "反贼";
}
void InitIdentity(){//形成身份牌堆
for(int i=1;i<=TotalPeopleNumber;i++)
IdentityCardHeap[i]=AllIdentityCard[i];
}
void InitStandard(){//形成标准版的武将牌和游戏排
for(int i=1;i<=TotalWarCard;i++)
if(AllWarCard[i].Pack==1) WarCardHeap[++WarCardNumber]=AllWarCard[i];
for(int i=1;i<=TotalGameCard;i++)
if(AllGameCard[i].Pack<=3) GameCardHeap[++GameCardNumber]=AllGameCard[i];
}
void InitMyth(){//形成神话再临的武将牌和游戏排
for(int i=1;i<=TotalWarCard;i++) if(AllWarCard[i].Number==7)
WarCardHeap[++WarCardNumber]=AllWarCard[i];
//for(int i=1;i<=TotalWarCard;i++) if(AllWarCard[i].Pack==2) WarCardHeap[++WarCardNumber]=AllWarCard[i];//风
//for(int i=1;i<=TotalWarCard;i++) if(AllWarCard[i].Pack<=3) WarCardHeap[++WarCardNumber]=AllWarCard[i];//火
//for(int i=1;i<=TotalWarCard;i++) if(AllWarCard[i].Pack<=4) WarCardHeap[++WarCardNumber]=AllWarCard[i];//林
//for(int i=1;i<=TotalWarCard;i++) if(AllWarCard[i].Pack<=5) WarCardHeap[++WarCardNumber]=AllWarCard[i];//山
}
void RndGameCard(){//游戏牌堆洗牌
srand((unsigned int)time(0));
for(int i=1;i<=GameCardNumber;i++) GameCardHeap[i].Rnd=rand();
sort(GameCardHeap+1,GameCardHeap+GameCardNumber+1,GameRnd);
}
void RndWarCard(){//武将牌堆洗牌
srand((unsigned int)time(0));
for(int i=1;i<=WarCardNumber;i++) WarCardHeap[i].Rnd=rand();//赋随机数
sort(WarCardHeap+1,WarCardHeap+WarCardNumber+1,WarRnd);//按照随机数洗武将牌
}
void RndIdentityCard(){//身份牌堆洗牌
srand((unsigned int)time(0));
for(int i=1;i<=TotalPeopleNumber;i++)
IdentityCardHeap[i].Rnd=rand();
sort(IdentityCardHeap+1,IdentityCardHeap+TotalPeopleNumber+1,IdentityRnd);
}
void SetSeatNumber(){//确定身份--确定座次
int i=1;
for(i=1;i<=TotalPeopleNumber;i++)
if(IdentityCardHeap[i].Type==1) break;//确定主公位置
for(int j=1;j<=TotalPeopleNumber;j++){//讲1-n号位的身份确定
Player[j].Identity=IdentityCardHeap[i].Type;
IdentityNumber[IdentityCardHeap[i].Type]++;
if(++i>TotalPeopleNumber) i=1;
}
}
void CalDistance(){//计算所有人之间距离
for(int i=1;i<=TotalPeopleNumber;i++)
if(!Dead[i]){
int id=i;
if(++id>TotalPeopleNumber) id=1;
for(int k=1;k<=TotalPeopleNumber-DeadPeopleNumber-1;k++){
while(Dead[id]){
if(++id>TotalPeopleNumber) id=1;
}
Player[i].Aim[id]=Distance[TotalPeopleNumber-DeadPeopleNumber][k];
if(Player[id].EquipmentExist[3]==true) Player[i].Aim[id]++;
if(Player[i].EquipmentExist[4]==true) Player[i].Aim[id]--;
if(Player[i].WarriorCard.Number==14) Player[i].Aim[id]--;//马超--马术
if(Player[i].WarriorCard.Number==53) Player[i].Aim[id]--;//庞德--马术
//神曹操--飞影
if(++id>TotalPeopleNumber) id=1;
}
}
/*
for(int i=1;i<=TotalPeopleNumber;i++)
{
printf("%d号位\n",i);
for(int j=1;j<=TotalPeopleNumber;j++)
if(i!=j) printf("与%d号位的距离为%d\n",j,Player[i].Aim[j]);
}*/
}
void ShowAllDistance(){//显示每两个人距离
for(int i=1;i<=TotalPeopleNumber;i++)
{
printf("%d号位:",i);
for(int j=1;j<=TotalPeopleNumber;j++)
if(i!=j) printf("与%d号位距离为%d ",j,Player[i].Aim[j]);
printf("\n");
}
}
void ChooseWarrior(){//选择武将
for(int i=1;i<=WarCardNumber;i++){
if(WarCardHeap[i].Emperor==1){
EmperorNum++;
EmperorHeap[EmperorNum]=WarCardHeap[i];
}
else{
UnEmperorNum++;
UnEmperorHeap[UnEmperorNum]=WarCardHeap[i];
}
}
for(int i=1;i<=EmperorNum;i++) WarriorChoosing[1][i]=EmperorHeap[i];
for(int i=1;i<=ChoosingNumber[1];i++) WarriorChoosing[1][EmperorNum+i]=UnEmperorHeap[i];
//WarriorChoosing[1][4]=UnEmperorHeap[1];
//WarriorChoosing[1][5]=UnEmperorHeap[2];
printf("您的身份为主公,%d号位,请在下列武将中选择一位出战\n",1);
for(int i=1;i<=EmperorNum+ChoosingNumber[1];i++){//主公选武将
printf("%d %s\n",i,WarriorChoosing[1][i].Name);
}
int ChooseNumber;
scanf("%d",&ChooseNumber);
printf("您选择的英雄是%s\n",WarriorChoosing[1][ChooseNumber].Name);
OnField[WarriorChoosing[1][ChooseNumber].Number]=1;
Player[1].WarriorCard=WarriorChoosing[1][ChooseNumber];
Player[1].Sex=WarriorChoosing[1][ChooseNumber].Sex;
Player[1].Nation=WarriorChoosing[1][ChooseNumber].Nation;
Player[1].BloodCeiling=WarriorChoosing[1][ChooseNumber].Blood+(TotalPeopleNumber>=5);
Player[1].BloodNow=WarriorChoosing[1][ChooseNumber].Blood+(TotalPeopleNumber>=5);//待改,神甘宁初始体力不等于体力上限
for(int i=1;i<=WarCardNumber;i++)//去除主公选择牌,将其余所有牌重新洗牌
if(WarCardHeap[i].Number==WarriorChoosing[1][ChooseNumber].Number){
if(i!=WarCardNumber) swap(WarCardHeap[i],WarCardHeap[WarCardNumber]);
WarCardNumber--;
break;
}
RndWarCard();
for(int i=2;i<=TotalPeopleNumber;i++)//2号位以后每人选三张牌
for(int j=1;j<=ChoosingNumber[i];j++)
WarriorChoosing[i][j]=WarCardHeap[WarCardNumber--];
for(int i=2;i<=TotalPeopleNumber;i++){//2-n号位选择武将
printf("您的身份为%s,%d号位,请在下列武将中选择一位出战\n",identity(Player[i].Identity),i);
for(int j=1;j<=ChoosingNumber[i];j++) printf("%d %s\n",j,WarriorChoosing[i][j].Name);//打印三位武将信息
scanf("%d",&ChooseNumber);
printf("您选择的英雄是%s\n",WarriorChoosing[i][ChooseNumber].Name);
OnField[WarriorChoosing[i][ChooseNumber].Number]=i;
Player[i].WarriorCard=WarriorChoosing[i][ChooseNumber];
Player[i].Sex=WarriorChoosing[i][ChooseNumber].Sex;
Player[i].Nation=WarriorChoosing[i][ChooseNumber].Nation;
Player[i].BloodCeiling=WarriorChoosing[i][ChooseNumber].Blood;
Player[i].BloodNow=WarriorChoosing[i][ChooseNumber].Blood;
for(int j=1;j<=ChoosingNumber[i];j++)
if(j!=ChooseNumber) WarCardHeap[++WarCardNumber]=WarriorChoosing[i][j];
}
RndWarCard();//给左慈准备的
}
void WashGameCard(){//洗游戏牌
TurnsNumber++;
while(DiscardNumber) GameCardHeap[++GameCardNumber]=DiscardHeap[DiscardNumber--];
RndGameCard();
}
GameCard TakeOneGameCard(){//从牌堆顶取一张牌
GameCard TopCard=GameCardHeap[GameCardNumber--];
if(GameCardNumber==0) WashGameCard();
return TopCard;
}
void GiveGameCardTo(int SeatNumber,int T){//给某人T张牌
while(T--) Player[SeatNumber].HandCard[++Player[SeatNumber].HandCardNumber]=TakeOneGameCard();
}
void OwletGirl(int SeatNumber){//孙尚香--枭姬
GiveGameCardTo(SeatNumber,2);
}
void InitialCard(){//初始发一人四张牌
TurnsNumber=1;
for(int i=1;i<=TotalPeopleNumber;i++) GiveGameCardTo(i,4);
}
void ShowOneGameCard(GameCard Card){//显示一张游戏牌 名称 花色 点数
printf("%s %s%s\n",Card.Name,color(Card.Color),point(Card.Point));
}
void ShowOnesHandCard(int SeatNumber){//显示某人全部的手牌
printf("%d-%s\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("手牌:\n");
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++){
printf("%d-",i);
ShowOneGameCard(Player[SeatNumber].HandCard[i]);//打印手牌--一张一行
}
}
void ShowOnesRedHandCard(int SeatNumber){//显示某人所有的红色手牌
printf("%d-%s\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("红色手牌:\n");
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++){
GameCard Card=Player[SeatNumber].HandCard[i];
if(Card.Color<=2){
printf("%d-",i);
ShowOneGameCard(Card);
}
}
}
void ShowOnesPlumHandCard(int SeatNumber){//显示某人所有的梅花手牌
printf("%d-%s\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("梅花手牌:\n");
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++){
GameCard Card=Player[SeatNumber].HandCard[i];
if(Card.Color==4){
printf("%d-",i);
ShowOneGameCard(Card);
}
}
}
void ShowOnesBlackHandCard(int SeatNumber){//显示某人所有的黑色手牌
printf("%d-%s\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("黑色手牌:\n");
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++){
GameCard Card=Player[SeatNumber].HandCard[i];
if(Card.Color>=3){
printf("%d-",i);
ShowOneGameCard(Card);//一张一行
}
}
}
void ShowOnesAllCard(int SeatNumber){//显示某人全部的牌 装备牌+手牌
ShowOnesHandCard(SeatNumber);
printf("装备牌:\n");
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]==1){//显示所有装备牌
printf("%d-",i+Player[SeatNumber].HandCardNumber);
ShowOneGameCard(Player[SeatNumber].Equipment[i]);
}
}
void ShowOnesAllRedCard(int SeatNumber){//显示某人全部的红色牌 装备牌+手牌
printf("%d-%s\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("红色手牌:\n");
int Number=Player[SeatNumber].HandCardNumber;
for(int i=1;i<=Number;i++)
if(Player[i].HandCard[i].Color<=2){//显示所有红色手牌
printf("%d-",i);
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
printf("红色装备牌:\n");
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]==1)
if(Player[SeatNumber].Equipment[i].Color<=2){//显示红色装备牌
printf("%d-",i+Number);
ShowOneGameCard(Player[SeatNumber].Equipment[i]);
}
}
void ShowOnesAllSquareCard(int SeatNumber){//显示某人全部的方块牌 装备牌+手牌
printf("%d-%s\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("方块手牌:\n");
int Number=Player[SeatNumber].HandCardNumber;
for(int i=1;i<=Number;i++)
if(Player[SeatNumber].HandCard[i].Color==2){//显示所有方块手牌
printf("%d-",i);
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
printf("方块装备牌:\n");
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]==1)
if(Player[SeatNumber].Equipment[i].Color==2){//显示方块装备牌
printf("%d-",i+Number);
ShowOneGameCard(Player[SeatNumber].Equipment[i]);
}
}
void ShowOnesAllPlumCard(int SeatNumber){//显示某人全部的梅花牌 装备牌+手牌
printf("%d-%s\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("梅花手牌:\n");
int Number=Player[SeatNumber].HandCardNumber;
for(int i=1;i<=Number;i++)
if(Player[i].HandCard[i].Color==4){//显示所有方块手牌
printf("%d-",i);
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
printf("梅花装备牌:\n");
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]==1)
if(Player[SeatNumber].Equipment[i].Color==4){//显示方块装备牌
printf("%d-",i+Number);
ShowOneGameCard(Player[SeatNumber].Equipment[i]);
}
}
void ShowOnesAllBlackCard(int SeatNumber){//显示某人全部的黑色牌 装备牌+手牌
printf("%d-%s\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("黑色手牌:\n");
int Number=Player[SeatNumber].HandCardNumber;
for(int i=1;i<=Number;i++)
if(Player[SeatNumber].HandCard[i].Color>=3){//显示所有黑色手牌
printf("%d-",i);
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
printf("黑色装备牌:\n");
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]==1)
if(Player[SeatNumber].Equipment[i].Color>=3){//显示黑色装备牌
printf("%d-",i+Number);
ShowOneGameCard(Player[SeatNumber].Equipment[i]);
}
}
void ShowOnesHandCardBack(int SeatNumber){//显示所有手牌的背面
printf("%d-%s\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("手牌背面:\n");
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++)
printf("%d-第%d张牌\n",i,i);
}
void ShowOnesAllCardBack(int SeatNumber){//显示所有手牌背面 装备牌+手牌
printf("%d-%s\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("手牌背面:\n");
int Number=Player[SeatNumber].HandCardNumber;
for(int i=1;i<=Number;i++) printf("%d-第%d张牌\n",i,i);
printf("装备牌:\n");
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]==1){//显示装备牌
printf("%d-",i+Number);
ShowOneGameCard(Player[SeatNumber].Equipment[i]);
}
}
void ShowOnesAllCardBackAndJudgeCard(int SeatNumber){//显示所有手牌背面+装备牌+判定牌
printf("%d-%s\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("手牌背面:\n");
int Number=Player[SeatNumber].HandCardNumber;
for(int i=1;i<=Number;i++) printf("%d-第%d张牌\n",i,i);
printf("装备牌:\n");
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]==1){
printf("%d-",i+Number);
ShowOneGameCard(Player[SeatNumber].Equipment[i]);
}
printf("判定牌:\n");
for(int i=1;i<=Player[SeatNumber].JudgeCardNumber;i++){
printf("%d-",i+Number+4);
if(Player[SeatNumber].JudgeArea[i].NationBeauty==1) printf("(国色)");
if(Player[SeatNumber].JudgeArea[i].NoGrain==1) printf("(断粮)");
ShowOneGameCard(Player[SeatNumber].JudgeArea[i]);
}
}
void ShowOnesAllCardAndJudgeCard(int SeatNumber){//显示所有手牌+装备牌+判定牌
ShowOnesHandCard(SeatNumber);
printf("装备牌:\n");
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]==1){
printf("%d-",i+Player[SeatNumber].HandCardNumber);
ShowOneGameCard(Player[SeatNumber].Equipment[i]);
}
printf("判定牌:\n");
for(int i=1;i<=Player[SeatNumber].JudgeCardNumber;i++){
printf("%d-",i+Player[SeatNumber].HandCardNumber+4);
if(Player[SeatNumber].JudgeArea[i].NationBeauty==1) printf("(国色)");
if(Player[SeatNumber].JudgeArea[i].NoGrain==1) printf("(断粮)");
ShowOneGameCard(Player[SeatNumber].JudgeArea[i]);
}
}
int AllCardNumber(int SeatNumber){//统计一个人所有的牌数量
int Number=Player[SeatNumber].HandCardNumber;
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]==1) Number++;
return Number;
}
void ClearTable(){//回收桌面卡牌
while(TableCardNumber){
TableCard[TableCardNumber].NoGrain=0;
TableCard[TableCardNumber].NationBeauty=0;
DiscardHeap[++DiscardNumber]=TableCard[TableCardNumber--];
}
}
int AttackScope(int SeatNumber){//计算攻击距离
int Scope=1;//基础攻击距离
int WeaponType=0;
if(Player[SeatNumber].EquipmentExist[1]==1){
WeaponType=Player[SeatNumber].Equipment[1].Type;
if(WeaponType==22) Scope=1;//诸葛连弩
if(WeaponType==23) Scope=2;//青釭剑
if(WeaponType==24) Scope=2;//雌雄双股剑
if(WeaponType==25) Scope=3;//贯石斧
if(WeaponType==26) Scope=3;//青龙偃月刀
if(WeaponType==27) Scope=3;//丈八蛇矛
if(WeaponType==28) Scope=4;//方天画戟
if(WeaponType==29) Scope=5;//麒麟弓
if(WeaponType==30) Scope=2;//寒冰剑
if(WeaponType==31) Scope=4;//朱雀羽扇
if(WeaponType==32) Scope=2;//古锭刀
}
return Scope;
}
void FireCamp(int SeatNumber){//陆逊--连营
if(Player[SeatNumber].HandCardNumber==0){
printf("触发连营\n");
GiveGameCardTo(SeatNumber,1);
}
}
GameCard OnesCard(int SeatNumber,int Option){//一个人的第Option张牌
int Number=Player[SeatNumber].HandCardNumber;
if(Option<=Number) return Player[SeatNumber].HandCard[Option];
else if(Option<=Number+4) return Player[SeatNumber].Equipment[Option-Number];
else return Player[SeatNumber].JudgeArea[Option-Number-4];
}
void OneLoseCard(int SeatNumber,int number){//SeatNumber号位失去第number张牌 或装备牌
if(number<=Player[SeatNumber].HandCardNumber){//手牌
for(int i=number+1;i<=Player[SeatNumber].HandCardNumber;i++)//后面的牌依次向前移一位
Player[SeatNumber].HandCard[i-1]=Player[SeatNumber].HandCard[i];//将牌依次前移
Player[SeatNumber].HandCardNumber--;//卡牌总数量-1
if(Player[SeatNumber].WarriorCard.Number==39)
FireCamp(SeatNumber);
}
else if(number<=Player[SeatNumber].HandCardNumber+4){//装备牌
number-=Player[SeatNumber].HandCardNumber;
Player[SeatNumber].EquipmentExist[number]=0;
if(number==2&&Player[SeatNumber].Equipment[2].Type==35){//白银狮子
if(Player[SeatNumber].BloodNow!=Player[SeatNumber].BloodCeiling){
printf("白银狮子效果触发\n");
Player[SeatNumber].BloodNow++;
}
}
if(Player[SeatNumber].WarriorCard.Number==45) OwletGirl(SeatNumber);//孙尚香--枭姬
if(number>=3) CalDistance();
}
else{//判定牌
number-=Player[SeatNumber].HandCardNumber+4;
if(Player[SeatNumber].JudgeArea[number].Type==19||Player[SeatNumber].JudgeArea[number].NationBeauty==1)
Player[SeatNumber].JudgeCardExist[1]=false;
if(Player[SeatNumber].JudgeArea[number].Type==20||Player[SeatNumber].JudgeArea[number].NoGrain==1)
Player[SeatNumber].JudgeCardExist[2]=false;
if(Player[SeatNumber].JudgeArea[number].Type==21)
Player[SeatNumber].JudgeCardExist[3]=false;
for(int i=number+1;i<=Player[SeatNumber].JudgeCardNumber;i++)
Player[SeatNumber].JudgeArea[i-1]=Player[SeatNumber].JudgeArea[i];
Player[SeatNumber].JudgeCardNumber--;
}
}
void OneLoseNumber(int SeatNumber,int Number){
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++)
if(Player[SeatNumber].HandCard[i].Number==Number){//手牌
OneLoseCard(SeatNumber,i);
return;
}
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[1]==1&&Player[SeatNumber].Equipment[i].Number==Number){//装备牌
OneLoseCard(SeatNumber,i+Player[SeatNumber].HandCardNumber);
return;
}
}
int OneCardOption(int SeatNumber,int Number){//确保这张牌在某人的手牌中或者是装备区
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++)
if(Player[SeatNumber].HandCard[i].Number==Number) return i;
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[1]==1&&Player[SeatNumber].Equipment[i].Number==Number) return Player[SeatNumber].HandCardNumber+i;
}
GameCard OnesCardNumber(int SeatNumber,int Number){
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++)
if(Player[SeatNumber].HandCard[i].Number==Number) return Player[SeatNumber].HandCard[i];
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[1]==1&&Player[SeatNumber].Equipment[i].Number==Number) return Player[SeatNumber].Equipment[i];
}
void BloodUp(int SeatNumber){//加血
if(Player[SeatNumber].BloodNow!=Player[SeatNumber].BloodCeiling) Player[SeatNumber].BloodNow++;
}
void GhostTalent(int SeatNumber){//询问司马懿--鬼才(待升级)
printf("%d-%s,请问您是否发动鬼才? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option!=1){
printf("取消发动\n");
return;
}
printf("%d-%s,请您打出一张手牌替代判定牌\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
ShowOnesHandCard(SeatNumber);//每列显示一张手牌
printf("0-取消\n");//提供取消选项
scanf("%d",&Option);
if(Option==0){
printf("取消发动鬼才\n");
return;//取消发动
}
//生效
TableCard[++TableCardNumber]=JudgeCard;
JudgeCard=Player[SeatNumber].HandCard[Option];
OneLoseCard(SeatNumber,Option);
printf("司马懿打出替换的判定牌:");
ShowOneGameCard(JudgeCard);
return;
}
bool ZhangJiaosEightDiagramIsGoingOn;
void GhostWay(int SeatNumber){//询问张角--鬼道(待升级)
printf("%d-%s,请问您是否发动鬼道? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option!=1){
printf("取消发动\n");
return;
}
printf("%d-%s,请您打出一张牌替换判定牌",SeatNumber,Player[SeatNumber].WarriorCard.Name);
{//每列显示一张黑色牌 手牌+装备牌
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++)
if(Player[SeatNumber].HandCard[i].Color>=3)
{
printf("%d-",i);
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]==true)
if(Player[SeatNumber].Equipment[i].Color>=3)
{
if(i==2&&Player[SeatNumber].Equipment[i].Type==33&&ZhangJiaosEightDiagramIsGoingOn==true) continue;
printf("%d-",Player[SeatNumber].HandCardNumber+i);
ShowOneGameCard(Player[SeatNumber].Equipment[i]);
}
}
printf("0-取消\n");
scanf("%d",&Option);
if(Option==0){
printf("取消发动鬼道\n");
return;//取消发动
}
GameCard Temp=JudgeCard;
JudgeCard=OnesCard(SeatNumber,Option);
OneLoseCard(SeatNumber,Option);
Player[SeatNumber].HandCard[++Player[SeatNumber].HandCardNumber]=Temp;//判定牌加入手牌
printf("张角替换判定牌:");
ShowOneGameCard(JudgeCard);
return;
}
void AskChangeJudgeCard(int SeatNumber){//询问司马懿和张角是否更改判定牌
/*
if(OnField[7]&&OnField[30]){
int id=SeatNumber;
for(int i=1;i<=TotalPeopleNumber-1;i++){
if(++id>TotalPeopleNumber) id=1;
if(id==OnField[7]) GhostWay(OnField[7]);//询问张角-鬼道
if(id==OnField[30]) GhostTalent(OnField[30]);//询问司马懿-鬼才
}
}
else{
if(OnField[7]) GhostWay(OnField[7]);//有张角-询问鬼道
if(OnField[30]) GhostTalent(OnField[30]);//有司马懿-询问鬼才
}
*/
if(OnField[7]||OnField[30]){
int id=SeatNumber;
for(int i=1;i<=TotalPeopleNumber;i++){
if(id==OnField[7]) GhostWay(OnField[7]);//询问张角-鬼道
if(id==OnField[30]) GhostTalent(OnField[30]);//询问司马懿-鬼才
if(++id>TotalPeopleNumber) id=1;
}
}
}
void Judge(int SeatNumber){//判定
JudgeCard=TakeOneGameCard();//从牌堆拿出一张判定牌
printf("判定牌:");
ShowOneGameCard(JudgeCard);//显示该判定牌
AskChangeJudgeCard(SeatNumber);//询问是否有人更换判定牌
//曹丕--颂威
}
void CloseMoon(int SeatNumber){//貂蝉--闭月
GiveGameCardTo(SeatNumber,1);
}
void Integral(int Winner){//计算结果
if(Winner==1){//主忠获胜
printf("主公忠臣胜利!\n");
}
if(Winner==3){//内奸获胜
printf("内奸胜利!\n");
}
if(Winner==4){//反贼获胜
printf("反贼胜利!\n");
}
printf("Game Over!!!");
exit(0);
}
void SharpestBlade(int FromNumber,int ToNumber){//祝融--烈刃
}
void JudgeOver(){//判断游戏结束
if(IdentityNumber[1]==0){//主公阵亡
if(IdentityNumber[2]==0&&IdentityNumber[4]==0&&IdentityNumber[3]==1) Integral(3);//只有内奸存活,内奸胜利
else Integral(4);//不只有内奸存活,反贼胜利
}
else if(IdentityNumber[3]+IdentityNumber[4]==0) Integral(1);//反贼内奸全部阵亡,主公和忠臣胜利
else return;
}
bool BronzeSword(int SeatNumber){//是否有青釭剑
if(Player[SeatNumber].EquipmentExist[1]==1&&Player[SeatNumber].Equipment[1].Type==23) return true;
return false;
}
void Damage(Damageinfo damage,int ToNumber,bool skyfume);
void EvilHero(Damageinfo damage,int SeatNumber){//触发曹操--奸雄
if(!damage.FromCardNumber) return;
printf("%d-%s,奸雄触发\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
for(int i=1;i<=damage.FromCardNumber;i++){
for(int j=1;j<=TableCardNumber;j++)
if(TableCard[j].Number==damage.Card[i]){
Player[SeatNumber].HandCard[++Player[SeatNumber].HandCardNumber]=TableCard[j];
for(int k=j+1;k<=TableCardNumber;k++)
TableCard[k-1]=TableCard[k];
TableCardNumber--;
break;
}
}
}
void HeritagePlan(Damageinfo damage,int SeatNumber){//触发郭嘉--遗计(待升级)
printf("%d-%s,您触发了遗计\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
for(int i=1;i<=damage.Number*2;i++){
GameCard heritage=TakeOneGameCard();
printf("请将第%d张牌分配给下列一名角色: ",i);
ShowOneGameCard(heritage);
for(int j=1;j<=TotalPeopleNumber;j++){
if(Dead[j]) continue;
printf("%d-%s\n",j,Player[j].WarriorCard.Name);
int Option;
scanf("%d",&Option);
Player[Option].HandCard[++Player[Option].HandCardNumber]=heritage;
break;
}
}
}
void StrikeBack(Damageinfo damage,int SeatNumber){//触发司马懿--反馈(待升级)
if(!AllCardNumber(damage.FromMember)) return;
printf("%d-%s,你是否发动反馈? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return;
printf("%d-%s,请你从%d-%s的手牌或装备区反馈一张牌\n",SeatNumber,Player[SeatNumber].WarriorCard.Name,damage.FromMember,Player[damage.FromMember].WarriorCard.Name);
ShowOnesAllCardBack(damage.FromMember);
scanf("%d",&Option);
Player[SeatNumber].HandCard[++Player[SeatNumber].HandCardNumber]=OnesCard(damage.FromMember,Option);
OneLoseCard(damage.FromMember,Option);
return;
}
void IronTemper(Damageinfo damage,int SeatNumber){//触发夏侯惇--刚烈
printf("%d-%s,你是否发动刚烈? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return;
Judge(SeatNumber);
printf("刚烈判定结果: ");
ShowOneGameCard(JudgeCard);
if(JudgeCard.Color==1){
printf("刚烈失效\n");
return;
}
else printf("刚烈生效\n");
printf("%d-%s,%d-%s的刚烈生效,请你弃掉两张手牌或者受到其对你造成的一点伤害\n",damage.FromMember,Player[damage.FromMember].WarriorCard.Name,SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Number=Player[damage.FromMember].HandCardNumber;
int Choose[Number+1];
int ChooseNumber=0;
int NeedDiscard=2;
memset(Choose,0,sizeof(Choose));
while(NeedDiscard){
Number=Player[damage.FromMember].HandCardNumber;
printf("0-受到伤害\n");
printf("%d-%s,您还需要弃掉%d张牌\n",damage.FromMember,Player[damage.FromMember].WarriorCard.Name,NeedDiscard);
for(int i=1;i<=Number;i++){
printf("%d-",i);
if(Choose[i]) printf("(已选)");
ShowOneGameCard(Player[damage.FromMember].HandCard[i]);
}
if(ChooseNumber>=1) printf("%d-确认\n",Number+1);
int Option;
scanf("%d",&Option);
if(Option==0){
Damageinfo damage1;
damage1.Attribute=1;
damage1.Type=SK+1;
damage1.Number=1;
damage1.FromMember=SeatNumber;
damage1.FromCardNumber=0;
Damage(damage1,damage.FromMember,0);
return;
}
if(Option==Number+1){
for(int i=1;i<=Number;i++)
if(Choose[i]){
OneLoseNumber(damage.FromMember,Choose[i]);
Choose[i]=0;
}
NeedDiscard-=ChooseNumber;
ChooseNumber=0;
}
if(Choose[Option]){
Choose[Option]=0;
ChooseNumber--;
}
else{
if(ChooseNumber==NeedDiscard) continue;
Choose[Option]=Player[damage.FromMember].HandCard[Option].Number;
ChooseNumber++;
}
}
}
bool SkyPerfume(Damageinfo damage,int SeatNumber){//小乔--天香
printf("%d-%s,请问您是否发动天香,将伤害转移至另外一个人? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return false;
printf("%d-%s,您需要弃掉一张红桃手牌\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消");
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++){
int color=Player[SeatNumber].HandCard[i].Color;
if(color==3) color=1;//小乔--天香
if(color==1){//牌是红桃的
printf("%d-",i);
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
}
scanf("%d",&Option);
if(Option==0) return false;
printf("%d-%s,请你选择天香的目标: ",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++){
if(Dead[i]) continue;
if(i==SeatNumber) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option1;
scanf("%d",&Option1);
if(Option1==0) return false;
TableCard[++TableCardNumber]=Player[SeatNumber].HandCard[Option];
OneLoseCard(SeatNumber,Option);
damage.Type=SK;//伤害属于技能Type
Damage(damage,Option1,1);
return true;
}
void DeadDisposed(int SeatNumber){//阵亡处理
if(OnField[4]&&SeatNumber!=OnField[4]){//曹丕--行殇
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++) Player[OnField[4]].HandCard[++Player[OnField[4]].HandCardNumber]=Player[SeatNumber].HandCard[i];
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]==1) Player[OnField[4]].HandCard[++Player[OnField[4]].HandCardNumber]=Player[SeatNumber].Equipment[i];
for(int i=1;i<=Player[SeatNumber].JudgeCardNumber;i++) Player[OnField[4]].HandCard[++Player[OnField[4]].HandCardNumber]=Player[SeatNumber].JudgeArea[i];
}
else{
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++) TableCard[++TableCardNumber]=Player[SeatNumber].HandCard[i];
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]==1) TableCard[++TableCardNumber]=Player[SeatNumber].Equipment[i];
for(int i=1;i<=Player[SeatNumber].JudgeCardNumber;i++) TableCard[++TableCardNumber]=Player[SeatNumber].JudgeArea[i];
}
ClearTable();
Dead[SeatNumber]=1;
Across[SeatNumber]=0;
Player[SeatNumber].WarriorCard.Back=0;
OnField[Player[SeatNumber].WarriorCard.Number]=0;
DeadPeopleNumber++;
IdentityNumber[Player[SeatNumber].Identity]--;//死亡计数
Player[SeatNumber].HandCardNumber=0;
Player[SeatNumber].JudgeCardNumber=0;
memset(Player[SeatNumber].EquipmentExist,0,sizeof(Player[SeatNumber].EquipmentExist));
memset(Player[SeatNumber].JudgeCardExist,0,sizeof(Player[SeatNumber].JudgeCardExist));
CalDistance();
if(Player[SeatNumber].Identity==1) printf("%d-%s阵亡,身份是主公\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);//主公阵亡
if(Player[SeatNumber].Identity==2) printf("%d-%s阵亡,身份是忠臣\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);//忠臣阵亡
if(Player[SeatNumber].Identity==3) printf("%d-%s阵亡,身份是内奸\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);//内奸阵亡
if(Player[SeatNumber].Identity==4) printf("%d-%s阵亡,身份是反贼\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);//反贼阵亡
}
void Die(Damageinfo damage,int ToNumber){//某人阵亡
DeadDisposed(ToNumber);//阵亡处理
JudgeOver();//考虑游戏是否结束
if(Player[ToNumber].Identity==4) GiveGameCardTo(damage.FromMember,3);//杀反贼--摸三张牌
if(Player[ToNumber].Identity==2&&Player[damage.FromMember].Identity==1){//主杀忠-弃掉所有牌
for(int i=1;i<=Player[damage.FromMember].HandCardNumber;i++) TableCard[++TableCardNumber]=Player[damage.FromMember].HandCard[i];
for(int i=1;i<=4;i++)
if(Player[damage.FromMember].EquipmentExist[i]==1){
TableCard[++TableCardNumber]=Player[damage.FromMember].Equipment[i];
Player[damage.FromMember].EquipmentExist[i]=0;
}
ClearTable();
}
//考虑身份
}
int NervousRescue(int SeatNumber){//华佗--急救
printf("%d-%s,请您使用一张红色牌当做桃打出\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
ShowOnesAllRedCard(SeatNumber);
int Option;
scanf("%d",&Option);
return Option;
}
int CyanPack(int SeatNumber){//华佗--青囊
printf("%d-%s,请您使用一张手牌当做桃使用\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
ShowOnesHandCard(SeatNumber);
int Option;
scanf("%d",&Option);
return Option;
}
bool AskPeachOrWine(int SeatNumber){//自己打出一个桃或者酒
printf("%d-%s,您处于濒死状态,请你打出%d个【桃】或者【酒】\n",SeatNumber,Player[SeatNumber].WarriorCard.Name,-Player[SeatNumber].BloodNow+1);
if(Player[SeatNumber].WarriorCard.Number==49){//于吉--蛊惑
//蛊惑失败可以继续蛊惑,如果主动放弃蛊惑则不可以再本次求桃过程中再使用
}
if(Player[SeatNumber].WarriorCard.Number==55){//华佗
if(Player[MemberNow].WarriorCard.Number!=55){//回合外--急救
printf("%d-%s,请问您是否发动急救? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==1){
Option=NervousRescue(SeatNumber);
if(Option){
TableCard[++TableCardNumber]=Player[SeatNumber].HandCard[Option];
OneLoseCard(SeatNumber,Option);
return true;
}
}
}
else{//回合内--青囊
if(CyanPackChance){
printf("%d-%s,请问您是否发动青囊? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==1){
Option=CyanPack(SeatNumber);
if(Option){
TableCard[++TableCardNumber]=Player[SeatNumber].HandCard[Option];
OneLoseCard(SeatNumber,Option);
CyanPackChance=0;
return true;
}
}
}
}
}
//神赵云--龙魂
printf("0-取消\n");
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++){
if(Player[SeatNumber].HandCard[i].Type==5||Player[SeatNumber].HandCard[i].Type==6){
printf("%d-",i);
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
}
int Option;
scanf("%d",&Option);
if(Option==0) return false;
TableCard[++TableCardNumber]=Player[SeatNumber].HandCard[Option];
OneLoseCard(SeatNumber,Option);
return true;
}
bool AskPeach(int SeatNumber,int ToNumber){//帮别人打出一个桃
printf("%d-%s处于濒死状态,请%d-%s(你)打出%d个【桃】\n",ToNumber,Player[ToNumber].WarriorCard.Name,SeatNumber,Player[SeatNumber].WarriorCard.Name,-Player[ToNumber].BloodNow+1);
if(Player[SeatNumber].WarriorCard.Number==49){//于吉--蛊惑
}
if(Player[SeatNumber].WarriorCard.Number==55){//华佗
if(Player[MemberNow].WarriorCard.Number!=55){//回合外--急救
printf("%d-%s,请问您是否发动急救? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==1){
Option=NervousRescue(SeatNumber);
if(Option){
TableCard[++TableCardNumber]=Player[SeatNumber].HandCard[Option];
OneLoseCard(SeatNumber,Option);
return true;
}
}
}
else{//回合内--青囊
if(CyanPackChance){
printf("%d-%s,请问您是否发动青囊? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==1){
Option=CyanPack(SeatNumber);
if(Option){
TableCard[++TableCardNumber]=Player[SeatNumber].HandCard[Option];
OneLoseCard(SeatNumber,Option);
CyanPackChance=0;
return true;
}
}
}
}
}
//神赵云--龙魂
printf("0-取消\n");
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++)
if(Player[SeatNumber].HandCard[i].Type==5){
printf("%d-",i);
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
int Option;
scanf("%d",&Option);
if(Option==0) return false;
TableCard[++TableCardNumber]=Player[SeatNumber].HandCard[Option];
OneLoseCard(SeatNumber,Option);
return true;
}
bool Rescue(int SeatNumber){//孙权--救援
if(Player[SeatNumber].Nation==3) return true;
else return false;
}
void Dying(Damageinfo damage,int SeatNumber){//濒死状态
if(Player[SeatNumber].WarriorCard.Number==47){//周泰--不屈
}
int id=damage.FromMember;
for(int i=1;i<=TotalPeopleNumber;i++){
if(i!=1) id++;
if(id>TotalPeopleNumber) id=1;
if(Dead[id]) continue;
if(id==SeatNumber){
if(Player[SeatNumber].WarriorCard.Number==18){;//庞统--涅槃
}
while(1){
if(AskPeachOrWine(SeatNumber)==true){
Player[SeatNumber].BloodNow++;
if(Player[SeatNumber].BloodNow>=1) return;
}
else break;
}
}
else{
if(Player[MemberNow].WarriorCard.Number==50) continue;//贾诩--完杀
while(1){
if(AskPeach(id,SeatNumber)==true){
Player[SeatNumber].BloodNow++;
if(Player[SeatNumber].WarriorCard.Number==5&&SeatNumber==1) if(Rescue(id)==true) Player[SeatNumber].BloodNow++;//孙权--救援
if(Player[SeatNumber].BloodNow>=1) return;
}
else break;
}
}
}
if(Player[SeatNumber].BloodNow<=0) Die(damage,SeatNumber);//死亡
return;
}
void BloodRun(int SeatNumber,int Number){//体力流失
Player[SeatNumber].BloodNow-=Number;
Damageinfo damage;
damage.FromMember=SeatNumber;
if(Player[SeatNumber].BloodNow<=0) Dying(damage,SeatNumber);
}
void Damage(Damageinfo damage,int SeatNumber,bool skyfume){
if(Across[SeatNumber]&&damage.Attribute>=2){//铁索连环
int Chain[13];
int len=0;
int id=SeatNumber;
for(int i=1;i<=TotalPeopleNumber;i++){
if(i!=1) id++;
if(id>TotalPeopleNumber) id=1;
if(Dead[id]) continue;
if(Across[id]){
Chain[++len]=id;
Across[id]=0;
}
}
for(int i=1;i<=len;i++){
if(Dead[Chain[i]]) continue;
Damage(damage,Chain[i],0);
}
return;
}
//神诸葛亮--狂风
//神诸葛亮--大雾
if(Player[SeatNumber].EquipmentExist[2]==1&&Player[SeatNumber].Equipment[2].Type==35){//白银狮子
if(damage.Number>=2) damage.Number=1;
}
if(Player[SeatNumber].EquipmentExist[2]==1&&Player[SeatNumber].Equipment[2].Type==36){//藤甲
if(damage.Attribute==2){
if(damage.Type>3||!BronzeSword(damage.FromMember)){
printf("藤甲触发,伤害+1");
damage.Number++;
}
}
}
if(Player[SeatNumber].WarriorCard.Number==48) if(SkyPerfume(damage,SeatNumber)==true) return;//小乔--天香
Player[SeatNumber].BloodNow-=damage.Number;
if(Player[SeatNumber].BloodNow<=0) Dying(damage,SeatNumber);//濒死状态
if(Dead[SeatNumber]) return;
if(skyfume==1) GiveGameCardTo(SeatNumber,Player[SeatNumber].BloodCeiling-Player[SeatNumber].BloodNow);//天香摸牌
if(Player[SeatNumber].WarriorCard.Number==29) HeritagePlan(damage,SeatNumber);//郭嘉--遗计
if(Player[SeatNumber].WarriorCard.Number==30) StrikeBack(damage,SeatNumber);//司马懿--反馈
if(Player[SeatNumber].WarriorCard.Number==3) EvilHero(damage,SeatNumber);//曹操--奸雄
if(Player[SeatNumber].WarriorCard.Number==26) IronTemper(damage,SeatNumber);//夏侯惇--刚烈
if(Player[SeatNumber].WarriorCard.Number==24);//荀彧--节命
if(Player[SeatNumber].WarriorCard.Number==52);//蔡文姬--悲歌
if(Player[SeatNumber].WarriorCard.Number==4);//曹丕--放逐
if(Player[damage.FromMember].WarriorCard.Number==20&&damage.Type<=3) SharpestBlade(damage.FromMember,SeatNumber);//祝融--烈刃
}
void BrilliantPosture(int SeatNumber){//触发周瑜--英姿 觉醒孙策--英姿
GiveGameCardTo(SeatNumber,1);
}
void BrilliantSoul(int SeatNumber){//孙坚--英魂 觉醒孙策--英魂
}
void LightStrike(int SeatNumber){//张角--雷击
printf("%d-%s,你是否发动雷击?1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return;
printf("%d-%s,请您选择雷击的目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消发动\n");
for(int i=1;i<=TotalPeopleNumber;i++)
{
if(Dead[i]) continue;
if(i==SeatNumber) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option1;
scanf("%d",&Option1);
if(Option1==0) return;
Judge(SeatNumber);
if(JudgeCard.Color==3)
{
printf("雷击生效\n");
Damageinfo damage;
damage.Attribute=3;
damage.Type=SK+4;
damage.Number=2;
damage.FromMember=SeatNumber;
damage.FromCardNumber=0;
Damage(damage,Option1,0);
}
TableCard[++TableCardNumber]=JudgeCard;
}
void YellowSky(int SeatNumber)
{
printf("%d-%s,请您将一张闪或者闪电交给%d-%s\n",SeatNumber,Player[SeatNumber].WarriorCard.Name,OnField[7],Player[OnField[7]].WarriorCard.Name);
printf("0-取消发动\n");
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++)
{
if(Player[SeatNumber].HandCard[i].Type==4||Player[SeatNumber].HandCard[i].Type==21)
{
printf("%d-",i);
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
}
int Option;
scanf("%d",&Option);
if(Option==0) return;
YellowSkyChance--;
Player[OnField[7]].HandCard[++Player[OnField[7]].HandCardNumber]=OnesCard(SeatNumber,Option);
OneLoseCard(SeatNumber,Option);
}
void SkyJustice(){//太史慈--天义
}
bool Naked(int SeatNumber){//询问许褚--裸衣
printf("%d-%s,请问您是否发动裸衣? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return false;
GiveGameCardTo(SeatNumber,1);
naked=true;
return true;
}
bool SuddenStrike(int SeatNumber){//询问张辽--突袭(待升级)
int ExistHandCard=0;
for(int i=1;i<=TotalPeopleNumber;i++){
if(Dead[i]) continue;
if(!Player[i].HandCardNumber) continue;
ExistHandCard++;
}
if(ExistHandCard==0) return false;
int Option;
printf("%d-%s,请问您是否发动突袭? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
scanf("%d",&Option);
if(Option==2) return false;
int Aim1;
int Aim2;
printf("%d-%s,请您选择突袭的第一名目标: \n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
for(int i=1;i<=TotalPeopleNumber;i++){
if(Dead[i]) continue;
if(i==SeatNumber) continue;
if(!Player[i].HandCardNumber) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
scanf("%d",&Aim1);
printf("%d-%s,请您选择突袭的第二名目标: \n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++){
if(Dead[i]) continue;
if(i==Aim1) continue;
if(i==SeatNumber) continue;
if(!Player[i].HandCardNumber) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
scanf("%d",&Aim2);
printf("%d-%s,请您从%d-%s手牌中选择一张卡牌",SeatNumber,Player[SeatNumber].WarriorCard.Name,Aim1,Player[Aim1].WarriorCard.Name);
ShowOnesHandCardBack(Aim1);
scanf("%d",&Option);
Player[SeatNumber].HandCard[++Player[SeatNumber].HandCardNumber]=Player[Aim1].HandCard[Option];//张辽得到这张牌
OneLoseCard(Aim1,Option);
if(Aim2==0) return true;
printf("%d-%s,请您从%d-%s手牌中选择一张卡牌",SeatNumber,Player[SeatNumber].WarriorCard.Name,Aim2,Player[Aim2].WarriorCard.Name);
ShowOnesHandCardBack(Aim2);
scanf("%d",&Option);
Player[SeatNumber].HandCard[++Player[SeatNumber].HandCardNumber]=Player[Aim2].HandCard[Option];
OneLoseCard(Aim2,Option);
return true;
}
bool EmptyCity(int SeatNumber){//触发诸葛亮--空城
if(Player[SeatNumber].HandCardNumber==0) return true;
else return false;
}
void FocusWisdom(int SeatNumber){//黄月英--集智
printf("集智\n");
GiveGameCardTo(SeatNumber,1);
}
int BloodDescend(int SeatNumber){//袁绍--血裔
}
bool OwnRestraint(int SeatNumber){//吕蒙--克己
if(KillChance>=1) return true;
else return false;
}
int Homeless(int FromNumber,int ToNumber){//大乔--流离(待升级)
int Number=Player[ToNumber].HandCardNumber;
for(int i=1;i<=4;i++)
if(Player[ToNumber].EquipmentExist[i]==1) Number++;
if(Number==0) return 0;
printf("%d-%s,请问您是否发动流离? 1-是 2-否\n",ToNumber,Player[ToNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return 0;
printf("%d-%s,请您弃掉一张牌: \n",ToNumber,Player[ToNumber].WarriorCard.Name);
printf("0-取消\n");
ShowOnesAllCard(ToNumber);
scanf("%d",&Option);
if(Option==0) return 0;
int Scope=1;
if(Option!=Player[ToNumber].HandCardNumber+1) Scope=AttackScope(ToNumber);
printf("%d-%s,请您选择流离的目标: \n",ToNumber,Player[ToNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++){
if(Dead[i]) continue;
if(i==FromNumber) continue;
if(i==ToNumber) continue;
if(Scope<Player[ToNumber].Aim[i]) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option1;
scanf("%d",&Option1);
if(Option1==0) return 0;
TableCard[++TableCardNumber]=OnesCard(ToNumber,Option);
OneLoseCard(ToNumber,Option);
return Option1;
}
void SoulPosture(int SeatNumber){//孙策--魂姿
if(Player[SeatNumber].BloodNow==1){
Player[SeatNumber].BloodCeiling--;
Player[SeatNumber].BloodNow++;
Player[SeatNumber].WarriorCard.Wakeup=1;
}
}
void HugeElephant(Damageinfo damage,int SeatNumber){//祝融--巨象
for(int i=1;i<=TableCardNumber;i++)
if(TableCard[i].Number==damage.Card[1]){//如果在桌面上找到了南蛮入侵
Player[SeatNumber].HandCard[++Player[SeatNumber].HandCardNumber]=TableCard[i];
for(int j=i+1;j<=TableCardNumber;j++)
TableCard[j-1]=TableCard[j];
TableCardNumber--;
return;
}
}
int UnassailableNumber;//无懈可击数量
bool UnassailableExist[13];
bool ExistUnassailable(){//查看有无懈可击的玩家是否存在
memset(UnassailableExist,0,sizeof(UnassailableExist));
bool Ask=0;
for(int i=1;i<=TotalPeopleNumber;i++){
if(Dead[i]) continue;
int Number=Player[i].HandCardNumber;
if(Player[i].WarriorCard.Number==19){//卧龙--看破
if(Number) Ask=true;
for(int j=1;j<=4;j++)
if(Player[i].Equipment[j].Color>=3){
//Ask=true;
break;
}
}
if(Player[i].WarriorCard.Number==49){//于吉--蛊惑
if(Number)
Ask=true;
}
//神赵云--龙魂
for(int j=1;j<=Number;j++)
if(Player[i].HandCard[j].Type==16){
Ask=1;
UnassailableExist[i]=1;
break;
}
}
return Ask;
}
bool AskUnassailable(){//询问无懈可击
if(ExistUnassailable())
{//无懈可击看谁先出
for(int i=1;i<=TotalPeopleNumber;i++){
if(UnassailableExist[i]){
printf("%d-%s,请问您是否打出无懈可击?\n",i,Player[i].WarriorCard.Name);
for(int j=1;j<=Player[i].HandCardNumber;j++)
if(Player[i].HandCard[j].Type==16){
printf("%d-",j);
ShowOneGameCard(Player[i].HandCard[j]);
}
int Option;
printf("0-取消\n");
scanf("%d",&Option);
if(Option==0){
printf("取消打出\n");
}
else{
if(Player[i].WarriorCard.Number==15) FocusWisdom(i);//黄月英--集智
TableCard[++TableCardNumber]=Player[i].HandCard[Option];
OneLoseCard(i,Option);
if(AskUnassailable()) return 0;
else return 1;
}
}
if(Player[i].WarriorCard.Number==19){
printf("%d-%s,请问您是否发动看破,使用一张黑色的牌作为无懈可击打出? 1-是 2-否\n",i,Player[i].WarriorCard.Name);
int Option;
if(Option==1){
printf("%d-%s,请选择一张牌当做无懈可击打出: \n",i,Player[i].WarriorCard.Name);
printf("0-取消\n");
ShowOnesAllBlackCard(i);
scanf("%d",&Option);
if(Option==0) continue;
TableCard[++TableCardNumber]=OnesCard(i,Option);
OneLoseCard(i,Option);
if(AskUnassailable()) return 0;
else return 1;
}
}
if(Player[i].WarriorCard.Number==49){
printf("您是否发动蛊惑? 1-是 2-否\n");
}
}
return 0;
}
else return 0;
}
void EmotionUp(int SeatNumber){//孙策--激昂
GiveGameCardTo(SeatNumber,1);
}
Damageinfo WuSage(int SeatNumber,int type){//关羽--武圣(待升级)
printf("%d-%s,请将一张红色的牌作为杀打出\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
Damageinfo damage;
damage.FromCardNumber=0;
int Option;
printf("0-放弃发动\n");
ShowOnesRedHandCard(SeatNumber);
printf("装备牌: \n");
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]==1){
if(i==1&&KillChance==0&&type==1) continue;
if(Player[SeatNumber].Equipment[i].Color>2) continue;
printf("%d-",i);
ShowOneGameCard(Player[SeatNumber].Equipment[i]);
}
scanf("%d",&Option);
if(Option==0) return damage;
damage.Type=1;
damage.Attribute=1;
damage.Number=1;
damage.Color=OnesCard(SeatNumber,Option).Color;
damage.FromCardNumber=1;
damage.Card[1]=OnesCard(SeatNumber,Option).Number;
return damage;
}
Damageinfo DragonBraveKill(int SeatNumber){//赵云--龙胆--闪当杀(待升级)
printf("%d-%s,请您选一张闪作为杀打出:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
Damageinfo damage;
damage.FromCardNumber=0;
int Option;
printf("0-放弃发动\n");
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++)
if(Player[SeatNumber].HandCard[i].Type==4){
printf("%d-",i);
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
scanf("%d",&Option);
if(Option==0) return damage;
damage.Type=1;
damage.Attribute=1;
damage.Number=1;
damage.Color=Player[SeatNumber].HandCard[Option].Color;
damage.FromCardNumber=1;
damage.Card[1]=Player[SeatNumber].HandCard[Option].Number;
return damage;
}
Damageinfo AskKill(int SeatNumber);
Damageinfo ExciteSoldier(int SeatNumber){//刘备、刘禅--激将
Damageinfo damage;
damage.FromCardNumber=0;
int id=SeatNumber;
for(int i=1;i<TotalPeopleNumber;i++){
if(++id>TotalPeopleNumber) id=1;
if(Dead[id]) continue;
if(Player[id].Nation!=1) continue;
Damageinfo damage=AskKill(id);
if(damage.FromCardNumber) return damage;
}
return damage;
}
Damageinfo EightSpear(int SeatNumber){//丈八蛇矛(待升级)
Damageinfo damage;
damage.FromCardNumber=0;
int Number=Player[SeatNumber].HandCardNumber;
for(int i=2;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]) Number++;
if(Number<2) return damage;
printf("%d-%s,请您选择第一张牌:",SeatNumber,Player[SeatNumber].WarriorCard.Name);
Number=Player[SeatNumber].HandCardNumber;
printf("0-取消\n");
ShowOnesHandCard(SeatNumber);
for(int i=2;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]){
printf("%d-",i+Number);
ShowOneGameCard(Player[SeatNumber].Equipment[i]);
}
int Option1;
scanf("%d",&Option1);
if(Option1==0) return damage;
printf("%d-%s,请您选择第二张牌:",SeatNumber,Player[SeatNumber].WarriorCard.Name);
Number=Player[SeatNumber].HandCardNumber;
printf("0-取消\n");
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++)
if(i!=Option1) ShowOneGameCard(Player[SeatNumber].HandCard[i]);
for(int i=2;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]){
printf("%d-",i+Number);
ShowOneGameCard(Player[SeatNumber].Equipment[i]);
}
int Option2;
scanf("%d",&Option2);
if(Option2==0) return damage;
int color;
int color1=Player[SeatNumber].HandCard[Option1].Color;
int color2=Player[SeatNumber].HandCard[Option2].Color;
int number1=Player[SeatNumber].HandCard[Option1].Number;
int number2=Player[SeatNumber].HandCard[Option2].Number;
if(color1>=3&&color2>=3) color=3;
else if(color1<=2&&color2<=2) color=1;
else color=0;
damage.Type=1;
damage.Attribute=1;
damage.Number=1;
damage.Color=color;
damage.FromCardNumber=2;
damage.Card[1]=number1;
damage.Card[2]=number2;
if(Player[SeatNumber].WarriorCard.Number==6)//孙策--激昂
if(damage.Color==1) EmotionUp(SeatNumber);
return damage;
}
Damageinfo AskKill(int SeatNumber){//请求杀 南蛮入侵、决斗无需知道杀的伤害来源 借刀杀人、主动激将、青龙偃月刀需要知道杀的伤害来源和伤害类型,其中伤害来源在发起函数中设置 无需伤害来源只需要提供杀的信息
printf("%d-%s,请您打出一张杀\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
Damageinfo damage;
damage.FromCardNumber=0;
int Option;
if(Player[SeatNumber].WarriorCard.Number==10){//关羽--武圣
printf("%d-%s,请问您是否发动武圣,将红色的牌作为杀打出: 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
scanf("%d",&Option);
if(Option==1){
damage=WuSage(SeatNumber,0);
if(damage.FromCardNumber){
OneLoseNumber(SeatNumber,damage.Card[1]);
damage.FromMember=SeatNumber;
return damage;
}
}
}
if(Player[SeatNumber].WarriorCard.Number==13){//赵云--龙胆--闪当杀
printf("%d-%s,请问您是否发动龙胆,将闪当做杀打出: 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
scanf("%d",&Option);
if(Option==1){
damage=DragonBraveKill(SeatNumber);
if(damage.FromCardNumber){
OneLoseNumber(SeatNumber,damage.Card[1]);
damage.FromMember=SeatNumber;
return damage;
}
}
}
//于吉--蛊惑
//神赵云--龙魂
if(Player[SeatNumber].EquipmentExist[1]==1&&Player[SeatNumber].Equipment[1].Type==27){//丈八蛇矛
printf("%d-%s,请问您是否发动丈八蛇矛,将两张牌当做杀打出? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
scanf("%d",&Option);
if(Option==1){
damage=EightSpear(SeatNumber);
if(damage.FromCardNumber)
OneLoseNumber(SeatNumber,damage.Card[1]);
OneLoseNumber(SeatNumber,damage.Card[2]);
damage.FromMember=SeatNumber;
return damage;
}
}
if(Player[SeatNumber].WarriorCard.Number==1&&SeatNumber==1){//刘备--激将
printf("%d-%s,请问您是否发动激将,让蜀势力角色替你打出一张杀? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
scanf("%d",&Option);
if(Option==1){
damage=ExciteSoldier(SeatNumber);
if(damage.FromCardNumber){
damage.FromMember=SeatNumber;
return damage;
}
}
}
if(Player[SeatNumber].WarriorCard.Number==2&&Player[SeatNumber].WarriorCard.Wakeup==1&&SeatNumber==1){//刘禅--激将
printf("%d-%s,请问您是否发动激将,让蜀势力角色替你打出一张杀? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
scanf("%d",&Option);
if(Option==1){
damage=ExciteSoldier(SeatNumber);
if(damage.FromCardNumber){
damage.FromMember=SeatNumber;
return damage;
}
}
}
printf("%d-%s,请您从手牌中打出一张杀\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消出杀\n");
for(int i=1;i<=Player[SeatNumber].HandCardNumber;i++)
if(Player[SeatNumber].HandCard[i].Type<=3){//显示杀
printf("%d-",i);
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
scanf("%d",&Option);
if(Option==0) return damage;
damage.Type=Player[SeatNumber].HandCard[Option].Type;
damage.Attribute=Player[SeatNumber].HandCard[Option].Type;
damage.Number=1;
damage.Color=Player[SeatNumber].HandCard[Option].Color;
damage.FromMember=SeatNumber;
damage.Card[1]=Player[SeatNumber].HandCard[Option].Number;
damage.FromCardNumber=1;
if(Player[SeatNumber].WarriorCard.Number==6)//孙策--激昂
if(damage.Color<=2) EmotionUp(SeatNumber);
TableCard[++TableCardNumber]=Player[SeatNumber].HandCard[Option];
OneLoseCard(SeatNumber,Option);
return damage;
}
void KirinBow(int SeatNumber,int ToNumber){//麒麟弓
if(Player[ToNumber].EquipmentExist[3]==0&&Player[ToNumber].EquipmentExist[4]==0) return;
printf("%d-%s,请问您是否发动麒麟弓? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return;
else{
int Number=Player[ToNumber].HandCardNumber;
if(Player[ToNumber].EquipmentExist[3]==1){
printf("%d-",Number+3);
ShowOneGameCard(Player[ToNumber].Equipment[3]);
}
if(Player[ToNumber].EquipmentExist[4]==1){
printf("%d-",Number+4);
ShowOneGameCard(Player[ToNumber].Equipment[4]);
}
scanf("%d",&Option);
TableCard[++TableCardNumber]=Player[ToNumber].Equipment[Option-Number];
OneLoseCard(ToNumber,Option);
}
}
bool IceSword(int FromNumber,int ToNumber){//寒冰剑(待升级)
if(!AllCardNumber(ToNumber)) return false;
printf("%d-%s,请问您是否发动寒冰剑? 1-是 2-否\n",FromNumber,Player[FromNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return false;
printf("%d-%s,请您选择第一张弃掉的牌:",FromNumber,Player[FromNumber].WarriorCard.Name);
ShowOnesAllCardBack(ToNumber);
scanf("%d",&Option);
TableCard[++TableCardNumber]=OnesCard(ToNumber,Option);
OneLoseCard(ToNumber,Option);
int Number=Player[ToNumber].HandCardNumber;
for(int i=1;i<=4;i++)
if(Player[ToNumber].EquipmentExist[i]) Number++;
if(Number==0) return true;
printf("%d-%s,请您选择第二张弃掉的牌\n",FromNumber,Player[FromNumber].WarriorCard.Name);
printf("0-取消\n");
ShowOnesAllCardBack(ToNumber);
scanf("%d",&Option);
TableCard[++TableCardNumber]=OnesCard(ToNumber,Option);
OneLoseCard(ToNumber,Option);
return true;
}
void KillDamage(Damageinfo damage,int ToNumber){//杀造成的伤害
if(Player[damage.FromMember].EquipmentExist[1]==1){//考虑武器
if(Player[damage.FromMember].Equipment[1].Type==29)
KirinBow(damage.FromMember,ToNumber);//麒麟弓--卸马
if(Player[damage.FromMember].Equipment[1].Type==30)
if(IceSword(damage.FromMember,ToNumber)==1) return;//寒冰剑--弃牌
if(Player[damage.FromMember].Equipment[1].Type==32)
if(Player[ToNumber].HandCardNumber==0){
printf("古锭刀\n");
damage.Number++;//古锭刀
}
}
if(Player[damage.FromMember].Wine==2){//酒--伤害+1
damage.Number++;
Player[damage.FromMember].Wine=1;
}
if(Player[damage.FromMember].WarriorCard.Number==28&&naked==1) damage.Number++;//许褚--裸衣
Damage(damage,ToNumber,0);
}
void InertiaZax(Damageinfo damage,int ToNumber){//贯石斧(待升级)
printf("%d-%s,请问你是否发动贯石斧? 1-是 2-否\n",damage.FromMember,Player[damage.FromMember].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return;
printf("%d-%s,请弃掉两张牌:\n",damage.FromMember,Player[damage.FromMember].WarriorCard.Name);
int Number;
Number=Player[damage.FromMember].HandCardNumber;
printf("%d-%s,请您弃掉第一张牌:\n",damage.FromMember,Player[damage.FromMember].WarriorCard.Name);
printf("0-取消");
ShowOnesHandCard(damage.FromMember);
for(int i=2;i<=4;i++)
if(Player[damage.FromMember].EquipmentExist[i]==1){
printf("%d-",i+Number);
ShowOneGameCard(Player[damage.FromMember].Equipment[i]);
}
int FirstCard;
scanf("%d",&FirstCard);
if(FirstCard==0) return;
TableCard[++TableCardNumber]=OnesCard(damage.FromMember,FirstCard);
OneLoseCard(damage.FromMember,FirstCard);
Number=Player[damage.FromMember].HandCardNumber;
printf("%d-%s,请您弃掉第二张牌:\n",damage.FromMember,Player[damage.FromMember].WarriorCard.Name);
printf("0-取消\n");
ShowOnesHandCard(damage.FromMember);
for(int i=2;i<=4;i++)
if(Player[damage.FromMember].EquipmentExist[i]==1){
printf("%d-",i+Number);
ShowOneGameCard(Player[damage.FromMember].Equipment[i]);
}
int SecondCard;
scanf("%d",&SecondCard);
if(SecondCard==0) return;
TableCard[++TableCardNumber]=OnesCard(damage.FromMember,SecondCard);
OneLoseCard(damage.FromMember,SecondCard);
KillDamage(damage,ToNumber);
return;
}
void Kill(Damageinfo damage,int ToNumber);
void CyanDragonBlade(int FromNumber,int ToNumber){//青龙偃月刀
printf("%d-%s,请问您是否发动青龙偃月刀? 1-是 2-否\n",FromNumber,Player[FromNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return;
Damageinfo damage=AskKill(FromNumber);
if(damage.FromCardNumber){
damage.FromMember=FromNumber;
Kill(damage,ToNumber);
}
return;
}
void GodJealous(int SeatNumber){//触发郭嘉--天妒
Player[SeatNumber].HandCard[++Player[SeatNumber].HandCardNumber]=JudgeCard;//郭嘉--天妒 获得判定牌
}
int EnjoyLife(int SeatNumber){//刘禅--享乐(待升级)
printf("刘禅发动了享乐,%d-%s,您需要弃掉一张基本牌使该杀生效\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
int Number=Player[SeatNumber].HandCardNumber;
for(int i=1;i<=Number;i++){
GameCard HandCard=Player[SeatNumber].HandCard[i];
if(HandCard.Type<=6){
printf("%d-",i);
ShowOneGameCard(HandCard);
}
}
int Option;
scanf("%d",&Option);
if(Option==0) return true;//享乐生效-杀无效
TableCard[++TableCardNumber]=Player[SeatNumber].HandCard[Option];
OneLoseCard(SeatNumber,Option);
return false;
}
bool LeanStage(int SeatNumber){//甄姬--倾国(待升级)
printf("%d-%s,您是否发动倾国? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return 0;
printf("0-放弃发动\n");
ShowOnesBlackHandCard(SeatNumber);
scanf("%d",&Option);
if(Option==0) return 0;
TableCard[++TableCardNumber]=Player[SeatNumber].HandCard[Option];
OneLoseCard(SeatNumber,Option);
return 1;
}
bool DragonBraveFlash(int SeatNumber){//赵云--龙胆--杀当闪(待升级)
printf("%d-%s,您是否发动龙胆? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return 0;
printf("%d-%s,请你选择一张杀当做闪打出(龙胆):\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-放弃发动\n");
int Number=Player[SeatNumber].HandCardNumber;
for(int i=1;i<=Number;i++)
if(Player[SeatNumber].HandCard[i].Type<=3){
printf("%d-",i);
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
scanf("%d",&Option);
if(Option==0) return 0;
TableCard[++TableCardNumber]=Player[SeatNumber].HandCard[Option];
OneLoseCard(SeatNumber,Option);
return 1;
}
bool EightDiagram(int SeatNumber){//八卦阵
printf("%d-%s,请问您发动八卦阵? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return false;
if(Player[SeatNumber].WarriorCard.Number==7) ZhangJiaosEightDiagramIsGoingOn=true;
printf("八卦阵结果:\n");
Judge(SeatNumber);
int color=JudgeCard.Color;
if(Player[SeatNumber].WarriorCard.Number==48&&color==3) color=1;//小乔--红颜
if(color<=2){
printf("八卦阵生效\n");
if(Player[SeatNumber].WarriorCard.Number==7) ZhangJiaosEightDiagramIsGoingOn=false;
if(Player[SeatNumber].WarriorCard.Number==29) GodJealous(SeatNumber);//郭嘉--天妒拿走判定牌
else TableCard[++TableCardNumber]=JudgeCard;//将判定牌放入桌面
if(Player[SeatNumber].WarriorCard.Number==7) LightStrike(SeatNumber);//张角--雷击
return true;
}
else{
printf("八卦阵失效\n");
if(Player[SeatNumber].WarriorCard.Number==7) ZhangJiaosEightDiagramIsGoingOn=false;
if(Player[SeatNumber].WarriorCard.Number==29) GodJealous(SeatNumber);//郭嘉--天妒拿走判定牌
else TableCard[++TableCardNumber]=JudgeCard;//将判定牌放入桌面
return false;
}
}
bool AskFlash(Damageinfo damage,int SeatNumber);
bool ProtectEmperor(int SeatNumber){//曹操--护驾
printf("%d-%s,请问您是否发动护驾? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return false;
int id=SeatNumber;
for(int i=1;i<TotalPeopleNumber;i++){
if(++id>TotalPeopleNumber) id=1;
if(Dead[id]) continue;
if(Player[id].Nation!=2) continue;
Damageinfo damage;
damage.FromMember=0;
if(AskFlash(damage,id)==1)
return true;
}
return false;
}
bool AskFlash(Damageinfo damage,int SeatNumber){//请求闪
printf("%d-%s,请您打出一张闪:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
if(Player[SeatNumber].EquipmentExist[2]==1&&Player[SeatNumber].Equipment[2].Type==33)//八卦阵
if(damage.Type>3||!BronzeSword(damage.FromMember))
if(EightDiagram(SeatNumber)==1) return 1;
if(Player[SeatNumber].EquipmentExist[2]==0&&Player[SeatNumber].WarriorCard.Number==19)//卧龙诸葛亮--八阵
if(damage.Type>3||!BronzeSword(damage.FromMember))
if(EightDiagram(SeatNumber)==1) return 1;
if(Player[SeatNumber].WarriorCard.Number==31)//甄姬--倾国
if(LeanStage(SeatNumber)==1) return 1;
if(Player[SeatNumber].WarriorCard.Number==3&&SeatNumber==1)//曹操--护驾
if(ProtectEmperor(SeatNumber)==1) return 1;
if(Player[SeatNumber].WarriorCard.Number==13)//赵云--龙胆
if(DragonBraveFlash(SeatNumber)==1) return 1;
printf("%d-%s,请您从手牌中打出一张闪\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
int Number=Player[SeatNumber].HandCardNumber;
for(int i=1;i<=Number;i++)
if(Player[SeatNumber].HandCard[i].Type==4){//显示闪
printf("%d-",i);
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
int Option;
scanf("%d",&Option);
if(Option==0) return 0;
TableCard[++TableCardNumber]=Player[SeatNumber].HandCard[Option];
OneLoseCard(SeatNumber,Option);
if(Player[SeatNumber].WarriorCard.Number==7) LightStrike(SeatNumber);//张角--雷击
return 1;
}
void TwoSexSword(int FromNumber,int ToNumber){//雌雄双股剑(待升级)
printf("%d-%s,请问您是否发动雌雄双股剑? 1-是 2-否\n",FromNumber,Player[FromNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return;
printf("%d-%s,请您选择下列一项\n",ToNumber,Player[ToNumber].WarriorCard.Name);
if(Player[ToNumber].HandCardNumber) printf("1-弃掉自己一张手牌 ");
printf("2-让对方%d-%s摸一张牌\n",FromNumber,Player[FromNumber].WarriorCard.Name);
scanf("%d",&Option);
if(Option==1){
printf("%d-%s,请您弃掉自己一张牌:\n",ToNumber,Player[ToNumber].WarriorCard.Name);
ShowOnesHandCard(ToNumber);
scanf("%d",&Option);
TableCard[++TableCardNumber]=Player[ToNumber].HandCard[Option];
OneLoseCard(ToNumber,Option);
}
else GiveGameCardTo(FromNumber,1);
}
bool IronHorse(int FromNumber){//马超--铁骑
printf("%d-%s,请问您是否发动铁骑? 1-是 2-否\n",FromNumber,Player[FromNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return false;
Judge(FromNumber);
if(JudgeCard.Color<=2){
printf("铁骑生效\n");
TableCard[++TableCardNumber]=JudgeCard;//将判定牌放入桌面
return true;
}
else{
printf("铁骑失效\n");
TableCard[++TableCardNumber]=JudgeCard;//将判定牌放入桌面
return false;
}
}
bool ViolentBow(int FromNumber,int ToNumber){//黄忠--烈弓
int Scope=AttackScope(FromNumber);
int Number=Player[ToNumber].HandCardNumber;
if(Number>=Player[FromNumber].BloodNow||Number<=Scope){
printf("%d-%s,请问您是否发动烈弓? 1-是 2-否\n",FromNumber,Player[FromNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==1){
printf("烈弓\n");
return true;
}
else return false;
}
else return false;
}
void AskFlashSuccess(Damageinfo damage,int ToNumber){//武器--青龙偃月刀和贯石斧--咨询
if(Player[damage.FromMember].EquipmentExist[1]==1&&Player[damage.FromMember].Equipment[1].Type==25) InertiaZax(damage,ToNumber);//贯石斧
if(Player[damage.FromMember].EquipmentExist[1]==1&&Player[damage.FromMember].Equipment[1].Type==26) CyanDragonBlade(damage.FromMember,ToNumber);//青龙偃月刀
//庞德--猛进
return;
}
void ChooseMarryAim(int SeatNumber){//选择结姻目标
printf("0-取消发动\n");
for(int i=1;i<=TotalPeopleNumber;i++){
if(Dead[i]) continue;
if(i==SeatNumber) continue;
if(Player[i].Sex==1) continue;
if(Player[i].BloodNow==Player[i].BloodCeiling) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option;
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
return;
}
void ChooseAlienateAim(int SeatNumber){//貂蝉--离间选择目标
printf("%d-%s,请你选择离间的第一个目标\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消发动\n");
for(int i=1;i<=TotalPeopleNumber;i++){
if(i==SeatNumber) continue;
if(Dead[i]) continue;
if(Player[i].Sex==1) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option;
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
printf("%d-%s,请你选择离间的第二个目标\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消发动\n");
for(int i=1;i<=TotalPeopleNumber;i++){
if(i==SeatNumber) continue;
if(Dead[i]) continue;
if(i==Aim[1]) continue;
if(Player[i].Sex==1) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
return;
}
void ChooseCyanPackAim(int SeatNumber){//选择青囊目标
printf("%d-%s,请选择你青囊的目标\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消发动\n");
for(int i=1;i<=TotalPeopleNumber;i++){
if(Dead[i]) continue;
if(Player[i].BloodNow==Player[i].BloodCeiling) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option;
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
return;
}
void ChooseExciteSoldierAim(int SeatNumber){//选择激将的目标
printf("%d-%s,请选择您激将的目标\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Scope=AttackScope(SeatNumber);
int id=SeatNumber;
printf("0-放弃发动\n");
for(int i=1;i<TotalPeopleNumber;i++){
if(++id>TotalPeopleNumber) id=1;
if(Dead[id]) continue;
if(Player[SeatNumber].Aim[id]>Scope) continue;
printf("%d-%s\n",id,Player[id].WarriorCard.Name);
}
int Option;
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
return;
}
void ChooseWuSageAim(int SeatNumber,int Number){//选择武圣目标
int Option=OneCardOption(SeatNumber,Number);
int Scope=1;
if(Option!=Player[SeatNumber].HandCardNumber+1) Scope=AttackScope(SeatNumber);
bool FangTianHuaJi=0;
if(Player[SeatNumber].EquipmentExist[1]==1&&Player[SeatNumber].Equipment[1].Type==28&&Player[SeatNumber].HandCardNumber==1&&Option<=Player[SeatNumber].HandCardNumber) FangTianHuaJi=1;
printf("%d-%s,请选择您武圣发动的目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++)
if(i!=SeatNumber&&!Dead[i]){
if(Player[i].WarriorCard.Number==12&&EmptyCity(i)) continue;//诸葛亮--空城
if(Player[SeatNumber].Aim[i]>Scope) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
if(FangTianHuaJi==1){//第二个目标
printf("%d-%s,请选择您武圣发动的第二个目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++)
if(i!=SeatNumber&&!Dead[i]&&i!=Aim[1]){
if(Player[i].WarriorCard.Number==12&&EmptyCity(i)) continue;//诸葛亮--空城
if(Player[SeatNumber].Aim[i]>Scope) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
}
if(FangTianHuaJi==1){//第三个目标
printf("%d-%s,请选择您武圣发动的第三个目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++)
if(i!=SeatNumber&&!Dead[i]&&i!=Aim[1]&&i!=Aim[2]){
if(Player[i].WarriorCard.Number==12&&EmptyCity(i)) continue;//诸葛亮--空城
if(Player[SeatNumber].Aim[i]>Scope) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
}
return;
}
void ChooseKillAim(int SeatNumber){//选择杀的目标
int Scope=AttackScope(SeatNumber);
bool FangTianHuaJi=0;
if(Player[SeatNumber].EquipmentExist[1]==1&&Player[SeatNumber].Equipment[1].Type==28&&Player[SeatNumber].HandCardNumber==1) FangTianHuaJi=1;
printf("%d-%s,请您选择杀的目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++)
if(i!=SeatNumber&&!Dead[i]){
if(Player[i].WarriorCard.Number==12&&EmptyCity(i)) continue;//诸葛亮--空城
if(Player[SeatNumber].Aim[i]<=Scope||skyjustice)
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option;
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
if(skyjustice==1||FangTianHuaJi==1){//第二个目标
printf("%d-%s,请您选择杀的第2个目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++)
if(i!=SeatNumber&&!Dead[i]&&i!=Aim[1]){
if(Player[i].WarriorCard.Number==12&&EmptyCity(i)) continue;//诸葛亮--空城
if(Player[SeatNumber].Aim[i]<=Scope||skyjustice)
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
}
if(FangTianHuaJi==1){//第三个目标
printf("%d-%s,请您选择杀的第3个目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++)
if(i!=SeatNumber&&!Dead[i]&&i!=Aim[1]&&i!=Aim[2]){
if(Player[i].WarriorCard.Number==12&&EmptyCity(i)) continue;//诸葛亮--空城
if(Player[SeatNumber].Aim[i]<=Scope||skyjustice)
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
}
if(FangTianHuaJi==1&&skyjustice==1){//第四个目标
printf("%d-%s,请您选择杀的第4个目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++)
if(i!=SeatNumber&&!Dead[i]&&i!=Aim[1]&&i!=Aim[2]&&i!=Aim[3]){
if(Player[i].WarriorCard.Number==12&&EmptyCity(i)) continue;//诸葛亮--空城
if(Player[SeatNumber].Aim[i]<=Scope||skyjustice)
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
}
return;
}
void ChooseDuelAim(int SeatNumber,int Color){//选择决斗目标
printf("%d-%s,请您选择决斗的目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++){
if(i==SeatNumber) continue;
if(Dead[i]) continue;
if(Player[i].WarriorCard.Number==50&&Color>=3) continue;//贾诩--帷幕
if(Player[i].WarriorCard.Number==12&&EmptyCity(i)) continue;//诸葛亮--空城
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option;
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
}
void ChooseWreckBridgeAim(int SeatNumber,int Color){//选择过河拆桥目标
printf("%d-%s,请您选择过河拆桥的目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++)
if(!Dead[i]&&i!=SeatNumber){
if(Player[i].WarriorCard.Number==50&&Color>=3) continue;//贾诩--帷幕
int Number=Player[i].HandCardNumber;
for(int j=1;j<=4;j++)
if(Player[i].EquipmentExist[j]==1) Number++;
Number+=Player[i].JudgeCardNumber;
if(Number==0) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option;
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
return;
}
void ChooseStealSheepAim(int SeatNumber,int Color){//选择顺手牵羊目标
printf("%d-%s,请您选择顺手牵羊的目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++)
if(!Dead[i]&&i!=SeatNumber){
if(Player[i].WarriorCard.Number==50&&Color>=3) continue;//贾诩--帷幕
if(Player[i].WarriorCard.Number==39) continue;//陆逊--谦逊
int Number=Player[i].HandCardNumber;
for(int j=1;j<=4;j++)
if(Player[i].EquipmentExist[j]==1) Number++;
Number+=Player[i].JudgeCardNumber;
if(Number==0) continue;
if(Player[SeatNumber].Aim[i]<=1||Player[SeatNumber].WarriorCard.Number==15)//黄月英--奇才
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option;
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
return;
}
void ChooseFireAttackAim(int SeatNumber,int Color){//选择火攻目标
printf("%d-%s,请您选择火攻的目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++){
if(Dead[i]) continue;
if(Player[i].WarriorCard.Number==50&&Color>=3) continue;//贾诩--帷幕
int Number=Player[i].HandCardNumber;
if(i==SeatNumber) Number--;
if(Number==0) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option;
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
return;
}
void ChooseBorrowKnifeAim(int SeatNumber,int Color){//选择借刀杀人目标
printf("%d-%s,请您选择借刀杀人的目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++){
if(Dead[i]) continue;
if(i==SeatNumber) continue;
if(Player[i].WarriorCard.Number==50&&Color>=3) continue;//贾诩--帷幕
if(!Player[i].EquipmentExist[1]) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option;
scanf("%d",&Option);
if(Option==0) return;
printf("%d-%s,请您选择该目标杀的目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
int Scope=AttackScope(Option);
for(int i=1;i<=TotalPeopleNumber;i++){
if(Dead[i]) continue;
if(i==Option) continue;
if(Player[i].WarriorCard.Number==12&&EmptyCity(i)==1) continue;//诸葛亮--空城
if(i==Aim[1]) continue;
if(Player[Option].Aim[i]>Scope) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option1;
scanf("%d",&Option1);
if(Option1==0) return;
Aim[++AimNumber]=Option;
Aim[++AimNumber]=Option1;
return;
}
void ChooseForgetShuAim(int SeatNumber,int Color){//选择乐不思蜀目标
printf("%d-%s,请您选择乐不思蜀的目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++){
if(Dead[i]) continue;
if(i==SeatNumber) continue;
if(Player[i].WarriorCard.Number==50&&Color>=3) continue;//贾诩--帷幕
if(Player[i].JudgeCardExist[1]==1) continue;//已经有乐不思蜀
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option;
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
return;
}
void ChooseNoGrainNoSoldierAim(int SeatNumber,int Color){//选择兵粮寸断目标
printf("%d-%s,请您选择兵粮寸断的目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++){
if(Dead[i]) continue;
if(i==SeatNumber) continue;
if(Player[i].WarriorCard.Number==50&&Color>=3) continue;//贾诩--帷幕
if(Player[i].JudgeCardExist[2]==1) continue;//已经有兵粮寸断
if(Player[SeatNumber].Aim[i]<=1||Player[SeatNumber].WarriorCard.Number==15)//黄月英--奇才
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option;
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
return;
}
bool Recoin(int SeatNumber){//铁索连环--重铸询问
printf("%d-%s,请问您是否选择重铸?1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==1) return 1;
else return 0;
}
void ChooseIronChainAim(int SeatNumber,int Color){//选择铁索连环目标
printf("%d-%s,请您选择第一个铁索连环的目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++){
if(Dead[i]) continue;
if(Player[i].WarriorCard.Number==50&&Color>=3) continue;//贾诩--帷幕
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option;
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
printf("%d-%s,请您选择第二个铁索连环的目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=TotalPeopleNumber;i++){
if(Dead[i]) continue;
if(Player[i].WarriorCard.Number==50&&Color>=3) continue;//贾诩--帷幕
if(i==Aim[1]) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
scanf("%d",&Option);
if(Option==0) return;
Aim[++AimNumber]=Option;
return;
}
void Kill(Damageinfo damage,int ToNumber){//杀
if(Dead[damage.FromMember]||Dead[ToNumber]) return;
if(Player[damage.FromMember].WarriorCard.Number==48)//小乔--红颜
if(damage.Color==3) damage.Color=1;
if(Player[ToNumber].WarriorCard.Number==6)//孙策--激昂
if(damage.Color<=2) EmotionUp(ToNumber);
if(Player[damage.FromMember].EquipmentExist[1]==1&&Player[damage.FromMember].Equipment[1].Type==31)//朱雀羽扇
if(damage.Type==1) damage.Attribute=damage.Type=2;
if(Player[damage.FromMember].EquipmentExist[1]==1&&Player[damage.FromMember].Equipment[1].Type==24)//雌雄双股剑
if(Player[damage.FromMember].Sex!=Player[ToNumber].Sex) TwoSexSword(damage.FromMember,ToNumber);
//雌雄双股剑优先级为指定目标后,所以在流离之前
if(Player[ToNumber].WarriorCard.Number==44){//大乔--流离
int aim=Homeless(damage.FromMember,ToNumber);
if(aim) ToNumber=aim;
}
if(Player[ToNumber].WarriorCard.Number==2)//刘禅--享乐
if(EnjoyLife(damage.FromMember)==1) return;
if(Player[ToNumber].EquipmentExist[2]==1&&Player[ToNumber].Equipment[2].Number==34)//仁王盾
if(!BronzeSword(damage.FromMember))
if(damage.Color>=3) return;
if(Player[ToNumber].EquipmentExist[2]==1&&Player[ToNumber].Equipment[2].Number==36)//藤甲
if(!BronzeSword(damage.FromMember))
if(damage.Type==1) return;
if(Player[damage.FromMember].WarriorCard.Number==14)//马超--铁骑
if(IronHorse(damage.FromMember)==true){
KillDamage(damage,ToNumber);
return;
}
if(Player[damage.FromMember].WarriorCard.Number==17)//黄忠--烈弓
if(ViolentBow(damage.FromMember,ToNumber)==true){
KillDamage(damage,ToNumber);
return;
}
if(Player[damage.FromMember].WarriorCard.Number==56){//吕布--无双
printf("%d-%s发动了无双,请%d-%s(你)依次打出两张闪\n",damage.FromMember,Player[damage.FromMember].WarriorCard.Name,ToNumber,Player[ToNumber].WarriorCard.Name);
if(AskFlash(damage,ToNumber)==true)
if(AskFlash(damage,ToNumber)==true){
AskFlashSuccess(damage,ToNumber);
return;
}
}
else{//普通杀
printf("%d-%s,对%d-%s(你)打出了杀\n",damage.FromMember,Player[damage.FromMember].WarriorCard.Name,ToNumber,Player[ToNumber].WarriorCard.Name);
if(AskFlash(damage,ToNumber)==true){
AskFlashSuccess(damage,ToNumber);
return;
}
}
KillDamage(damage,ToNumber);
}
void Duel(Damageinfo damage,int FromNumber,int ToNumber){//决斗
int Side=0;
printf("%d-%s,%d-%s对你发起了决斗\n",ToNumber,Player[ToNumber].WarriorCard.Name,FromNumber,Player[FromNumber].WarriorCard.Name);
while(1){
Side^=1;
if(Side==1){
Damageinfo damage1=AskKill(ToNumber);
if(damage1.FromCardNumber){
if(Player[FromNumber].WarriorCard.Number==56){//吕布--无双
printf("吕布发动了无双\n");
Damageinfo damage2=AskKill(ToNumber);
if(damage2.FromCardNumber) continue;
}
else continue;
}
if(Player[FromNumber].WarriorCard.Number==28&&naked==1) damage.Number++;//许褚--裸衣
damage.FromMember=FromNumber;
Damage(damage,ToNumber,0);
return;
}
else{
Damageinfo damage1=AskKill(FromNumber);
if(damage1.FromCardNumber){
if(Player[ToNumber].WarriorCard.Number==56){//吕布--无双
printf("吕布发动了无双\n");
Damageinfo damage2=AskKill(FromNumber);
if(damage2.FromCardNumber) continue;
}
else continue;
}
//if(Player[ToNumber].WarriorCard.Number==28&&naked==1) damage.Number++;//许褚--裸衣(该情况不可能发生,许褚的回合许褚不会成为决斗的目标)
damage.FromMember=ToNumber;
Damage(damage,FromNumber,0);
return;
}
}
}
void SouthSavageAttack(Damageinfo damage){//南蛮入侵
int id=damage.FromMember;
for(int i=1;i<TotalPeopleNumber;i++){
if(++id>TotalPeopleNumber) id=1;
if(Dead[id]) continue;
if(Player[id].WarriorCard.Number==20) continue;//祝融--巨象
if(Player[id].WarriorCard.Number==21) continue;//孟获--祸首
if(Player[id].WarriorCard.Number==50&&damage.Color>=3) continue;//贾诩--帷幕
if(Player[id].EquipmentExist[2]==1&&Player[id].Equipment[2].Number==36) continue;//藤甲
printf("%d-%s发动了南蛮入侵,请%d-%s打出杀\n",damage.FromMember,Player[damage.FromMember].WarriorCard.Name,id,Player[id].WarriorCard.Name);
if(AskUnassailable()) continue;
Damageinfo damagekill=AskKill(id);
if(damagekill.FromCardNumber) continue;
Damage(damage,id,0);
}
if(OnField[20]==true) HugeElephant(damage,OnField[20]);
}
void ThousandsArrowsFalling(Damageinfo damage){//万箭齐发
int id=damage.FromMember;
for(int i=1;i<TotalPeopleNumber;i++){
if(++id>TotalPeopleNumber) id=1;
if(Dead[id]) continue;
if(Player[id].WarriorCard.Number==50&&damage.Color>=3) continue;//贾诩--帷幕
if(Player[id].EquipmentExist[2]==1&&Player[id].Equipment[2].Number==36) continue;//藤甲
printf("%d-%s发动了万箭齐发,请%d-%s打出闪\n",damage.FromMember,Player[damage.FromMember].WarriorCard.Name,id,Player[id].WarriorCard.Name);
if(AskUnassailable()) continue;
if(AskFlash(damage,id)) continue;
Damage(damage,id,0);
}
}
void GrainHarvest(int SeatNumber,int Color){//五谷丰登
int id=SeatNumber;
bool GrainExist[13];
GameCard GrainCard[13];
int CardNumber=TotalPeopleNumber-DeadPeopleNumber;
for(int i=1;i<=CardNumber;i++){
GrainCard[i]=TakeOneGameCard();
GrainExist[i]=1;
}
for(int i=1;i<=TotalPeopleNumber;i++){
if(i!=1) id++;
if(id>TotalPeopleNumber) id=1;
if(Dead[id]) continue;
if(Player[id].WarriorCard.Number==50&&Color>=3) continue;//贾诩--帷幕
printf("%d-%s发动了五谷丰登,请%d-%s您选择一张牌:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name,id,Player[id].WarriorCard.Name);
if(AskUnassailable()) continue;
for(int j=1;j<=CardNumber;j++)
if(GrainExist[j])
{
printf("%d-",j);
ShowOneGameCard(GrainCard[j]);
}
int Option;
scanf("%d",&Option);
GrainExist[Option]=0;
Player[id].HandCard[++Player[id].HandCardNumber]=GrainCard[Option];
}
}
void PeachGarden(int SeatNumber,int Color){//桃园结义
int id=SeatNumber;
for(int i=1;i<=TotalPeopleNumber;i++){
if(i!=1) id++;
if(id>TotalPeopleNumber) id=1;
if(Dead[id]) continue;
if(Player[i].WarriorCard.Number==50&&Color>=3) continue;//贾诩--帷幕
if(Player[id].BloodNow==Player[id].BloodCeiling) continue;
printf("桃园结义即将对%d-%s生效\n",id,Player[id].WarriorCard.Name);
if(AskUnassailable()) continue;
Player[id].BloodNow++;
}
}
void WreckBridge(int FromNumber,int ToNumber){//过河拆桥
printf("%d-%s,请您选择你过河拆桥的牌:\n",FromNumber,Player[FromNumber].WarriorCard.Name);
ShowOnesAllCardBackAndJudgeCard(ToNumber);
int Option;
scanf("%d",&Option);
TableCard[++TableCardNumber]=OnesCard(ToNumber,Option);
OneLoseCard(ToNumber,Option);
return;
}
void StealSheep(int FromNumber,int ToNumber){//顺手牵羊
printf("%d-%s,请您选择你顺手牵羊的牌:\n",FromNumber,Player[FromNumber].WarriorCard.Name);
ShowOnesAllCardBackAndJudgeCard(ToNumber);
int Option;
scanf("%d",&Option);
Player[FromNumber].HandCard[++Player[FromNumber].HandCardNumber]=OnesCard(ToNumber,Option);
OneLoseCard(ToNumber,Option);
return;
}
bool BorrowKnife(int SeatNumber,int FromNumber,int ToNumber){//借刀杀人
printf("%d-%s,请你对%d-%s打出一张杀,否则您需要将您的武器交给%d-%s\n",FromNumber,Player[FromNumber].WarriorCard.Name,ToNumber,Player[ToNumber].WarriorCard.Name,SeatNumber,Player[SeatNumber].WarriorCard.Name);
Damageinfo damage;
damage.FromCardNumber=0;
damage=AskKill(FromNumber);
if(!damage.FromCardNumber) return false;
damage.FromMember=FromNumber;
Kill(damage,ToNumber);
return true;
}
void CardAppear(int SeatNumber){//无中生有
GiveGameCardTo(SeatNumber,2);//摸两张牌
}
void FireAttack(Damageinfo damage,int FromNumber,int ToNumber){//火攻
if(Player[FromNumber].WarriorCard.Number==15) FocusWisdom(FromNumber);//黄月英--集智
printf("%d-%s,%d-%s对您发动了火攻,请您展示一张手牌",ToNumber,Player[ToNumber].WarriorCard.Name,FromNumber,Player[FromNumber].WarriorCard.Name);
ShowOnesHandCard(ToNumber);
int Option;
scanf("%d",&Option);
printf("%d-%s火攻展示:",ToNumber,Player[ToNumber].WarriorCard.Name);
ShowOneGameCard(Player[ToNumber].HandCard[Option]);
printf("%d-%s,请您弃掉一张与此牌颜色相同的牌,对其造成一点火焰伤害\n",FromNumber,Player[FromNumber].WarriorCard.Name);
printf("0-取消\n");
for(int i=1;i<=Player[FromNumber].HandCardNumber;i++){
int Fromcolor=Player[FromNumber].HandCard[i].Color;
if(Fromcolor==3&&Player[FromNumber].WarriorCard.Number==48) Fromcolor=1;//小乔--红颜
int Tocolor=Player[ToNumber].HandCard[Option].Color;
if(Tocolor==3&&Player[ToNumber].WarriorCard.Number==48) Tocolor=1;//小乔--红颜
if(Fromcolor!=Tocolor) continue;
printf("%d-",i);
ShowOneGameCard(Player[FromNumber].HandCard[i]);
}
scanf("%d",&Option);
if(Option==0) return;
TableCard[++TableCardNumber]=Player[FromNumber].HandCard[Option];
OneLoseCard(FromNumber,Option);
Damage(damage,ToNumber,0);
return;
}
void IronChain(int SeatNumber){//铁索连环
Across[SeatNumber]^=1;
return;
}
void ForgetShu(int ToNumber,GameCard Shu){//乐不思蜀
Player[ToNumber].JudgeArea[++Player[ToNumber].JudgeCardNumber]=Shu;
Player[ToNumber].JudgeCardExist[1]=1;
return;
}
void NoGrainNoSoldier(int ToNumber,GameCard Soldier){//兵粮寸断
Player[ToNumber].JudgeArea[++Player[ToNumber].JudgeCardNumber]=Soldier;
Player[ToNumber].JudgeCardExist[2]=1;
return;
}
void Thunder(int SeatNumber,GameCard Thunder){//闪电
Player[SeatNumber].JudgeArea[++Player[SeatNumber].JudgeCardNumber]=Thunder;
Player[SeatNumber].JudgeCardExist[3]=1;
return;
}
void EatPeach(int SeatNumber){//吃桃
Player[SeatNumber].BloodNow++;
if(Player[SeatNumber].WarriorCard.Number==47){//周泰--不屈
}
}
void DrinkWine(int SeatNumber){//酒
Player[SeatNumber].Wine=2;
}
void ReverseScheme(int SeatNumber){//周瑜--反间
printf("%d-%s,请你选择反间的目标:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消发动\n");
for(int i=1;i<=TotalPeopleNumber;i++){
if(Dead[i]) continue;
if(i==SeatNumber) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option;
scanf("%d",&Option);
if(Option==0) return;
printf("%d-%s,%d-%s对你发起了反间,请你选择一种花色\n",Option,Player[Option].WarriorCard.Name,SeatNumber,Player[SeatNumber].WarriorCard.Name);
for(int i=1;i<=4;i++) printf("%s\n",color(i));
int ColorOption;
scanf("%d",&ColorOption);
printf("%d-%s,请你选择一张牌,若该牌的花色与你选择的花色不同,您受到%d-%s对您造成的一点伤害\n",Option,Player[Option].WarriorCard.Name,SeatNumber,Player[SeatNumber].WarriorCard.Name);
ShowOnesHandCardBack(SeatNumber);
int Option1;
scanf("%d",&Option1);
if(Player[SeatNumber].HandCard[Option1].Color!=ColorOption)
{
Damageinfo damage;
damage.Attribute=1;
damage.Type=SK+2;
damage.Number=1;
damage.FromMember=SeatNumber;
Damage(damage,Option,0);
}
printf("反间的牌:");ShowOneGameCard(OnesCard(SeatNumber,Option1));
Player[Option].HandCard[++Player[Option].HandCardNumber]=OnesCard(SeatNumber,Option1);
OneLoseCard(SeatNumber,Option1);
ReverseSchemeChance--;
}
void SurpriseAttack(int SeatNumber){//甘宁--奇袭(待升级)
printf("%d-%s,您发动了奇袭,请选择一张黑色牌当做过河拆桥使用\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消发动\n");
ShowOnesAllBlackCard(SeatNumber);
int Option;
scanf("%d",&Option);
if(Option==0) return;
AimNumber=0;
ChooseWreckBridgeAim(SeatNumber,OnesCard(SeatNumber,Option).Color);
if(!AimNumber) return;
TableCard[++TableCardNumber]=OnesCard(SeatNumber,Option);
OneLoseCard(SeatNumber,Option);
WreckBridge(SeatNumber,Aim[1]);
return;
}
void Kindheartedness(int SeatNumber){//刘备--仁德
printf("%d-%s,请你选择若干张牌并交给一个目标\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Number=Player[SeatNumber].HandCardNumber;
int Choose[Number+1];
memset(Choose,0,sizeof(Choose));
while(1){
printf("0-取消发动\n");
for(int i=1;i<=Number;i++){
printf("%d-",i);
if(Choose[i]) printf("(已选)");
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
printf("%d-选择目标\n",Number+1);
int Option;
scanf("%d",&Option);
if(Option==0) return;
if(Option==Number+1) break;
if(Choose[Option]) Choose[Option]=0;
else Choose[Option]=Player[SeatNumber].HandCard[Option].Number;
}
printf("0-取消发动\n");
for(int i=1;i<=TotalPeopleNumber;i++){
if(i==SeatNumber) continue;
if(Dead[i]) continue;
printf("%d-%s\n",i,Player[i].WarriorCard.Name);
}
int Option;
scanf("%d",&Option);
if(Option==0) return;
for(int i=1;i<=Number;i++)
if(Choose[i]){
Player[Option].HandCard[++Player[Option].HandCardNumber]=OnesCardNumber(SeatNumber,Choose[i]);
OneLoseNumber(SeatNumber,Choose[i]);
if(++KindheartednessNumber==2) BloodUp(SeatNumber);
}
return;
}
void Alienate(int SeatNumber){//貂蝉--离间
AimNumber=0;
ChooseAlienateAim(SeatNumber);
if(AimNumber!=2)
printf("%d-%s,请你弃掉一张手牌,视为%d对%d发动了决斗\n",SeatNumber,Player[SeatNumber].WarriorCard.Name,Aim[1],Aim[2]);
printf("0-放弃发动\n");
ShowOnesAllCard(SeatNumber);
int Option;
if(Option==0) return;
TableCard[++TableCardNumber]=OnesCard(SeatNumber,Option);
OneLoseCard(SeatNumber,Option);
Damageinfo damage;
damage.Attribute=1;
damage.Type=10;
damage.Number=1;
damage.Color=OnesCard(SeatNumber,Option).Color;
damage.FromCardNumber=1;
damage.Card[1]=OnesCard(SeatNumber,Option).Number;
if(Player[Aim[1]].WarriorCard.Number==6)//孙策--激昂
if(damage.Color<=2) EmotionUp(Aim[1]);
if(Player[Aim[2]].WarriorCard.Number==6)//孙策--激昂
if(damage.Color<=2) EmotionUp(Aim[2]);
Duel(damage,Aim[1],Aim[2]);
AlienateChance--;
return;
}
void Marry(int SeatNumber){//孙尚香--结姻
int Number=Player[SeatNumber].HandCardNumber;
int Choose[Number+1];
int ChooseNumber=0;
memset(Choose,0,sizeof(Choose));
while(1){
printf("0-取消发动\n");
for(int i=1;i<=Number;i++){
printf("%d-",i);
if(Choose[i]) printf("(已选)");
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
if(ChooseNumber==2) printf("%d-确认\n",Number+1);
int Option;
scanf("%d",&Option);
if(Option==0) return;
if(Option==Number+1) break;
if(Choose[Option]){
Choose[Option]=0;
ChooseNumber--;
}
else{
if(ChooseNumber==2) continue;
Choose[Option]=Player[SeatNumber].HandCard[Option].Number;
ChooseNumber++;
}
}
AimNumber=0;
ChooseMarryAim(SeatNumber);
if(!AimNumber) return;
for(int i=1;i<=Number;i++)
if(Choose[i]) OneLoseNumber(SeatNumber,Choose[i]);
BloodUp(Aim[1]);
BloodUp(SeatNumber);
MarryChance=0;
return;
}
void NationBeauty(int SeatNumber){//大乔--国色
printf("%d-%s,请选择一张方块牌当做乐不思蜀打出\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
printf("0-取消发动\n");
ShowOnesAllSquareCard(SeatNumber);
int CardOption;
scanf("%d",&CardOption);
if(CardOption==0) return;
AimNumber=0;
ChooseForgetShuAim(SeatNumber,2);
if(!AimNumber) return;
ForgetShu(Aim[1],OnesCard(SeatNumber,CardOption));
OneLoseCard(SeatNumber,CardOption);
}
void BotherMuscle(int SeatNumber){//黄盖--苦肉
printf("%d-%s,您确认失去一点体力,并且获得两张牌吗? 1-确认 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return;
BloodRun(SeatNumber,1);
if(Dead[SeatNumber]) return;
GiveGameCardTo(SeatNumber,2);
}
void Balance(int SeatNumber){//孙权--制衡
int Number=Player[SeatNumber].HandCardNumber;
int Choose[Number+5];
int ChooseNumber=0;
memset(Choose,0,sizeof(Choose));
while(1){
printf("手牌:\n");
printf("0-取消发动\n");
for(int i=1;i<=Number;i++){
printf("%d-",i);
if(Choose[i]) printf("(已选)");
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
printf("装备区:\n");
for(int i=1;i<=4;i++)
if(Player[SeatNumber].EquipmentExist[i]==1){
printf("%d-",i+Number);
if(Choose[i+Number]) printf("(已选)");
ShowOneGameCard(Player[SeatNumber].Equipment[i]);
}
if(ChooseNumber>=1) printf("%d-确认\n",Number+5);
int Option;
scanf("%d",&Option);
if(Option==0) return;
if(Option==Number+5) break;
if(Choose[Option]){
Choose[Option]=0;
ChooseNumber--;
}
else{
Choose[Option]=OnesCard(SeatNumber,Option).Number;
ChooseNumber++;
}
}
int CardNumber=0;
for(int i=1;i<=Number+4;i++)
if(Choose[i]){
OneLoseNumber(SeatNumber,Choose[i]);
CardNumber++;
}
GiveGameCardTo(SeatNumber,CardNumber);
BalanceChance=0;
}
void LookStar(int SeatNumber){//诸葛亮--观星 觉醒姜维--观星(待升级)
printf("%d-%s,您是否发动观星 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return;
int StarNumber=0;
for(int i=1;i<=TotalPeopleNumber;i++)
if(!Dead[i]) StarNumber++;
GameCard LookStar[6];
StarNumber=min(StarNumber,5);
for(int i=1;i<=StarNumber;i++) LookStar[i]=TakeOneGameCard();
printf("%d-%s,您可以分配任意数量的牌在堆顶或堆底:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
for(int i=1;i<=StarNumber;i++){
printf("第%d张:",i);
ShowOneGameCard(LookStar[i]);
}
int Top=1;
int Bottom=1;
bool Star[6];
memset(Star,0,sizeof(Star));
for(int i=1;i<=StarNumber;i++){
int Option;
if(Top){
printf("%d-%s,请输入您第%d张要放到堆顶的牌:",SeatNumber,Player[SeatNumber].WarriorCard.Name,Top);
printf("0-开始把牌堆底\n");
for(int k=1;k<=StarNumber;k++)
if(!Star[k]) printf("%d-第%d张 ",k,k);
scanf("%d",&Option);
if(Option==0){
Top=0;
i--;
}
else{
GameCardNumber++;
for(int k=1;k<Top;k++)
GameCardHeap[GameCardNumber-k+1]=GameCardHeap[GameCardNumber-k];
GameCardHeap[GameCardNumber-Top+1]=LookStar[Option];
Star[Option]=true;
Top++;
}
}
else{
printf("%d-%s,请输入你第%d张要放到堆底的牌:",SeatNumber,Player[SeatNumber].WarriorCard.Name,Bottom);
for(int k=1;k<=StarNumber;k++)
if(!Star[k]) printf("%d-第%d张 ",k,k);
printf("\n");
scanf("%d",&Option);
GameCardNumber++;
for(int i=GameCardNumber;i>=2;i--)
GameCardHeap[i]=GameCardHeap[i-1];
GameCardHeap[1]=LookStar[Option];
Star[Option]=true;
Bottom++;
}
}
}
void LuoShen(int SeatNumber){//询问甄姬--洛神
while(1){
printf("%d-%s,是否发动洛神? 1-是 2-否\n",SeatNumber,Player[SeatNumber].WarriorCard.Name);
int Option;
scanf("%d",&Option);
if(Option==2) return;
Judge(SeatNumber);
if(JudgeCard.Color>=3){//结果为黑色
Player[SeatNumber].HandCard[++Player[SeatNumber].HandCardNumber]=JudgeCard;//将判定牌加入手牌
printf("生效\n");
}
else{//结果为红色
TableCard[++TableCardNumber]=JudgeCard;
printf("失效\n");
ClearTable();
return;
}
}
}
void ShowAllPlayersInformation()
{
for(int i=1;i<=TotalPeopleNumber;i++){
printf("%d-%s",i,Player[i].WarriorCard.Name);
if(Across[i]==1) printf("(铁索)");
printf(" 血量:%d/%d 手牌数:%d 身份:%s ",Player[i].BloodNow,Player[i].BloodCeiling,Player[i].HandCardNumber,identity(Player[i].Identity));
if(Dead[i]) printf("(阵亡)");
else
{
printf("武器牌:");
if(Player[i].EquipmentExist[1]) printf("%s %s%d ",Player[i].Equipment[1].Name,color(Player[i].Equipment[1].Color),Player[i].Equipment[1].Point);
printf("护具牌:");
if(Player[i].EquipmentExist[2]) printf("%s %s%d ",Player[i].Equipment[2].Name,color(Player[i].Equipment[2].Color),Player[i].Equipment[2].Point);
printf("防御马:");
if(Player[i].EquipmentExist[3]) printf("%s %s%d ",Player[i].Equipment[3].Name,color(Player[i].Equipment[3].Color),Player[i].Equipment[3].Point);
printf("进攻马:");
if(Player[i].EquipmentExist[4]) printf("%s %s%d",Player[i].Equipment[4].Name,color(Player[i].Equipment[4].Color),Player[i].Equipment[4].Point);
}
printf("\n");
}
}
void BeginningStage(int SeatNumber){//SeatNumber号位回合开始阶段
printf("回合开始阶段\n");
if(Player[SeatNumber].WarriorCard.Number==6) SoulPosture(SeatNumber);//询问孙策--魂姿
if(Player[SeatNumber].WarriorCard.Number==31) LuoShen(SeatNumber);//询问甄姬--洛神
if(Player[SeatNumber].WarriorCard.Number==12) LookStar(SeatNumber);//询问诸葛亮--观星
if(Player[SeatNumber].WarriorCard.Number==6&&Player[SeatNumber].WarriorCard.Wakeup==1) BrilliantSoul(SeatNumber);//询问觉醒孙策--英魂
if(Player[SeatNumber].WarriorCard.Number==36) BrilliantSoul(SeatNumber);//询问孙坚--英魂
ClearTable();
printf("回合开始阶段结束\n");
}
bool TransferThunder(int SeatNumber,GameCard Thunder){//闪电转移
int id=SeatNumber;
for(int i=1;i<=TotalPeopleNumber;i++){//找到第一个没挂闪电的人
if(++id>TotalPeopleNumber) id=1;
if(Dead[id]) continue;
if(Player[id].JudgeCardExist[3]==1) continue;
if(Player[id].WarriorCard.Number==50&&Thunder.Color>=3) continue;//贾诩--帷幕
for(int j=Player[id].JudgeCardNumber;j>=1;j--)
Player[id].JudgeArea[j+1]=Player[id].JudgeArea[j];
Player[id].JudgeCardNumber++;
Player[id].JudgeArea[1]=Thunder;//SeatNumber的闪电转移至id判定牌堆底
Player[id].JudgeCardExist[3]=1;
if(id==SeatNumber) return true;
else return false;
}
}
void JudgingStage(int SeatNumber){//SeatNumber号位开始判定阶段
if(Dead[SeatNumber]) return;
//张郃--巧变
//夏侯渊--神速
if(JumpJudging){//需要跳过判定阶段
JumpJudging=0;
return;
}
printf("判定阶段\n");
bool thunder=0;
while(Player[SeatNumber].JudgeCardNumber){//判定判定区的牌
if(Player[SeatNumber].JudgeCardNumber==1&&thunder==1) break;
GameCard JudgedCard=Player[SeatNumber].JudgeArea[Player[SeatNumber].JudgeCardNumber--];
if(JudgedCard.Type==19||JudgedCard.NationBeauty==1){//SeatNumber玩家判定区第i张牌是乐不思蜀或者国色
Player[SeatNumber].JudgeCardExist[1]=0;//乐不思蜀离开判定区
TableCard[++TableCardNumber]=JudgedCard;//乐不思蜀/国色转移至桌子
if(AskUnassailable()) continue;
printf("对乐不思蜀进行判定:\n");
Judge(SeatNumber);
int color=JudgeCard.Color;
if(Player[SeatNumber].WarriorCard.Number==48&&color==3) color=1;
if(color==1) printf("乐不思蜀失效\n");
else{
JumpOutCard=1;
printf("乐不思蜀生效\n");
}
if(Player[SeatNumber].WarriorCard.Number==29) GodJealous(SeatNumber);//郭嘉--天妒拿走判定牌
else TableCard[++TableCardNumber]=JudgeCard;//将判定牌放入桌面
}
if(JudgedCard.Type==20||JudgedCard.NoGrain==1){//SeatNumber玩家判定区第i张牌是兵粮寸断或者断粮
Player[SeatNumber].JudgeCardExist[2]=0;//兵粮寸断离开判定区
TableCard[++TableCardNumber]=JudgedCard;//兵粮寸断/断粮转移至桌子
if(AskUnassailable()) continue;
printf("对兵粮寸断进行判定:\n");
Judge(SeatNumber);
int color=JudgeCard.Color;
if(Player[SeatNumber].WarriorCard.Number==48&&color==3) color=1;
if(color==4) printf("兵粮寸断失效\n");
else{
JumpInCard=1;
printf("兵粮寸断生效\n");
}
if(Player[SeatNumber].WarriorCard.Number==29) GodJealous(SeatNumber);//郭嘉--天妒拿走判定牌
else TableCard[++TableCardNumber]=JudgeCard;
}
if(JudgedCard.Type==21){//SeatNumber玩家判定区第i张牌是闪电
Player[SeatNumber].JudgeCardExist[3]=0;//闪电离开判定区
printf("对闪电进行判定: \n");
if(AskUnassailable()){
thunder=TransferThunder(SeatNumber,JudgedCard);
continue;
}
Judge(SeatNumber);
int color=JudgeCard.Color;
int point=JudgeCard.Point;
if(Player[SeatNumber].WarriorCard.Number==48&&color==3) color=1;
if(color==3&&point>=2&&point<=9){
printf("闪电生效\n");
TableCard[++TableCardNumber]=JudgedCard;//闪电转移至桌子
Damageinfo damage;
damage.Attribute=3;
damage.Type=21;
damage.Number=3;
damage.FromMember=0;
damage.FromCardNumber=0;
Damage(damage,SeatNumber,0);//造成三点闪电伤害
if(Dead[SeatNumber]){
ClearTable();
return;
}
}
else thunder=TransferThunder(SeatNumber,JudgedCard);
if(Player[SeatNumber].WarriorCard.Number==29) GodJealous(SeatNumber);//郭嘉--天妒拿走判定牌
else TableCard[++TableCardNumber]=JudgeCard;
}
}
ClearTable();
printf("判定阶段结束\n");
}
void InCardStage(int SeatNumber){//SeatNumber号位摸牌阶段
if(Dead[SeatNumber]) return;
//张郃--巧变
if(JumpInCard==1){//需要跳过摸牌阶段
JumpInCard=0;
return;
}
printf("摸牌阶段\n");
if(Player[SeatNumber].WarriorCard.Number==28)
if(Naked(SeatNumber)==true) return;//许褚--裸衣
if(Player[SeatNumber].WarriorCard.Number==27)
if(SuddenStrike(SeatNumber)==true) return;//张辽--突袭
if(Player[SeatNumber].WarriorCard.Number==43) BrilliantPosture(SeatNumber);//周瑜--英姿
if(Player[SeatNumber].WarriorCard.Number==6&&Player[SeatNumber].WarriorCard.Wakeup==1) BrilliantPosture(SeatNumber);//觉醒孙策--英姿
//else if(Player[SeatNumber].WarriorCard.Number==37) LoveCharity(SeatNumber);//鲁肃--好施
GiveGameCardTo(SeatNumber,2);
//孟获--再起
printf("摸牌阶段结束\n");
}
void CalSkillChance(){//技能次数设置
CyanPackChance=1;//华佗--青囊
SkyJusticeChance=1;//太史慈--天义
ReverseSchemeChance=1;//周瑜--反间
MarryChance=1;//孙尚香--结姻
NationBeautyChance=1;//大乔--国色
AlienateChance=1;//貂蝉--离间
KindheartednessNumber=0;//刘备--仁德牌数
BalanceChance=1;//孙权--制衡
YellowSkyChance=1;//张角--黄天
Unreasonablestrike=1;//典韦--强袭
}
bool CanKill(int SeatNumber){//判断是否可以出杀
bool CanOut=0;
if(KillChance) CanOut=1;
if(Player[SeatNumber].Equipment[1].Type==22) CanOut=1;//诸葛连弩
if(Player[SeatNumber].WarriorCard.Number==11) CanOut=1;//张飞--咆哮
if(skyjustice==-1) CanOut=0;//太史慈--天义
return CanOut;
}
void OutCardStage(int SeatNumber){//SeatNumber号位出牌阶段
if(Dead[SeatNumber]) return;
//张郃--巧变
//刘禅--放权
//夏侯渊--神速
if(JumpOutCard==1){//需要跳过出牌阶段
JumpOutCard=0;
return;
}
printf("出牌阶段\n");
CalSkillChance();
KillChance=1;//出杀次数置为1
while(!Dead[SeatNumber]){//开始出牌
ShowAllPlayersInformation();
ShowOnesAllCardAndJudgeCard(SeatNumber);//显示一个人的所有牌 手牌+装备牌
printf("%d-%s %s ,请您发动某项技能或打出一张牌:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name,identity(Player[SeatNumber].Identity));
printf("0-弃牌\n");
int Number=Player[SeatNumber].HandCardNumber;
for(int i=1;i<=Number;i++){
GameCard OutCard=Player[SeatNumber].HandCard[i];
int type=OutCard.Type;
bool CanOut=0;
if(type>=1&&type<=3) if(CanKill(SeatNumber)==true) CanOut=1;//可不可以出杀
if(type==5) if(Player[SeatNumber].BloodNow<Player[SeatNumber].BloodCeiling) CanOut=1;//桃-血量未满
if(type==6) if(Player[SeatNumber].Wine==0) CanOut=1;//酒-没喝过酒
if(type>=7&&type<=15||type==17||type==18) CanOut=1;//非延时锦囊
if(type==19||type==20) CanOut=1;//延时锦囊--乐不思蜀和兵粮寸断
if(type==21){//延时锦囊--闪电
if(Player[SeatNumber].WarriorCard.Number==50&&OutCard.Color>=3) continue;
if(Player[SeatNumber].JudgeCardExist[3]==1) continue;
CanOut=1;
}
if(type>=22&&type<=38) CanOut=1;//装备牌
if(CanOut==1){
printf("%d-",i);
ShowOneGameCard(Player[SeatNumber].HandCard[i]);
}
}
if(Player[SeatNumber].EquipmentExist[1]){//装备
if(Player[SeatNumber].Equipment[1].Type==27) if(CanKill(SeatNumber)==true) printf("%d-发动丈八蛇矛\n",Number+1);
}
{//可以在出牌阶段主动发出的技能
if(Player[SeatNumber].WarriorCard.Number==1)
printf("%d-发动仁德\n",Number+2);//刘备--仁德
if(Player[SeatNumber].WarriorCard.Number==1&&SeatNumber==1) if(CanKill(SeatNumber)==true) printf("%d-发动激将\n",Number+3);//刘备主公技--激将
if(Player[SeatNumber].WarriorCard.Number==5) if(BalanceChance>=1) printf("%d-发动制衡\n",Number+2);//孙权--制衡
if(Player[SeatNumber].WarriorCard.Number==10) if(CanKill(SeatNumber)==true) printf("%d-发动武圣\n",Number+2);//关羽--武圣
if(Player[SeatNumber].WarriorCard.Number==13) if(CanKill(SeatNumber)==true) printf("%d-发动龙胆\n",Number+2);//赵云--龙胆
if(Player[SeatNumber].WarriorCard.Number==16) printf("%d-发动狂骨\n",Number+2);//魏延--狂骨
if(Player[SeatNumber].WarriorCard.Number==19) printf("%d-发动火计\n",Number+2);//卧龙--火计
if(Player[SeatNumber].WarriorCard.Number==23) printf("%d-发动断粮\n",Number+2);//徐晃--断粮
if(Player[SeatNumber].WarriorCard.Number==24) printf("%d-发动驱虎\n",Number+2);//荀彧--驱虎
if(Player[SeatNumber].WarriorCard.Number==40) printf("%d-发动奇袭\n",Number+2);//甘宁--奇袭
if(Player[SeatNumber].WarriorCard.Number==42) printf("%d-发动苦肉\n",Number+2);//黄盖--苦肉
if(Player[SeatNumber].WarriorCard.Number==43) if(ReverseSchemeChance>=1&&Player[SeatNumber].HandCardNumber>=1) printf("%d-发动反间\n",Number+2);//周瑜--反间
if(Player[SeatNumber].WarriorCard.Number==44) if(NationBeautyChance==true) printf("%d-发动国色\n",Number+2);//大乔--国色
if(Player[SeatNumber].WarriorCard.Number==45) if(MarryChance>=1) printf("%d-发动结姻\n",Number+2);//孙尚香--结姻
if(Player[SeatNumber].WarriorCard.Number==46) if(SkyJusticeChance>=1) printf("%d-发动天义\n",Number+2);//太史慈--天义 KillChance++
if(Player[SeatNumber].WarriorCard.Number==55) if(CyanPackChance>=1) printf("%d-发动青囊\n",Number+2);//华佗--青囊
if(Player[SeatNumber].WarriorCard.Number==57) if(AlienateChance>=1) printf("%d-发动离间\n",Number+2);//貂蝉--离间
if(Player[SeatNumber].WarriorCard.Number==9) printf("%d-发动乱击\n",Number+2);//袁绍--乱击
if(Player[SeatNumber].WarriorCard.Number==22) printf("%d-发动挑衅\n",Number+2);//姜维--挑衅
if(Player[SeatNumber].WarriorCard.Number==18) printf("%d-发动连环\n",Number+2);//庞统--连环
if(Player[SeatNumber].WarriorCard.Number==25) printf("%d-发动强袭\n",Number+2);//典韦--强袭
if(Player[SeatNumber].WarriorCard.Number==37) printf("%d-发动缔盟\n",Number+2);//鲁肃--缔盟
if(OnField[7]==1&&Player[SeatNumber].Nation==4&&SeatNumber!=1) if(YellowSkyChance>=1) printf("%d-发动黄天\n",Number+3);//主公是张角 可以发动黄天
if(OnField[6]==1&&Player[SeatNumber].Nation==3);//主公是孙策 可以发动制霸
}
int Option;
scanf("%d",&Option);
if(Option==0) return;//进入弃牌阶段
if(Option<=Number){//如果选择打出手牌
GameCard OutCard=Player[SeatNumber].HandCard[Option];
int type=OutCard.Type;
int color=OutCard.Color;
int number=OutCard.Number;
if(Player[SeatNumber].WarriorCard.Number==48&&color==3) color=1;//小乔--红颜
AimNumber=0;
if(type>=1&&type<=3){//杀
ChooseKillAim(SeatNumber);
if(!AimNumber) continue;
TableCard[++TableCardNumber]=OutCard;
OneLoseCard(SeatNumber,Option);
if(Player[SeatNumber].WarriorCard.Number==6)//孙策--激昂
if(color<=2) EmotionUp(SeatNumber);
Damageinfo damage;
damage.Type=type;
damage.Attribute=type;
damage.FromMember=SeatNumber;
damage.Number=1;
damage.Color=color;
damage.Card[1]=number;//伤害来源牌的编号
damage.FromCardNumber=1;
for(int i=1;i<=AimNumber;i++) Kill(damage,Aim[i]);
KillChance--;
}
if(type==5){//桃
TableCard[++TableCardNumber]=OutCard;
OneLoseCard(SeatNumber,Option);
EatPeach(SeatNumber);
}
if(type==6){//酒
TableCard[++TableCardNumber]=OutCard;
OneLoseCard(SeatNumber,Option);
DrinkWine(SeatNumber);
}
if(type==7){//过河拆桥
ChooseWreckBridgeAim(SeatNumber,color);
if(!AimNumber) continue;
TableCard[++TableCardNumber]=OutCard;
OneLoseCard(SeatNumber,Option);
if(Player[SeatNumber].WarriorCard.Number==15) FocusWisdom(SeatNumber);//黄月英--集智
if(!AskUnassailable()) WreckBridge(SeatNumber,Aim[1]);
}
if(type==8){//顺手牵羊
ChooseStealSheepAim(SeatNumber,color);
if(!AimNumber) continue;
TableCard[++TableCardNumber]=OutCard;
OneLoseCard(SeatNumber,Option);
if(Player[SeatNumber].WarriorCard.Number==15) FocusWisdom(SeatNumber);//黄月英--集智
if(!AskUnassailable()) StealSheep(SeatNumber,Aim[1]);
}
if(type==9){//无中生有
TableCard[++TableCardNumber]=OutCard;
OneLoseCard(SeatNumber,Option);
if(Player[SeatNumber].WarriorCard.Number==15) FocusWisdom(SeatNumber);//黄月英--集智
if(!AskUnassailable()) CardAppear(SeatNumber);
ClearTable();
}
if(type==10){//决斗
ChooseDuelAim(SeatNumber,color);
if(!AimNumber) continue;
TableCard[++TableCardNumber]=OutCard;
OneLoseCard(SeatNumber,Option);
if(Player[SeatNumber].WarriorCard.Number==6)//孙策--激昂
if(color<=2) EmotionUp(SeatNumber);
if(Player[Aim[1]].WarriorCard.Number==6)//孙策--激昂
if(color<=2) EmotionUp(Aim[1]);
if(Player[SeatNumber].WarriorCard.Number==15) FocusWisdom(SeatNumber);//黄月英--集智
if(AskUnassailable()) continue;
Damageinfo damage;
damage.Type=10;
damage.Attribute=1;
damage.Number=1;
damage.Color=color;
damage.FromCardNumber=1;
damage.Card[1]=number;//伤害来源牌的编号
Duel(damage,SeatNumber,Aim[1]);
}
if(type==11){//借刀杀人
ChooseBorrowKnifeAim(SeatNumber,color);
if(!AimNumber) continue;
TableCard[++TableCardNumber]=OutCard;
OneLoseCard(SeatNumber,Option);
if(Player[SeatNumber].WarriorCard.Number==15) FocusWisdom(SeatNumber);//黄月英--集智
if(AskUnassailable()) continue;
if(BorrowKnife(SeatNumber,Aim[1],Aim[2])==true) continue;
Player[SeatNumber].HandCard[++Player[SeatNumber].HandCardNumber]=Player[Aim[1]].Equipment[1];
OneLoseCard(Aim[1],Player[Aim[1]].HandCardNumber+1);
}
if(type==12){//桃园结义
TableCard[++TableCardNumber]=OutCard;
OneLoseCard(SeatNumber,Option);
if(Player[SeatNumber].WarriorCard.Number==15) FocusWisdom(SeatNumber);//黄月英--集智
PeachGarden(SeatNumber,OutCard.Color);
}
if(type==13){//五谷丰登
TableCard[++TableCardNumber]=OutCard;
OneLoseCard(SeatNumber,Option);
if(Player[SeatNumber].WarriorCard.Number==15) FocusWisdom(SeatNumber);//黄月英--集智
GrainHarvest(SeatNumber,color);
}
if(type==14){//南蛮入侵
TableCard[++TableCardNumber]=OutCard;
OneLoseCard(SeatNumber,Option);
if(Player[SeatNumber].WarriorCard.Number==15) FocusWisdom(SeatNumber);//黄月英--集智
Damageinfo damage;
damage.Type=14;
damage.Attribute=1;
damage.Number=1;
damage.Color=color;
damage.FromMember=SeatNumber;
if(Player[SeatNumber].WarriorCard.Number==21) damage.FromMember=21;//孟获--祸首
damage.Card[1]=number;
damage.FromCardNumber=1;
SouthSavageAttack(damage);
}
if(type==15){//万箭齐发
TableCard[++TableCardNumber]=OutCard;
OneLoseCard(SeatNumber,Option);
if(Player[SeatNumber].WarriorCard.Number==15) FocusWisdom(SeatNumber);//黄月英--集智
Damageinfo damage;
damage.Attribute=1;
damage.Type=15;
damage.Number=1;
damage.Color=color;
damage.FromMember=SeatNumber;
damage.Card[1]=number;
damage.FromCardNumber=1;
ThousandsArrowsFalling(damage);
}
if(type==17){//火攻
ChooseFireAttackAim(SeatNumber,color);
if(!AimNumber) continue;
TableCard[++TableCardNumber]=OutCard;
OneLoseCard(SeatNumber,Option);
if(Player[SeatNumber].WarriorCard.Number==15) FocusWisdom(SeatNumber);//黄月英--集智
if(AskUnassailable()) continue;
Damageinfo damage;
damage.Type=17;
damage.Attribute=2;
damage.Number=1;
damage.FromMember=SeatNumber;
damage.Card[1]=number;
damage.FromCardNumber=1;
FireAttack(damage,SeatNumber,Aim[1]);
}
if(type==18){//铁索连环
AimNumber=0;
if(Recoin(SeatNumber)==1){//重铸
TableCard[++TableCardNumber]=OutCard;
OneLoseCard(SeatNumber,Option);
if(Player[SeatNumber].WarriorCard.Number==15) FocusWisdom(SeatNumber);//黄月英--集智
GiveGameCardTo(SeatNumber,1);
ClearTable();
continue;
}
ChooseIronChainAim(SeatNumber,color);
if(!AimNumber) continue;
TableCard[++TableCardNumber]=OutCard;
OneLoseCard(SeatNumber,Option);
if(Player[SeatNumber].WarriorCard.Number==15) FocusWisdom(SeatNumber);//黄月英--集智
for(int i=1;i<=AimNumber;i++){
if(AskUnassailable()) continue;
IronChain(Aim[i]);
}
}
if(type==19){//乐不思蜀
AimNumber=0;
ChooseForgetShuAim(SeatNumber,OutCard.Color);
if(!AimNumber) continue;
ForgetShu(Aim[1],OutCard);
OneLoseCard(SeatNumber,Option);
}
if(type==20){//兵粮寸断
AimNumber=0;
ChooseNoGrainNoSoldierAim(SeatNumber,OutCard.Color);
if(!AimNumber) continue;
NoGrainNoSoldier(Aim[1],OutCard);
OneLoseCard(SeatNumber,Option);
}
if(type==21){//闪电
Thunder(SeatNumber,OutCard);
OneLoseCard(SeatNumber,Option);
}
if(type>=22&&type<=32){//武器
if(Player[SeatNumber].EquipmentExist[1]==1){
TableCard[++TableCardNumber]=Player[SeatNumber].Equipment[1];
OneLoseCard(SeatNumber,Player[SeatNumber].HandCardNumber+1);
}
Player[SeatNumber].EquipmentExist[1]=1;
Player[SeatNumber].Equipment[1]=OutCard;
OneLoseCard(SeatNumber,Option);
}
if(type>=33&&type<=36){//防具
if(Player[SeatNumber].EquipmentExist[2]==1){
TableCard[++TableCardNumber]=Player[SeatNumber].Equipment[2];
OneLoseCard(SeatNumber,Player[SeatNumber].HandCardNumber+2);
}
Player[SeatNumber].EquipmentExist[2]=1;
Player[SeatNumber].Equipment[2]=OutCard;
OneLoseCard(SeatNumber,Option);
}
if(type==37){//防御马
if(Player[SeatNumber].EquipmentExist[3]==1){
TableCard[++TableCardNumber]=Player[SeatNumber].Equipment[3];
OneLoseCard(SeatNumber,Player[SeatNumber].HandCardNumber+3);
}
Player[SeatNumber].EquipmentExist[3]=1;
Player[SeatNumber].Equipment[3]=OutCard;
OneLoseCard(SeatNumber,Option);
CalDistance();
}
if(type==38){//进攻马
if(Player[SeatNumber].EquipmentExist[4]==1){
TableCard[++TableCardNumber]=Player[SeatNumber].Equipment[4];
OneLoseCard(SeatNumber,Player[SeatNumber].HandCardNumber+4);
}
Player[SeatNumber].EquipmentExist[4]=1;
Player[SeatNumber].Equipment[4]=OutCard;
OneLoseCard(SeatNumber,Option);
CalDistance();
}
}
else if(Option==Number+1){//装备牌--丈八蛇矛
Damageinfo damage;
damage.FromCardNumber=0;
damage=EightSpear(SeatNumber);
if(!damage.FromCardNumber) continue;
AimNumber=0;
ChooseKillAim(SeatNumber);
if(!AimNumber) continue;
TableCard[++TableCardNumber]=OnesCardNumber(SeatNumber,damage.Card[1]);
OneLoseNumber(SeatNumber,damage.Card[1]);
TableCard[++TableCardNumber]=OnesCardNumber(SeatNumber,damage.Card[2]);
OneLoseNumber(SeatNumber,damage.Card[2]);
damage.FromMember=SeatNumber;
for(int i=1;i<=AimNumber;i++)
Kill(damage,Aim[i]);
KillChance--;
}
else{//如果选择发动技能
Damageinfo damage;
damage.FromCardNumber=0;
if(Player[SeatNumber].WarriorCard.Number==1&&SeatNumber==1&&Option==Number+3){//刘备主公技--激将
AimNumber=0;
ChooseExciteSoldierAim(SeatNumber);
if(!AimNumber) continue;
damage=ExciteSoldier(SeatNumber);
if(!damage.FromCardNumber)
damage.FromMember=SeatNumber;
Kill(damage,Aim[1]);
KillChance--;
}
if(Player[SeatNumber].WarriorCard.Number==5&&Option==Number+2){//孙权--制衡(出牌阶段限一次)
Balance(SeatNumber);
}
if(Player[SeatNumber].WarriorCard.Number==1&&Option==Number+2){//刘备--仁德
Kindheartedness(SeatNumber);
}
if(Player[SeatNumber].WarriorCard.Number==10&&Option==Number+2){//关羽--武圣
damage=WuSage(SeatNumber,1);
if(!damage.FromCardNumber) continue;
AimNumber=0;
ChooseWuSageAim(SeatNumber,damage.Card[1]);
if(!AimNumber) continue;
TableCard[++TableCardNumber]=OnesCardNumber(SeatNumber,damage.Card[1]);
OneLoseNumber(SeatNumber,damage.Card[1]);
damage.FromMember=SeatNumber;
for(int i=1;i<=AimNumber;i++)
Kill(damage,Aim[i]);
KillChance--;
}
if(Player[SeatNumber].WarriorCard.Number==13&&Option==Number+2){//赵云--龙胆
damage=DragonBraveKill(SeatNumber);
if(!damage.FromCardNumber) continue;
AimNumber=0;
ChooseKillAim(SeatNumber);
if(!AimNumber) continue;
TableCard[++TableCardNumber]=OnesCardNumber(SeatNumber,damage.Card[1]);
OneLoseNumber(SeatNumber,damage.Card[1]);
damage.FromMember=SeatNumber;
for(int i=1;i<=AimNumber;i++)
Kill(damage,Aim[i]);
KillChance--;
}
if(Player[SeatNumber].WarriorCard.Number==44&&Option==Number+2){//大乔--国色
NationBeauty(SeatNumber);
}
if(Player[SeatNumber].WarriorCard.Number==55&&Option==Number+2){//华佗--青囊
int Option=CyanPack(SeatNumber);
if(!Option) continue;
AimNumber=0;
ChooseCyanPackAim(SeatNumber);
if(!AimNumber) continue;
OneLoseCard(SeatNumber,Option);
BloodUp(Aim[1]);
}
if(Player[SeatNumber].WarriorCard.Number==43&&Option==Number+2){//周瑜--反间
ReverseScheme(SeatNumber);
}
if(Player[SeatNumber].WarriorCard.Number==57&&Option==Number+2){//貂蝉--离间
Alienate(SeatNumber);
}
if(Player[SeatNumber].WarriorCard.Number==40&&Option==Number+2){//甘宁--奇袭
SurpriseAttack(SeatNumber);
}
if(Player[SeatNumber].WarriorCard.Number==45&&Option==Number+2){//孙尚香--结姻
Marry(SeatNumber);
}
if(Player[SeatNumber].WarriorCard.Number==42&&Option==Number+2){//黄盖--苦肉
BotherMuscle(SeatNumber);
}
if(OnField[7]==1&&Player[SeatNumber].Nation==4&&SeatNumber!=1)
if(Option==Number+3)
{
YellowSky(SeatNumber);
}
if(Player[SeatNumber].WarriorCard.Number==46&&Option==Number+2){//太史慈--天义
}
if(Player[SeatNumber].WarriorCard.Number==16&&Option==Number+2){//魏延--狂骨
}
if(Player[SeatNumber].WarriorCard.Number==19&&Option==Number+2){//卧龙--火计
}
if(Player[SeatNumber].WarriorCard.Number==23&&Option==Number+2){//徐晃--断粮
}
if(Player[SeatNumber].WarriorCard.Number==9&&Option==Number+2){//袁绍--乱击
}
if(Player[SeatNumber].WarriorCard.Number==18&&Option==Number+2){//庞统--连环
}
if(Player[SeatNumber].WarriorCard.Number==25&&Option==Number+2){//典韦--强袭
}
if(Player[SeatNumber].WarriorCard.Number==37&&Option==Number+2){//鲁肃--缔盟
}
if(Player[SeatNumber].WarriorCard.Number==22&&Option==Number+2){//姜维--挑衅
}
if(Player[SeatNumber].WarriorCard.Number==24&&Option==Number+2){//荀彧--驱虎
}
}
ClearTable();
}
//清空桌面卡牌
if(Player[SeatNumber].Wine>=1) Player[SeatNumber].Wine=0;
if(naked==1) naked=0;//许褚裸衣效果消失
if(skyjustice!=0) skyjustice=0;//太史慈天义效果消失
printf("出牌阶段结束\n");
//万箭齐发--袁绍
//决斗
//乐不思蜀--大乔
//兵粮寸断--徐晃
}
void DiscardStage(int SeatNumber){//SeatNumber号位弃牌阶段
if(Dead[SeatNumber]) return;
//张郃--巧变
if(JumpDiscard==1){//需要跳过弃牌阶段
JumpDiscard=0;
return;
}
printf("弃牌阶段\n");
if(Player[SeatNumber].WarriorCard.Number==41){//吕蒙--克己
if(OwnRestraint(SeatNumber)){
printf("克己\n");
return;
}
}
int CardCeiling=Player[SeatNumber].BloodNow;
if(Player[SeatNumber].WarriorCard.Number==9&&Player[SeatNumber].WarriorCard.Emperor==1) CardCeiling+=BloodDescend(SeatNumber);//袁绍--血裔
while(Player[SeatNumber].HandCardNumber>CardCeiling){
printf("%d-%s,您还需要弃掉%d张牌,请选择:\n",SeatNumber,Player[SeatNumber].WarriorCard.Name,Player[SeatNumber].HandCardNumber-CardCeiling);
ShowOnesHandCard(SeatNumber);
int Option;
scanf("%d",&Option);
TableCard[++TableCardNumber]=Player[SeatNumber].HandCard[Option];
OneLoseCard(SeatNumber,Option);
}
ClearTable();
printf("弃牌阶段结束\n");
//张昭张弘--固政
//吕蒙--克己
//袁绍--主公--血裔
}
void EndStage(int SeatNumber){//SeatNumber号位回合结束阶段
if(Dead[SeatNumber]) return;
printf("回合结束阶段\n");
if(Player[SeatNumber].WarriorCard.Number==57) CloseMoon(SeatNumber);//貂蝉--闭月
//曹仁--据守
printf("回合结束阶段结束\n");
}
void Start(){
int SeatNumber=0;
while(1){
if(++SeatNumber>TotalPeopleNumber) SeatNumber=1;
if(Dead[SeatNumber]) continue;//该玩家阵亡跳过
//for(int i=1;i<=TotalPeopleNumber;i++) ShowOnesHandCard(i);
for(int i=1;i<=2;i++) printf("--------%d号位%s--------",SeatNumber,Player[SeatNumber].WarriorCard.Name);printf("\n");
//考虑卡牌翻面问题
if(Player[SeatNumber].WarriorCard.Back==1){
printf("翻回正面\n");
Player[SeatNumber].WarriorCard.Back=0;
continue;
}
MemberNow=SeatNumber;
BeginningStage(SeatNumber);
JudgingStage(SeatNumber);
InCardStage(SeatNumber);
OutCardStage(SeatNumber);
DiscardStage(SeatNumber);
EndStage(SeatNumber);
}
}
int main(){
//sort(AllWarCard+1,AllWarCard+57+1,cmp);
while(1){//输入游戏人数
printf("请输入该局人数:");
scanf("%d",&TotalPeopleNumber);
if(TotalPeopleNumber<=20&&TotalPeopleNumber>=2) break;
}
InitIdentity();//初始化身份牌
InitStandard();//初始化标准版游戏牌+军争篇 标准版最多只能9个人游戏
InitMyth();//初始化神话再临武将牌
RndIdentityCard();
RndGameCard();
RndWarCard();
SetSeatNumber();//确定1~n号位位置
//for(int i=1;i<=WarCardNumber;i++){printf("%d 名:%s 所属阵营:%s 是否为主公:%s 技能数量:%d 体量上限:%d 性别:%s 所属包:%s\n\n",i,WarCardHeap[i].name,nation(WarCardHeap[i].nation),emperor(WarCardHeap[i].emperor),WarCardHeap[i].skillnumber,WarCardHeap[i].blood,sex(WarCardHeap[i].sex),whichpack(WarCardHeap[i].pack));}
//for(int i=1;i<=GameCardNumber;i++){printf("%d %s %s %s\n\n",i,GameCardHeap[i].name,color(GameCardHeap[i].color),point(GameCardHeap[i].point));}
for(int i=1;i<=TotalPeopleNumber;i++){printf("%d %s\n\n",i,identity(IdentityCardHeap[i].Type));}
ChooseWarrior();//选英雄
InitialCard();//每个人发4张牌
CalDistance();//设置座位距离
//ShowAllDistance();
//for(int i=1;i<=TotalPeopleNumber;i++) ShowOnesHandCard(i);
Start();
}