java - 二十一点游戏,需要造型帮助

标签 java class bluej blackjack

简介

嘿伙计们!我是一位老程序员,大约三年没有编程了,刚刚在大学开始学习Java(类(class)已经上两年了)几周了。)

我制作了一个二十一点程序,我想知道是否有任何方法可以减少二十一点类中的代码,不确定是否只有我这样,但似乎又长又凌乱。我的编程相当草率,在需要时输入值并进行修改。我希望我能得到您的建议改变,这样我就可以在我的项目和 future 在学校的学习中使用它们:)

注意:这也是一次重击,而不是轻击,因此玩家的机会略少。

谢谢!

运行类

import java.util.Scanner;

public class Run
{
    // instance variables - replace the example below with your own
    public static void main (String[] args)
    {         
        try
        {
            Blackjack.blackjack();
        } catch(Exception e) {}
    }

}

二十一点级

import java.util.Scanner;
import java.util.Objects;

public class Blackjack
{
    public static void blackjack () throws InterruptedException
    {
        // TO SLEEP
        // Thread.sleep(x);
        // Total seconds to sleep = x/1000
        ///////////////////////////////


        // Variables
        String[] deck = Deck.generateDeck();
        String[] player = new String[6];
        String[] dealer = new String[6];
        int money = 0, bet = 0, deckNumber = 0, handNumber = 0, stay = 0, cardTotal = 0, i = 0, totalValue = 0, totalValueAce = 0;
        boolean win = false, lose = false, quit = false, play = false, betTrue = false, blackJack = false;
        String enter = "";

        // Scanner
        Scanner input = new Scanner(System.in);

        System.out.println("///// Blackjack //////");
        System.out.print("Enter starting money: $");
        money = input.nextInt();
        System.out.println("//////////////////////\n");
        System.out.println("Current cash amount: $" + money);
        while (quit == false)
        {
            while (quit == false && play == false)
            {
                System.out.print("Would you like to play? (yes/no): ");
                player[0] = input.next();
                if (Objects.equals(player[0], "yes"))
                {
                    play = true;
                    System.out.print("\n");
                }
                else if (Objects.equals(player[0], "no"))
                {
                    quit = true;
                }
                else
                {
                    System.out.println("Error enter either yes/no!");
                }
            }

            while (betTrue == false && quit == false)
            {
                System.out.print("Enter bet amount: $");
                bet = input.nextInt();
                if (bet > money)
                {
                    System.out.println("Error, you entered more money than you had!\n");
                }
                else if (bet < 0)
                {
                    System.out.println("You can't bet negative dollars silly!\n");
                }
                else
                {
                    betTrue = true;
                }
                System.out.println("Good luck!\n");
            }

            betTrue = false;
            // Deal format:
            // Deck.deal(cardPlace to deal, player cardHand#, certain deck, player name);
            //
            // Randomize Cards in Deck
            Deck.totalRandom(deck,1000);

            Deck.deal(0,0,deck,player);
            Deck.deal(1,1,deck,player);
            Deck.deal(2,0,deck,dealer);
            Deck.deal(3,1,deck,dealer);

            // Total cards in player hand, used in loop
            cardTotal = 2;

            // Next hand number, used in equation
            handNumber = 2;

            // Tells to deal the fourth card of deck next
            deckNumber = 4;

            // Player Turn Loop
            while (stay == 0 && lose == false && win == false && quit == false) 
            {
                System.out.print("You've gotten the cards: ");
                i = (cardTotal - 1);
                while (i > -1)
                {
                    System.out.print(player[i]);
                    if (i > 1)
                    {
                        System.out.print(", ");
                    }
                    else if (i > 0)
                    {
                        if (handNumber > 3)
                        {
                            System.out.println(",");
                        }
                        System.out.print(" and ");
                    }
                    else
                    {
                        System.out.println(".");
                    }
                    --i;
                }
                if (((Deck.checkValue(player[0]) == -1)) && ((Deck.checkValue(player[1])) == 10) || ((Deck.checkValue(player[1]) == -1)) && ((Deck.checkValue(player[0])) == 10))
                {
                    win = true;
                    blackJack = true;
                }
                else
                {
                    i = cardTotal;
                    totalValue = 0;
                    totalValueAce = 0;
                    while (i>0)
                    {
                        --i;
                        if (Deck.checkValue(player[i]) == -1)
                        {
                            totalValueAce = totalValue + 1;
                            totalValue += 11;
                        }
                        else
                        {
                            totalValue+=Deck.checkValue(player[i]);
                            if (totalValueAce != 0)
                            {
                                totalValueAce+=Deck.checkValue(player[i]);
                            }
                        }

                    }
                    if (totalValue == 21 || totalValueAce == 21)
                    {
                    }
                    else if (totalValueAce == 0 && totalValue > 21)
                    {
                        lose = true;
                    }
                    else if (totalValueAce > 21)
                    {
                        lose = true;
                    }
                    else if (handNumber == 5)
                    {
                        lose = true;
                    }
                }
                if (totalValue > 21 && totalValueAce != 0)
                {
                    totalValue = totalValueAce;
                    totalValueAce = 0;
                }
                if (totalValueAce == 0)
                {
                    System.out.println("You have the total value: " + totalValue);
                }
                else
                {
                    System.out.println("You have total value of either " + totalValue + " or " + totalValueAce);
                }
                if (lose == false && win == false)
                {
                    System.out.println("\nDealer has face up card: " + dealer[0]);
                    System.out.println("Would you like to hit or stay?");
                    enter = input.next();
                    System.out.println("");
                    if (Objects.equals(enter, "hit"))
                    {
                        Deck.deal(deckNumber,handNumber,deck,player);
                        ++deckNumber;
                        ++handNumber;
                        ++cardTotal;
                    }
                    else if (Objects.equals(enter, "stay"))
                    {
                        stay = 1;
                    }
                    else
                    {
                        System.out.println("Invalid value!\n");
                    }
                }
            }

            stay = 0;
            cardTotal = 2;
            handNumber = 2;
            int totalValueDealer = 0;
            int totalValueDealerAce = 0;

            // Dealer Turn Loop
            while (stay == 0 && lose == false && win == false && quit == false && (totalValueDealer < totalValue || 
            totalValueDealerAce < totalValueAce || totalValueDealer < totalValueAce || totalValueDealerAce < totalValue)) 
            {
                System.out.print("Dealer has the cards: ");
                i = (cardTotal - 1);
                while (i > -1)
                {
                    System.out.print(dealer[i]);
                    if (i > 1)
                    {
                        System.out.print(", ");
                    }
                    else if (i > 0)
                    {
                        if (handNumber == 3)
                        {
                            System.out.print(",");
                        }
                        else if (handNumber > 3)
                        {
                            System.out.println(",");
                        }
                        System.out.print(" and ");
                    }
                    else
                    {
                        System.out.println(".");
                    }
                    --i;
                }

                if (((Deck.checkValue(dealer[0]) == -1)) && ((Deck.checkValue(dealer[1])) == 10))
                {
                    System.out.println("You lose");
                }
                else
                {
                    totalValueDealer = 0;
                    totalValueDealerAce = 0;
                    i = cardTotal;
                    while (i>0)
                    {
                        --i;
                        if (Deck.checkValue(dealer[i]) == -1)
                        {
                            totalValueDealerAce = totalValueDealer + 1;
                            totalValueDealer += 11;
                        }
                        else
                        {
                            totalValueDealer+=Deck.checkValue(dealer[i]);
                            if (totalValueDealerAce != 0)
                            {
                                totalValueDealerAce+=Deck.checkValue(dealer[i]);
                            }
                        }
                    }
                    if (totalValueDealer > 21 && totalValueAce != 0)
                    {
                    totalValueDealer = totalValueDealerAce;
                    totalValueDealerAce = 0;
                    }
                    if (totalValueDealer == 21 || totalValueDealerAce == 21)
                    {
                    }
                    else if (totalValueDealerAce == 0 && totalValueDealer > 21)
                    {
                        win = true;
                    }
                    else if (totalValueDealerAce > 21)
                    {
                        win = true;
                    }
                    else if (handNumber == 5)
                    {
                        lose = true;
                    }
                }
                if (totalValueDealerAce == 0)
                {
                    System.out.println("Dealer has the total value: " + totalValueDealer);
                }
                else
                {
                    System.out.println("Dealer has total value of either " + totalValueDealer + " or " + totalValueDealerAce);
                }
                System.out.println("");
                Thread.sleep(3000);
                if (totalValueDealer < 17 || (totalValueDealerAce != 0 && totalValueDealerAce < 17))
                {
                    Deck.deal(deckNumber,handNumber,deck,dealer);
                    ++deckNumber;
                    ++handNumber;
                    ++cardTotal;
                }
                else
                {
                    stay = 1;
                }
            }
            if (play == true)
            {
                if (win == true && lose == false)
                {
                    System.out.println("You win!\n");
                    if (blackJack == true)
                    {
                        System.out.println("BLACK JACK!!! Amount won: " + (bet * 1.5));
                        money += (bet * 1.5);
                    }
                    else
                    {
                        money += bet;
                    }
                }
                else if ((totalValueDealer == totalValue && totalValue > totalValueDealerAce || totalValueDealer == totalValueAce && totalValueAce != 0))
                {
                    System.out.println("It's a tie!\n");
                }
                else if ((totalValueDealer > totalValue && totalValueDealer > totalValueAce && totalValueDealer < 22) || (totalValueDealerAce > totalValue && totalValueDealerAce > totalValueAce) || lose == true)
                {
                    System.out.println("You lose!\n");
                    money -= bet;
                }
                else
                {
                    System.out.println("You win!\n");
                    if (blackJack == true)
                    {
                        System.out.println("BLACK JACK!!! Amount won: " + (bet * 1.5));
                        money += (bet * 1.5);
                    }
                    else
                    {
                        money += bet;
                    }
                }
                blackJack = false;
                play = false;
                lose = false;
                win = false;
                stay = 0;
                if (money < 1)
                {
                    quit = true;
                    System.out.println("You've lost all your money!");
                }
                else
                {
                    System.out.println("Current cash amount: $" + money);
                }
            }
            /* Print Deck
            for (int i=0;i<52;i++)
            {
                System.out.println(deck[i]);
            }
            */
        }
    }
}

