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

如何实现根据用户输入决定卡牌发牌数量?(附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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 14:03:12