【案例 6-4】斗地主洗牌发牌

【案例介绍】

1.任务描述
斗地主的扑克牌游戏,相信许多人都会玩,本例要求编写一个斗地主的洗牌发牌程序,要求按照斗地主的规则完成洗牌发牌的过程。一副扑克总共有 54 张牌,牌面由花色和数字组成(包括 J、Q、K、A 字母)组成,花色有♠、♥、♦、♣ 四种,分别表示黑桃、红桃、方块、梅花,小☺、大☻分别表示小王和大王。斗地主游戏共有三位玩家参与,首先将这 54张牌的顺序打乱每人轮流摸一次牌,剩余 3 张留作底牌,然后在控制台打印三位玩家的牌和三张底牌。

2.运行结果

【任务介绍】

  • 学会分析“斗地主之洗牌发牌”任务的实现思路。
  • 根据思路独立完成“斗地主之洗牌发牌”任务的源代码编写、编译及运行。
  • 掌握 List 集合和 Map 集合特点及常用方法的使用。
  • 掌握集合遍历的方式。

【实现思路】

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

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

【实现代码】

import java.util.ArrayList;
import java.util.Collections;

public class main {
    public static void main(String[] args) {
        //斗地主洗牌发牌
        String[] colors = {"♠", "♥", "♦", "♣"};
        String[] numbers = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
        String[] jokers = {"大王☻", "小王☺"};
        //创建一个牌盒
        ArrayList<String> pokerBox = new ArrayList<>();
        //将牌放入牌盒
        for (String number : numbers) {
            for (String color : colors) {
                pokerBox.add(number + color);
            }
        }
        pokerBox.add(jokers[0]);
        pokerBox.add(jokers[1]);
        //洗牌
        Collections.shuffle(pokerBox);
        //发牌
        ArrayList<String> player1 = new ArrayList<>();
        ArrayList<String> player2 = new ArrayList<>();
        ArrayList<String> player3 = new ArrayList<>();
        ArrayList<String> dipai = new ArrayList<>();
        for (int i = 0; i < pokerBox.size(); i++) {
            if (i >= pokerBox.size() - 3) {
                dipai.add(pokerBox.get(i));
            } else if (i % 3 == 0) {
                player1.add(pokerBox.get(i));
            } else if (i % 3 == 1) {
                player2.add(pokerBox.get(i));
            } else if (i % 3 == 2) {
                player3.add(pokerBox.get(i));
            }
        }
        //看牌
        Collections.sort(player1);
        Collections.sort(player2);
        Collections.sort(player3);
        System.out.println("玩家一:" + player1);
        System.out.println("玩家二:" + player2);
        System.out.println("玩家三:" + player3);
        System.out.println("底牌:" + dipai);
    }
}
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值