期末大作业--德州扑克(包含双人手动发牌,多人手动发牌,多人手动、自动发牌三个版本)

双人手动发牌

初始版本很简单,输入两人名字,再每人输入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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小浪浪、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值