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(); } }