集合实现发牌功能

发布于:2025-08-19 ⋅ 阅读:(18) ⋅ 点赞:(0)

目录

前言:

一、题目

1.1 具体要求:

1.2 题目分析:

二、输出展示

三、程序框架

3.1 封装扑克类

3.2 发牌测试类

四、代码演示

4.1 封装扑克类

4.2 发牌测试类


前言:

本篇文章将分析学习Map后的一个小功能。适合先了解map后观看。

感谢大家的观看。

学习Map链接

一、题目

设计实现一个斗地主游戏,该游戏可以生成牌,洗牌,发牌,三名玩家可以看到自己的底牌,也可以看到最后三张牌。

1.1 具体要求:

  • 生成:生成54张扑克牌(四种花色*13+大小王);
  • 洗牌:将五十四张牌随机打乱;
  • 发牌:准备三名玩家,三人交替摸牌,最后三张底牌不能摸;
  • 底牌:三人可以查看自己的牌和底牌,按照大小顺序展示。

1.2 题目分析:

思考:需要几个集合,分别保存什么样的数据?

-花色信息、点数信息、组合好的牌放在什么地方?

思考:如何比较每张牌的大小,相同数值的牌如何比较大小?

-给牌添加对应的权重值。

思考:洗牌需要用什么方法才能将集合中的元素顺序打乱?

思考:如何发牌,有什么注意事项?

二、输出展示

---将输出结果放在这里方便大家对程序有个方向。

我们需要输出底牌和三名玩家的手牌,并按照大小顺序排序。

三、程序框架

---简易的代码和注释,大家可以在此基础上扩展。

3.1 封装扑克类

//封装扑克类
class Card{
    //花色
    String color;
    //点数
    String number;
    //权重(比大小所用)
    int weight;
    
    //构造器...set、get...
    //重写:toString
    //重写:......
    //......
}

因为扑克牌中有JQKA2等不好比较大小,所以我们设置了成员--权重,用以比较他们的大小。

注意:

--这里也可以看出来我们这里的(key--value)关系。

--扑克牌--权重,扑克牌不相同,但是权重可以相同。

--比如三和三的权重都是一样的。

3.2 发牌测试类

Public class Test{
    //牌--权重
    Map<Card,Integer> map=new TreeMap<>();
    //向map中添加元素
    //...
    //打乱
        //集合工具类中的打乱方法
        //需要先将集合的key存储在list中
         Collections.shuffle(list);
    //三人交替拿牌
        List<Card> play1=new ArrayList<>();
        List<Card> play2=new ArrayList<>();
        List<Card> play3=new ArrayList<>();
    //......

    //直接取出底牌
        List<Card> dipai=list.subList(51, 54);

    //获取权重(key-->value),开始排序
    //......

}

利用Card去找权重,完成排序。

注意:

--Collections.shuffle(list);是Collections工具类提供的静态方法,用于打乱。

--用权重排序需要重写自然排序,还需要考虑权重相同花色问题。

四、代码演示

---一千个伯乐有一千个哈利波特,大家的代码可以正常运行就行。

4.1 封装扑克类

//扑克牌类
public class Card implements Comparable<Card>{
    //花色
    private String color;
    //点数
    private String number;
    //权重
    private int weight;
//-------------构造器
    public Card() {
    }
    public Card(String color, String number) {
        this.color = color;
        this.number = number;
    }
//------------get、set
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
    public int getWeight() {
        return weight;
    }
    public void setWeight(int weight) {
        this.weight = weight;
    }

    
    // 关键:重写equals方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Card card = (Card) o;
        return Objects.equals(color, card.color) && Objects.equals(number, card.number);
    }

    // 关键:重写hashCode方法
    @Override
    public int hashCode() {
        return Objects.hash(color, number);
    }

    // 关键:重写compareTo方法
    @Override
    public int compareTo(Card o) {
        int num;
            num=this.weight-o.weight;
            if(num==0){
                num=colormath(this.color)-colormath(o.color);
            }
        return num;
    }

    //花色比较
    public int colormath(String color){
        if(color.equals("红桃")){return 1;}
        else if(color.equals("方片")){return 2;}
         else if(color.equals("黑桃")){return 3;}
          else if(color.equals("梅花")){return 4;}
          return 0;
    }

    //重写toString
    @Override
    public String toString() {
        return  color + number +" ";
    }
}

