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