运用java--模拟实现保皇发牌功能

题目描述:

模拟保皇游戏开始的发牌过程。规则: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]


近期老师出了一个实现保皇发牌功能作业,美名其package曰happybaohuang,并开始写代码,结果写了三个小时左右,能力不够,代码较长,欢迎大佬们指教。


以下是本项目代码:

首先需要建立一个包,把所有的类的代码放在包里面,并且在每个代码前面都是package XXX;(自己的包的名字)。


Main.java (主函数)

//2021.6.25
//注释掉的代码都是测试例子,可以对没有输出的数据进行测试
package XXXX;//输入你自己的包的名字
import java.util.LinkedList;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class Main {
	public static void main(String[] args) {
		Scanner in =new Scanner(System.in);
		
		MyMap shiweicard;
		loops:
		while(true)
		{
		Card allcard =new Card();
		int shiweiid;
		//System.out.println("所有的牌为:");
		int flag=0;
		Player shiwei=new Player();
		//allcard.showCard();//输出所有的牌
		//System.out.println();
		LinkedList<Player> players=new LinkedList<Player>();
		for(int i=0;i<5;i++)
		{
			LinkedList<MyMap> l=new LinkedList<MyMap>();
			Player player=new Player("玩家"+(i+1),l);
			players.add(player);
		}
		int i;
		for(i=0;i<43;i++)
		{
				players.get(0).cards.add(allcard.get(i));
		}
		for(i=43;i<86;i++)
		{
				players.get(1).cards.add(allcard.get(i));
		}
		for(i=86;i<129;i++)
		{
				players.get(2).cards.add(allcard.get(i));
		}
		for(i=129;i<172;i++)
		{
				players.get(3).cards.add(allcard.get(i));
		}
		for(i=172;i<216;i++)
		{
				players.get(4).cards.add(allcard.get(i));
		}
		//System.out.println("玩家1的牌数为:"+players.get(0).cards.size());
		//System.out.println("玩家2的牌数为:"+players.get(1).cards.size());
		//System.out.println("玩家3的牌数为:"+players.get(2).cards.size());
		//System.out.println("玩家4的牌数为:"+players.get(3).cards.size());
		//System.out.println("玩家5的牌数为:"+players.get(4).cards.size());
		//System.out.println(i);
		int huangnum=0;
		for(i=0;i<5;i++)
		{
			if(players.get(i).ishuangdi())
			{
				System.out.println("皇帝是:"+(players.get(i).getname()));
				System.out.println("皇帝的牌是:"+players.get(i).huangdipai());
				huangnum=i;
				
			}
		}
		LinkedList<Linkedclass> chose =new LinkedList<Linkedclass>();
		Linkedclass l1=new Linkedclass(players.get(huangnum).getcard().get(0));
		chose.add(l1);
		for(i=1;i<players.get(huangnum).getcard().size();i++)
		{
			Linkedclass m=new Linkedclass(players.get(huangnum).getcard().get(i));
			for(int j=0;j<chose.size();j++)
			{
				if(m.equals(chose.get(j)))
				{
					chose.get(j).addnum();
					flag=1;
				}
				
			}
			if(flag==0)
			{
				chose.add(m);
			}
			flag=0;
		}
		/*
		for(i=0;i<chose.size();i++)
		{
			System.out.println(chose.get(i));
		}
		*/
		int j;
		for(j=0;j<chose.size();j++)
		{
			if(chose.get(j).getnum()==4)
			{
				System.out.println("侍卫对应的牌是:"+chose.get(j).getmymap());
				System.out.println("侍卫是:皇帝本身");
			}
			if(chose.get(j).getnum()==3)
			{
				
				System.out.println("侍卫对应的牌是:"+chose.get(j).getmymap());
				shiweicard=chose.get(j).getmymap();
				MyMap m1=new MyMap("","大王");
				MyMap m2=new MyMap("","小王");
				MyMap m3=new MyMap("黑桃","3");
				MyMap m4=new MyMap("红桃","2");
				MyMap m5=new MyMap("黑桃","2");
				MyMap m6=new MyMap("红桃","3");
				MyMap m7=new MyMap("方片","2");
				MyMap m8=new MyMap("方片","3");
				MyMap m9=new MyMap("梅花","2");
				MyMap m10=new MyMap("梅花","3");
				if(shiweicard.equals(m1)||shiweicard.equals(m2)||shiweicard.equals(m3)||shiweicard.equals(m4)||shiweicard.equals(m5)||shiweicard.equals(m6)||shiweicard.equals(m7)||shiweicard.equals(m8)||shiweicard.equals(m9)||shiweicard.equals(m10))
				{
					System.out.println("该牌不能当侍卫牌,即将从新发牌。");
					continue loops;
				}
				for(i=0;i<allcard.showsize();i++)
				{
					if(shiweicard.equals(allcard.get(i))&&!shiweicard.equals("大王")&&!shiweicard.equals("小王")&&!shiweicard.equals("黑桃3")&&!shiweicard.equals("红桃2")&&!shiweicard.equals("黑桃2")&&!shiweicard.equals("红桃3")&&!shiweicard.equals("方片2")&&!shiweicard.equals("方片3")&&!shiweicard.equals("梅花2")&&!shiweicard.equals("梅花3"))
					{
						shiweiid=i;
						if(i<43&&huangnum!=0)
						{
							shiwei=players.get(0);
							System.out.println("侍卫是:玩家1");
							System.out.println("侍卫的牌是:"+players.get(0).huangdipai());
							break;
							
						}
						else if(i>=43&&i<86&&huangnum!=1)
						{
							shiwei=players.get(1);
							System.out.println("侍卫是:玩家2");
							System.out.println("侍卫的牌是:"+players.get(1).huangdipai());
							break;
						}
						else if(i>=86&&i<129&&huangnum!=2)
						{
							shiwei=players.get(2);
							System.out.println("侍卫是:玩家3");
							System.out.println("侍卫的牌是:"+players.get(2).huangdipai());
							break;
						}
						else if(i>=129&&i<172&&huangnum!=3)
						{
							shiwei=players.get(3);
							System.out.println("侍卫是:玩家4");
							System.out.println("侍卫的牌是:"+players.get(3).huangdipai());
							break;
						}
						if(i>=172&&i<216&&huangnum!=4)
						{
							shiwei=players.get(4);
							System.out.println("侍卫是:玩家5");
							System.out.println("侍卫的牌是:"+players.get(4).huangdipai());
							break;
						}
						
					}
				}
				
				break loops;
				
			}
			
		}
		System.out.println("没有侍卫,即将重新发牌!");
		
		
		/*
		for(i=0;i<players.size();i++)
		{
			System.out.println(players.get(i));
		}
		*/
		}
	
	}
	
}

