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]

思路:

1.先创建一个Card类,类中包含两个属性,牌的花色(用int表示,再将其转化为String类型)和点数,该类实现Comparable接口,可以实现排序,另外该类重写equals方法和toString方法
2.创建一个Player类,类中包含两个属性,玩家名字(String)和玩家的手牌(Card数组),在玩家类中实现对该玩家手牌的排序,重写toString方法,方便输出,再添加两个方法,一个方法找出皇帝牌,一个方法找出保子牌
3.创建一个Card数组,将四副牌中所有的牌存到这个数组中,调用Collections.shuffle()方法打乱顺序
4.将Card数组中的牌依此发给五个玩家
5.对五个玩家中的手牌排序,找出皇帝,并找出侍卫牌,找出侍卫牌后,再找出侍卫
6.按照格式输出

以下为具体实现:

1.Card类实现:
class Card implements Comparable<Card>{
	private int colour;//取值范围为1-6,1:红桃,2:黑桃,3:梅花,4:方片,5:小王,6:大王,7:皇帝
	private String scolour;
	private int value;//取值范围为3-16,3-13为基本牌,14为A,15为2,16为王
	private String svalue;
	Card(int colour,int value){
		this.colour = colour;
		this.value = value;
		switch(colour){
			case 1:
				this.scolour = "红桃";
				break;
			case 2:
				this.scolour = "黑桃";
				break;
			case 3:
				this.scolour = "梅花";
				break;
			case 4:
				this.scolour = "方片";
				break;
			case 5:
				this.scolour = "小王";
				break;
			case 6:
				this.scolour = "大王";
				break;
			case 7:
				this.scoluor = "皇帝";
				break;
		}
		switch(value){
			case 11:
				this.svalue = "J";
				break;
			case 12:
				this.svalue = "Q";
				break;
			case 13:
				this.svalue = "K";
				break;
			case 14:
				this.svalue = "A";
				break;
			case 15:
				this.svalue = "2";
				break;
			case 16:
				this.svalue = "";
				break;
			default:
				this.svalue = String.valueOf(value);
		}
	}
	public int compareTo(Card c){
		if(c==this)
			return 0;
		if(this.value>c.value)
			return -1;
		else if(this.value<c.value)
			return 1;
		else{
			if(this.colour>c.colour)
				return -1;
			else if(this.colour<c.colour)
				return 1;
			else
				return 0;
		}
	}
	public int hashCode(){
		int result = 17;
		result = 31*result+colour;
		result = 31*result+value;
		return result;
	}
	public boolean equals(Object obj){
		if(this == obj)
			return true;
		if(obj == null)
			return false;
		if(getClass() != obj.getClass())
			return false;
		Card c = (Card)obj;
		if(this.colour!=c.colour)
			return false;
		if(this.value!=c.value)
			return false;
		return true;
	}
	public String toString(){
		return scolour+svalue;
	}
}
2.Player类的实现:
import java.util.Collections;
import java.util.LinkedList;
class Player{
	private String name;
	public LinkedList<Card> playerscard = new LinkedList<Card>();
	Player(String name){
		this.name = name;
	}
	public String getName(){
		return this.name;
	}
	public void sortc(){
		Collectoins.sort(this.playerscard);
	}
	public Card IfisEmperor(){//找出并返回侍卫牌,否则返回null
		Card c = null;
		for(int i=0;i<this.playerscard.size()-2;i++){
			if((this.playerscard.get(i).equals(this.playerscard.get(i+1)))&&(this.playerscard.get(i).equals(this.playerscard.get(i+2)))){
				c=playerscard.get(i);
				break;
			}
		}
		return c;
	}
	public boolean IfisBodyguard(Card c){//判断玩家是不是侍卫,是的话返回true,否则返回false
		int flag=0;
		for(int i=0;i<this.playerscard.size();i++){
			if(this.playerscard.get(i).equals(c)){
				flag=1;
				break;
			}
		}
		if(flag==1)
			return true;
		else
			return false;
	}
	public void show(){
		System.out.print("["+this.playerscard.get(0));
		for(int i=1;i<this.playerscard.size();i++){
			System.out.print(","+this.playerscard.get(i));
		}
		System.out.print("]");
	}
}
3.main函数的实现(控制台类Main的实现)
import java.util.Scanner;
import java.util.Collections;
import java.util.LinkedList;
class Main{
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		LinkedList<Card> cards = new LinkedList<Card>();
		Player[] players = new Player[5];
		
		//将所有的牌存入cards链表中
		
		for(int i=3;i<16;i++){//十三张基本牌
			for(int j=1;j<5;j++){//四个基本花色
				for(int k=0;k<4;k++){
					cards.add(new Card(j,i));//将四副牌的基本牌存入到数组中
				}
			}
		}
		for(int i=0;i<4;i++){//将四副牌的小王存入
			cards.add(new Card(5,16));
		}
		for(int i=0;i<3;i++){//将四副牌中出皇帝牌外的三张大王存入
			cards.add(new Card(6,16));
		}
		cards.add(new Card(7,16));//将皇帝牌存入

		for(int i=0;i<5;i++){//初始化玩家姓名
			String name = input.nextLine();
			players[i] = new Player(name);
		}
		
		//洗牌(打乱牌的顺序)
		Collections.shuffle(cards);
		
		//发牌
		while(!cards.isEmpty()){
			for(int i=0;i<5;i++){
				if(cards.isEmpty())
					break;
				players[i].playerscard.add(cards.get(0));
				cards.remove(0);
			}
		}
		
		//给每个玩家排手牌
		for(int i=0;i<players.length;i++){
			players[i].sortc();
		}
		
		//找出皇帝
		Card cemperor = null;//皇帝能够叫的侍卫牌
		int iemperor = 0;//皇帝在players数组中的位置
		String s = "皇帝";
		for(int i=0;i<players.length;i++){
			if(s.equals(players[i].playerscard.get(0).toString())){
				iemperor = i;
				cemperor = players[i].IfisEmperor();
			}
		}
		System.out.println("皇帝:"+players[iemperor].getName());
		System.out.print("皇帝的牌:");
		players[iemperor].show();
		System.out.println();
		if(cemperor == null){//皇帝没有三张花色一样的牌
			System.out.println("皇帝叫不起侍卫牌")}
		else{//皇帝有三张花色一样的牌,找出侍卫,并输出侍卫的牌
			System.out.println("侍卫对应的牌:"+cemperor);
			System.out.println();
			int ibodyguard=0;
			for(int i=0;i<players.length;i++){
				if(i==iemperor)
					continue;
				if(players[i].IfisBodyguard(cemperor)){
					ibodyguard = i;
					break;
				}
			}
			if(ibodyguard==0) {
				ibodyguard=iemperor;
				System.out.println("皇帝自保");
			}
			System.out.println("侍卫:"+players[ibodyguard].getName());
			System.out.println();
			System.out.print("侍卫的牌:");
			players[ibodyguard].show();
			System.out.println();
		}
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值