You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

21点程序开发疑问:Hit()方法实现及独立手牌创建求助

解决21点游戏的Hit功能与独立手牌问题

嘿,作为编程新手能写到这一步已经超棒了!咱们一步步拆解你遇到的两个问题:创建独立手牌和实现Hit加牌功能。

第一步:创建独立手牌

你已经有了CardSet类来存储卡牌的ArrayList,那每个玩家(你和电脑庄家)只需要各自拥有一个独立的CardSet实例就行啦。这样两个手牌完全分开,不会互相干扰。

比如在你的GameOf21类里,可以这样定义:

public class GameOf21 {
    public static void main(String[] args) {
        // 初始化一副牌
        Deck deck = new Deck();
        deck.generate52Cards(); // 假设你的Deck类有这个生成52张牌的方法

        // 创建玩家和庄家的独立手牌
        CardSet playerHand = new CardSet();
        CardSet dealerHand = new CardSet();

        // 初始发两张牌
        dealInitialCards(deck, playerHand, dealerHand);
        // ...后续游戏逻辑
    }

    // 辅助方法:发初始两张牌
    private static void dealInitialCards(Deck deck, CardSet playerHand, CardSet dealerHand) {
        // 给玩家发两张
        playerHand.addCard(deck.drawCard());
        playerHand.addCard(deck.drawCard());
        // 给庄家发两张
        dealerHand.addCard(deck.drawCard());
        dealerHand.addCard(deck.drawCard());
    }
}

这里要确保你的CardSet类有一个addCard(Card card)方法,用来把卡牌加入到它的ArrayList里:

public class CardSet {
    private ArrayList<Card> cards;

    public CardSet() {
        cards = new ArrayList<>();
    }

    // 添加卡牌到手牌
    public void addCard(Card card) {
        cards.add(card);
    }

    // 其他你需要的方法,比如获取所有卡牌、计算点数等
    public ArrayList<Card> getCards() {
        return cards;
    }
}

第二步:实现Hit功能

Hit的核心逻辑就是从牌堆里抽一张牌,加到当前玩家的手牌里。所以你需要给Deck类添加一个抽牌的方法,比如drawCard(),用来从牌堆里取出一张牌并返回:

import java.util.Collections;

public class Deck {
    private ArrayList<Card> cards;

    public Deck() {
        cards = new ArrayList<>();
    }

    // 你的生成52张牌的方法
    public void generate52Cards() {
        for (Suits suit : Suits.values()) {
            // 假设卡牌面值:2-10对应数值,J/Q/K=11/12/13,A=14
            for (int value = 2; value <= 14; value++) {
                cards.add(new Card(suit, value));
            }
        }
        // 洗牌(建议加上,让游戏更真实)
        Collections.shuffle(cards);
    }

    // 抽牌方法:从牌堆顶部取一张牌
    public Card drawCard() {
        if (cards.isEmpty()) {
            throw new IllegalStateException("牌堆已经空了!");
        }
        // 移除并返回最后一张(或者第一张,看你定义的牌堆顺序)
        return cards.remove(cards.size() - 1);
    }
}

然后在GameOf21里,处理玩家的Hit选择:

import java.util.Scanner;

public class GameOf21 {
    public static void main(String[] args) {
        // ...前面的初始化代码

        Scanner scanner = new Scanner(System.in);
        boolean playerTurn = true;

        while (playerTurn) {
            // 显示玩家当前手牌和点数
            System.out.println("你的手牌:" + playerHand.getCards());
            int playerValue = calculateHandValue(playerHand);
            System.out.println("当前点数:" + playerValue);

            // 询问是否Hit
            System.out.print("Hit or Stand? (H/S): ");
            String choice = scanner.nextLine().trim().toUpperCase();

            if (choice.equals("H")) {
                // Hit:抽一张牌加到玩家手牌
                Card newCard = deck.drawCard();
                playerHand.addCard(newCard);
                System.out.println("你抽到了:" + newCard);

                // 检查是否爆牌(点数超过21)
                if (calculateHandValue(playerHand) > 21) {
                    System.out.println("你爆牌了!庄家获胜!");
                    playerTurn = false;
                }
            } else if (choice.equals("S")) {
                // Stand:结束玩家回合,进入庄家回合
                playerTurn = false;
                dealerTurn(deck, dealerHand, playerHand);
            } else {
                System.out.println("请输入H或S!");
            }
        }
    }

    // 辅助方法:计算手牌点数(21点规则,A可算1或11)
    private static int calculateHandValue(CardSet hand) {
        int value = 0;
        int aceCount = 0;

        for (Card card : hand.getCards()) {
            int cardValue = card.getValue();
            if (cardValue >= 11 && cardValue <= 13) { // J/Q/K算10
                value += 10;
            } else if (cardValue == 14) { // A先算11
                value += 11;
                aceCount++;
            } else {
                value += cardValue;
            }
        }

        // 如果点数超过21,把A从11改成1
        while (value > 21 && aceCount > 0) {
            value -= 10;
            aceCount--;
        }

        return value;
    }

    // 庄家回合逻辑
    private static void dealerTurn(Deck deck, CardSet dealerHand, CardSet playerHand) {
        while (calculateHandValue(dealerHand) < 17) {
            Card newCard = deck.drawCard();
            dealerHand.addCard(newCard);
            System.out.println("庄家抽到了:" + newCard);
        }

        // 比较点数判断胜负
        int playerValue = calculateHandValue(playerHand);
        int dealerValue = calculateHandValue(dealerHand);

        if (dealerValue > 21) {
            System.out.println("庄家爆牌了!你获胜!");
        } else if (dealerValue > playerValue) {
            System.out.println("庄家点数更高,你输了!");
        } else if (dealerValue < playerValue) {
            System.out.println("你的点数更高,你赢了!");
        } else {
            System.out.println("平局!");
        }
    }
}

关键要点总结

  • 独立手牌:每个玩家(玩家/庄家)对应一个CardSet实例,各自维护自己的卡牌集合,完全独立。
  • Hit功能:通过Deck.drawCard()从牌堆取牌,再调用CardSet.addCard()把牌加入手牌,核心就是这两步。
  • 额外补充:21点需要计算手牌点数,一定要实现点数计算逻辑,尤其是A的特殊处理(1或11)。

内容的提问来源于stack exchange,提问作者semji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:10:39