21点游戏,而循环无法使用Java进行预期工作

问题描述 投票:-1回答:1

我正在尝试使用一个项目的以下规则来实现二十一点游戏:

游戏进行如下:向玩家发两张牌,正面朝上。如果总分正好是21,则玩家立即获胜。如果总数不为21,则发给发牌者两张牌,一张朝上,一张朝下。然后,玩家确定是要向发牌人索要另一张牌(称为“命中”)还是用其当前手“停留”。玩家可能会要求几次“击中”。当玩家决定“留下”时,发牌人便开始游戏。如果发牌者有21,则立即赢得比赛。否则,发牌人必须进行“击中”,直到手中的总分达到17点或以上,此时发牌人必须“停留”。如果发牌者在进行“击中”时超过21分,则游戏结束并且玩家获胜。 。如果庄家的积分总计为21,则庄家立即获胜。庄家和玩家玩完手后,总分最高的是获胜者。重复游戏直到玩家决定退出或用完钱下注。

我有一个西服枚举,等级枚举,卡片类别,甲板类别和主要类别。

排名枚举

public enum Rank
{
    Ace,
    Two,
    Three,
    Four,
    Five,
    Six,
    Seven,
    Eight,
    Nine,
    Ten,
    Jack,
    Queen,
    King
}

Suit枚举

public enum Suit
{
    Spade,
    Heart,
    Club,
    Diamond
}

卡类:

public class Card
{
    private Suit suit;
    private Rank rank;

    Card()
    {
        suit = null;
        rank = null;
    }
        Card(Suit newSuit, Rank newRank)
        {
            suit = newSuit;
            rank = newRank;
        }
        public String toString()
        {
            return(suit + "||" + rank);
        }
        public Rank getRank()
        {
            return rank;
        }
}

甲板类:

import java.util.ArrayList;
import java.util.Random;

class Deck
{
    protected ArrayList<Card> deck;

    Deck()
    {
        deck = new ArrayList<Card>();
    }

    public void setCardDeck()
    {
        for(Suit newSuit : Suit.values())
        {
            for(Rank newRank: Rank.values())
            {
                deck.add(new Card(newSuit, newRank));
            }
        }
    }

    public void shuffle()
    {
        ArrayList<Card>shuffleDeck = new ArrayList<Card>();
        int shuffleNum = 0;
        int deckSize = deck.size();


        for(int i = 0; i < deckSize; i++)
        {
            shuffleNum = (int)(Math.random() * deck.size());
            shuffleDeck.add(deck.get(shuffleNum));
            deck.remove(shuffleNum);
        }
        deck = shuffleDeck;
    }

    public String toString()
    {
        String cardDisplay = "";

        for(Card newCard : deck)
        {
            cardDisplay += "\n" + newCard.toString();
        }
        return cardDisplay;
    }

    public void removeCard(int aCard)
    {
        deck.remove(aCard);
    }
    public Card dealCard(int aCard)
    {
        return deck.get(aCard);
    }
    public void restoreCard(Card restoreCard)
    {
        deck.add(restoreCard);
    }
    public void draw(Deck cardSource)
    {
        deck.add(cardSource.dealCard(0));
        cardSource.removeCard(0);
    }

    public int deckSize()
    {
        return deck.size();
    }

    public void resetDeck(Deck reset)
    {
        int newDeckSize = deck.size();

        //put cards into the reset deck
        for(int i = 0; i < newDeckSize; i++)
        {
            reset.restoreCard(dealCard(i));
        }
        for(int i = 0; i < newDeckSize; i++)
        {
            removeCard(0);
        }
    }


    public int cardRank()
    {
    int handPoint = 0;
    int ace = 0;

    for(Card newCard : deck)
    {
        switch(newCard.getRank())
        {
            case Ace:
                ace += 1;
                break;
            case Two:
                handPoint += 2;
                break;
            case Three:
                handPoint += 3;
                break;
            case Four:
                handPoint += 4;
                break;
            case Five:
                handPoint += 5;
                break;
            case Six:
                handPoint += 6;
                break;
            case Seven:
                handPoint += 7;
                break;
            case Eight:
                handPoint += 8;
                break;
            case Nine:
                handPoint += 9;
                break;
            case Ten:
            case Jack:
            case Queen:
            case King:
                handPoint += 10;
                break;
        }
    }
    //For loop to locate the aces in hand
    for(int i = 0; i < ace; i++)
    {
        if(handPoint > 10)
        {
            handPoint += 1;
        }
        else if(handPoint <= 10)
        {
            handPoint += 11;
        }
    }
    return handPoint;
    }
}

主类:

import java.util.*;

public class BlackjackGameSimulator
{             
    private static Scanner sc = new Scanner(System.in);
    private static double gameMoney = 500;
    private static double bet;
    private static boolean endGame = false;
    private static String playOrNot;

