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]

(个人意见,仅供参考,请勿抄袭,如有错误,还望指出) 

思路:主要设计了三个类(Card、Player、GameObject)
 逻辑:
        creatCard();创建扑克牌
        creatPlayer();创建玩家
        shuffleCard();洗牌
        dealCard();发牌并选出皇帝
        checkCard();检查牌并选出侍卫
        showCard();打印输出结果

(可以从main函数开始看(最下面))
题目并不是十分明确,为了不进行手动键盘输入数据,一切就简。

有兴趣的同学可以把确定侍卫那一部分进行讨论:

  • 如果皇帝有多种三张相同的牌,进行键盘输入,自选一种为luckcard;
  • 如果皇帝有四张相同的牌,及多张多种三张相同的牌,进行键盘输入,选择是否自保并确定luckcard;

 Card类:

import java.util.Comparator;

public class Card implements Comparable {
	private String color;//花色
	private String point;//点数(用于转换Card)
	private String card;//花色+点数(牌面)
	private int i, j;//点塑、花色(用于重写排序)

	public Card(int point, int color) {
		i = point;
		j = color;
		changeCard(point, color);
	}

	public Card(String card) {
		if (card == "大王")
			i = 17;
		else if (card == "皇上")
			i = 18;
		else
			i = 16;
		this.color = null;
		this.point = null;
		this.card = card;
	}

	public String getCard() {
		return card;
	}

	public void changeCard(int point, int color) {
		switch (color) {
		case 1:
			this.color = "方片";
			break;
		case 2:
			this.color = "梅花";
			break;
		case 3:
			this.color = "黑桃";
			break;
		case 4:
			this.color = "红桃";
			break;
		}
		switch (point) {
		case 1:
			this.point = "A";
			i = 14;
			break;
		case 2:
			this.point = "2";
			i = 15;
			break;
		case 11:
			this.point = "J";
			break;
		case 12:
			this.point = "Q";
			break;
		case 13:
			this.point = "K";
			break;
		default:
			this.point = String.valueOf(point);
		}
		this.card = this.color + this.point;
	}

	/*
	 * 重写hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((card == null) ? 0 : card.hashCode());
		return result;
	}
	/*
	 * 重写equals()
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Card other = (Card) obj;
		if (card == null) {
			if (other.card != null)
				return false;
		} else if (!card.equals(other.card))
			return false;
		return true;
	}
	/*
	 * 重写compareTo()
	 */
	public int compareTo(Object o) {
		int ii = ((Card) o).i;
		int jj = ((Card) o).j;
		if (i < ii) {
			return 1;
		} else if (i > ii) {
			return -1;
		} else {
			if (j < jj) {
				return 1;
			} else {
				return -1;
			}
		}
	}

}

Player类:

import java.util.*;
import java.util.Map.Entry;

public class Player {

	private HashMap<Card, Integer> cards = new HashMap<Card, Integer>();
	//用于统计这个玩家所拥有的牌和每种牌的数量
	private String name;//玩家姓名

	public Player(String string) {
		name = string;
	}

	public String getName() {
		return name;
	}

	/*
	 * 摸牌后,把牌放在手中
	 */
	public void addCard(Card card) {
		if (cards.containsKey(card) == true) {//如果map中有这种牌了,修改数量+1
			int num = cards.get(card);
			cards.remove(card);
			cards.put(card, num + 1);
		} else {//如果没有这种牌,直接放入
			cards.put(card, 1);
		}
	}

	public Card checkCard() {// 检查皇帝的牌
		for (Card key : cards.keySet()) {
			if (cards.get(key) == 4) {//有四张相同的牌,可以自保
				return null;
			}
			if (cards.get(key) == 3) {//有三张相同的牌,可以找个保子
				return key;//返回幸运牌
			}
		}
		return null;

	}

	public boolean checkCardAndPick(Card luckcard) {// 检查平民的牌并挑选保子
		if (cards.containsKey(luckcard) == true) {
			return true;
		}
		return false;

	}

