【整活向】SCP2026-S1

· · 个人记录

#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
using namespace std;
const int N=1010;
string s[]={"3","4","5","6","7","8","9","10","J","Q","K","A","2","D","X"};
vector<string>p[5];
int countp[5][20];
int mark[10];
int f[N]; 
string poker_model[100]; 
int lenth_model;//特殊牌型需要长度记录 
int model;//牌型记录 
int landlord_id;
int Findid(string y){
    for(int i=0;i<15;i++){
        if(s[i]==y)return i;
    }
    return -1;
}
string FindString(int id){
    return s[id];
}
bool cmp(string A,string B){
    int idA=Findid(A);
    int idB=Findid(B);
    return idA<=idB;
}
void Init(){
    memset(f,0,sizeof(f));
    vector<string>poker;
    for(int i=1;i<=4;i++){
        for(int j=0;j<13;j++){
            poker.push_back(s[j]);
        }
    } 
    poker.push_back("D");
    poker.push_back("X");
    for(int i=1;i<=17;i++){
        for(int j=1;j<=3;j++){
            int id=rand()%(poker.size());
            while(f[id])id=rand()%(poker.size());
            f[id]=1;
            p[j].push_back(poker[id]);
        }
    }
    for(int i=0;i<poker.size();i++)if(!f[i])p[4].push_back(poker[i]);

    for(int i=1;i<=4;i++){
        sort(p[i].begin(),p[i].end(),cmp);
        for(string to:p[i])cout<<to<<" ";
        cout<<"\n";
    }
    return;
}
void Pushpoker(int idA,int idB){//把A 放到 B 中 
    for(string to:p[idA])p[idB].push_back(to);
    sort(p[idB].begin(),p[idB].end(),cmp);
    return; 
}
void Show(int id){
    if(id==1)cout<<"Mine:\n";
    else if(id<=3)cout<<"Player"<<id<<"'s";
    else cout<<"landlord's extra pokers:\n";
    for(string to:p[id])cout<<to<<" ";
    cout<<"\n";
    return;
}
void Countdown(int time){
    for(int i=time;i>=1;i--){
        Sleep(1000);
        system("cls");
        if(_kbhit()){
            char ch=getch();
            cout<<"Warn!\n";
        }
        cout<<i<<"\n";
    }
    return;
}
void Import(){//导入数据 
    for(int i=1;i<=3;i++){
        for(string to:p[i])countp[i][Findid(to)]++;

    }
    return;
}
bool check_AAAB(int id,int k){
    if(!k){
        int f1=0,f2=0;
        for(int i=0;i<15;i++){
            if(countp[id][i]==3 && !f1){
                f1=i+1;
            }
            else if(countp[id][i]==1 && !f2){
                f2=i+1;
            }
        }
        if(!f1 || !f2)return false;
        model=1;
        countp[id][f1-1]-=3;
        countp[id][f2-1]-=1;
        poker_model[1]=FindString(f1-1);
        poker_model[2]=FindString(f2-1);
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=1;i<=3;i++){
            cout<<poker_model[1]<<" ";
        }
        cout<<poker_model[2]<<"\n";
    }
    else if(k==1){
        int f1=0,f2=0;
        for(int i=0;i<15;i++){
            if(countp[id][i]>=3){
                f1=i+1;
                break;
            }
        }
        if(!f1)return 0;
        for(int i=0;i<15;i++){
            if(i==f1-1)continue;
            if(countp[id][i]>=1){
                f2=i+1;
                break;
            }
        }
        if(!f2)return 0;
        model=1;
        countp[id][f1-1]-=3;
        countp[id][f2-1]-=1;
        poker_model[1]=FindString(f1-1);
        poker_model[2]=FindString(f2-1);
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=1;i<=3;i++){
            cout<<poker_model[1]<<" ";
        }
        cout<<poker_model[2]<<"\n";
    }
    else if(k==2){
        int f1=0,f2=0;
        for(int i=0;i<15;i++){
            if(i>=Findid(poker_model[1])+1 && countp[id][i]==3 && !f1){
                f1=i+1;
            }
            else if(countp[id][i]==1 && !f2){
                f2=i+1;
            }
        }
        if(!f1 || !f2)return false;
        model=1;
        countp[id][f1-1]-=3;
        countp[id][f2-1]-=1;
        poker_model[1]=FindString(f1-1);
        poker_model[2]=FindString(f2-1);
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=1;i<=3;i++){
            cout<<poker_model[1]<<" ";
        }
        cout<<poker_model[2]<<"\n";
    }
    else{
        int f1=0,f2=0;
        for(int i=Findid(poker_model[1])+1;i<15;i++){
            if(countp[id][i]>=3){
                f1=i+1;
                break;
            }
        }
        if(!f1)return 0;
        for(int i=0;i<15;i++){
            if(i==f1-1)continue;
            if(countp[id][i]>=1){
                f2=i+1;
                break;
            }
        }
        if(!f2)return 0;
        model=1;
        countp[id][f1-1]-=3;
        countp[id][f2-1]-=1;
        poker_model[1]=FindString(f1-1);
        poker_model[2]=FindString(f2-1);
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=1;i<=3;i++){
            cout<<poker_model[1]<<" ";
        }
        cout<<poker_model[2]<<"\n";
    }
    return 1;
}
bool check_AABBCC(int id,int k){
    if(!k){
        int lenth=0,f1=0;
        for(int i=0;i<12;i++){
            int lencnt=0;
            for(int j=i;j<12;j++){
                if(countp[id][j]==2)lencnt++;
                else break;
            }
            if(lencnt>lenth && lencnt>=3){
                lenth=lencnt;
                f1=i;
            }
        }
        if(!lenth)return 0;
        model=2;
        for(int i=f1;i<=f1+lenth-1;i++)countp[id][i]-=2;
        poker_model[1]=FindString(f1);
        lenth_model=lenth;
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=f1;i<=f1+lenth-1;i++){
            for(int j=1;j<=2;j++){
                cout<<FindString(i)<<" ";
            }
        }
        cout<<"\n";
    }
    else if(k==1){//允许拆牌 
        int lenth=0,f1=0;
        for(int i=0;i<12;i++){
            int lencnt=0;
            for(int j=i;j<12;j++){
                if(countp[id][j]>=2)lencnt++;
                else break;
            }
            if(lencnt>lenth && lencnt>=3){
                lenth=lencnt;
                f1=i;
            }
        }
        if(!lenth)return 0;
        model=2;
        for(int i=f1;i<=f1+lenth-1;i++)countp[id][i]-=2;
        poker_model[1]=FindString(f1);
        lenth_model=lenth;
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=f1;i<=f1+lenth-1;i++){
            for(int j=1;j<=2;j++){
                cout<<FindString(i)<<" ";
            }
        }
        cout<<"\n";
    }
    else if(k==2){//根据已经有的牌型出,不允许拆牌 
        int lenth=lenth_model,f1=0;
        for(int i=Findid(poker_model[1])+1;i<12-lenth+1;i++){
            int lencnt=0;
            for(int j=i;j<i+lenth-1;j++){
                if(countp[id][j]==2)lencnt++;
                else break;
            }
            if(lencnt==lenth){
                f1=i+1;
                break; 
            }
        }
        if(!f1)return 0;
        f1--;
        model=2;
        for(int i=f1;i<=f1+lenth-1;i++)countp[id][i]-=2;
        poker_model[1]=FindString(f1);
        lenth_model=lenth;
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=f1;i<=f1+lenth-1;i++){
            for(int j=1;j<=2;j++){
                cout<<FindString(i)<<" ";
            }
        }
        cout<<"\n";
    }
    else{//根据已经有的牌型出,允许拆牌 
        int lenth=lenth_model,f1=0;
        for(int i=Findid(poker_model[1])+1;i<12-lenth+1;i++){
            int lencnt=0;
            for(int j=i;j<i+lenth-1;j++){
                if(countp[id][j]>=2)lencnt++;
                else break;
            }
            if(lencnt==lenth){
                f1=i+1;
                break; 
            }
        }
        if(!f1)return 0;
        f1--;
        model=2;
        for(int i=f1;i<=f1+lenth-1;i++)countp[id][i]-=2;
        poker_model[1]=FindString(f1);
        lenth_model=lenth;
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=f1;i<=f1+lenth-1;i++){
            for(int j=1;j<=2;j++){
                cout<<FindString(i)<<" ";
            }
        }
        cout<<"\n";
    }
    return 1;
}
bool check_ABCDE(int id,int k){
    if(!k){
        int lenth=0,f1=0;
        for(int i=0;i<12;i++){
            int lencnt=0;
            for(int j=i;j<12;j++){
                if(countp[id][j]==1)lencnt++;
                else break;
            }
            if(lencnt>lenth && lencnt>=5){
                lenth=lencnt;
                f1=i;
            }
        }
        if(!lenth)return 0;
        model=3;
        for(int i=f1;i<=f1+lenth-1;i++)countp[id][i]-=1;
        poker_model[1]=FindString(f1);
        lenth_model=lenth;
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=f1;i<=f1+lenth-1;i++){
            cout<<FindString(i)<<" ";
        }
        cout<<"\n";
    }
    else if(k==1){//允许拆牌 
        int lenth=0,f1=0;
        for(int i=0;i<12;i++){
            int lencnt=0;
            for(int j=i;j<12;j++){
                if(countp[id][j]>=1)lencnt++;
                else break;
            }
            if(lencnt>lenth && lencnt>=5){
                lenth=lencnt;
                f1=i;
            }
        }
        if(!lenth)return 0;
        model=3;
        for(int i=f1;i<=f1+lenth-1;i++)countp[id][i]-=1;
        poker_model[1]=FindString(f1);
        lenth_model=lenth;
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=f1;i<=f1+lenth-1;i++){
            cout<<FindString(i)<<" ";
        }
        cout<<"\n";
    }
    else if(k==2){//根据已经有的牌型出,不允许拆牌 
        int lenth=lenth_model,f1=0;
        for(int i=Findid(poker_model[1])+1;i<12-lenth+1;i++){
            int lencnt=0;
            for(int j=i;j<i+lenth-1;j++){
                if(countp[id][j]==1)lencnt++;
                else break;
            }
            if(lencnt==lenth){
                f1=i+1;
                break; 
            }
        }
        if(!f1)return 0;
        f1--;
        model=3;
        for(int i=f1;i<=f1+lenth-1;i++)countp[id][i]-=1;
        poker_model[1]=FindString(f1);
        lenth_model=lenth;
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=f1;i<=f1+lenth-1;i++){
            cout<<FindString(i)<<" ";
        }
        cout<<"\n";
    }
    else{//根据已经有的牌型出,允许拆牌 
        int lenth=lenth_model,f1=0;
        for(int i=Findid(poker_model[1])+1;i<12-lenth+1;i++){
            int lencnt=0;
            for(int j=i;j<i+lenth-1;j++){
                if(countp[id][j]>=1)lencnt++;
                else break;
            }
            if(lencnt==lenth){
                f1=i+1;
                break; 
            }
        }
        if(!f1)return 0;
        f1--;
        model=3;
        for(int i=f1;i<=f1+lenth-1;i++)countp[id][i]-=1;
        poker_model[1]=FindString(f1);
        lenth_model=lenth;
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=f1;i<=f1+lenth-1;i++){
            cout<<FindString(i)<<" ";
        }
        cout<<"\n";
    }
    return 1;   
}
bool check_A(int id,int k){
    if(!k){
        int f1=0;
        for(int i=0;i<15;i++){
            if(countp[id][i]==1){
                f1=i+1;
                break;
            }
        }
        if(!f1)return 0;
        model=4;
        countp[id][f1-1]-=1;
        poker_model[1]=FindString(f1-1);
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        cout<<poker_model[1]<<"\n";
    }
    else if(k==1){
        int f1=0;
        for(int i=0;i<15;i++){
            if(countp[id][i]>=1){
                f1=i+1;
                break;
            }
        }
        if(!f1)return 0;
        model=4;
        countp[id][f1-1]-=1;
        poker_model[1]=FindString(f1-1);
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        cout<<poker_model[1]<<"\n";
    }
    else if(k==2){
        int f1=0;
        for(int i=Findid(poker_model[1])+1;i<15;i++){
            if(countp[id][i]==1){
                f1=i+1;
                break;
            }
        }
        if(!f1)return 0;
        model=4;
        countp[id][f1-1]-=1;
        poker_model[1]=FindString(f1-1);
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        cout<<poker_model[1]<<"\n";
    }
    else{
        int f1=0;
        for(int i=Findid(poker_model[1])+1;i<15;i++){
            if(countp[id][i]>=1){
                f1=i+1;
                break;
            }
        }
        if(!f1)return 0;
        model=4;
        countp[id][f1-1]-=1;
        poker_model[1]=FindString(f1-1);
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        cout<<poker_model[1]<<"\n";
    }
    return 1;
}
bool check_AA(int id,int k){
    if(!k){
        int f1=0;
        for(int i=0;i<15;i++){
            if(countp[id][i]==2){
                f1=i+1;
                break;
            }
        }
        if(!f1)return 0;
        model=5;
        countp[id][f1-1]-=2;
        poker_model[1]=FindString(f1-1);
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=1;i<=2;i++)cout<<poker_model[1]<<" ";
        cout<<"\n";
    }
    else if(k==1){
        int f1=0;
        for(int i=0;i<15;i++){
            if(countp[id][i]>=2){
                f1=i+1;
                break;
            }
        }
        if(!f1)return 0;
        model=5;
        countp[id][f1-1]-=2;
        poker_model[1]=FindString(f1-1);
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=1;i<=2;i++)cout<<poker_model[1]<<" ";
        cout<<"\n";
    }
    else if(k==2){
        int f1=0;
        for(int i=Findid(poker_model[1])+1;i<15;i++){
            if(countp[id][i]==2){
                f1=i+1;
                break;
            }
        }
        if(!f1)return 0;
        model=5;
        countp[id][f1-1]-=2;
        poker_model[1]=FindString(f1-1);
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=1;i<=2;i++)cout<<poker_model[1]<<" ";
        cout<<"\n";
    }
    else{
        int f1=0;
        for(int i=Findid(poker_model[1])+1;i<15;i++){
            if(countp[id][i]>=2){
                f1=i+1;
                break;
            }
        }
        if(!f1)return 0;
        model=5;
        countp[id][f1-1]-=2;
        poker_model[1]=FindString(f1-1);
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=1;i<=2;i++)cout<<poker_model[1]<<" ";
        cout<<"\n";
    }
    return 1;
}
bool check_AAAA(int id,int k){
    if(!k){
        int f1=0;
        for(int i=0;i<15;i++){
            if(countp[id][i]==4){
                f1=i+1;
                break;
            }
        }
        if(!f1){
            if(countp[id][13]==1 && countp[id][14]==1){
                model=7;
                countp[id][13]--;
                countp[id][14]--;
                if(id==1)cout<<"My ";
                else if(id<=3)cout<<"player"<<id<<"'s ";
                cout<<"move:\n";
                cout<<"D X"<<"\n";
                cout<<"\n";
                return 1;
            }
            return 0;
        }
        model=6;
        countp[id][f1-1]-=4;
        poker_model[1]=FindString(f1-1);
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=1;i<=4;i++)cout<<poker_model[1]<<" ";
        cout<<"\n";
    }
    else if(k==2){
        int f1=0;
        for(int i=Findid(poker_model[1])+1;i<15;i++){
            if(countp[id][i]==4){
                f1=i+1;
                break;
            }
        }
        if(!f1){
            if(countp[id][13]==1 && countp[id][14]==1){
                model=7;
                countp[id][13]--;
                countp[id][14]--;
                if(id==1)cout<<"My ";
                else if(id<=3)cout<<"player"<<id<<"'s ";
                cout<<"move:\n";
                cout<<"D X"<<"\n";
                cout<<"\n";
                return 1;
            }
            return 0;
        }
        model=6;
        countp[id][f1-1]-=4;
        poker_model[1]=FindString(f1-1);
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"move:\n";
        for(int i=1;i<=4;i++)cout<<poker_model[1]<<" ";
        cout<<"\n";
    }
    return 1;
}
void Free_choice(int id){//AAAB>AABBCC>ABCDE>A>AA>AAAA>DX
    if(check_AAAB(id,0))return;
    if(check_AABBCC(id,0))return;
    if(check_ABCDE(id,0))return;
    if(check_A(id,0))return;
    if(check_AA(id,0))return;
    if(check_AAAA(id,0))return;
}
bool NotFree_choice(int id){
    if(model==1 && check_AAAB(id,3))return 1;
    if(model==2 && check_AABBCC(id,3))return 1;
    if(model==3 && check_ABCDE(id,3))return 1;
    if(model==4 && check_A(id,3))return 1;
    if(model==5 && check_AA(id,3))return 1;
    if(model==6 && check_AAAA(id,2))return 1;
    cout<<"Pass\n";
    mark[id]=1;
    return 0;
}
bool VeryFree_choice(int id){
if(model==1 && check_AAAB(id,2))return 1;
    if(model==2 && check_AABBCC(id,2))return 1;
    if(model==3 && check_ABCDE(id,2))return 1;
    if(model==4 && check_A(id,2))return 1;
    if(model==5 && check_AA(id,2))return 1;
    if(model==6 && check_AAAA(id,2))return 1;
    cout<<"Pass\n";
    mark[id]=1;
    return 0;
}
int count_poker(int id){
    int ans=0;
    for(int j=0;j<15;j++)ans+=countp[id][j];
    return ans;
}
void poker_report(){
    cout<<"Shold more than ";
    if(model==0){
        cout<<"Nothing\n";
    }
    else if(model==1){
        for(int i=1;i<=3;i++)cout<<poker_model[1]<<" ";
        cout<<poker_model[2]<<"\n";
    }
    else if(model==2){
        for(int i=Findid(poker_model[1]);i<=Findid(poker_model[1])+lenth_model-1;i++){
            for(int j=1;j<=2;j++)cout<<FindString(i)<<" ";
        }
    }
    else if(model==3){
        for(int i=Findid(poker_model[1]);i<=Findid(poker_model[1])+lenth_model-1;i++){
            cout<<FindString(i)<<" ";
        }
    }
    else if(model==4){
        cout<<poker_model[1]<<"\n";
    }
    else if(model==5){
        for(int i=1;i<=2;i++)cout<<poker_model[1]<<" ";
        cout<<"\n";
    }
    else if(model==6){
        for(int i=1;i<=4;i++)cout<<poker_model[1]<<" ";
        cout<<"\n";
    }
    else if(model==7){
        cout<<"D X\n";
    }
    for(int i=1;i<=3;i++){
        if(i==1)cout<<"My have";
        else if(i<=3)cout<<"player"<<i<<" has";
        int ans=count_poker(i);
        cout<<" "<<ans;
        cout<<" poker";
        if(ans>1)cout<<"s";
        cout<<"\n";
    }
    cout<<"\n";
    return;
}
bool check_poker(string push_poker){
    string p="";
    int k[N];
    for(int i=0;i<15;i++)k[i]=countp[1][i];
    for(int i=0;i<push_poker.size();i++){
        if(push_poker[i]==' ' || i==push_poker.size()-1){
            if(p!=""){
                int poker_id=Findid(p);
                if(poker_id==-1)return 0;
                k[poker_id]--;
                if(k[poker_id]<0)return 0;
            }
            p="";
        }
        else{
            p+=push_poker[i];
        }
    }
    return 1;
}
bool model_AAAB(string push_poker){
    string p="";
    vector<int>v;
    v.clear(); 
    for(int i=0;i<push_poker.size();i++){
        if(push_poker[i]==' ' || i==push_poker.size()-1){
            if(p!=""){
                int poker_id=Findid(p);
                v.push_back(poker_id);
                //cout<<p<<"\n";
            }
            p="";
        }
        else{
            p+=push_poker[i];
        }
    }
    //cout<<push_poker<<"\n";
    //for(int to:v)cout<<to<<" ";
    //cout<<endl; 
    if(v.size()!=4)return 0;
    if(v[0]!=v[1] || v[1]!=v[2])return 0;
    if(v[0]<=Findid(poker_model[1]))return 0;
    poker_model[1]=FindString(v[0]);
    poker_model[2]=FindString(v[3]);
    return 1;
}
bool model_AABBCC(string push_poker){
    string p="";
    vector<int>v;
    v.clear();
    for(int i=0;i<push_poker.size();i++){
        if(push_poker[i]==' ' || i==push_poker.size()-1){
            if(p!=""){
                int poker_id=Findid(p);
                v.push_back(poker_id);
            }
            p="";
        }
        else{
            p+=push_poker[i];
        }
    }
    if(v.size()!=lenth_model*2)return 0;
    for(int i=0;i<lenth_model;i+=2){
        if(v[i]!=v[i+1])return 0;
        if(i!=0 && v[i]!=v[i-1]+1)return 0;
        if(v[i]>=12)return 0;
    }
    if(v[0]<=Findid(poker_model[1]))return 0;
    for(int i=0;i<lenth_model;i++){
        poker_model[i+1]=FindString(v[i*2]);
    }
    return 1;
}
bool model_ABCDE(string push_poker){
    string p="";
    vector<int>v;
    v.clear();
    for(int i=0;i<push_poker.size();i++){
        if(push_poker[i]==' ' || i==push_poker.size()-1){
            if(p!=""){
                int poker_id=Findid(p);
                v.push_back(poker_id);
            }
            p="";
        }
        else{
            p+=push_poker[i];
        }
    }
    if(v.size()!=lenth_model)return 0;
    for(int i=0;i<lenth_model;i++){
        if(i!=0 && v[i]!=v[i-1]+1)return 0;
        if(v[i]>=12)return 0;
    }
    if(v[0]<=Findid(poker_model[1]))return 0;
    for(int i=0;i<lenth_model;i++){
        poker_model[i+1]=FindString(v[i]);
    }
    return 1;
}
bool model_A(string push_poker){
    string p="";
    vector<int>v;
    v.clear(); 
    for(int i=0;i<push_poker.size();i++){
        if(push_poker[i]==' ' || i==push_poker.size()-1){
            if(p!=""){
                int poker_id=Findid(p);
                cout<<"pokerid="<<poker_id;
                v.push_back(poker_id);
            }
            cout<<p<<"\n";
            p="";
        }
        else{
            p+=push_poker[i];
        }
    }
    cout<<v.size()<<"\n";
    if(v.size()!=1)return 0;
    cout<<v[0]<<" "<<Findid(poker_model[1])<<"\n";
    if(v[0]<=Findid(poker_model[1]))return 0;
    poker_model[1]=FindString(v[0]);
    return 1;
}
bool model_AA(string push_poker){
    string p="";
    vector<int>v;
    v.clear(); 
    for(int i=0;i<push_poker.size();i++){
        if(push_poker[i]==' ' || i==push_poker.size()-1){
            if(p!=""){
                int poker_id=Findid(p);
                v.push_back(poker_id);
            }
            p="";
        }
        else{
            p+=push_poker[i];
        }
    }
    if(v.size()!=2)return 0;
    if(v[0]!=v[1])return 0;
    if(v[0]<=Findid(poker_model[1]))return 0;
    poker_model[1]=FindString(v[0]);
    return 1;
}
bool model_AAAA(string push_poker){
    string p="";
    vector<int>v;
    v.clear(); 
    model=6;
    for(int i=0;i<push_poker.size();i++){
        if(push_poker[i]==' ' || i==push_poker.size()-1){
            if(p!=""){
                int poker_id=Findid(p);
                v.push_back(poker_id);
            }
            p="";
        }
        else{
            p+=push_poker[i];
        }
    }
    if(v.size()!=4)return 0;
    if(v[0]!=v[1] || v[1]!=v[2] || v[2]!=v[3])return 0;
    if(v[0]<=Findid(poker_model[1]))return 0;
    poker_model[1]=FindString(v[0]);
    return 1;
}
bool check_poker_model(int checkid,string push_poker){
    cout<<model<<"\n";
    if(checkid==1)return 1;
    if(model==1)return model_AAAB(push_poker);
    else if(model==2)return model_AABBCC(push_poker);
    else if(model==3)return model_ABCDE(push_poker);
    else if(model==4)return model_A(push_poker);
    else if(model==5)return model_AA(push_poker);
    else if(1)return model_AAAA(push_poker);
    else if(model==7)return 0;
}
void cutdown_poker(int id,string push_poker){
    string p="";
    for(int i=0;i<push_poker.size();i++){
        if(push_poker[i]==' ' || i==push_poker.size()-1){
            if(p!=""){
                int poker_id=Findid(p);
                countp[id][poker_id]--;
            }
            p="";
        }
        else{
            p+=s[i];
        }
    }
}
int main(){
    srand(time(0));
    Init();
    Show(1);
    system("pause");
    double wait_time=(rand()%100+1)/100.0;
    //Countdown(5);
    Sleep(500);
    system("cls");
    clock_t start=clock();
    while((clock()-start)/(double)CLOCKS_PER_SEC<wait_time){
        if(_kbhit()){
            char ch=_getch();
            if(ch==' '){
                cout<<"You are the landlord!\n";
                landlord_id=1;
                break;
            }
        }
    }
    Show(4);
    if(landlord_id==1){
        Pushpoker(4,1); 
    }
    else{
        landlord_id=rand()%2+2;
        Pushpoker(4,landlord_id);
        cout<<"Player"<<landlord_id<<" is "<<"landlord!\n";
    }
    system("pause");
    system("cls");
    //Countdown(3);
    cout<<"The conflict has begun!\n";
    int starter=landlord_id;
    Import();//导入牌的数据 
    int cnt=2;//不叫计数器 
    int id=starter;
    while(1){
        if(id==1)cout<<"My ";
        else if(id<=3)cout<<"player"<<id<<"'s ";
        cout<<"Round\n";
        poker_report();
        cout<<"\n\n\n";
        if(id==1){
            Show(1);
            int checkid=0;//检查方式 
            if(cnt==2){
                cout<<"Free:\n";
                cnt=0;
                mark[1]=mark[2]=mark[3]=0;
                checkid=1; 
            }
            while(1){
                string push_poker;
                char ch=getch();
                getline(cin,push_poker);
                cout<<push_poker;
                if(push_poker=="Pass"){
                    cnt++;
                    mark[id]=1;
                    //cout<<"Pass\n";
                    break;
                }
                if(!check_poker(push_poker)){
                    cout<<"Warn11!\n";
                    continue;
                }
                if(!check_poker_model(checkid,push_poker)){
                    cout<<"Warn114514!\n";
                    continue;
                }
                cout<<"Success\n";
                cutdown_poker(id,push_poker);
                break;
            }
            system("pause");
        }
        else{
            if(cnt==2){//这么多人都已经不叫了 
                Free_choice(id);//选择出的牌 
                cnt=0;
                mark[1]=mark[2]=mark[3]=0;
            }
            else{
                if(id==landlord_id){
                    if(!NotFree_choice(id))cnt++;
                } 
                else{
                    int last_id=id-1;
                    if(last_id==0)last_id=3;
                    if(last_id==landlord_id){
                        if(!VeryFree_choice(id))cnt++;
                        else{
                            mark[1]=mark[2]=mark[3]=0;
                            cnt=0;
                        }
                    }
                    else if(mark[last_id]){
                        if(!NotFree_choice(id))cnt++;
                        else{
                            mark[1]=mark[2]=mark[3]=0;
                            cnt=0;
                        }
                    }
                    else{
                        if(count_poker(id)<count_poker(last_id) && count_poker(landlord_id)<=5){
                            if(!VeryFree_choice(id))cnt++;
                        }
                        else{
                            cout<<"Pass\n";
                            mark[id]=1;
                            cnt++;
                        }
                    }
                }
            } 
            system("pause");
        }
        if(!count_poker(id)){
            if(id==landlord_id)cout<<"The lanlord win!\n";
            else cout<<"The farmer win!";
            break;
        }
        id++;
        if(id==4){
            id=1;
        }
        system("cls");
    }
    return 0;
}
//A
//AA
//AAAB
//AAAA
//DX
//AABBCC
//ABCDE

//考虑什么时候会拆牌:
//队友出不了过了(或者没有队友)
//考虑什么时候会接队友的牌:
//队友牌数>我的牌数且对手的牌<=5

//若是自由出牌的回合,出牌类型的优先级:AAAB>AABBCC>ABCDE>A>AA>AAAA>DX