如何实现根据用户输入决定卡牌发牌数量?(附Java代码)
卡牌游戏发牌逻辑修改需求
我正在为学校项目制作一款卡牌游戏,玩家需要猜测发牌数量,使卡牌数值总和尽可能接近指定目标数。目前我能基于预设值发牌,但需要修改为根据用户输入的数量发牌。以下是我的Deck类和游戏类代码:
Deck 类代码
import java.util.Random; public class Deck { private static final int NUMCARDS = 52; private final Card[] CARDS = new Card[52]; private int cardIndex; public Deck() { for (int thisCard = 0; thisCard < NUMCARDS; thisCard++) { this.CARDS[thisCard] = new Card(thisCard % 13, thisCard / 13); } this.cardIndex = NUMCARDS - 1; this.shuffle(); } private void shuffle() { int index; Card temp; Random random = new Random(); for (int i = this.CARDS.length - 1; i > 0; i--) { index = random.nextInt(i + 1); temp = this.CARDS[index]; this.CARDS[index] = this.CARDS[i]; this.CARDS[i] = temp; } } public Card deal() { return this.CARDS[this.cardIndex--]; } }
原Game类代码
import java.util.Scanner; public class CardGame { private static final int NUMCARDS =5; private Card[] player1 = new Card[NUMCARDS]; private Card[] player2 = new Card[NUMCARDS]; public CardGame() { Deck deck = new Deck(); for (int i=0; i<NUMCARDS; i++) { this.player1[i] = deck.deal(); this.player2[i] = deck.deal(); } } public static void main(String[] args) { CardGame game = new CardGame(); Scanner player1Name = new Scanner(System.in); System.out.println("Enter player 1 name"); String p1Name = player1Name.nextLine(); System.out.println("Welcome " + p1Name); Scanner cardNum = new Scanner(System.in); System.out.println("How many cards : "); int cardNo = cardNum.nextInt(); cardNum.close(); System.out.println("Target is 51"); System.out.println(""); for (int i = NUMCARDS-1; i>=0; i--) { System.out.println(p1Name + ": " + game.player1[i]); } } }
修改方案及代码
原代码核心问题是提前用固定常量初始化发牌数量,导致无法根据用户输入动态调整。以下是修改后的完整代码:
import java.util.Scanner; public class CardGame { private Card[] player1; private Card[] player2; private final int cardCount; // 构造方法接收用户输入的牌数 public CardGame(int cardCount) { this.cardCount = cardCount; // 动态初始化玩家手牌数组 this.player1 = new Card[cardCount]; this.player2 = new Card[cardCount]; Deck deck = new Deck(); // 根据传入的牌数发牌 for (int i = 0; i < cardCount; i++) { this.player1[i] = deck.deal(); this.player2[i] = deck.deal(); } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 获取玩家1名称 System.out.println("Enter player 1 name"); String p1Name = scanner.nextLine(); System.out.println("Welcome " + p1Name); // 获取用户指定的发牌数量 System.out.println("How many cards : "); int cardNo = scanner.nextInt(); scanner.close(); // 传入牌数创建游戏实例 CardGame game = new CardGame(cardNo); System.out.println("Target is 51"); System.out.println(""); // 根据实际牌数打印玩家手牌 for (int i = game.cardCount - 1; i >= 0; i--) { System.out.println(p1Name + ": " + game.player1[i]); } } }
修改要点说明
- 移除固定的
NUMCARDS常量,改用cardCount成员变量存储用户输入的牌数 - 构造方法新增
cardCount参数,动态初始化玩家手牌数组 - 调整发牌循环,使用
cardCount控制发牌次数 - 合并Scanner实例,避免重复创建资源
- 打印手牌时使用游戏实例的
cardCount,保证和实际发牌数量一致
内容的提问来源于stack exchange,提问作者LordFarquad3199
相关产品推荐
相关产品推荐

