79-Java案例:斗地主游戏

案例:斗地主游戏

一、需求

  • 在启动游戏房间的时候,应该提前准备好54张牌,完成洗牌、发牌、牌排序、逻辑。

二、分析

  • 当系统启动的同时需要准备好数据的时候,就可以用静态代码块了。
  • 洗牌就是打乱牌的顺序。
  • 定义三个玩家,依次发出51张牌。
  • 给玩家的牌进行排序(拓展)
  • 输出每个玩家的牌数据。
package com.app.d6_Collection_test;

/**
    1、定义牌类,封装牌的信息
 */
public class Card {
    /**
        牌属性:点数、花色
     */
    private String size;
    private String color;
    private int index;  // 定义一个牌的大小属性

    /**
        提供无参和有参构造器
     */
    public Card() {

    }

    public Card(String size, String color, int index) {
        this.size = size;
        this.color = color;
        this.index = index;
    }

    /**
        提供成套的getter、setter方法,暴露其取值和赋值
     */
    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    /**
        重写toString方法,格式化输出内容
     */
    @Override
    public String toString() {
        return size + color;    // 只关心牌的点数和花色
    }
}
package com.app.d6_Collection_test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
    Collection集合体系的综合案例:斗地主案例开发

    需求分析:
        斗地主的做牌,洗牌,发牌,排序(拓展知识),看牌
        业务:总共有54张牌
        点数:"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"
        花色:"♠", "♥", "♣", "♦"
        大小王:"大🃏", "小🃏"
        点数分别要组合4种花色,大小王各一张。
        斗地主:发出51张牌,剩下3张作为底牌。

    功能:
        1、做牌
        2、洗牌
        3、要3个玩家
        4、发牌
        5、排序(拓展,了解)
        6、看牌
 */
public class GameDemo {
    /**
        2、定义一个静态的集合用于存储54张牌
     */
    public static List<Card> allCards = new ArrayList<>();

    /**
        3、做牌:定义静态代码块,用于启动游戏房间的同时做好牌
     */
    static {
        // a、定义数组存储牌的点数:个数确定、类型确定,所以使用数组
        String[] sizes = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};

        // b、定义数组存储牌的花色:个数确定、类型确定,所以使用数组
        String[] colors = {"♠", "♥", "♣", "♦"};

        int index = 0;  // 定义一个变量,用于记录牌的大小
        // c、组合点数和花色
        // 定义外部循环遍历点数
        for (String size : sizes) {
            index++;    // 牌的大小+1,从3开始
            // 定义内部循环遍历花色
            for (String color : colors) {
                // d、封装成一张牌对象:点数,花色,大小
                Card card = new Card(size, color, index);
                // e、将封装好的牌对象添加到集合中
                allCards.add(card);
            }
        }

        // f、所有点数和花色组合好之后,单独添加大王和小王到集合中
        Collections.addAll(allCards, new Card("小", "🃏", ++index), new Card("大", "🃏", ++index));

