双人手动发牌
初始版本很简单,输入两人名字,再每人输入5张牌
#include<iostream>
#include<algorithm>
#include<map>
#include<cmath>
using namespace std;
map<string,int>mp;
struct node{
string name,type_name;
int cards[5];
}player[100];
void list()
{
mp["方2"]=1; mp["梅2"]=2; mp["红2"]=3; mp["黑2"]=4;
mp["方3"]=5; mp["梅3"]=6; mp["红3"]=7; mp["黑3"]=8;
mp["方4"]=9; mp["梅4"]=10; mp["红4"]=11; mp["黑4"]=12;
mp["方5"]=13; mp["梅5"]=14; mp["红5"]=15; mp["黑5"]=16;
mp["方6"]=17; mp["梅6"]=18; mp["红6"]=19; mp["黑6"]=20;
mp["方7"]=21; mp["梅7"]=22; mp["红7"]=23; mp["黑7"]=24;
mp["方8"]=25; mp["梅8"]=26; mp["红8"]=27; mp["黑8"]=28;
mp["方9"]=29; mp["梅9"]=30; mp["红9"]=31; mp["黑9"]=32;
mp["方10"]=33; mp["梅10"]=34; mp["红10"]=35; mp["黑10"]=36;
mp["方J"]=37; mp["梅J"]=38; mp["红J"]=39; mp["黑J"]=40;
mp["方Q"]=41; mp["梅Q"]=42; mp["红Q"]=43; mp["黑Q"]=44;
mp["方K"]=45; mp["梅K"]=46; mp["红K"]=47; mp["黑K"]=48;
mp["方A"]=49; mp["梅A"]=50; mp["红A"]=51; mp["黑A"]=52;
}
int shun(int num[])
{
for(int i=1;i<5;i++)
if((num[i-1]-1)/4!=(num[i]-1)/4-1)
return 0; //不是顺子
for(int i=1;i<5;i++)
if(num[i]-num[i-1]!=4)
return 4; //普通顺子
if((num[0]-1)/4==8)
return 9; //皇家同花顺
return 8; //同花顺
}
int dui(int num[])
{
map<int,int>mp_flag;
for(int i=0;i<5;i++)
mp_flag[(num[i]-1)/4]++;
map<int,int>::iterator it=mp_flag.begin();
if(mp_flag.size()==2)
{
if(it->second==4||(++it)->second==4)return 7; //四条
else return 6; //葫芦(三条加对子)
}
else if(mp_flag.size()==3)
{
if(it->second==3||(++it)->second==3||mp_flag[2]==3)
return 3; //三条
else return 2; //两对
}
else if(mp_flag.size()==4)
return 1; //对子
else return 0;
}
int flower(int num[])
{
int count=0,flag=num[0]%4;
for(int i=1;i<5;i++)
if(num[i]%4!=flag)
return 0;
return 5; //同花
}
int type(int num[]) //对每种类型进行编码
{
int flag=max({shun(num),dui(num),flower(num)});
switch(flag) //是顺子就不可能是对子,但有可能是同花
{
//因为牌在主函数已经排好序了
case 9:case 8:case 5:case 4:
return flag*20000+(num[4]-1)/4;
case 7:case 6:case 3:
return flag*20000+(num[2]-1)/4;
case 2:
{
int count=40000,flag_1=2;
count+=((num[3]-1)/4+1)*pow(14,flag_1--);
count+=((num[1]-1)/4+1)*pow(14,flag_1--);
if(num[0]!=num[1])
count+=(num[0]-1)/4+1;
else if(num[4]!=num[3])
count+=(num[4]-1)/4+1;
else count+=(num[2]-1)/4+1;
return count;
}
case 1:
{
int count=0,flag_1=0;
for(int i=0;i<5;i++)
if((num[i]-1)/4==(num[i+1]-1)/4)
{
count+=((num[i]-1)/4+1)*2600;
i++;
}
else count+=((num[i]-1)/4+1)*pow(14,flag_1++);
return count;
}
case 0:
{
int count=0,flag_1=0;
for(int i=4;i>=0;i--)
count+=-(13-(num[i]-1)/4)*pow(14,flag_1++);
return count;
}
}
}
void cards_name(int n)
{
for(int i=0;i<n;i++)
{
switch(type(player[i].cards)/20000)
{
case 9:player[i].type_name="皇家同花顺";break;
case 8:player[i].type_name="同花顺";break;
case 7:player[i].type_name="四条";break;
case 6:player[i].type_name="葫芦";break;
case 5:player[i].type_name="同花";break;
case 4:player[i].type_name="顺子";break;
case 3:player[i].type_name="三条";break;
case 2:player[i].type_name="两对";break;
case 1:
case 0:player[i].type_name="对子";break;
default:player[i].type_name="高牌";break;
}
}
}
int main()
{
list();
cout<<"输入两位玩家名字:"<<endl;
for(int i=0;i<2;i++)
cin>>player[i].name;
for(int i=0;i<2;i++)
{
cout<<"输入"<<player[i].name<<"的五张牌:";
for(int j=0;j<5;j++)
{
string s;
cin>>s;
player[i].cards[j]=mp[s];
}
sort(player[i].cards,player[i].cards+5); //对每位玩家的牌进行排序
}
cards_name(2);
cout<<dui(player[0].cards)<<endl;
cout<<player[0].name<<" "<<player[0].type_name<<endl;
cout<<player[1].name<<" "<<player[1].type_name<<endl;
if(type(player[0].cards)>type(player[1].cards))
cout<<player[0].name<<"赢";
else if(type(player[0].cards)==type(player[1].cards))
cout<<"平局";
else cout<<player[1].name<<"赢";
return 0;
}
多人手动发牌
此版本较上一版本增加了多人模式,以及输入牌型错误时提示重新输入功能
#include<iostream>
#include<algorithm>
#include<map>
#include<cmath>
using namespace std;
map<string,int>mp;
struct node{
string name,type_name;
int cards[5];
}player[100];
void list()
{
mp["方2"]=1; mp["梅2"]=2; mp["红2"]=3; mp["黑2"]=4;
mp["方3"]=5; mp["梅3"]=6; mp["红3"]=7; mp["黑3"]=8;
mp["方4"]=9; mp["梅4"]=10; mp["红4"]=11; mp["黑4"]=12;
mp["方5"]=13; mp["梅5"]=14; mp["红5"]=15; mp["黑5"]=16;
mp["方6"]=17; mp["梅6"]=18; mp["红6"]=19; mp["黑6"]=20;
mp["方7"]=21; mp["梅7"]=22; mp["红7"]=23; mp["黑7"]=24;
mp["方8"]=25; mp["梅8"]=26; mp["红8"]=27; mp["黑8"]=28;
mp["方9"]=29; mp["梅9"]=30; mp["红9"]=31; mp["黑9"]=32;
mp["方10"]=33; mp["梅10"]=34; mp["红10"]=35; mp["黑10"]=36;
mp["方J"]=37; mp["梅J"]=38; mp["红J"]=39; mp["黑J"]=40;
mp["方Q"]=41; mp["梅Q"]=42; mp["红Q"]=43; mp["黑Q"]=44;
mp["方K"]=45; mp["梅K"]=46; mp["红K"]=47; mp["黑K"]=48;
mp["方A"]=49; mp["梅A"]=50; mp["红A"]=51; mp["黑A"]=52;
}
int shun(int num[])
{
for(int i=1;i<5;i++)
if((num[i-1]-1)/4!=(num[i]-1)/4-1)
return 0; //不是顺子
for(int i=1;i<5;i++)
if(num[i]-num[i-1]!=4)
return 4; //普通顺子
if((num[0]-1)/4==8)
return 9; //皇家同花顺
return 8; //同花顺
}
int dui(int num[])
{
map<int,int>mp_flag;
for(int i=0;i<5;i++)
mp_flag[(num[i]-1)/4]++;
map<int,int>::iterator it=mp_flag.begin();
if(mp_flag.size()==2)
{
if(it->second==4||(++it)->second==4)return 7; //四条
else return 6; //葫芦(三条加对子)
}
else if(mp_flag.size()==3)
{
if(it->second==3||(++it)->second==3||mp_flag[2]==3)
return 3; //三条
else return 2; //两对
}
else if(mp_flag.size()==4)
return 1; //对子
else return 0;
}
int flower(int num[])
{
int count=0,flag=num[0]%4;
for(int i=1;i<5;i++)
if(num[i]%4!=flag)
return 0;
return 5; //同花
}
int type(int num[]) //对每种类型进行编码
{
int flag=max({shun(num),dui(num),flower(num)});
switch(flag) //是顺子就不可能是对子,但有可能是同花
{
//因为牌在主函数已经排好序了
case 9:case 8:case 5:case 4:
return flag*20000+(num[4]-1)/4;
case 7:case 6:case 3:
return flag*20000+(num[2]-1)/4;
case 2:
{
int count=40000,flag_1=2;
count+=((num[3]-1)/4+1)*pow(14,flag_1--);
count+=((num[1]-1)/4+1)*pow(14,flag_1--);
if(num[0]!=num[1])
count+=(num[0]-1)/4+1;
else if(num[4]!=num[3])
count+=(num[4]-1)/4+1;
else count+=(num[2]-1)/4+1;
return count;
}
case 1:
{
int count=0,flag_1=0;
for(int i=0;i<5;i++)
if((num[i]-1)/4==(num[i+1]-1)/4)
{
count+=((num[i]-1)/4+1)*2600;
i++;
}
else count+=((num[i]-1)/4+1)*pow(14,flag_1++);
return count;
}
case 0:
{
int count=0,flag_1=0;
for(int i=4;i>=0;i--)
count+=-(13-(num[i]-1)/4)*pow(14,flag_1++);
return count;
}
}
}
void cards_name(int n)
{
for(int i=0;i<n;i++)
{
switch(type(player[i].cards)/20000)
{
case 9:player[i].type_name="皇家同花顺";break;
case 8:player[i].type_name="同花顺";break;
case 7:player[i].type_name="四条";break;
case 6:player[i].type_name="葫芦";break;
case 5:player[i].type_name="同花";break;
case 4:player[i].type_name="顺子";break;
case 3:player[i].type_name="三条";break;
case 2:player[i].type_name="两对";break;
case 1:
case 0:player[i].type_name="对子";break;
default:player[i].type_name="高牌";break;
}
}
}
bool cmp(node a,node b)
{
return type(a.cards)>type(b.cards);
}
int main()
{
list();
int N;
cout<<"输入玩家人数:";
cin>>N;
cout<<"输入"<<N<<"位玩家名字:"<<endl;
for(int i=0;i<N;i++)
cin>>player[i].name;
for(int i=0;i<N;i++)
{
cout<<"输入"<<player[i].name<<"的五张牌:";
for(int j=0;j<5;j++)
{
string s;
cin>>s;
while(mp.find(s)==mp.end())
{
cout<<"第"<<j+1<<"张牌输入错误,请重新输入!"<<endl;
cin>>s;
}
player[i].cards[j]=mp[s];
}
sort(player[i].cards,player[i].cards+5); //对每位玩家的牌进行排序
}
cards_name(N); //存入玩家卡片类型名
sort(player,player+N,cmp); //对玩家按牌大小排序
if(type(player[0].cards)==type(player[1].cards))
cout<<"平局";
else cout<<player[0].name<<"赢!牌型为:"<<player[0].type_name;
return 0;
}
多人手动、自动发牌
此版本较上一版本多了自动发牌功能,因期末作业截止了,所以自动发牌还是有些bug,以后有时间再做修改。
#include<iostream>
#include<algorithm>
#include<map>
#include<cmath>
#include<iomanip>
using namespace std;
map<string,int>mp;
string public_cards="";
struct node{
string name,type_name,cards_name[7];
int cards[5],all_cards[8];
}player[100];
void list()
{
mp["方2"]=1; mp["梅2"]=2; mp["红2"]=3; mp["黑2"]=4;
mp["方3"]=5; mp["梅3"]=6; mp["红3"]=7; mp["黑3"]=8;
mp["方4"]=9; mp["梅4"]=10; mp["红4"]=11; mp["黑4"]=12;
mp["方5"]=13; mp["梅5"]=14; mp["红5"]=15; mp["黑5"]=16;
mp["方6"]=17; mp["梅6"]=18; mp["红6"]=19; mp["黑6"]=20;
mp["方7"]=21; mp["梅7"]=22; mp["红7"]=23; mp["黑7"]=24;
mp["方8"]=25; mp["梅8"]=26; mp["红8"]=27; mp["黑8"]=28;
mp["方9"]=29; mp["梅9"]=30; mp["红9"]=31; mp["黑9"]=32;
mp["方10"]=33; mp["梅10"]=34; mp["红10"]=35; mp["黑10"]=36;
mp["方J"]=37; mp["梅J"]=38; mp["红J"]=39; mp["黑J"]=40;
mp["方Q"]=41; mp["梅Q"]=42; mp["红Q"]=43; mp["黑Q"]=44;
mp["方K"]=45; mp["梅K"]=46; mp["红K"]=47; mp["黑K"]=48;
mp["方A"]=49; mp["梅A"]=50; mp["红A"]=51; mp["黑A"]=52;
}
int shun(int num[])
{
for(int i=1;i<5;i++)
if((num[i-1]-1)/4!=(num[i]-1)/4-1)
return 0; //不是顺子
for(int i=1;i<5;i++)
if(num[i]-num[i-1]!=4)
return 4; //普通顺子
if((num[0]-1)/4==8)
return 9; //皇家同花顺
return 8; //同花顺
}
int dui(int num[])
{
map<int,int>mp_flag;
for(int i=0;i<5;i++)
mp_flag[(num[i]-1)/4]++;
map<int,int>::iterator it=mp_flag.begin();
if(mp_flag.size()==2)
{
if(it->second==4||(++it)->second==4)return 7; //四条
else return 6; //葫芦(三条加对子)
}
else if(mp_flag.size()==3)
{
if(it->second==3||(++it)->second==3||mp_flag[2]==3)
return 3; //三条
else return 2; //两对
}
else if(mp_flag.size()==4)
return 1; //对子
else return 0;
}
int flower(int num[])
{
int count=0,flag=num[0]%4;
for(int i=1;i<5;i++)
if(num[i]%4!=flag)
return 0;
return 5; //同花
}
int type(int num[]) //对每种类型进行编码
{
int flag=max({shun(num),dui(num),flower(num)});
switch(flag) //是顺子就不可能是对子,但有可能是同花
{
//因为牌在主函数已经排好序了
case 9:case 8:case 5:case 4:
return flag*20000+(num[4]-1)/4;
case 7:case 6:case 3:
return flag*20000+(num[2]-1)/4;
case 2:
{
int count=40000,flag_1=2;
count+=((num[3]-1)/4+1)*pow(14,flag_1--);
count+=((num[1]-1)/4+1)*pow(14,flag_1--);
if(num[0]!=num[1])
count+=(num[0]-1)/4+1;
else if(num[4]!=num[3])
count+=(num[4]-1)/4+1;
else count+=(num[2]-1)/4+1;
return count;
}
case 1:
{
int count=0,flag_1=0;
for(int i=0;i<5;i++)
if((num[i]-1)/4==(num[i+1]-1)/4)
{
count+=((num[i]-1)/4+1)*2600;
i++;
}
else count+=((num[i]-1)/4+1)*pow(14,flag_1++);
return count;
}
case 0:
{
int count=0,flag_1=0;
for(int i=4;i>=0;i--)
count+=-(13-(num[i]-1)/4)*pow(14,flag_1++);
return count;
}
}
}
void cards_name(int n)
{
for(int i=0;i<n;i++)
{
switch(type(player[i].cards)/20000)
{
case 9:player[i].type_name="皇家同花顺";break;
case 8:player[i].type_name="同花顺";break;
case 7:player[i].type_name="四条";break;
case 6:player[i].type_name="葫芦";break;
case 5:player[i].type_name="同花";break;
case 4:player[i].type_name="顺子";break;
case 3:player[i].type_name="三条";break;
case 2:player[i].type_name="两对";break;
case 1:
case 0:player[i].type_name="对子";break;
default:player[i].type_name="高牌";break;
}
}
}
bool cmp(node a,node b)
{
return type(a.cards)>type(b.cards);
}
string fp() //发牌
{
int m=rand()%52+1;
map<string,int>::iterator it=mp.begin();
for(it;m!=it->second;it++);
return it->first;
}
void delete_player(int m,int n){ //玩家中途弃权
for(m;m<n-1;m++)
player[m]=player[m+1];
}
void fixed(int N) //固定发牌
{
for(int i=0;i<N;i++)
{
cout<<"输入"<<player[i].name<<"的五张牌:";
for(int j=0;j<5;j++)
{
string s;
cin>>s;
while(mp.find(s)==mp.end())
{
cout<<"第"<<j+1<<"张牌输入错误,请重新输入!"<<endl;
cin>>s;
}
player[i].cards[j]=mp[s];
}
sort(player[i].cards,player[i].cards+5); //对每位玩家的牌进行排序
}
}
int game(int N)
{
int k=5;
while(1)
{
system("cls");
char c;
for(int i=0;i<N;i++)
cout<<left<<setw(11)<<player[i].name;
cout<<"公共牌:"<<public_cards<<endl;
for(int i=0;i<N;i++)
cout<<left<<setw(3)<<player[i].cards_name[0]<<" "<<setw(7)<<player[i].cards_name[1];
cout<<endl;
for(int i=0;i<N;i++){
cout<<player[i].name<<",你是否继续押注? Y/N\t";
cin>>c;
if(c=='Y'||c=='y');
else{
delete_player(i,N);
N--;
i--;
}
}
if(N==1||k==7)break;
string m=fp();
for(int j=0;j<N;j++)
{
player[j].cards_name[k]=m;
player[j].all_cards[k]=mp[m];
}
k++;
public_cards+=m+" ";
}
return N;
}
int *compare_6(int *a)
{
static int *b,n[5]; //必须要改为静态,因为指针出了函数就重置了
int max=-10000000;
for(int i=0;i<6;i++)
{
int flag=0;
for(int j=0;j<6;j++)
if(i!=j)n[flag++]=a[j];
cout<<type(n)<<" ";
if(type(n)>max)b=n;
}cout<<endl<<type(b)<<endl;
return b;
}
int *compare_7(int *a)
{
static int *b=new int[5];
int n[5],max=-10000000;
for(int i=0;i<7;i++)
for(int j=0;j<7;j++)
{
int flag=0;
for(int k=0;k<7;k++)
if(k!=i&&k!=j&&i!=j)n[flag++]=a[k];
if(type(n)>max)b=n;
}
return b;
}
void max_cards(int N)
{
int count=0,max=-10000000;
while(player[0].all_cards[count]!=0)
count++;
for(int i=0;i<N;i++)
{
int *m;
if(count==5)m=player[i].all_cards;
if(count==6)m=compare_6(player[i].all_cards);
if(count==7)m=compare_7(player[i].all_cards);
for(int j=0;j<5;j++)
player[i].cards[j]=m[j];
sort(player[i].cards,player[i].cards+5);
for(int j=0;j<5;j++)
cout<<player[i].cards[j]<<" ";
}
}
int random(int N)
{
string m,n;
for(int i=0;i<N;i++) //发手牌
{
for(int j=0;j<2;j++)
{
m=fp();
player[i].cards_name[j]=m;
player[i].all_cards[j]=mp[m];
}
}
for(int i=2;i<5;i++) //发公共牌
{
m=fp();
for(int j=0;j<N;j++)
{
player[j].cards_name[i]=m;
player[j].all_cards[i]=mp[m];
}
public_cards+=m+" ";
}
N=game(N);
max_cards(N);
return N;
}
int main()
{
list();
srand(time(0));
int N,m;
cout<<"输入玩家人数:";
cin>>N;
cout<<"输入"<<N<<"位玩家名字:"<<endl;
for(int i=0;i<N;i++)
cin>>player[i].name;
cout<<"请选择随机发牌(0)/固定发牌(1):";
cin>>m;
if(!m)N=random(N); //随机发牌
else fixed(N); //固定发牌
cards_name(N); //存入玩家卡片类型名
sort(player,player+N,cmp); //对玩家按牌大小排序
if(N==1)cout<<player[0].name<<"赢!牌型为:"<<player[0].type_name;
else if(type(player[0].cards)==type(player[1].cards))
cout<<"平局";
else cout<<player[0].name<<"赢!牌型为:"<<player[0].type_name;
return 0;
}