Card.Java  

主要用于把牌准备好

package XXX;

import java.util.Collections;
import java.util.LinkedList;

public class Card {
	LinkedList<MyMap> c=new LinkedList<MyMap>();
	Card()
	{
		String[] huase= {"黑桃","红桃","方片","梅花"};
		String[] number= {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
		
	    for(int i=0;i<huase.length;i++)
	    {
	    	for(int j=0;j<number.length;j++)
	    	{
	    		
	    		MyMap thiscard=new MyMap(huase[i],number[j]);
	    		c.add(thiscard);
	    	}
	    }
	    for(int i=0;i<huase.length;i++)
	    {
	    	for(int j=0;j<number.length;j++)
	    	{
	    		
	    		MyMap thiscard=new MyMap(huase[i],number[j]);
	    		c.add(thiscard);
	    	}
	    }
	    for(int i=0;i<huase.length;i++)
	    {
	    	for(int j=0;j<number.length;j++)
	    	{
	    		
	    		MyMap thiscard=new MyMap(huase[i],number[j]);
	    		c.add(thiscard);
	    	}
	    }
	    for(int i=0;i<huase.length;i++)
	    {
	    	for(int j=0;j<number.length;j++)
	    	{
	    		
	    		MyMap thiscard=new MyMap(huase[i],number[j]);
	    		c.add(thiscard);
	    	}
	    }
	    MyMap dawang =new MyMap("","大王");
	    MyMap xiaowang =new MyMap("","小王");
	    
	    c.add(dawang);
	    c.add(xiaowang);
	    MyMap dawang2 =new MyMap("","大王");
	    MyMap huangshang =new MyMap("","皇上");
	    huangshang.biaoji=1;
	    c.add(huangshang);
	    c.add(xiaowang);
	    c.add(dawang2);
	    c.add(xiaowang);
	    c.add(dawang2);
	    c.add(xiaowang);
	    Collections.shuffle(c);//随机排序
	
	}
	public int showsize()
	{
		return c.size();
	}
	public MyMap get(int i)
	{
		return c.get(i);
	}
	public void showCard()
	{
		for(int i=0;i<c.size();i++)
	    {
	    	System.out.print(c.get(i)+" ");
	    }
	}
}

MyMap.java

因为自己不喜欢用set,(LinkedList永远的神),所以就建立了一个类似map的类,建立一个此类的链表,比较灵活,还挺好用的。

package XXX;

import java.util.Comparator;
public class MyMap {
	String a;
	String b;
	int biaoji=0;
	MyMap(String a,String b)
	{
		this.a=a;
		this.b=b;
	}
	public int getbiaoji()
	{
		return this.biaoji;
	}
	public String geta()
	{
		return this.a;
	}
	public String getb()
	{
		return this.b;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((a == null) ? 0 : a.hashCode());
		result = prime * result + ((b == null) ? 0 : b.hashCode());
		return result;
	}
	public int paixuzhunbei()
	{
		if(this.b=="3")
		{
			return 16;
		}
		if(this.b=="4")
		{
			return 15;
		}
		if(this.b=="5")
		{
			return 14;
		}
		if(this.b=="6")
		{
			return 13;
		}
		if(this.b=="7")
		{
			return 12;
		}
		if(this.b=="8")
		{
			return 11;
		}
		if(this.b=="9")
		{
			return 10;
		}
		if(this.b=="10")
		{
			return 9;
		}
		if(this.b=="J")
		{
			return 8;
		}
		if(this.b=="Q")
		{
			return 7;
		}
		if(this.b=="K")
		{
			return 6;
		}
		if(this.b=="A")
		{
			return 5;
		}
		if(this.b=="2")
		{
			return 4;
		}
		if(this.b=="小王")
		{
			return 2;
		}
		if(this.b=="大王")
		{
			return 3;
		}
		if(this.b=="皇上")
		{
			return 1;
		}
		return 0;
		
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		MyMap other = (MyMap) obj;
		if (a == null) {
			if (other.a != null)
				return false;
		} else if (!a.equals(other.a))
			return false;
		if (b == null) {
			if (other.b != null)
				return false;
		} else if (!b.equals(other.b))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return a +b ;
	}
}


Player.java

此函数主要是用来建立玩家类的,包括玩家的姓名还有玩家手里面的牌。

package XXX;

import java.util.LinkedList;

public class Player {
	String name;
	LinkedList<MyMap> cards=new LinkedList<MyMap> ();
	Player()
	{
		
	}
	Player(String name,LinkedList<MyMap> cards)
	{
		this.cards=cards;
		this.name=name;
	}
	public String getname()
	{
		return this.name;
	}
	public boolean ishuangdi()
	{
		for(int i=0;i<cards.size();i++)
		{
			int j=cards.get(i).getbiaoji();
			if(j==1)
			{
				return true;
			}
			
		}
		return false;
	}
	public LinkedList<MyMap> getcard()
	{
		return this.cards;
	}
	public LinkedList<MyMap> huangdipai() {
		cards.sort(new MyComp());
		
		return cards;
	}
	@Override
	public String toString() {
		return  name + "的牌是:" + cards ;
	}
	
	
}

MyComp.java

此函数就是一个实现排序的函数,由于没有什么更好的办法,所以就用了上面的,将每个字母重新赋值了一个int,然后根据这个int排序(一开始是真的没有想到什么好办法,怎么排序都不对)

package XXX;

import java.util.Comparator;

public class MyComp implements Comparator<MyMap>
{

	public int compare(MyMap o1, MyMap o2) {
		if(!o1.getb().equals(o2.getb()))
		{
			return o1.paixuzhunbei()-o2.paixuzhunbei();
		}
		else
			return o1.geta().compareTo(o2.geta());
				
}
}

将这些代码全部组合起来,每个放到一个class中,然后统一放入一个package里面,就可以在自己的电脑上面运行了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值