4.2 发牌测试类

public class Test {
    public static void main(String[] args) {

        Map<Card,Integer> map=new TreeMap<>();
        //调用添加方法,在代码最下面
        Add.addCard(map,"红桃");
        Add.addCard(map,"方片");
        Add.addCard(map,"黑桃");
        Add.addCard(map,"梅花");
        Card card1=new Card("大丑","大丑");card1.setWeight(17);
        map.put(card1,17);
        Card card2=new Card("小丑","小丑");card2.setWeight(16);
        map.put(card2,16);
        //System.out.println("总"+map.size());
        //System.out.println(map);
        //打乱
            //将map的key存入list
            List<Card> list = new ArrayList<>(map.keySet());
            Collections.shuffle(list);


        //保留三张,开始拿牌,一人17张  
        // List<Card> play1=list.subList(0, 17);
        // List<Card> play2=list.subList(17, 34);
        // List<Card> play3=list.subList(34, 51);
        // List<Card> dipai=list.subList(51, 54);
        //三人交替拿牌
        List<Card> play1=new ArrayList<>();
        List<Card> play2=new ArrayList<>();
        List<Card> play3=new ArrayList<>();
        List<Card> dipai=list.subList(51, 54);

        for(int i=0;i<list.size()-4;i++){
            Card card=list.get(i);
            switch (i%3) {
                case 0:
                    play1.add(card);
                    break;
                case 1:
                    play2.add(card);
                    break;
                case 2:
                    play3.add(card);
                    break;                                
                default:
                    break;
            }
        }

        //获取权重,开始排序
        play1.sort(Comparator.comparingInt(card -> map.get(card)));
        play2.sort(Comparator.comparingInt(card -> map.get(card)));
        play3.sort(Comparator.comparingInt(card -> map.get(card)));
        System.out.println("玩家一:"+play1);
        System.out.println("玩家二:"+play2);
        System.out.println("玩家三:"+play3);
        dipai.sort(Comparator.comparingInt(card->map.get(card)));
        System.out.println("底牌:"+dipai);
        
     }
 }
 //添加方法
class Add{
    public static void addCard(Map<Card,Integer> map,String color){
                for(int i=3;i<16;i++){
                String s=String.valueOf(i);
               
                
            if(i==14){ 
                Card card14=new Card(color,"A"); card14.setWeight(i);
                map.put(card14,i);continue;
            }
            else    if(i==15){ 
                 Card card15=new Card(color,"2");card15.setWeight(i);
                map.put(card15,i);continue;
            }
            else    if(i==11){
                 Card card11=new Card(color,"J");card11.setWeight(i);
                 map.put(card11,i);continue;
                }
            else    if(i==12){ 
                 Card card12=new Card(color,"Q");card12.setWeight(i);
                map.put(card12,i);continue;
            }
            else    if(i==13){ 
                 Card card13=new Card(color,"K");card13.setWeight(i);
                map.put(card13,i);continue;
            }
            else   {
                 Card card = new Card(color, s);card.setWeight(i);
                map.put(card,i); 
            }
        }
    }
} 

上述代码的基本思想:

将花色和点数是牌的基本特征作为唯一key键,可以相同用于比较的权重作为value值,通过get方法将权重值输入对应Card对象,最后通过重写的自然排序完成牌面大小的输出。

虽然,用集合完成斗地主发牌程序只是一个“小练习”,但是却是我们从理论到实践的一大步。它不仅帮助我们巩固了知识,更是让我们明白“编程解决实际问题”的乐趣。

你还能想到运用学过的知识可以完成什么小程序呢?

当然,集合只是Java学习中的一小部分,后续我们将会学习:并发集合(如:ConcurrentHashMap,应对多线程场景)、Stream API(简化集合的遍历与处理)等。

希望大家多多努力。

OK,本篇内容到此结束!!感谢大家的观看。

风铃响,故人归;

        秋风秋风快快回。


网站公告

今日签到

点亮在社区的每一天
去签到