集合的应用-模拟保皇游戏发牌

本文介绍了如何通过编程模拟保皇游戏的发牌过程,包括生成5个玩家的牌组,根据规则找出皇帝和侍卫,并展示他们的牌。程序输出详细展示了皇帝、侍卫的身份及其手中的牌,遵循特定的牌面顺序。通过这个模拟,强调了选择合适数据结构和利用容器类方法的重要性。
摘要由CSDN通过智能技术生成

问题描述

模拟保皇游戏开始的发牌过程。规则:4副扑克,5个玩家。1)有一个大王标记为皇上。每次发牌时,所发牌中有该大王的玩家是皇上。2)皇帝选择侍卫(也叫保儿、腿子,游戏过程中与皇帝一伙):作为皇上的玩家从自己的牌中选择一张拥有相同三张(点数和花色都相同)的一张牌(不能是2、3、大小王),其他四个玩家中有这张牌的就是侍卫。例如,皇上有三个红桃5,其他四个玩家中有红桃5的玩家就是侍卫。特殊情况是:1)皇上有一套四张牌相同的点数的牌,皇帝可以自己做侍卫;2)皇帝没有满足要求的牌,无法获得侍卫。程序要求:程序启动后生成5个玩家,并自动给他们发牌。然后输出:1)皇帝和侍卫的名字及其手里的牌(每张牌输出为“花色”+“点数”,如红桃5,牌之间用“,”分割),并按照大王、小王、2、A、K、Q、J、10、9、8、7、6、5、4、3的顺序排列,相同点数但不同花色的牌要把相同花色的牌放在一起;2)那张作为侍卫所特有的牌(“花色”+“点数”)。如果无法得到侍卫,则程序输出相应的提示。例如,程序运行后输出如下的结果:皇帝是:玩家1皇帝的牌是:[皇上, 小王, 小王, 小王, 小王, 方片2, 黑桃2, 黑桃A, 黑桃A, 红桃A, 方片K, 梅花K, 黑桃K, 红桃K, 梅花Q, 梅花Q, 黑桃Q, 方片J, 方片J, 方片J, 红桃J, 梅花9, 黑桃9, 黑桃9, 方片8, 梅花8, 红桃8, 梅花7, 黑桃7, 黑桃7, 红桃7, 梅花6, 梅花6, 黑桃6, 黑桃6, 方片5, 梅花5, 黑桃5, 黑桃5, 梅花4, 梅花4, 梅花4, 方片3, 红桃3]侍卫对应的牌是:方片J侍卫是:玩家2侍卫的牌是:[方片2, 黑桃2, 红桃2, 方片A, 方片K, 梅花K, 梅花K, 黑桃K, 红桃K, 红桃K, 黑桃Q, 红桃Q, 方片J, 方片10, 黑桃10, 红桃10, 红桃10, 红桃10, 方片9, 红桃9, 方片8, 梅花8, 梅花8, 黑桃8, 黑桃8, 黑桃8, 红桃8, 红桃8, 方片7, 黑桃7, 黑桃7, 方片6, 黑桃6, 黑桃5, 梅花4, 黑桃4, 红桃4, 红桃4, 方片3, 梅花3, 黑桃3, 红桃3, 红桃3]

代码开始

Baohuang.java

package problem5;
import java.util.*;

