JavaSE——集合框架二(2/6)-综合案例-斗地主游戏(做牌、洗牌、发牌、排序、看牌)

简介: JavaSE——集合框架二(2/6)-综合案例-斗地主游戏(做牌、洗牌、发牌、排序、看牌)

需求与分析

需求

  • 总共有54张牌
  • 点数:"3","4","5","6","7","8","9","10","J","Q","K","A","2"
  • 花色:"♠","♥","♣","♦"
  • 大小王:"👲","🃏"
  • 斗地主:发出51张牌,剩下3张作为底牌

分析实现

  • 在启动游戏房间的时候,应该提前准备好54张牌
  • 接着,需要完成洗牌、发牌、对牌排序、看牌

具体实现

类定义

package user.Collection;
 
public class Card {
    private String number;
    private String color;
    //每张牌是存在牌值大小的
    private int size;       //0 1 2 ...
 
    public Card() {
    }
 
    public Card(String number, String color, int size) {
        this.number = number;
        this.color = color;
        this.size = size;
    }
 
    public String getNumber() {
        return number;
    }
 
    public void setNumber(String number) {
        this.number = number;
    }
 
    public String getColor() {
        return color;
    }
 
    public void setColor(String color) {
        this.color = color;
    }
 
    public int getSize() {
        return size;
    }
 
    public void setSize(int size) {
        this.size = size;
    }
 
    @Override
    public String toString() {
        return number + color;
    }
}

房间类定义

package user.Collection;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
 
public class Room {
    //首先必须有一副牌
    private List<Card> allCards = new ArrayList<>();
 
    public Room(){
        //1.做出54张牌,存入到集合allCards
        //a.所有牌的点数
        String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        //b.所有牌的花色
        String[] colors = {"♠","♥","♣","♦"};
        int size = 0;       //表示每张牌的牌值大小
        //c.遍历点数,再遍历花色,组织牌
        for(String number:numbers){
            //number = "3"
            size++; //1 2 3 ......
            for(String color:colors){
                //得到一张牌
                Card d = new Card(number,color,size);
                allCards.add(d);    //存入牌库
            }
        }
 
        //单独存入大小王
        Card d1 = new Card("","🃏",++size);  //小王
        Card d2 = new Card("","👲",++size); //大王
        Collections.addAll(allCards,d1,d2);
    }
}

初步测试

Room类中加一下输出语句:(已重写Card类的toString方法)


在主程序中运行:


运行结果:

启动游戏

在Room类中编写启动游戏的方法,再调用


    public void start() {
        //1.洗牌
        Collections.shuffle(allCards);
        System.out.println("洗牌后:" + allCards);
 
        //2.发牌,发给三个玩家 还是使用List集合
        List<Card> MegMarch = new ArrayList<>();
        List<Card> JoMarch = new ArrayList<>();
        List<Card> BethMarch = new ArrayList<>();
 
        //正式发牌给这三个玩家,依次发出51张牌,剩余三张作为底牌
        for(int i = 0;i < allCards.size();i++){
            Card c = allCards.get(i);
            //判断发牌给谁
            if(i % 3 == 0){
                //发牌给梅格
                MegMarch.add(c);
            }else if(i % 3 == 1){
                //发牌给乔
                JoMarch.add(c);
            }else if(i % 3 == 2){
                //发牌给贝丝
                BethMarch.add(c);
            }
        }
        
        //3.对三个玩家的牌进行排序
        sortCards(MegMarch);
        sortCards(JoMarch);
        sortCards(BethMarch);
 
        //4.看牌
        System.out.println("梅格 :" + MegMarch);
        System.out.println("乔   :" + JoMarch);
        System.out.println("贝丝 :" + BethMarch);
        List<Card> lastThreeCards = allCards.subList(allCards.size() - 3,allCards.size());
        System.out.println("底牌 :" + lastThreeCards);
        //假设乔抢到了地主
        JoMarch.addAll(lastThreeCards);
        sortCards(JoMarch);
        System.out.println("乔抢到地主后:" + JoMarch);
    }
 
    private void sortCards(List<Card> cards) {
        Collections.sort(cards, new Comparator<Card>() {
            @Override
            public int compare(Card o1, Card o2) {
                return o2.getSize() - o1.getSize(); //降序排序
            }
        });
    }

运行案例


END



目录
相关文章
|
4月前
|
Java 索引
Java实现扑克牌游戏 | 随机发牌 ( 过程拆分详解+完整代码 )
Java实现扑克牌游戏 | 随机发牌 ( 过程拆分详解+完整代码 )
|
3月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
50 1
|
Java
【Java】三人扑克牌随机发牌
【Java】三人扑克牌随机发牌
145 0
用Java实现简易的洗牌和发牌功能
在日常生活中,想必大家都玩过或者听过斗地主吧,斗地主大致分为三个过程:洗牌,发牌,玩家按照规则将手中的牌给打完,谁最先打完,谁就获胜。这听起来挺简单的,但是影响你胜利的因素有很多:洗牌,玩家的水平。在赌场中很多人就是在洗牌跟发牌的过程中作弊的,那么我们可不可以用代码来实现洗牌跟发牌的功能来实现相对公平呢?
|
存储 小程序 Java
Java数据结构之基于ArrayList编写大众麻将和扑克牌洗牌小练习
本文讲解:Java数据结构之基于ArrayList编写大众麻将和扑克牌洗牌小练习
|
Java
java学习第七天笔记-方法140-综合练习-抽奖代码2进行数组交换
java学习第七天笔记-方法140-综合练习-抽奖代码2进行数组交换
73 0
java学习第七天笔记-方法140-综合练习-抽奖代码2进行数组交换
|
Java
java学习第五天笔记-循环高级和数组101-打乱数据
java学习第五天笔记-循环高级和数组101-打乱数据
65 0
java学习第五天笔记-循环高级和数组101-打乱数据
|
Java
java学习第七天笔记-方法130-综合联系-找质数
java学习第七天笔记-方法130-综合联系-找质数
52 0
java学习第七天笔记-方法130-综合联系-找质数
|
算法 Java
java学习第七天笔记-方法144-综合练习-双色球算法3
java学习第七天笔记-方法144-综合练习-双色球算法3
72 0
java学习第七天笔记-方法144-综合练习-双色球算法3
|
算法 Java
java学习第七天笔记-方法143-综合练习-双色球算法2
java学习第七天笔记-方法143-综合练习-双色球算法2
67 0
java学习第七天笔记-方法143-综合练习-双色球算法2