数组实现简单斗地主游戏
import java.util.*; // 定义扑克牌类 class Poker { private String suit; // 花色 private String rank; // 点数 public Poker(String suit, String rank) { this.suit = suit; this.rank = rank; } public String getRank() { return rank; } @Override public String toString() { return suit + rank; } } public class DouDiZhuGame { public static void main(String[] args) { // 初始化一副扑克牌 List<Poker> pokerList = initPoker(); // 洗牌 Collections.shuffle(pokerList); // 发牌 List<List<Poker>> players = dealPoker(pokerList); // 给玩家手牌排序 sortHands(players); // 展示玩家手牌和底牌 showHands(players); } // 初始化一副扑克牌 private static List<Poker> initPoker() { List<Poker> pokerList = new ArrayList<>(); String[] suits = {"♠", "♥", "♣", "♦"}; String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"}; // 添加普通扑克牌 for (String suit : suits) { for (String rank : ranks) { pokerList.add(new Poker(suit, rank)); } } // 添加大小王 pokerList.add(new Poker("", "小王")); pokerList.add(new Poker("", "大王")); return pokerList; } // 发牌 private static List<List<Poker>> dealPoker(List<Poker> pokerList) { List<List<Poker>> players = new ArrayList<>(); for (int i = 0; i < 3; i++) { players.add(new ArrayList<>()); } List<Poker> bottomCards = new ArrayList<>(); // 发牌 for (int i = 0; i < pokerList.size(); i++) { if (i >= pokerList.size() - 3) { bottomCards.add(pokerList.get(i)); } else { players.get(i % 3).add(pokerList.get(i)); } } players.add(bottomCards); return players; } // 给玩家手牌排序 private static void sortHands(List<List<Poker>> players) { // 定义扑克牌点数的大小顺序 String[] rankOrder = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2", "小王", "大王"}; Map<String, Integer> rankMap = new HashMap<>(); for (int i = 0; i < rankOrder.length; i++) { rankMap.put(rankOrder[i], i); } for (List<Poker> hand : players) { Collections.sort(hand, (p1, p2) -> { int rank1 = rankMap.get(p1.getRank()); int rank2 = rankMap.get(p2.getRank()); return Integer.compare(rank1, rank2); }); } } // 展示玩家手牌和底牌 private static void showHands(List<List<Poker>> players) { String[] playerNames = {"玩家1", "玩家2", "玩家3", "底牌"}; for (int i = 0; i < players.size(); i++) { System.out.println(playerNames[i] + "的手牌:" + players.get(i)); } } }
这段 Java 代码实现了一个简单的斗地主游戏,主要包含了扑克牌的初始化、洗牌、发牌、手牌排序以及展示手牌等功能。下面我会逐部分详细解释代码。
1. 导入必要的包
import java.util.*;
这行代码导入了 java.util
包下的所有类,该包提供了许多常用的集合类(如 List
、Map
、ArrayList
、HashMap
等)以及工具类(如 Collections
)。
2. 定义扑克牌类 Poker
class Poker { private String suit; // 花色 private String rank; // 点数 public Poker(String suit, String rank) { this.suit = suit; this.rank = rank; } public String getRank() { return rank; } @Override public String toString() { return suit + rank; } }
suit
和rank
是Poker
类的两个私有属性,分别表示扑克牌的花色和点数。- 构造函数
Poker(String suit, String rank)
用于创建Poker
对象,初始化花色和点数。 getRank()
方法用于获取扑克牌的点数。toString()
方法被重写,返回扑克牌的花色和点数组合的字符串,方便后续打印输出。
3. 主类 DouDiZhuGame
3.1 main
方法
public static void main(String[] args) { // 初始化一副扑克牌 List<Poker> pokerList = initPoker(); // 洗牌 Collections.shuffle(pokerList); // 发牌 List<List<Poker>> players = dealPoker(pokerList); // 给玩家手牌排序 sortHands(players); // 展示玩家手牌和底牌 showHands(players); }
main
方法是程序的入口点,按顺序调用了以下几个方法:
initPoker()
:初始化一副完整的扑克牌。Collections.shuffle(pokerList)
:使用Collections
类的shuffle
方法对扑克牌列表进行洗牌,打乱牌的顺序。dealPoker(pokerList)
:将洗好的牌发给三个玩家,并留下三张底牌。sortHands(players)
:对每个玩家的手牌进行排序。showHands(players)
:展示每个玩家的手牌和底牌。
3.2 initPoker
方法
private static List<Poker> initPoker() { List<Poker> pokerList = new ArrayList<>(); String[] suits = {"♠", "♥", "♣", "♦"}; String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"}; // 添加普通扑克牌 for (String suit : suits) { for (String rank : ranks) { pokerList.add(new Poker(suit, rank)); } } // 添加大小王 pokerList.add(new Poker("", "小王")); pokerList.add(new Poker("", "大王")); return pokerList; }
该方法用于初始化一副完整的扑克牌:
- 创建一个
ArrayList
来存储扑克牌。 - 定义两个数组
suits
和ranks
,分别表示扑克牌的花色和点数。 - 使用嵌套的
for
循环遍历花色和点数,创建普通扑克牌并添加到pokerList
中。 - 最后添加大小王到
pokerList
中,并返回该列表。
3.3 dealPoker
方法
private static List<List<Poker>> dealPoker(List<Poker> pokerList) { List<List<Poker>> players = new ArrayList<>(); for (int i = 0; i < 3; i++) { players.add(new ArrayList<>()); } List<Poker> bottomCards = new ArrayList<>(); // 发牌 for (int i = 0; i < pokerList.size(); i++) { if (i >= pokerList.size() - 3) { bottomCards.add(pokerList.get(i)); } else { players.get(i % 3).add(pokerList.get(i)); } } players.add(bottomCards); return players; }
该方法用于发牌:
- 创建一个
List<List<Poker>>
类型的players
列表,用于存储三个玩家的手牌,每个玩家的手牌也是一个List<Poker>
。 - 创建一个
List<Poker>
类型的bottomCards
列表,用于存储三张底牌。 - 使用
for
循环遍历扑克牌列表,将前 51 张牌依次发给三个玩家,最后三张牌作为底牌。 - 将底牌列表添加到
players
列表的最后,并返回players
列表。
3.4 sortHands
方法
private static void sortHands(List<List<Poker>> players) { // 定义扑克牌点数的大小顺序 String[] rankOrder = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2", "小王", "大王"}; Map<String, Integer> rankMap = new HashMap<>(); for (int i = 0; i < rankOrder.length; i++) { rankMap.put(rankOrder[i], i); } for (List<Poker> hand : players) { Collections.sort(hand, (p1, p2) -> { int rank1 = rankMap.get(p1.getRank()); int rank2 = rankMap.get(p2.getRank()); return Integer.compare(rank1, rank2); }); } }
该方法用于对每个玩家的手牌进行排序:
- 定义一个
rankOrder
数组,指定扑克牌点数的大小顺序。 - 创建一个
HashMap
类型的rankMap
,将每个点数映射到一个整数,方便后续比较大小。 - 使用
for
循环遍历每个玩家的手牌,使用Collections
类的sort
方法和自定义的比较器对其进行排序。比较器通过比较两张牌的点数对应的整数大小来确定牌的顺序。
3.5 showHands
方法
private static void showHands(List<List<Poker>> players) { String[] playerNames = {"玩家1", "玩家2", "玩家3", "底牌"}; for (int i = 0; i < players.size(); i++) { System.out.println(playerNames[i] + "的手牌:" + players.get(i)); } }
该方法用于展示每个玩家的手牌和底牌:
- 定义一个
playerNames
数组,存储玩家和底牌的名称。 - 使用
for
循环遍历players
列表,打印每个玩家的手牌和底牌。
综上所述,这段代码通过一系列方法实现了斗地主游戏的基本流程,包括初始化扑克牌、洗牌、发牌、排序和展示手牌等功能。
Java集合框架 文章被收录于专栏
Java集合框架是Java提供的一组用于存储和操作数据的类和接口,它位于java.util包中,为开发者提供了强大且灵活的数据存储和处理能力。以下将从整体架构、主要接口、常用实现类、使用场景以及示例代码等方面详细介绍Java集合框架。