public class Baohuang {
	public static void main(String[] args) {
		ArrayList t = new ArrayList();
		Cards.CreatCards(t);

		player[] Players = new player[5];
		for (int i = 0; i < 5; i++) {
			Players[i] = new player();
		}
		player.AcquireCards(Players, t);

		player.SortCards(Players);
//		
		int EmperorNum = player.FindEmperor(Players);
		Cards tt = new Cards(0, 0);
		int flag = player.EmperorCards(Players, EmperorNum, tt);

		Iterator iter2 = Players[EmperorNum].Mine.iterator();
		System.out.println("皇帝是" + EmperorNum);
		System.out.print("皇帝的牌是:[");
		int flag1 = 0;
		while (iter2.hasNext()) {
			Cards result = (Cards) iter2.next();
			if (flag1 == 0) {
				System.out.print(Cards.CardsToString(result));
				flag1 = 1;
			} else
				System.out.print("," + Cards.CardsToString(result));
		}
		System.out.println("]");

		if (flag == 1) {
			int GuardNum = player.FindGuard(tt, Players, EmperorNum);
			System.out.println("侍卫是" + GuardNum);
			System.out.println("侍卫的对应的牌是" + Cards.CardsToString(tt));
			System.out.print("侍卫的牌是:[");
			int flag2 = 0;

			Iterator iter3 = Players[GuardNum].Mine.iterator();
			while (iter3.hasNext()) {
				Cards result = (Cards) iter3.next();
				if (flag2 == 0) {
					System.out.print(Cards.CardsToString(result));
					flag2 = 1;
				} else
					System.out.print("," + Cards.CardsToString(result));
			}
			System.out.println("]");
		}
		if (flag == 2) {
			System.out.println("皇帝可以自己当侍卫");
		}
		if (flag == 0) {
			System.out.println("皇帝没有可选的侍卫");
		}
	}
//		
//		
//		System.out.println(" ");
//		while(iter2.hasNext())
//		{	Cards result=(Cards)iter1.next();
//			System.out.print(Cards.CardsToString(result));
//		}

}

Cards.java

package problem5;
import java.util.*;
public class Cards {
	private int type;
	private int num;
	Cards(int type,int num)
	{
		this.type=type;
		this.num=num;
	}
	static String CardsToString(Cards t)//将数字翻译成牌号
	{	String s1=null,s2=null;
		switch (t.type)
		{
			case 0:
			{s1="黑桃";break;}
			case 1:
			{s1="红桃";break;}
			case 2:
			{s1="方片";break;}
			case 3:
			{s1="梅花";break;}
			case 4:
			{s1="小王";break;}
			case 5:
			{s1="大王";break;}
			case 6:
			{s1="皇帝";break;}
			
		}
		switch(t.num)
		{
			case 8:
			{s2="J";break;}
			case 9:
			{s2="Q";break;}
			case 10:
			{s2="K";break;}
			case 11:
			{s2="A";break;}
			case 12:
			{s2="2";break;}
			case 13:
			{s2="";break;}
			default:
			{
				s2=Integer.toString(t.num+3);
				break;
			}
		}
		return s1+s2;
	}
	public void setType(int type) {
		this.type = type;
	}
	public void setNum(int num) {
		this.num = num;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + num;
		result = prime * result + type;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Cards other = (Cards) obj;
		if (num != other.num)
			return false;
		if (type != other.type)
			return false;
		return true;
	}
	static void CreatCards(ArrayList t)//创建4副卡牌,并将其存入arraylist中,进行洗牌
	{	for(int k=0;k<13;k++)//13种有4种花色的牌
		for(int i=0;i<4;i++)//4副
			for(int j=0;j<4;j++)//4种花色
				
				{
					t.add(new Cards(j,k));
				}
		for(int i=0;i<4;i++)//4副大王
			t.add(new Cards(4,13));
		for(int i=0;i<4;i++)//4副小王
			t.add(new Cards(5,13));
		t.add(new Cards(6,13));
		Collections.shuffle(t);
	}
	public int getType() {
		return type;
	}
	public int getNum() {
		return num;
	}
	
	/*public static void main(String[] args) {
		ArrayList t=new ArrayList();
		CreatCards(t);
		Iterator iter=t.iterator();
		while(iter.hasNext())
		{
			Cards c=(Cards)iter.next();
			System.out.println(c.CardsToString(c));
		}
		
	}*/
}

player.java

package problem5;
import java.util.*;
public class player {
	ArrayList<Cards> Mine=new ArrayList<Cards>();
	class SortByNum implements Comparator<Cards>
	{
		public int compare(Cards t1,Cards t2)
		{
			if(t1.getNum()<t2.getNum())
				return -1;
			else if(t1.getNum()>t2.getNum())
				return 1;
			else 
			{
				if(t1.getType()<t2.getType())
					return -1;
				else if(t1.getType()>t2.getType())
					return 1;
				else 
					return 0;
			}
		}
	}
	 
