1. 程式人生 > >JAVA 模擬保皇遊戲開始的發牌過程

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();列印輸出結果

題目並不是十分明確,為了不進行手動鍵盤輸入資料,一切就簡。

有興趣的同學可以把確定侍衛那一部分進行討論:

  • 如果皇帝有多種三張相同的牌,進行鍵盤輸入,自選一種為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 = 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();

	}
}