	public void showCard() {//排序并输出
		//自定义HashMap排序
		List<Map.Entry<Card, Integer>> list = new ArrayList<Map.Entry<Card, Integer>>(cards.entrySet());
		
		Collections.sort(list, new Comparator<Map.Entry<Card, Integer>>() {
			@Override
			public int compare(Entry<Card, Integer> o1, Entry<Card, Integer> o2) {
				return o1.getKey().compareTo(o2.getKey());
			}
		});
		//控制一下输出格式
		int is=1;
		for (Map.Entry<Card, Integer> mapping : list) {
			if(is==1) {
				System.out.print("["+mapping.getKey().getCard());
				is=0;
				for (int i = 1; i < mapping.getValue(); i++) {
					System.out.print(", "+mapping.getKey().getCard());
				}
				continue;
			}
			for (int i = 0; i < mapping.getValue(); i++) {
				System.out.print(", "+mapping.getKey().getCard());
				
			}
		}
		System.out.println("]");
	}

}

GameObject类:

import java.util.*;

public class GameObject {

	private int playernum = 5;//玩家数量
	private Player players[];//玩家
	public int emperor;//皇上
	public int baozi;//侍卫(保子)
	private Card luckcard;//被选中可以当侍卫的牌
	private List<Card> list = new ArrayList<Card>();//所有的牌

	/*
	 * 创建扑克牌
	 */
	public void creatCard() {
		// HashMap[] cards = new HashMap[playernum];
		for (int i = 1; i <= 13; i++) {
			for (int j = 1; j <= 4; j++) {
				for (int k = 1; k <= 4; k++) {
					Card card = new Card(i, j);
					list.add(card);
				}
			}
		}
		for (int i = 1; i <= 4; i++) {
			Card card = new Card("小王");
			list.add(card);
		}
		for (int i = 1; i <= 3; i++) {
			Card card = new Card("大王");
			list.add(card);
		}
		Card card = new Card("皇上");
		list.add(card);
	}

	/*
	 * 创建游戏玩家
	 */
	public void creatPlayer() {
		players = new Player[playernum];
		for (int i = 0; i < playernum; i++) {
			players[i] = new Player("Tom00" + (int)(i+1));
		}

	}

	/*
	 * 洗牌,随机序列,调用Collections.shuffle(list)函数可直接获取随机序列
	 */
	public void shuffleCard() {
		Collections.shuffle(list);
	}

	/*
	 * 发牌,五个玩家每人一张轮流获取牌
	 */
	public void dealCard() {
		for (int i = 0; i < list.size();) {
			for (int j = 0; j < playernum; j++) {
				if (list.get(i).getCard().equals("皇上")) {//将得到皇上牌的玩家标记下来
					emperor = j;
				}
				players[j].addCard(list.get(i));//玩家j得到牌后,紧紧攥在自己的手里
				i++;
				if (i >= list.size())
					return;
			}
		}
	}
	/*
	 * 检查牌,目的是知道保子是谁
	 */
	public void checkCard() {
		luckcard = players[emperor].checkCard();//检查皇上的牌,并返回 那张幸运的牌
		if (luckcard == null) { //返回null 则自保
			baozi = -1;
			return;
		}
		for (int i = 0; i < playernum; i++) { //得知luckcard,去检查平民的牌,看谁有机会当侍卫
			if (i != emperor) {
				if (players[i].checkCardAndPick(luckcard) == true) {
					baozi = i;
				}
			}
		}
	}

	/*
	 * 输出打印结果
	 */
	public void showCard() {
		System.out.println("皇上:" + players[emperor].getName());
		System.out.print("皇上的牌是: ");
		players[emperor].showCard();
		if (baozi == -1) {
			System.out.println("皇上自保");
		} else {
			System.out.println("侍卫对应的牌是:" + luckcard.getCard());
			System.out.println("侍卫是:" + players[baozi].getName());
			System.out.print("侍卫的牌是: ");
			players[baozi].showCard();
		}
	}

	public void startGame() {
		creatCard();
		creatPlayer();
		shuffleCard();
		dealCard();
		checkCard();
		showCard();
	}

	/*
	 * 主函数
	 */
	public static void main(String[] args) {
		GameObject game = new GameObject();
		game.startGame();

	}
}

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值