	static void AcquireCards(player []Players,ArrayList<Cards> t)//每个人获取牌
	{
		
		Random r=new Random();
		int num=r.nextInt(5);
		
		Iterator iter=t.iterator();
		while(iter.hasNext())
		{	Cards result=(Cards)iter.next();
		
			Players[num].Mine.add(new Cards(result.getType(),result.getNum()));
			num=(num+1)%5;
			
		}
		
	}
	
	static void SortCards(player []Player)
	{	player n=new player();
		for(int i=0;i<Player.length;i++)
		{SortByNum sc=n.new SortByNum();
		Collections.sort(Player[i].Mine,sc);
		}
	}
	static int FindEmperor(player []Player)
	{	int num=0;
		for(int i=0;i<Player.length;i++)
		{
			if(Player[i].Mine.contains(new Cards(6,13)))
			{	num=i;
				break;			
			}
		}
		
		return num;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((Mine == null) ? 0 : Mine.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		player other = (player) obj;
		if (Mine == null) {
			if (other.Mine != null)
				return false;
		} else if (!Mine.equals(other.Mine))
			return false;
		return true;
	}

	static int EmperorCards(player []Player,int num,Cards tt)
	{	Cards cd=(Cards)Player[num].Mine.get(0);
		Iterator iter=Player[num].Mine.iterator();
		int a=cd.getNum();
		int b=cd.getType();
		Cards et=(Cards)iter.next();
		
		int record=1;
		int flag1 =0;
		int flag2=0;
		int result=0;
		while(iter.hasNext())
		{	 et=(Cards)iter.next();
			if(a==et.getNum()&&b==et.getType()&&a!=0&&a!=0&&a!=12&&b!=4&&b!=5&&b!=6)
			{
				record++;
			}
			else
			{
				a=et.getNum();
				b=et.getType();
				record=1;
			}
			if(record==3&&flag1==0)
			{
				
				flag1=1;
				tt.setNum(et.getNum());
				tt.setType(et.getType());
				
			}
			if(record==4)
			{
				flag2=1;
			}
				
		}	
		if(flag1==0&&flag2==0)
		{
			
			result=0;
		}
		else if(flag2==1)
		{
			
			result=2;
		}
		else 
		{
			result=1;
			
		}
		
		return result;
	}
	static int FindGuard(Cards t,player []Player,int num)
	{	int result=0;
		
		for(int i=0;i<Player.length;i++)
	{
		if(Player[i].Mine.contains(new Cards(t.getType(),t.getNum()))&&i!=num)
		{
			result=i;
			break;
		}			
	}
		return result;
	}
	
}

输出结果

皇帝是1
皇帝的牌是:[黑桃3,红桃3,红桃3,方片3,黑桃4,黑桃4,红桃4,红桃5,红桃5,红桃5,方片5,方片5,梅花5,梅花5,黑桃6,红桃6,方片6,梅花6,黑桃7,红桃8,红桃8,方片8,黑桃9,黑桃9,方片9,梅花9,黑桃10,梅花10,方片J,方片J,方片Q,方片Q,方片Q,梅花Q,黑桃K,梅花K,红桃A,方片A,方片A,黑桃2,红桃2,红桃2,大王,皇帝]
侍卫是0
侍卫的对应的牌是红桃5
侍卫的牌是:[黑桃3,红桃3,方片3,梅花3,黑桃5,黑桃5,红桃5,方片5,梅花5,梅花5,黑桃6,梅花6,梅花6,黑桃7,红桃7,红桃7,梅花7,梅花7,黑桃8,梅花8,梅花8,黑桃9,红桃9,红桃9,方片9,梅花9,方片10,方片10,梅花10,黑桃J,红桃J,梅花J,梅花J,红桃Q,梅花Q,黑桃K,梅花K,黑桃A,黑桃A,红桃A,黑桃2,小王,小王]

总结

1、要选择恰当的容器。
2、充分利用好容器类的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值