一、背景知识
斗地主的扑克牌游戏: 一副扑克总共有 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);
}
}