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



目录
相关文章
|
3月前
|
Java 索引
Java实现扑克牌游戏 | 随机发牌 ( 过程拆分详解+完整代码 )
Java实现扑克牌游戏 | 随机发牌 ( 过程拆分详解+完整代码 )
|
2月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
41 1
|
5月前
|
Java C++
愤怒的牛(java c++)(二分典型例子)
愤怒的牛(java c++)(二分典型例子)
56 1
|
5月前
|
存储 算法 PHP
开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里?
开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里?
34 1
开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里?
|
搜索推荐 算法 测试技术
八大排序超详解(动图+源码)
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
用Java实现简易的洗牌和发牌功能
在日常生活中,想必大家都玩过或者听过斗地主吧,斗地主大致分为三个过程:洗牌,发牌,玩家按照规则将手中的牌给打完,谁最先打完,谁就获胜。这听起来挺简单的,但是影响你胜利的因素有很多:洗牌,玩家的水平。在赌场中很多人就是在洗牌跟发牌的过程中作弊的,那么我们可不可以用代码来实现洗牌跟发牌的功能来实现相对公平呢?
|
Python
shuffle什么意思?python模拟随机发牌(斗地主、掼蛋)
shuffle什么意思?python模拟随机发牌(斗地主、掼蛋)
143 0
|
存储 小程序 Java
Java数据结构之基于ArrayList编写大众麻将和扑克牌洗牌小练习
本文讲解:Java数据结构之基于ArrayList编写大众麻将和扑克牌洗牌小练习
|
对象存储 索引
终极:用集合模拟斗地主
1.买一副扑克牌将花色和数字分别进行组合,生成所有的普通牌手动添加“大王”、“小王” 2.洗牌使用Collections工具类的shuffle()方法打乱牌的顺序 3.发牌遍历牌堆,将每一张牌分发到三个玩家集合中留三张作为底牌 4.看牌分别打印每个玩家集合的内容
终极:用集合模拟斗地主
|
Java
java学习第七天笔记-方法140-综合练习-抽奖代码2进行数组交换
java学习第七天笔记-方法140-综合练习-抽奖代码2进行数组交换
70 0
java学习第七天笔记-方法140-综合练习-抽奖代码2进行数组交换