套牌等级

(不变,但如果您需要功能,请在此处检查)

import java.util.Random;
import java.util.Objects;

public class Deck
{

    // Generate Deck
    // Description: Used to generate an array with a length of 52 that holds each card of a deck of cards.
    // Tip: To use in program, set a string array equal to this method.
    public static String[] generateDeck()
    {
        // Variables
        int i = 0;

        // Initialize deck
        String[] deck = new String[52];
        deck[0] = "Ace of spades";
        for (i=1; i<12; i++)
        {
            deck[i] = Integer.toString(i + 1) + " of spades";
        }
        deck[10] = "Jack of spades";
        deck[11] = "Queen of spades";
        deck[12] = "King of spades";
        deck[13] = "Ace of hearts";
        for (i=1; i<12; i++)
        {
            deck[(i + 13)] = Integer.toString(i + 1) + " of hearts";
        }
        deck [23] = "Jack of hearts";
        deck [24] = "Queen of hearts";
        deck [25] = "King of hearts";
        deck [26] = "Ace of clubs";
        for (i=1; i<12; i++)
        {
            deck[(i + 26)] = Integer.toString(i + 1) + " of clubs";
        }
        deck [36] = "Jack of clubs";
        deck [37] = "Queen of clubs";
        deck [38] = "King of clubs";
        deck [39] = "Ace of diamonds";
        for (i=1; i<12; i++)
        {
            deck[(i + 39)] = Integer.toString(i + 1) + " of diamonds";
        }
        deck [49] = "Jack of diamonds";
        deck [50] = "Queen of diamonds";
        deck [51] = "King of diamonds";

        return deck;
    }

