【案例介绍】
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);}
}