题目
使用集合实现斗地主游戏的部分功能,要求如下:
- 首先准备 54 张扑克牌并打乱顺序。
- 由三个玩家交替摸牌,每人 17 张扑克牌,最后三张留作底牌。
- 查看三个玩家手中的扑克牌和底牌。
- 其中玩家手中的扑克牌需要按照大小顺序打印,规则如下:
- 手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
思路分析
- 扑克牌由花色和字符组成,首先声明一个集合存放花色,再声明一个集合存放字符,通过双重foreach循环进行字符串的拼接
- 声明一个集合,存放索引,每拼接一个字符串(一张扑克牌),索引+1且存放入集合,并将索引拼接后的字符串存入map集合,索引作为key,拼接后的字符串作为value。
- 采用集合工具类Collentions中的shuffle方法随即置换索引集合进行洗牌
- 将索引集合转换为队列作为牌堆,抓牌即为出队
- 声明4个集合存放三名玩家手牌和底牌,循环抓牌17次,留下底牌,并存放入集合
- 通过集合的sort方法自动排序玩家手牌,进行遍历展示手牌和底牌
代码示例
package com.lagou.homework;
import java.lang.reflect.Array;
import java.util.*;
/*使用集合实现斗地主游戏的部分功能,要求如下:
(1)首先准备 54 张扑克牌并打乱顺序。
(2)由三个玩家交替摸牌,每人 17 张扑克牌,最后三张留作底牌。
(3)查看三个玩家手中的扑克牌和底牌。
(4)其中玩家手中的扑克牌需要按照大小顺序打印,规则如下:
手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3*/
public class HomeWork3_3 {
//声明一个集合作为扑克牌
//新建HashMap存牌 key作为牌的唯一标识
public static HashMap<Integer,String> pokermap = new HashMap<>();
//声明一个列表存key (只有单值的列表方便打乱顺序)
public static ArrayList<Integer> arrayList = new ArrayList<>();
//声明花色数组
public static String[] pokercolor = new String[]{
"♥","♠","♣","♦"};
//声明牌面字符数组(不包括大小王)
public static String[] pokerchar = new String[]{
"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
//洗好后的牌堆队列 (队列出队删减的特点方便抓牌)
public static Queue<Integer> queueall;
//三个玩家的手牌和底牌(为了能自动排序 使用TreeSet)
public static TreeSet<Integer> player1 = new TreeSet<>();
public static TreeSet<Integer> player2= new TreeSet<>();
public static TreeSet<Integer> player3= new TreeSet<>();
public static TreeSet<Integer> dipai = new TreeSet<>();
//显示玩家的牌和底牌
public static void show(HashMap<Integer,String> map/*总扑克牌*/,TreeSet<Integer> set,String string/*玩家称号*/){
System.out.print(string+": ");//玩家称呼:
for (Integer i :set
) {
System.out.print(map.get(i)+" ");//获取key对应的value
}
System.out.println();
}
public static void main(String[] args) {
//声明一个key作为扑克牌的map集合的key的同时作为索引
int key = 1;
pokermap.put(key,"大王");//单独添加小王
arrayList.add(key);//存入索引数组
key++;//存入一张牌 索引自增
pokermap.put(key,"小王");//单独添加大王
arrayList.add(key);//存入索引数组
key++;//存入一张牌 索引自增
for (String charstr:pokerchar
) {
for (String colorstr:pokercolor
) {
//将花色和字符连接起来 以字符作为外循环 可以保证 3~2的顺序里数字大的key一定小
pokermap.put(key,colorstr.concat(charstr));
arrayList.add(key);
key++;
}
}
//洗牌 采用Collections工具类的随即置换
Collections.shuffle(arrayList);
Queue<Integer> queue = new LinkedList<>(arrayList);
//每个人17张牌 循环摸牌17次
// Iterator<Integer> pokerIterator = arrayList.iterator();
for (int i = 0 ; i < 17; i++){
player1.add(queue.poll());//牌堆出队的牌给到玩家
player2.add(queue.poll());
player3.add(queue.poll());
}
//将底牌存入集合
int len = queue.size();//提前取出底牌剩余数
for (int i = 0; i<len;i++){
dipai.add(queue.poll());
}
//查看牌
show(pokermap,player1,"玩家一");
show(pokermap,player2,"玩家二");
show(pokermap,player3,"玩家三");
show(pokermap,dipai,"底牌");
}
}