        System.out.println("新牌:" + allCards);
    }

    public static void main(String[] args) {
        // 4、洗牌
        Collections.shuffle(allCards);
        System.out.println("洗牌后:" + allCards);

        // 5、发牌(定义三个玩家,每个玩家的牌也是一个集合容器:因为玩家手上需要拿牌)
        List<Card> sunwukong = new ArrayList<>();   // 玩家1:孙悟空
        List<Card> zhubajie = new ArrayList<>();    // 玩家2:猪八戒
        List<Card> shawujing = new ArrayList<>();   // 玩家3:沙悟净

        // 6、开始发牌(从牌集合中发出51张牌给三个玩家,剩余3张作为底牌)
        // allCards = [4♥, 8♣, K♥, Q♥, 10♦, 5♥, A♦, 9♥, 9♣, 3♠, ...
        //   i          0   1   2   3   4    5   6   7   8   9   ...
        for (int i = 0; i < allCards.size() - 3; i++) {
            // 先拿到牌对象
            Card card = allCards.get(i);

            // 分别给三个玩家发牌,对3求余
            if (i % 3 == 0) {
                // 如果i对3求余等于0,请孙悟空接牌
                sunwukong.add(card);
            } else if (i % 3 == 1) {
                // 如果i对3求余等于1,请猪八戒接牌
                zhubajie.add(card);
            }else if (i % 3 == 2){
                // 如果i对3求余等于2,请沙悟净接牌
                shawujing.add(card);
            }
        }

        // 7、拿到最后三张牌作为底牌(把最后三张牌截取成一个子集合)
        List<Card> lastThreeCards = allCards.subList(allCards.size() - 3, allCards.size()); // 等同于(51, 54),包前不包后

        // 8、给玩家的牌排序(从大到小,相当于你拿到牌了,也会给牌进行排序)
        sortCards(sunwukong);
        sortCards(zhubajie);
        sortCards(shawujing);

        // 9、看牌:输出玩家的牌
        System.out.println("-------------------------------------------------------------------------------------");
        System.out.println("孙悟空:" + sunwukong);
        System.out.println("猪八戒:" + zhubajie);
        System.out.println("沙悟净:" + shawujing);
        System.out.println("三张底牌:" + lastThreeCards);
    }

    /**
     * 对玩家的牌进行排序:从大到小
     * @param cards
     */
    private static void sortCards(List<Card> cards) {
        // cards = [大🃏, A♥, 3♦, A♦, 小🃏, 5♠, 8♣, 6♣, 10♠, 9♠, 3♥, 7♦, J♠, 10♦, K♥, 2♠, 7♥]
        /*Collections.sort(cards, new Comparator<Card>() {
            @Override
            public int compare(Card o1, Card o2) {
                // 我们要知道牌的大小,才可以指定规则来排序
                return o2.getIndex() - o1.getIndex();   // 降序
            }
        });*/
        Collections.sort( cards, ( o1,  o2) -> o2.getIndex() - o1.getIndex() );
    }


}
新牌:[3♠, 3♥, 3♣, 3♦, 4♠, 4♥, 4♣, 4♦, 5♠, 5♥, 5♣, 5♦, 6♠, 6♥, 6♣, 6♦, 7♠, 7♥, 7♣, 7♦, 8♠, 8♥, 8♣, 8♦, 9♠, 9♥, 9♣, 9♦, 10♠, 10♥, 10♣, 10♦, J♠, J♥, J♣, J♦, Q♠, Q♥, Q♣, Q♦, K♠, K♥, K♣, K♦, A♠, A♥, A♣, A♦, 2♠, 2♥, 2♣, 2♦, 小🃏, 大🃏]
洗牌后:[6♥, 6♠, 2♦, 8♦, K♦, 2♣, 8♥, Q♣, 7♣, J♥, 5♥, 3♣, K♣, 8♠, Q♥, 9♦, Q♦, 4♣, 10♠, 小🃏, 3♥, K♠, 5♠, 9♠, 9♣, 4♠, 10♣, A♣, 3♠, 7♦, K♥, 7♠, 大🃏, 5♦, A♦, 6♦, J♦, 6♣, 7♥, 2♥, 3♦, 5♣, Q♠, 4♦, 10♦, A♠, 9♥, 2♠, J♠, 10♥, A♥, J♣, 8♣, 4♥]
-------------------------------------------------------------------------------------
孙悟空:[2♥, A♣, A♠, K♣, K♠, K♥, Q♠, J♥, J♦, J♠, 10♠, 9♦, 9♣, 8♦, 8♥, 6♥, 5♦]
猪八戒:[小🃏, A♦, K♦, Q♣, Q♦, 10♥, 9♥, 8♠, 7♠, 6♠, 6♣, 5♥, 5♠, 4♠, 4♦, 3♠, 3♦]
沙悟净:[大🃏, 2♦, 2♣, 2♠, A♥, Q♥, 10♣, 10♦, 9♠, 7♣, 7♦, 7♥, 6♦, 5♣, 4♣, 3♣, 3♥]
三张底牌:[J♣, 8♣, 4♥]

Process finished with exit code 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
地主是一款经典的扑克牌游戏,我们可以使用Java来实现这个游戏。这个地主游戏的实现包括了Deck类(表示一副牌)、Card类(表示一张牌)和Player类(表示一个玩家)。程序的主类是DouDiZhu类,它负责管理游戏的过程和输出结果。在这个程序中,每个玩家会收到17张牌,剩下的三张牌作为地主牌。游戏结束后会输出所有玩家的手牌和地主牌。需要注意的是,这个程序实现的地主游戏比较简单,仅仅包含了最基本的发牌、抢地主等操作。如果你需要更完整的地主游戏,可以根据这个程序进行扩展。地主游戏的实现可以帮助我们加深对Java的理解和应用。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [java实现一个简单的地主游戏](https://blog.csdn.net/m0_56235386/article/details/129910166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [地主游戏(JAVA实现)](https://blog.csdn.net/weixin_62445683/article/details/124237098)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值