    // Shuffle one card of the deck with another
    // Description: Not much use, but it helps to see how one might swap two random cards with each other.
    public static void oneCardShuffle(String[] deck)
    {
        Random randomGenerator = new Random();

        // Generates number from 0 to 51
        int cardFirst = randomGenerator.nextInt(52);
        int cardSecond = randomGenerator.nextInt(52);

        // Swap
        String card = deck[cardSecond];
        deck[cardSecond] = deck[cardFirst];
        deck[cardFirst] = card;

    }

    // The standard riffle shuffle
    // Description: It cuts the deck into two pieces and lays on card on top of other.
    // Tip: To use in program, simply call the method with the deck you generated earlier.
    // WARNING: If you riffleShuffle enough, it will go back to the order it started out in. To fix, use the "totalRandom" method.
    public static void riffleShuffle(String[] deck)
    {
        String[] cutOne = new String[26];
        String[] cutTwo = new String[26];
        for (int i=0;i<26;i++)
        {
            cutOne[i] = deck[i];
        }
        for (int i=0;i<26;i++)
        {
            cutTwo[i] = deck[i+26];
        }
        for (int i=0;i<26;i++)
        {
            deck[2*i] = cutOne[i];
            deck[2*i + 1] = cutTwo[i];
        }

    }

    // Shuffle from top to bottom
    // Description: Takes the top card of deck and bottom card and swaps them, moving down to the center of the deck.
    public static void topBottomShuffle(String[] deck)
    {
        for (int i=0;i<26;i+=1)
        {
            String card = deck[51 - i];
            deck [51 - i] = deck[i];
            deck [i] = card;
        }
    }

