题目:
使用集合实现斗地主游戏的部分功能,要求如下:
(1)首先准备 54 张扑克牌并打乱顺序。
(2)由三个玩家交替摸牌,每人 17 张扑克牌,最后三张留作底牌。
(3)查看三个玩家手中的扑克牌和底牌。
(4)其中玩家手中的扑克牌需要按照大小顺序打印,规则如下:手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
思路:扑克牌的花色可以通过for循环的方式来生成,分给3个玩家只要以3取余就行,本来想用set集合来打乱排序,但是测试下来并不生效,于是用了Collections里的shufflle来洗牌。前3个要求感觉都还比较好做,第四个要求第一个想到的是用重写TreeSet里的比较器来实现排序,但是最后不知道该怎么实现所以放弃了。最后通过使用HashMap,以自增序号为Key,花色为Value的方式,然后调用Collections里的sort方法对Key排序,最后在通过get(序号)的方式来实现的。具体代码如下。
视频:https://www.bilibili.com/video/BV1Ei4y1T7xM/
package com.lagou.homework.part3;
import java.util.*;
public class PlayCard {
public static void main(String[] args) {
// 定义花色和点数数组用来生成牌
String[] arr1 = {"3","4","5","6","7","8","9","10",
"J","Q","K","A","2","小王","大王"};
String[] arr2 = {"♥","♣","♦","♠"};
// 定义牌面顺序
int cardIndex = 1;
// 用来保存牌点数和牌顺序
Map<Integer,String> carMap = new LinkedHashMap<>();
// 用来保存牌面顺序
List<Integer> cardList = new ArrayList<>();
// 双重循环生成key 为54张带花色的扑克牌,value为牌面价值的map集合
for (int i=0; i<arr1.length; i++){
// 生成花色的A-K牌面
if (i<13){
for (int j=0; j<arr2.length; j++){
// cardList.add(arr2[j] + arr1[i]);
// 将牌序号和牌点数存到map集合中,其中key为序号,value为点数
carMap.put(cardIndex,arr2[j] + arr1[i]);
// 将牌点数信息存到list集合中,给选手发牌用
cardList.add(cardIndex);
cardIndex++;
}
// 加上大王和小王
}else{
carMap.put(cardIndex,arr1[i]);
cardList.add(cardIndex);
cardIndex++;
}
}
// 洗牌
Collections.shuffle(cardList);
// 定义底牌和选手
List<Integer> bottom = new ArrayList<>();
List<Integer> player1 = new ArrayList<>();
List<Integer> player2 = new ArrayList<>();
List<Integer> player3 = new ArrayList<>();
for (int i=0; i<cardList.size(); i++){
// 前3张牌给底牌
if (i<3){
bottom.add(cardList.get(i));
// 轮流摸牌
}else if(i%3 == 0){
player1.add(cardList.get(i));
}else if(i%3 == 1){
player2.add(cardList.get(i));
}else if(i%3 == 2){
player3.add(cardList.get(i));
}
}
// 序号从小到大排序,也就是说牌面从大到小排序
Collections.sort(bottom);
Collections.sort(player1);
Collections.sort(player2);
Collections.sort(player3);
// System.out.println(player1);
showCard("底牌",bottom,carMap);
showCard("player1",player1,carMap);
showCard("player2",player2,carMap);
showCard("player3",player3,carMap);
}
public static void showCard(String name,List<Integer> lt,Map<Integer,String> carMap ){
System.out.println(name + ":");
for (Integer i:lt){
System.out.print(carMap.get(i) + " ");
}
System.out.println();
}
}