java实现发牌逻辑

发牌游戏:Java代码实现

发牌游戏是一个非常受欢迎的桌面游戏,我们可以通过编写Java代码来实现这个游戏的逻辑。在这篇文章中,我将向您展示如何用Java语言实现一副牌的创建、洗牌和发牌。

1. 创建一副牌

首先,我们需要创建一副牌,包括四种花色和十三种点数。在这个示例中,我们将去除大小王、三个2和一个A,共48张牌。

String[] suits = {"♠", "♥", "♣", "♦"}; // 四种花色
String[] ranks = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}; // 十三种点数
ArrayList<String> deck = new ArrayList<String>(); // 创建一副牌
for (String suit : suits) {
    for (String rank : ranks) {
        String card = suit + rank;
        if (!"♠2".equals(card) && !"♥2".equals(card) && !"♦2".equals(card) && !"♠A".equals(card)) {
            deck.add(card);
        } // 删除大小王、三个2和一个A,共48张牌
    }
}

2. 洗牌

接下来,我们需要将这幅牌洗混。在Java中,我们可以使用 Collections.shuffle() 方法来打乱 List 中的元素。

Collections.shuffle(deck); // 洗牌

3. 发牌

现在,我们已经创建好了一副洗过的牌。接下来,我们需要将这副牌分发给多个玩家。假设有三个玩家,每人分到16张牌。我们可以使用一个二维数组 hands 来表示每个玩家手中的牌。

int numPlayers = 3; // 玩家数量
int numCards = 16; // 每人16张牌
ArrayList<String>[] hands = new ArrayList[numPlayers]; // 创建一个二维数组来保存每个玩家手中的牌
for (int i = 0; i < numPlayers; i++) {
    hands[i] = new ArrayList<>();
}
for (int i = 0; i < numPlayers * numCards; i++) {
    String card = deck.get(i);
    int playerIndex = i % numPlayers;
    hands[playerIndex].add(card); // 将每张牌依次分配给不同的玩家
}

4. 对牌进行排序

最后,我们需要对每个玩家手中的牌进行排序。在这个示例中,我们将使用一个自定义的比较器来对牌进行排序。我们还编写了一个转换函数 convertDeck() 来将牌面中的字母(例如 A、J、Q 和 K)转换为数字(例如 1、11、12 和 13)。

Comparator<String> cmp = (s1, s2) -> {
    String substring = s1.substring(1, 2);
    String substring1 = s2.substring(1, 2);
    substring=convertDeck(substring);
    substring1=convertDeck(substring1);
    return Integer.parseInt(substring) - Integer.parseInt(substring1);
}; // 创建一个自定义的比较器,用于对牌进行排序
for (int i = 0; i < numPlayers; i++) {
    ArrayList<String> hand = hands[i];
    Collections.sort(hand, cmp); // 对每个玩家手中的牌进行排序
}

最后,在控制台上打印出每个玩家手中的牌。

for (int i = 0; i < numPlayers; i++) {
    System.out.println("游戏者 " + (i + 1) + "手里的牌:");
    System.out.println(hands[i]); // 打印

的完整代码如下所示:

package org.codertao;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

/**
 * @BelongsProject: MyNotes
 * @BelongsPackage: org.codertao
 * @Author: bainianshushu
 * @CreateTime: 2023-05-03  08:19
 * @Description: 发牌
 * @Version: 1.0
 */
public class DealCards {


    public static void main(String[] args) {
        // 创建一副牌,去除大小王、三个2和一个A,共48张牌
        String[] suits = {"♠", "♥", "♣", "♦"};
        String[] ranks = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
        ArrayList<String> deck = new ArrayList<String>();
        for (String suit : suits) {
            for (String rank : ranks) {
                String card = suit + rank;
                if (!"♠2".equals(card) && !"♥2".equals(card) && !"♦2".equals(card) && !"♠A".equals(card)) {
                    deck.add(card);
                }
            }
        }

        // 洗牌
        Collections.shuffle(deck);

        // 发牌
        int numPlayers = 3;
        int numCards = 16;

        // 发牌
        ArrayList<String>[] hands = new ArrayList[numPlayers];
        for (int i = 0; i < numPlayers; i++) {
            hands[i] = new ArrayList<>();
        }
        for (int i = 0; i < numPlayers * numCards; i++) {
            String card = deck.get(i);
            int playerIndex = i % numPlayers;
            hands[playerIndex].add(card);
        }

        Comparator<String> cmp = (s1, s2) -> {
            String substring = s1.substring(1, 2);
            String substring1 = s2.substring(1, 2);
            substring=convertDeck(substring);
            substring1=convertDeck(substring1);
            return Integer.parseInt(substring) - Integer.parseInt(substring1);
        };
        // 遍历每个人手里拿到的牌
        for (int i = 0; i < numPlayers; i++) {

            System.out.println("游戏者 " + (i + 1) + "手里的牌:");
            System.out.println(hands[i]);

            ArrayList<String> hand = hands[i];
            // 对手牌排序
            Collections.sort(hand, cmp);
            for (String card : hands[i]) {
                System.out.println(card);
            }
        }
    }

    /**
     * 转换牌面
     * @param substring 牌面
     * @return 转换后的牌面
     */
    public static String convertDeck(String substring){
        switch (substring) {
            case "1":
                substring = "10";
                break;
            case "A":
                substring = "1";
                break;
            case "J":
                substring = "11";
                break;
            case "Q":
                substring = "12";
                break;
            case "K":
                substring = "13";
                break;
            default:
                break;
        };
        return substring;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值