【实现思路】
1、要实现纸牌程序,首先需要完成纸牌的组装。牌面是由花色和数字(包括 J、Q、K、A 字母)两部分组成的,可以创建两个 ArrayList 集合作为花色集合和数字集合,存储时需要注意,比 10 大的牌用 J、Q、K 表示,1 用 A 来表示。
2、将花色集合和数字集合这两个集合进行嵌套循环,将花色与数字组合,形成 52 张牌,并赋予其编号。将组合后的牌存放到一个 HashMap 集合中,集合的 key 值是编号, value 值是组装完成的纸牌。还有两张牌是大小王。由于组装规则不一致,需单独使用 add()方法将这两张牌加入到 HashMap 中。
3、创建一个数字集合,用这个数字集合来代替纸牌完成洗牌和发牌的操作。由于纸牌的数量是 54 张,所欲创建的集合范围是 0~53。
4、可以使用 Collectios 类的 shuffle()方法完成打乱数字集合的操作,实现洗牌效果。由于只有 3 个人,所以可以使用 for 循环,通过将数字与 3 取余的方法,将代表不同纸牌的数字分配给不同的人和底牌,实现发牌效果。
5、洗牌和发牌完成之后,可通过 Collections 类的 sort()方法完成排序,之后通过 foreach 循环 HashMap 集合,根据数字查找对应的纸牌字符串,并存入新创建的字符串集合中,最后展示字符串集合。
【实现代码】
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
public class PokerShuffleCards {
public static void main(String[] args) {
//准备花色
ArrayList<String> color = new ArrayList<String>();
color.add("♠");
color.add("♥");
color.add("♦");
color.add("♣");
//准备数字,用 ArrayList 将纸牌由小到大排序
ArrayList<String> number = new ArrayList<String>();
for (int i = 3; i <= 10; i++) {
number.add(i + "");
}
number.add("J");
number.add("Q");
number.add("K");
number.add("A");
number.add("2");
//定义一个 map 集合:用来将数字与每一张牌进行对应
HashMap<Integer, String> map = new HashMap<Integer, String>();
int index = 0; //纸牌编号
for (String thisNumber : number) { //循环纸牌数字
for (String thisColor : color) { //循环纸牌花色
map.put(index++, thisColor + thisNumber); //将花色与数字组合,形成 52 张牌,并赋予对应编号
}
}
//加入大小王
map.put(index++, "smallking");
map.put(index++, "bigking");
//创建内容为 0~53 的数字集合,代表着 54 张牌
ArrayList<Integer> cards = new ArrayList<Integer>();
for (int i = 0; i <= 53; i++) {
cards.add(i); //此时的 cards 顺序为 0-53
}
//洗牌,使用 Collections 工具类中的 shuffle()方法
Collections.shuffle(cards); //此时的 cards 顺序已被打乱
//创建三个玩家和底牌
ArrayList<Integer> iPlayer = new ArrayList<Integer>();
ArrayList<Integer> iPlayer2 = new ArrayList<Integer>();
ArrayList<Integer> iPlayer3 = new ArrayList<Integer>();
ArrayList<Integer> iSecretCards = new ArrayList<Integer>();
//遍历这副洗好的牌,遍历过程中,将牌发到 3 个玩家和底牌中
for (int i = 0; i < cards.size(); i++) {
if (i >= 51) {
iSecretCards.add(cards.get(i)); //留取 3 张底牌
}else {
if (i % 3 == 0) {
iPlayer.add(cards.get(i)); //与 3 取余为 0 的牌发给玩家1
}else if (i % 3 == 1) {
iPlayer2.add(cards.get(i)); //与 3 取余为 1 的牌发给玩家2
}else {
iPlayer3.add(cards.get(i)); //与 3 取余为 2 的牌发给玩家3
}
}
}
//对每个人手中的牌排序,使用 Collections 工具类中的 sort()方法
Collections.sort(iPlayer);
Collections.sort(iPlayer2);
Collections.sort(iPlayer3);
//对应数字形式的每个人手中的牌,定义字符串形式的牌
ArrayList<String> sPlayer = new ArrayList<String>();
ArrayList<String> sPlayer2 = new ArrayList<String>();
ArrayList<String> sPlayer3 = new ArrayList<String>();
ArrayList<String> sSecretCards = new ArrayList<String>();
//循环主键,从 Map 中获取纸牌
for (Integer key : iPlayer) {
sPlayer.add(map.get(key));
}
for (Integer key : iPlayer2) {
sPlayer2.add(map.get(key));
}
for (Integer key : iPlayer3) {
sPlayer3.add(map.get(key));
}
for (Integer key : iSecretCards) {
sSecretCards.add(map.get(key));
}
//看牌
System.out.println("玩家1:" + sPlayer);
System.out.println("玩家2:" + sPlayer2);
System.out.println("玩家3:" + sPlayer3);
System.out.println("底牌:" + sSecretCards);
}
}
1.既然arraylist是无序的,为什么遍历时是以存入的顺序进行遍历,15~27行。
2.map的get()方法不是应该传入键所对应的类型吗,为什么这里可以传入interger类型,71~73