    public static void main(String[] args)
    {
        Deck newDeck = new Deck();
        Deck player = new Deck();
        Deck dealer = new Deck();

        newDeck.setCardDeck();
        newDeck.shuffle();

        while(gameMoney > 0)
        {       
            System.out.println("Would you like to play Blackjack?");
            playOrNot = sc.nextLine();

            if(playOrNot.equalsIgnoreCase("no"))
            {
                System.out.println("Bye! See you next time.");
                break;
            }

            if(playOrNot.equalsIgnoreCase("yes"))
            {
                System.out.println("You have $" + gameMoney + ". How much are you placing your bet?");
                bet = sc.nextDouble();
                sc.nextLine();


                while(bet < 0 || bet > gameMoney)
                {
                    if(bet < 0 || bet > gameMoney)
                    {
                        System.out.println("Invalid input. Please place your bet between $0 and " + "$" + gameMoney + ".");
                        break;
                    }
                }
            } 
                //Player gets 2 cards in the first round
                player.draw(newDeck);
                player.draw(newDeck);           

                dealer.draw(newDeck);
                dealer.draw(newDeck);

            while(true)
            {
                System.out.println("Your hand: " + player.toString() + "\n");
                System.out.println("Your total points are " + player.cardRank());
                System.out.println();

                if(player.cardRank() == 21 && endGame == false)
                {
                    winner(player, dealer);
                    resetRound(newDeck, player, dealer);
                    continue;
                }
                else
                {
                    //Dealer draws the first card in the current deck
                    System.out.println("Dealer hand: " + dealer.dealCard(0).toString() + " and ????");

                    System.out.println("Would you like to hit or stand?");
                    String reaction = sc.nextLine();

                    if(reaction.equalsIgnoreCase("hit"))
                    {
                        player.draw(newDeck);
                        System.out.println("You draw " + player.dealCard(player.deckSize() - 1).toString());

                        if(player.cardRank() < 21)
                        {
                            break;
                        }
                        if(player.cardRank() > 21)
                        {
                            loser(player, dealer);
                            resetRound(newDeck, player, dealer);
                            break;
                        }
                    }
                    if(reaction.equalsIgnoreCase("stand"))
                    {
                        break;
                    }
                }
                System.out.println("Dealer hand: " + dealer.toString());

                if((dealer.cardRank() > player.cardRank()) && endGame == false)
                {
                    loser(player, dealer);
                    resetRound(newDeck, player, dealer);
                    continue;
                }

                while((dealer.cardRank() < 17) && endGame == false)
                {
                    dealer.draw(newDeck);
                    System.out.println("Dealer draws" + dealer.dealCard(dealer.deckSize() - 1).toString());
                }
                System.out.println("Dealer's current points are " + dealer.cardRank());

                if((dealer.cardRank() > 21) && endGame == false)
                {
                    winner(player, dealer);
                    resetRound(newDeck, player, dealer);
                    continue;
                }

                if((player.cardRank() == dealer.cardRank()) && endGame == false)
                {
                    tie(player, dealer);
                    resetRound(newDeck, player, dealer);
                    continue;
                }

                if((player.cardRank() > dealer.cardRank()) && endGame == false)
                {
                    winner(player, dealer);
                    resetRound(newDeck, player, dealer);
                    continue;
                }

                if((player.cardRank() < dealer.cardRank()) && endGame == false)
                {
                    loser(player, dealer);
                    resetRound(newDeck, player, dealer);
                    continue;
                }

                //Return player's and dealer's cards to the deck
                player.resetDeck(newDeck);
                dealer.resetDeck(newDeck);

            }
        }
    }

    private static void winner(Deck player, Deck dealer)
    {
        System.out.println("You win! You current points are " + player.cardRank() + ". Dealer current points are " + dealer.cardRank());
        gameMoney += bet;
        endGame = true;

    }
    private static void loser(Deck player, Deck dealer)
    {
        System.out.println("You lose! You current points are " + player.cardRank() + ". Dealer current points are " + dealer.cardRank());
        gameMoney -= bet;
        endGame = true;
    }
    private static void tie(Deck player, Deck dealer)
    {
        System.out.println("Push! It's a tie. You current points are " + player.cardRank() + ". Dealer current points are " + dealer.cardRank());
        gameMoney -= bet;
        endGame = true;
    }
    private static void resetRound(Deck newDeck, Deck player, Deck dealer)
    {
        player.resetDeck(newDeck);
        dealer.resetDeck(newDeck);
    }
}

我现在很难完成正确的循环。例如,如果我打了,它只会发牌,但不会显示积分,并根据情况结束或继续游戏;如果我站着,它会得分并提示我是否要玩游戏。

任何帮助将不胜感激。我非常困扰这个问题。提前非常感谢!

java
1个回答
0
投票

基本上,您的问题是错误地使用了continue vs. break指令。

