• 猪国杀(100分)


     坑点:删牌;每次某位玩家阵亡带来的影响;按照从左往右顺序出牌,每次出牌后重新从左往右扫牌;及时结算;决斗使得出牌方死亡;无懈可击作用于无懈可击 etc

    #include<iostream>
    #include<sstream>
    #include<cstdio>
    #include<cstdlib>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<functional>
    #include<iomanip>
    #include<numeric>
    #include<cmath>
    #include<queue>
    #include<vector>
    #include<set>
    #include<cctype>
    #include<stack>
    #include<map>
    const double PI = acos(-1.0);
    const int INF = 0x3f3f3f3f;
    const int NINF = -INF - 1;
    const int maxn = 2e3 + 10;
    const double eps = 1e-9;
    typedef long long ll;
    using namespace std;
    int n, m;
    char deck[maxn];//牌组
    int deck_num;
    struct node{
        string id;
        char hand[maxn];
        int hp;
        int crossbow;//连弩
        int hand_num;
    }player[15];
    int winner = 0;
    int num_use_kill;//单局使用杀的数量
    int cur_player[15];//存活玩家
    int killer[15];//伤害来源
    int dis[15][15];
    int maybe_FP[15], sure_FP[15], sure_ZP[15];//类反贼,反贼,忠臣
    char last_card;
    int game_over = 0;
    void init(){
        for(int i = 1; i <= n; ++i) maybe_FP[i] = 0, sure_FP[i] = 0, sure_ZP[i] = 0;
        for(int i = 1; i <= n; ++i) memset(player[i].hand, 0, sizeof(player[i].hand));
    }
    void push_end_hand(int id, char c){//增加手牌
        player[id].hand_num++;
        player[id].hand[player[id].hand_num] = c;
    }
    void delete_hand(int id, int pos){//删除手牌
        player[id].hand_num--;
        for(int i = pos; i <= player[id].hand_num; ++i) player[id].hand[i] = player[id].hand[i + 1];
    }
    char pop_top_deck(){//取出牌组顶端牌
        char ans = deck[1];
        deck_num--;
        for(int i = 1; i <= deck_num; ++i) deck[i] = deck[i + 1];
        return ans;
    }
    
    void count_dis(){//计算距离
        for(int i = 1; i <= n; ++i){
            for(int j = 1; j <= n; ++j){
                if(j >= i){
                    dis[i][j] = j - i;
                    for(int k = i + 1; k < j; ++k) {
                        if(!cur_player[k]) dis[i][j]--;
                    }
                }
                else{
                    dis[i][j] = n - i + j;
                    for(int k = i + 1; k <= n; ++k) {
                        if(!cur_player[k]) dis[i][j]--;
                    }
                    for(int k = 1; k < j; ++k){
                        if(!cur_player[k]) dis[i][j]--;
                    }
                }
            }
        }
    }
    
    void Draw(int x, int p){//摸牌
    //    if(player[x].hand_num == 0) cout << "当前手牌为空" << endl;
        while(p--){
            char tmp;
            if(deck_num == 0) tmp = last_card;
            else tmp = pop_top_deck();
            push_end_hand(x, tmp);
        }
    }
    int check_end(){//检查游戏是否结束
        if(player[1].hp <= 0) {
            winner = 1;//winner为1,反贼获胜
            return 1;
        }
        int flag = 0;
        for(int i = 2; i <= n; ++i){
            if(player[i].id == "FP" && player[i].hp > 0){
                flag = 1;
                break;
            }
        }
        if(flag) return 0;
        else {
            winner = 2;//winner为2,猪公获胜
            return 1;
        }
    }
    void Reward_punishment(){
        for(int i = 1; i <= n; ++i){
            if(player[i].hp <= 0 && cur_player[i]){
                int aim = killer[i];
                if(player[i].id == "FP"){
                    Draw(aim, 3);
                }
                else if(player[i].id == "ZP" && player[aim].id == "MP"){
                    player[1].crossbow = 0;
                    player[1].hand_num = 0;
                }
            }
        }
    }
    void mark_death(){
        for(int i = 1; i <= n; ++i){
            if(player[i].hp <= 0 && cur_player[i]) cur_player[i] = 0;
        }
    }
    int cur_eff(int x){//出一张牌后的影响
        int near_death = 0;//是否有人濒死
        for(int i = 1; i <= n; ++i){
            if(player[i].hp <= 0 && cur_player[i]){
                near_death++;//存在濒死
                for(int j = 1; j <= player[i].hand_num; ++j){
                    if(player[i].hand[j] == 'P'){
                        player[i].hp = 1;
                        delete_hand(i, j);
                        near_death--;//濒死已经救活
                        break;
                    }
                }
            }
        }
        if(near_death){//存在濒死未救活
            if(check_end()) {
                mark_death();
    //            cout << "游戏结束" << endl;
                return 1;//当前出牌导致游戏结束
            }
            Reward_punishment();//击杀奖励与惩罚
            mark_death();
            count_dis();
            if(!cur_player[x]){//出牌方死亡
    //            cout << "出牌方死亡" << endl;
                return 1;
            }
        }
        return 0;
    }
    void res_D(int x, int source){//
        int flag = 0;
        for(int i = 1; i <= player[x].hand_num; ++i){
            if(player[x].hand[i] == 'D'){
                flag = 1;
                delete_hand(x, i);
                break;
            }
        }
        if(!flag) {
    //        cout << "使用杀造成1点伤害" << endl;
            player[x].hp--;
            killer[x] = source;
            if(cur_eff(source)) game_over = 1;
        }
    }
    void res_K(int x){//
        if(player[x].id == "MP"){
            for(int i = 2; i <= n; ++i){
                if(dis[x][i] == 1 && cur_player[i]){//杀的距离只有1
                    if(maybe_FP[i] || sure_FP[i]){
                        res_D(i, x);
                    }
                    break;
                }
            }
        }
        else if(player[x].id == "ZP"){
            for(int i = x + 1; i < n + x; ++i){
                int tmp = i;
                if(tmp > n) tmp -= n;
                if(dis[x][tmp] == 1 && cur_player[tmp]){
                    if(sure_FP[tmp]){//跳忠
                        res_D(tmp, x);
                        sure_ZP[x] = 1;
                        maybe_FP[x] = 0;
                        sure_FP[x] = 0;
                    }
                    break;
                }
            }
        }
        else if(player[x].id == "FP"){
            for(int i = x + 1; i < n + x; ++i){
                int tmp = i;
                if(tmp > n) tmp -= n;
                if(dis[x][tmp] == 1 && cur_player[tmp]){
                    if(tmp == 1 || sure_ZP[tmp]){//跳反
                        res_D(tmp, x);
                        sure_FP[x] = 1;
                        maybe_FP[x] = 0;
                        sure_ZP[x] = 0;
                    }
                    break;
                }
            }
        }
    }
    
    //使用无懈可击无效无懈可击
    int J_to_J(int x, int fac){//fac=0,表示目标为主公方;fac=1,表示目标为反贼
        int cur_use_J = x;//这次使用无懈可击的玩家
        int do_J = 0;
        if(fac == 0){
            for(int i = x; i < n + x; ++i){
                int tmp = i;
                if(tmp > n) tmp -= n;
                if(!cur_player[tmp]) continue;
                if(player[tmp].id == "FP"){
                    for(int j = 1; j <= player[tmp].hand_num; ++j){
                        if(player[tmp].hand[j] == 'J'){
    //                        cout << tmp << "使用了无懈可击" << endl;
                            do_J = 1;
                            sure_FP[tmp] = 1;
                            maybe_FP[tmp] = 0;
                            sure_ZP[tmp] = 0;
                            delete_hand(tmp, j);
                            cur_use_J = tmp;
                            break;
                        }
                    }
                    if(do_J) break;;
                }
            }
        }
        else if(fac == 1){
            for(int i = x; i < n + x; ++i){
                int tmp = i;
                if(tmp > n) tmp -= n;
                if(!cur_player[tmp]) continue;
                if(player[tmp].id == "MP"){
                    for(int j = 1; j <= player[tmp].hand_num; ++j) {
                        if (player[tmp].hand[j] == 'J') {
    //                        cout << "主公使用了无懈可击" << endl;
                            do_J = 1;
                            delete_hand(tmp, j);
                            cur_use_J = tmp;
                            break;
                        }
                    }
                }
                else if(player[tmp].id == "ZP"){
                    for(int j = 1; j <= player[tmp].hand_num; ++j) {
                        if (player[tmp].hand[j] == 'J') {
                            do_J = 1;
                            sure_ZP[tmp] = 1;
                            maybe_FP[tmp] = 0;
                            sure_FP[tmp] = 0;
                            delete_hand(tmp, j);
                            cur_use_J = tmp;
                            break;
                        }
                    }
                }
                if(do_J) break;
            }
        }
        if(do_J == 0) return 1;
        else {
            if(J_to_J(cur_use_J, fac ^ 1)) return 0;
            else return 1;
        }
    }
    int res_J(int x, int source){//无懈可击,能触发无懈可击,其身份必然被确定
        int do_J = 0;//是否成功无懈可击
        int find_J = 0;//是否找到无懈可击
        if(player[x].id == "MP"){
            for(int i = source; i < n + source; ++i){
                int tmp = i;
                if(tmp > n) tmp -= n;
                if(!cur_player[tmp]) continue;
                if(player[tmp].id == "MP"){//主公自救
                    for(int j = 1; j <= player[tmp].hand_num; ++j){
                        if(player[tmp].hand[j] == 'J'){
    //                        cout << "主公使用无懈可击" << endl;
                            delete_hand(tmp, j);
                            if(J_to_J(1, 0)) do_J = 1;
                            find_J = 1;
                            break;
                        }
                    }
                }
                else if(player[tmp].id == "ZP"){//忠臣献殷勤,将导致跳忠
                    for(int j = 1; j <= player[tmp].hand_num; ++j){
                        if(player[tmp].hand[j] == 'J'){
    //                        cout << "忠臣帮助主公使用了无懈可击" << endl;
                            delete_hand(tmp, j);
                            if(J_to_J(tmp, 0)) do_J = 1;
                            sure_ZP[tmp] = 1;
                            maybe_FP[tmp] = 0;
                            sure_FP[tmp] = 0;
                            find_J = 1;
                            break;
                        }
                    }
                }
                if(find_J) break;
            }
        }
        else if(player[x].id == "ZP"){
            for(int i = source; i < n + source; ++i){
                int tmp = i;
                if(tmp > n) tmp -= n;
                if(!cur_player[tmp]) continue;
                if(player[tmp].id == "MP"){//主公出手救跳忠忠臣
                    for(int j = 1; j <= player[tmp].hand_num; ++j){
                        if(player[tmp].hand[j] == 'J'){
                            delete_hand(tmp, j);
                            if(J_to_J(1, 0)) do_J = 1;
                            find_J = 1;
                            break;
                        }
                    }
                }
                else if(player[tmp].id == "ZP"){
                    for(int j = 1; j <= player[tmp].hand_num; ++j){
                        if(player[tmp].hand[j] == 'J'){
                            delete_hand(tmp, j);
                            if(J_to_J(tmp, 0)) do_J = 1;
                            sure_ZP[tmp] = 1;
                            maybe_FP[tmp] = 0;
                            sure_FP[tmp] = 0;
                            find_J = 1;
                            break;
                        }
                    }
                }
                if(find_J) break;
            }
        }
        else if(player[x].id == "FP"){
            for(int i = source; i < n + source; ++i){//锦囊牌按序依次出牌
                int tmp = i;
                if(tmp > n) tmp -= n;
                if(!cur_player[tmp]) continue;
                if(player[tmp].id == "FP"){
                    for(int j = 1; j <= player[tmp].hand_num; ++j){
                        if(player[tmp].hand[j] == 'J'){//对跳反献殷勤将导致跳反
                            delete_hand(tmp, j);
                            if(J_to_J(tmp, 1)) do_J = 1;
                            sure_FP[tmp] = 1;
                            maybe_FP[tmp] = 0;
                            sure_ZP[tmp] = 0;
                            find_J = 1;
                            break;
                        }
                    }
                }
                if(find_J) break;
            }
        }
        if(do_J) return 1;
        else return 0;
    }
    void do_F(int x, int aim, int num_kill){//进行决斗
        int aim_num_kill = 0;//被决斗方'杀'的数量
        for(int i = 1; i <= player[aim].hand_num; ++i){
            if(player[aim].hand[i] == 'K') aim_num_kill++;
        }
    //    cout << "决斗进行:决斗发起方的'杀'的数量:" << num_kill << " 决斗目标'杀'的数量:" << aim_num_kill << endl;
        if(num_kill >= aim_num_kill){
            player[aim].hp--;
            killer[aim] = x;
            if(cur_eff(x)) game_over = 1;
            int winner_get_up = aim_num_kill;//获胜者需要弃牌量
            while(1){
                for(int i = 1; i <= player[x].hand_num; ++i){
                    if(winner_get_up == 0) break;
                    if(player[x].hand[i] == 'K'){
                        winner_get_up--;
                        delete_hand(x, i);
                    }
                }
                if(winner_get_up == 0) break;
            }
            while(1){
                for(int i = 1; i <= player[aim].hand_num; ++i){
                    if(player[aim].hand[i] == 'K'){
                        aim_num_kill--;
                        delete_hand(aim, i);
                    }
                }
                if(aim_num_kill == 0) break;
            }
    //        cout << "决斗败者的手牌:" << endl;
    //        for(int i = 1; i <= player[aim].hand_num; ++i) cout << player[aim].hand[i] << ' ';
    //        cout << endl;
        }
        else{
            player[x].hp--;
            killer[x] = aim;
            if(cur_eff(x)) game_over = 1;
            int winner_get_up = num_kill + 1;
            while(1){
                for(int i = 1; i <= player[aim].hand_num; ++i){
                    if(winner_get_up == 0) break;
                    if(player[aim].hand[i] == 'K'){
                        winner_get_up--;
                        delete_hand(aim, i);
                    }
                }
                if(winner_get_up == 0) break;
            }
            while(1){
                for(int i = 1; i <= player[x].hand_num; ++i){
                    if(player[x].hand[i] == 'K') {
                        num_kill--;
                        delete_hand(x, i);
                    }
                }
                if(num_kill == 0) break;
            }
        }
    }
    void res_F(int x){//决斗
        int num_kill = 0;//决斗使用者的'杀'的数量
        for(int i = 1; i <= player[x].hand_num; ++i){
            if(player[x].hand[i] == 'K') num_kill++;
        }
        if(player[x].id == "MP"){
            for(int i = 2; i <= n; ++i){
                if(cur_player[i] && (maybe_FP[i] || sure_FP[i])){
                    if(maybe_FP[i]){
                        player[i].hp--;
                        killer[i] = x;
                        if(cur_eff(x)) game_over = 1;
                    }
                    else{
                        if(res_J(i, x)) return;
                        else do_F(x, i, num_kill);
                    }
                    return;
                }
            }
        }
        else if(player[x].id == "ZP"){
            for(int i = x + 1; i < n + x; ++i){
                int tmp = i;
                if(tmp > n) tmp -= n;
                if(cur_player[tmp] && sure_FP[tmp]){
                    if(res_J(tmp, x)){
    
                    }
                    else{
                        do_F(x, tmp, num_kill);
                    }
                    sure_ZP[x] = 1;
                    maybe_FP[x] = 0;
                    sure_FP[x] = 0;
                    return;
                }
            }
        }
        else if(player[x].id == "FP"){
            if(res_J(1, x)){//反贼只会决斗主公
    
            }
            else{
                do_F(x, 1, num_kill);
            }
            sure_FP[x] = 1;
            maybe_FP[x] = 0;
            sure_ZP[x] = 0;
            return;
        }
    }
    int find_aim_K(int x){
    //    cout << x << "已经出了" << num_use_kill << "张杀了" << endl;
        if(num_use_kill == 1 && player[x].crossbow == 0) return 0;
        for(int i = x + 1; i < n + x; ++i){
            int tmp = i;
            if(tmp > n) tmp -= n;
            if(dis[x][tmp] == 1 && cur_player[tmp]){
                if(player[x].id == "MP"){
                    if(sure_FP[tmp] || maybe_FP[tmp]) return 1;
                }
                else if(player[x].id == "ZP"){
                    if(sure_FP[tmp]) return 1;
                }
                else if(player[x].id == "FP"){
                    if(tmp == 1 || sure_ZP[tmp]) return 1;
                }
            }
        }
        return 0;
    }
    int find_aim_F(int x){
        if(player[x].id == "MP"){
            for(int i = 2; i <= n; ++i){
                if(sure_FP[i] || maybe_FP[i]) return 1;
            }
        }
        else if(player[x].id == "ZP"){
            for(int i = x + 1; i < n + x; ++i){
                int tmp = i;
                if(tmp > n) tmp -= n;
                if(sure_FP[tmp]) return 1;
            }
        }
        else return 1;
        return 0;
    }
    int find_aim_P(int x){
        if(player[x].hp < 4) return 1;
        else return 0;
    }
    int get_up_K_D(int x, int flag){//flag=0,丢弃'杀';flag=1,丢弃'闪'
        for(int i = 1; i <= player[x].hand_num; ++i){
            if(flag == 0){
                if(player[x].hand[i] == 'K'){
                    delete_hand(x, i);
                    return 1;
                }
            }
            else if(flag == 1){
                if(player[x].hand[i] == 'D'){
                    delete_hand(x, i);
                    return 1;
                }
            }
        }
        player[x].hp--;
        return 0;
    }
    void res_N(int x){//南蛮入侵
        for(int i = x + 1; i < n + x; ++i){
            int tmp = i;
            if(tmp > n) tmp -= n;
            if(!cur_player[tmp]) continue;
            if(player[tmp].id == "MP"){
                if(res_J(tmp, x)) {
    //                cout << "主公通过无懈可击规避了南蛮入侵" << endl;
                    continue;//成功无懈可击
                }
                if(get_up_K_D(tmp, 0)){//成功弃牌
    //                cout << "主公成功弃牌规避了南蛮入侵" << endl;
                }
                else{
                    killer[tmp] = x;
                    if(cur_eff(x)) {
                        game_over = 1;
                        return;
                    }
    //                cout << "主公受到南蛮入侵的伤害" << endl;
                    if(!sure_FP[x] && !sure_ZP[x]) {
                        maybe_FP[x] = 1;//身份不确定,并对主公造成伤害,标记类反贼
                    }
                }
            }
            else if(player[tmp].id == "ZP"){
                if(sure_ZP[tmp]) {
                    if(res_J(tmp, x)) {
    //                    cout << tmp << "通过无懈可击规避了南蛮入侵" << endl;
                        continue;//只有确定忠臣身份才会触发无懈可击
                    }
                }
                if(!get_up_K_D(tmp, 0)) {
    //                cout << tmp << "受到了南蛮入侵的伤害" << endl;
                    killer[tmp] = x;
                    if(cur_eff(x)){
                        game_over = 1;
                        return;
                    }
                }
                else{
    //                cout << tmp << "成功弃牌规避了南蛮入侵" << endl;
                }
            }
            else if(player[tmp].id == "FP"){
                if(sure_FP[tmp]) {
                    if(res_J(tmp, x)) {
    //                    cout << tmp << "通过无懈可击规避了南蛮入侵" << endl;
                        continue;
                    }
                }
                if(!get_up_K_D(tmp, 0)) {
    //                cout << tmp << "受到了南蛮入侵的伤害" << endl;
                    killer[tmp] = x;
                    if(cur_eff(x)){
                        game_over = 1;
                        return;
                    }
                }
                else{
    //                cout << tmp << "成功弃牌规避了南蛮入侵" << endl;
                }
            }
        }
    }
    void res_W(int x){//万箭齐发
        for(int i = x + 1; i < n + x; ++i){
            int tmp = i;
            if(tmp > n) tmp -= n;
            if(!cur_player[tmp]) continue;
            if(player[tmp].id == "MP"){
                if(res_J(tmp, x)) {
    //                cout << "主公通过无懈可击规避了万箭齐发" << endl;
                    continue;//成功无懈可击
                }
                if(get_up_K_D(tmp, 1)){//成功弃牌
    //                cout << "主公成功弃牌规避了万箭齐发" << endl;
                }
                else{
                    killer[tmp] = x;
                    if(cur_eff(x)){
                        game_over = 1;
                        return;
                    }
    //                cout << "主公受到万箭齐发的伤害" << endl;
                    if(!sure_FP[x] && !sure_ZP[x]) {
                        maybe_FP[x] = 1;//身份不确定,并对主公造成伤害,标记类反贼
                    }
                }
            }
            else if(player[tmp].id == "ZP"){
                if(sure_ZP[tmp]) {
                    if(res_J(tmp, x)) {
    //                    cout << tmp << "通过无懈可击规避了万箭齐发" << endl;
                        continue;//只有确定忠臣身份才会触发无懈可击
                    }
                }
                if(!get_up_K_D(tmp, 1)) {
    //                cout << tmp << "受到了万箭齐发的伤害" << endl;
                    killer[tmp] = x;
                    if(cur_eff(x)){
                        game_over = 1;
                        return;
                    }
                }
                else{
    //                cout << tmp << "成功弃牌规避了万箭齐发" << endl;
                }
            }
            else if(player[tmp].id == "FP"){
                if(sure_FP[tmp]) {
                    if(res_J(tmp, x)) {
    //                    cout << tmp << "通过无懈可击规避了万箭齐发" << endl;
                        continue;
                    }
                }
                if(!get_up_K_D(tmp, 1)) {
    //                cout << tmp << "受到了万箭齐发的伤害" << endl;
                    killer[tmp] = x;
                    if(cur_eff(x)){
                        game_over = 1;
                        return;
                    }
                }
                else{
    //                cout << tmp << "成功弃牌规避了万箭齐发" << endl;
                }
            }
        }
    }
    
    int end_round(int x){
        int flag = 0;
        for(int i = 1; i <= player[x].hand_num; ++i){
            if(player[x].hand[i] == 'D' || player[x].hand[i] == 'J') flag++;
            else if(player[x].hand[i] == 'P'){
                if(!find_aim_P(x)) flag++;
            }
            else if(player[x].hand[i] == 'K') {
                if(!find_aim_K(x)) flag++;
            }
            else if(player[x].hand[i] == 'F'){
                if(!find_aim_F(x)) flag++;
            }
        }
    //    cout << flag << endl;
        if(flag == player[x].hand_num) return 1;
        else return 0;
    }
    void Play_cards(int x){
        while(1){
            if(end_round(x)) {
    //            cout << "无牌可出" << endl;
                return;
            }
            for(int i = 1; i <= player[x].hand_num; ++i){
                char cur_card = player[x].hand[i];
                if(cur_card == 'D' || cur_card == 'J') {
                    continue;
                }
                else if(cur_card == 'Z'){
                    delete_hand(x, i);
                    player[x].crossbow = 1;
                    break;
                }
                else if(cur_card == 'P' && find_aim_P(x)){
    //                cout << x << "使用了桃子" << endl;
                    delete_hand(x, i);
                    player[x].hp++;
                    break;
                }
                else if(cur_card == 'K' && find_aim_K(x)){
    //                cout << x << "使用了杀" << endl;
                    delete_hand(x, i);
                    res_K(x);
                    num_use_kill++;
                    break;
                }
                else if(cur_card == 'F' && find_aim_F(x)){
    //                cout << x << "使用了决斗" << endl;
                    delete_hand(x, i);
                    res_F(x);
                    break;
                }
                else if(cur_card == 'N'){
    //                cout << x << "使用了南蛮入侵" << endl;
                    delete_hand(x, i);
                    res_N(x);
                    break;
                }
                else if(cur_card == 'W'){
    //                cout << x << "使用了万箭齐发" << endl;
                    delete_hand(x, i);
                    res_W(x);
                    break;
                }
    
            }
            if(game_over) {
    //            cout << "游戏结束或者出牌方死亡" << endl;
                return;
            }
        }
    }
    void settlement(){//结算游戏
        for(int i = 1; i <= n; ++i){
            if(cur_player[i] == 0) cout << "DEAD" << endl;
            else{
                int num_flag = 0;
                for(int j = 1; j <= player[i].hand_num; ++j){
                    if(num_flag == 0) cout << player[i].hand[j];
                    else cout << ' ' << player[i].hand[j];
                    num_flag++;
                }
                cout << endl;
            }
        }
    }
    int main(){
        init();
        cin >> n >> m;
        for(int i = 1; i <= n; ++i){
            cin >> player[i].id;
            player[i].hand_num = 4;
            for(int j = 1; j <= 4; ++j){
                char c;
                cin >> c;
                player[i].hand[j] = c;
            }
            player[i].hp = 4;
            player[i].crossbow = 0;
            cur_player[i] = 1;
        }
        deck_num = m;
        for(int i = 1; i <= m; ++i){
            char tmp;
            cin >> tmp;
            if(i == m) last_card = tmp;
            deck[i] = tmp;
        }
    
        count_dis();
        int cur = 1;//当前属于谁的回合
        while(1){
            if(cur > n) cur -= n;
            if(!cur_player[cur]) {
                cur++;
                continue;
            }
    //        cout << "现在由" << cur << "号玩家出牌" << endl;
    
            num_use_kill = 0;
            game_over = 0;
            Draw(cur, 2);//摸牌
    
    //        cout << "摸牌后手牌如下:" << endl;
    //        for(int i = 1; i <= player[cur].hand_num; ++i) cout << player[cur].hand[i] << ' ';
    //        cout << endl;
    
            Play_cards(cur);//出牌
    
    //        cout << cur << "号玩家出牌结束" << endl;
    //        cout << "目前所有玩家手牌如下:" << endl;
    //        for(int i = 1; i <= n; ++i){
    //            cout << player[i].id << ' ';
    //            for(int j = 1; j <= player[i].hand_num; ++j) cout << player[i].hand[j] << ' ';
    //            cout << endl;
    //        }
    //        cout << "当前所有玩家身份如下:" << endl;
    //        for(int i = 2; i <= n; ++i){
    //            cout << i << ": ";
    //            if(!sure_FP[i] && !sure_ZP[i] && !maybe_FP[i]) cout << "身份不确定" << endl;
    //            else if(sure_ZP[i] && !sure_FP[i] && !maybe_FP[i]) cout << "忠臣" << endl;
    //            else if(sure_FP[i] && !sure_ZP[i] && !maybe_FP[i]) cout << "反贼" << endl;
    //            else if(maybe_FP[i] && !sure_ZP[i] && !sure_FP[i]) cout << "类反贼" << endl;
    //        }
    //        for(int i = 1; i <= n; ++i){
    //            cout << i << ": " << player[i].hp << endl;
    //        }
    
            if(winner != 0) break;//游戏是否结束
    
    //        if(deck_num == 0) {
    //            cout << "牌堆为空,游戏未结束" << endl;
    //            break;
    //        }
    //        cout << cur << "号玩家回合结束" << endl;
    
            cur++;
        }
        if(winner == 1) cout << "FP" << endl;
        else if(winner == 2) cout << "MP" << endl;
        settlement();
        return 0;
    }
  • 相关阅读:
    块结构在文件中的表示IOB【转载】
    LSTM输入层、隐含层及输出层参数理解【转载】
    L3-002 特殊堆栈 (30 分) 模拟stl
    L1-006 连续因子 (20 分) 模拟
    L2-014 列车调度 (25 分)
    L3-021 神坛 (30 分) 计算几何
    P1156 垃圾陷阱 DP
    P1063 能量项链 区间dp
    P1040 加分二叉树 区间dp
    P1605 迷宫 dfs回溯法
  • 原文地址:https://www.cnblogs.com/veasky/p/13810897.html
Copyright © 2020-2023  润新知