    // Cut
    // Description: Cuts the deck through the middle
    // Tip: Just use if there is a specific need for you to cut your deck, otherwise pointless.
    public static void cut(String[] deck)
    {
       String[] cut = new String[26];

       for (int i=0;i<26;i++)
        {
            cut[i] = deck[i];
        }
        for (int i=0;i<26;i++)
        {
            deck[i] = deck[i+26];
        }
        for (int i=1;i<27;i++)
        {
            deck[i+25] = cut[i - 1];
        }
    }

    // Random Shuffle
    // Description: Like the oneCardShuffle except repeated a certain number of times
    // Tip: Use this method to shuffle, may not be the fastest (not noticeable however), but it makes your deck totally randomized.
    public static void totalRandom(String[] deck, int times)
    {
        // Random Initialize
        Random randomGenerator = new Random();

        // Variables
        int cardFirst = 0;
        int cardSecond = 0;

        // Swap
        for (int i=0;i<times;i++)
        {
            // Generates number from 0 to 51
            cardFirst = randomGenerator.nextInt(52);
            cardSecond = randomGenerator.nextInt(52);
            String card = deck[cardSecond];
            deck[cardSecond] = deck[cardFirst];
            deck[cardFirst] = card;
        }
    }

    // Deal
    // Description: Function which deals a certain object which is holding cards a card out of the deck.
    public static void deal(int cardPlace, int handNumber, String[] deck, String[] holder)
    {
        holder[handNumber] = deck[cardPlace];
    }

    // Check Value of Card
    // Description: This checks the value of the card, and turns it from a string into an integer. Aces come back as -1, so if you need to you can read as 1 or 11.
    // Every other card will either be the number or if it is a face card, 10.
    // Tip: Use if you need to value cards and have a face card or ace equal 1 || 10 || 11.
    public static int checkValue(String card)
    {
        String[] name = card.split(" ");
        if (Objects.equals(name[0], "Jack") || (Objects.equals(name[0], "Queen")) 
        || (Objects.equals(name[0], "King")))
        {
            return 10;
        }
        else if (Objects.equals(name[0], "Ace"))
        {
            return -1;
        }
        else
        {
            return Integer.parseInt(name[0]);
        }
    }

    // Check the value order
    // Description: Used to check the order in which cards should lay if they are one after another
    public static int checkValueOrder(String card)
    {        
        String[] name = card.split(" ");
        switch(name[0])
        {
            case "Jack":
            return 11;
            case "Queen":
            return 12;
            case "King":
            return 13;
            case "Ace":
            return 1;
            default:
            return Integer.parseInt(name[0]);
        }
    }

    // Check Suit of Card
    // Description: This checks the suit of a cartain card in your deck, or in other words it cuts off the first part of the card, and only returns the suit.
    // Tip: Use if you need to check for card combinations which require same suit.
    public static String checkSuit(String card)
    {
        String[] name = card.split(" ");
        return name[2];
    }

    // Sorts cards from smallest to greatest
    // Description: Use if you need to know the NUMBERED order of cards.
    // Tip: Can be used with any size string of cards.
    public static void sortCards (String[] card)
    {
        String sortingCard = "";
        int sortingCount = 0;
        int cardsTotal = card.length;
        do
        {
            sortingCount = 0;
            for (int i = 0; i<cardsTotal-1; i++)
            {
                if (checkValueOrder(card[i]) > checkValueOrder(card[i+1]))
                {
                    sortingCard = card[i+1];
                    card[i+1] = card[i];
                    card[i] = sortingCard;
                }
                else
                {
                    ++sortingCount;
                }
            }
        } while (sortingCount != cardsTotal-1);
    }
}

最佳答案

下面是我所做的一些观察,这也将增强您使用许多内置 java API 的能力

  • 很多地方您都使用了字符串数组,而您本可以使用集合 API。
  • 有很多 if else 条件可以用三元运算符代替。
  • 可以使用内置函数(如 Arrays.sort() 、 collections.sort() 等)完成排序。
  • 可以在类中编写更多函数,而不是使用单个函数。
  • 除非必要,否则避免使用 String,而是使用 Stringbuilder 或 StringBuffer。

关于java - 二十一点游戏,需要造型帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33050819/

相关文章:

java - 不带重音的搜索必须返回带重音的单词

java - 为什么 SBT 检测不到 Java 中的主类? (未检测到主类)

C++ - 未定义类型的无效使用... - `class 的声明

Java - 具有父类(super class)的打印格式

java - 使用扫描仪读取

java - 如何使用 SAX 解析器从大 XML 文件中获取嵌入/嵌套 XML

java - StackTrace 中的 "Number of locked synchronizers = 1"是什么意思?

java - 从脚本文件调用 jar 文件内的函数

c# - 返回接口(interface)类型列表

java - BlueJ 导入自定义类库