【练习】JavaSE实现控制台版本的斗地主部分功能

题目

使用集合实现斗地主游戏的部分功能,要求如下:

  • 首先准备 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,"底牌");
   }
}