数组实现简单斗地主游戏

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 包下的所有类,该包提供了许多常用的集合类(如 ListMapArrayListHashMap 等)以及工具类(如 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;
    }
}

  • suitrankPoker 类的两个私有属性,分别表示扑克牌的花色和点数。
  • 构造函数 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 来存储扑克牌。
  • 定义两个数组 suitsranks,分别表示扑克牌的花色和点数。
  • 使用嵌套的 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集合框架。

全部评论
最关键的打牌部分在哪呢
点赞 回复 分享
发布于 04-21 13:28 浙江

相关推荐

不要停下啊:大二打开牛客,你有机会开卷了,卷起来,去找课程学习,在牛客上看看大家面试笔试都需要会什么,岗位有什么需求就去学什么,努力的人就一定会有收获,这句话从来都经得起考验,像我现在大三了啥也不会,被迫强行考研,炼狱难度开局,啥也不会,找工作没希望了,考研有丝丝机会
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务