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
相关产品推荐
相关产品推荐