break每次结束时都需要使用,因为它将使执行流返回到外部while循环,重置手并进行新的下注。

[继续在用户玩耍时需要使用以保持手在循环中。

而且我不确定为什么您添加了“ endGame”条件,但是它对您的执行流程造成了破坏性影响,因此我将其完全删除。确实,您的最终比赛条件是玩家赚了钱或他通过回答no来终止。

这里是您的主体的修订版。我对其进行了简短的测试,因此可能存在其他缺陷。

public class BlackjackGameSimulator {

private static Scanner sc = new Scanner(System.in);
private static double gameMoney = 500;
private static double bet;
private static String playOrNot;

public static void main(String[] args)
{
    Deck newDeck = new Deck();
    Deck player = new Deck();
    Deck dealer = new Deck();

    newDeck.setCardDeck();
    newDeck.shuffle();

    while(gameMoney > 0)
    {       
        System.out.println("Would you like to play Blackjack?");
        playOrNot = sc.nextLine();

        if(playOrNot.equalsIgnoreCase("no"))
        {
            System.out.println("Bye! See you next time.");
            break;
        }

        if(playOrNot.equalsIgnoreCase("yes"))
        {
            System.out.println("You have $" + gameMoney + ". How much are you placing your bet?");
            bet = sc.nextDouble();
            sc.nextLine();


            while(bet < 0 || bet > gameMoney)
            {
                System.out.println("Invalid input. Please place your bet between $0 and " + "$" + gameMoney + ".");
                bet = sc.nextDouble();
                sc.nextLine();
            }
        } 

        //Player gets 2 cards in the first round
        player.draw(newDeck);
        player.draw(newDeck);           

        dealer.draw(newDeck);
        dealer.draw(newDeck);

        while(true)
        {
            System.out.println("Your hand: " + player.toString() + "\n");
            System.out.println("Your total points are " + player.cardRank());
            System.out.println();

            if(player.cardRank() == 21)
            {
                winner(player, dealer);
                resetRound(newDeck, player, dealer);
                break;
            }
            else
            {
                //Dealer draws the first card in the current deck
                System.out.println("Dealer hand: " + dealer.dealCard(0).toString() + " and ????");

                System.out.println("Would you like to hit or stand?");
                String reaction = sc.nextLine();

                if(reaction.equalsIgnoreCase("hit"))
                {
                    player.draw(newDeck);
                    System.out.println("You draw " + player.dealCard(player.deckSize() - 1).toString());

                    if(player.cardRank() < 21)
                    {
                        continue;
                    }
                    if(player.cardRank() > 21)
                    {
                        loser(player, dealer);
                        resetRound(newDeck, player, dealer);
                        break;
                    }
                }
            }
            System.out.println("Dealer hand: " + dealer.toString());

            if((dealer.cardRank() > player.cardRank()))
            {
                loser(player, dealer);
                resetRound(newDeck, player, dealer);
                break;
            }

            while((dealer.cardRank() < 17))
            {
                dealer.draw(newDeck);
                System.out.println("Dealer draws " + dealer.dealCard(dealer.deckSize() - 1).toString());
            }
            System.out.println("Dealer's current points are " + dealer.cardRank());

            if((dealer.cardRank() > 21))
            {
                winner(player, dealer);
                resetRound(newDeck, player, dealer);
                break;
            }

            if((player.cardRank() == dealer.cardRank()))
            {
                tie(player, dealer);
                resetRound(newDeck, player, dealer);
                break;
            }

            if((player.cardRank() > dealer.cardRank()))
            {
                winner(player, dealer);
                resetRound(newDeck, player, dealer);
                break;
            }

            if((player.cardRank() < dealer.cardRank()))
            {
                loser(player, dealer);
                resetRound(newDeck, player, dealer);
                break;
            }

            //Return player's and dealer's cards to the deck
            player.resetDeck(newDeck);
            dealer.resetDeck(newDeck);

        }
    }
}

private static void winner(Deck player, Deck dealer)
{
    System.out.println("You win! You current points are " + player.cardRank() + ". Dealer current points are " + dealer.cardRank());
    gameMoney += bet;

}
private static void loser(Deck player, Deck dealer)
{
    System.out.println("You lose! You current points are " + player.cardRank() + ". Dealer current points are " + dealer.cardRank());
    gameMoney -= bet;
}
private static void tie(Deck player, Deck dealer)
{
    System.out.println("Push! It's a tie. You current points are " + player.cardRank() + ". Dealer current points are " + dealer.cardRank());
    gameMoney -= bet;
}
private static void resetRound(Deck newDeck, Deck player, Deck dealer)
{
    player.resetDeck(newDeck);
    dealer.resetDeck(newDeck);
}

}

希望这会有所帮助!

欢呼声

© www.soinside.com 2019 - 2024. All rights reserved.