Java案例6-4 斗地主洗牌发牌

一、背景知识

        斗地主的扑克牌游戏: 一副扑克总共有 54 张牌,牌面由花色和数字组成(包括 J、O、K、A 字母)组成,花色有 ♠ 、♥ 、♦ 、♣ 四种,分别表示黑桃、红桃、方块、梅花,小🤡、大🤡分别表示小王和大王。斗地主游戏共有三位玩家参与,首先将这 54张牌的顺序打乱每人轮流摸一次牌,剩余3张留作底牌,然后在控制台打印三位玩家的牌和三张底牌。

二、主要内容:

模拟斗地主游戏的发牌过程,程序需要完成以下任务:

        1、组装一副完整的扑克牌,并为每张牌分配一个唯一的编号;

        2、将牌的顺序随机打乱,模拟洗牌过程;

        3、按照斗地主的规则,将牌平均分配给三位玩家,并留出3张底牌;

        4、在控制台中打印每位玩家的牌和底牌。

具体实现:

        (1)要实现纸牌程序,首先需要完成纸牌的组装。牌面是由花色(包括 ♠ 、♥ 、♦ 、♣花色)和数字(包括J、Q、K、A 字母)两部分组成,可以创建两个 ArrayList 集合作为花色集合与数字集合,存储时需要注意。比 10 大的牌的数字用 J、Q、K 表示,1用 A 表示。

        (2)将花色集合与数字集合这两个循环进行嵌套循环,将花色与数字组合,形成 52 张牌,并赋予其编号。将组合后的牌存放到一个 HashMap 集合中,集合的 Key 值是编号,value值是组装完成的纸牌。还有两张牌是大小王(小🤡表示小王、大🤡表示大王)。由于组装规则不一致,需单独使用 add( )方法将这两张牌加入到 HashMap 集合中。

        (3)创建一个数字集合,用这个数字集合代替纸牌完成洗牌和发牌操作。由于纸牌的数量是 54 张,所以创建集合范围是 0~53。

        (4)使用 Collection 类的 shume( )方法完成打乱数字集合的操作,实现洗牌效果由于只有3个人,所以可以使用 for 循环,通过将数字与3取余的方法,将代表不同纸牌的数字分配给不同人与底牌,实现发牌效果。

        (5)洗牌和发牌结束后,可以通过 Collection 类的 sort( )方法完成排序,之后通过foreach( )循环 HashMap 集合,根据数字査找对应的纸牌字符串,并存入创建的字符串集合中,最后展示字符串集合。

三、实现代码:

package anli6_4;


import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class anli6_4 {
    public static void main(String[] args) {
        // 定义花色和数字集合
        List<String> suits = new ArrayList<>();
        suits.add("♠");
        suits.add("♥");
        suits.add("♦");
        suits.add("♣");

        List<String> numbers = new ArrayList<>();
        for (int i = 2; i <= 10; i++) {
            numbers.add(String.valueOf(i));
        }
        numbers.add("J");
        numbers.add("Q");
        numbers.add("K");
        numbers.add("A");

        // 创建牌的HashMap集合
        Map<Integer, String> cards = new HashMap<>();
        int index = 0;
        for (String suit : suits) {
            for (String number : numbers) {
                cards.put(index++, suit + number);
            }
        }
        cards.put(index++, "小🤡");
        cards.put(index++, "大🤡");

        // 创建数字集合用于洗牌和发牌
        List<Integer> deck = new ArrayList<>();
        for (int i = 0; i < cards.size(); i++) {
            deck.add(i);
        }

        // 洗牌
        Collections.shuffle(deck);

        // 发牌,每人17张,底牌3张
        List<String> player1 = new ArrayList<>();
        List<String> player2 = new ArrayList<>();
        List<String> player3 = new ArrayList<>();
        List<String> bottomCards = new ArrayList<>();

        for (int i = 0; i < deck.size(); i++) {
            if (i < 17) {
                player1.add(cards.get(deck.get(i)));
            } else if (i < 34) {
                player2.add(cards.get(deck.get(i)));
            } else if (i < 51) {
                player3.add(cards.get(deck.get(i)));
            } else {
                bottomCards.add(cards.get(deck.get(i)));
            }
        }

        // 打印结果
        System.out.println("玩家1:" + player1);
        System.out.println("玩家2:" + player2);
        System.out.println("玩家3:" + player3);
        System.out.println("底牌:" + bottomCards);
    }
}

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值