Присвоение значения int строке

avatar
PizzaParrot
8 апреля 2018 в 05:01
1538
3
2

Я разрабатываю программу Блэк Джек. Моя проблема в том, что я использую случай переключения для создания случайной карты. Но когда приходит время сравнивать значения карт... скажем, if(pCard1 + pCard2 > 21), это не позволяет мне сравнивать их, потому что это строки. Однако они должны быть строками, потому что я должен иметь возможность назначать String "Queen", но мне также нужно, чтобы "Queen" имел значение int, равное 10. Я не уверен, как это сделать.

Вот что у меня есть. Я не включаю весь свой код, потому что он состоит из пары сотен строк. Только включая раздел блэкджека.

System.out.println("---------------------Black Jack--------------------------");
    System.out.println("Welcome to BlackJack!");
    System.out.println("Available balance is $"+balance);
    System.out.print("How much would you like to bet on this hand?: ");
    int bet = input.nextInt();
    balance -= bet;
    System.out.println("You just bet $"+bet+"......Dealing cards!");
    System.out.println("----------------------------------------------------------");

    String pCard1 = dealCard();
    String pCard2 = dealCard();

    System.out.println("Your hand is a "+pCard1+" and "+pCard2);
    System.out.print("Would you like to Hit or Stand? :");
    String hOs = input.next();

    if(hOs.equals("Hit")) {
        String pCard3 = dealCard();
        if(pCard1 + pCard2 + pCard3);
    }
    }
}
public static String dealCard() {
    int value = (int)(Math.random() * 13);
    String returnString = "";
    switch ( value ) {
        case 1:   returnString = "Ace"; break;
        case 2:   returnString = "2"; break;
        case 3:   returnString = "3"; break;
        case 4:   returnString = "4"; break;
        case 5:   returnString = "5"; break;
        case 6:   returnString = "6"; break;
        case 7:   returnString = "7"; break;
        case 8:   returnString = "8"; break;
        case 9:   returnString = "9"; break;
        case 10:  returnString = "10"; break;
        case 11:  returnString = "Jack"; break;
        case 12:  returnString = "Queen"; break;
        case 13:  returnString = "King"; break;
    }
    return returnString;
  }
}    
Источник
Tim Biegeleisen
8 апреля 2018 в 05:03
2

Я думаю, что это требует рефакторинга с использованием enum. Но я почти уверен, что для этого вопроса есть дубликат.

Guy
8 апреля 2018 в 05:08
2

Или сделайте класс card со значением int и номиналом String

c0der
8 апреля 2018 в 06:07
0

Не пытайтесь «присвоить значение строке». Вместо этого, как предлагается, создайте структуру данных, которая будет содержать как строку, так и значение, используя enum или card class.

Lee Daniel Crocker
9 апреля 2018 в 16:07
0

Так что не используйте строки. Строки предназначены для людей, а компьютеры используют числа. Эффективно хранить, легко сравнивать и манипулировать. Когда придет время получить ввод от человека или отправить результат человеку, затем вы можете преобразовать в/из текста.

Ответы (3)

avatar
slerfsterdn
8 апреля 2018 в 06:21
3

Я думаю, что перечисления — лучший способ решения подобных проблем.

Если мы определим перечисления для Suit и Pips следующим образом

enum Suit {
    Hearts, Diamonds, Clubs, Spades;
}

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

И если мы определим класс Card:

class Card {
    Suit suit;
    Pips pips;

    public Card(Suit suit, Pips pips) {
        this.suit = suit;
        this.pips = pips;
    }

    @Override
    public String toString() {
        return pips.toString() + " of " + suit.toString();
    }
}

Card использует toString() для преобразования мастей и пипсов в строки, а числовое значение с нулевым индексом можно получить с помощью ordinal():

    Card card = new Card(Suit.Spades, Pips.Ace);
    System.out.println("Card: " + card);
    System.out.println("Numeric suit: " + card.suit.ordinal());
    System.out.println("Numeric pips: " + card.pips.ordinal());

Эта простая реализация имеет несколько ограничений. Во-первых, название масти или пипсов может быть только строковой версией имени перечисления. Что делать, если вы хотите, чтобы все ваши перечисления были в ВЕРХНЕМ РЕГИСТРЕ, как в хорошем стиле? Вторая проблема заключается в том, что порядковый номер всегда имеет нулевой индекс. Что, если вам нужна какая-то другая система id для пипсов?

В этом случае мы добавляем карты к каждому перечислению, чтобы хранить эти сопоставления. К сожалению, мы не можем использовать наследование для совместного использования кода между перечислениями, поэтому эталонная пластина становится немного многословной.

enum Suit {
    HEARTS(1, "Hearts"), //
    DIAMONDS(2, "Diamonds"), //
    CLUBS(3, "Clubs"), //
    SPADES(4, "Spades");

    private static Map<String, Suit> nameToEnum = new HashMap<>();
    private static Map<Integer, Suit> idToEnum = new HashMap<>();

    static {
        for (Suit suit : Suit.values()) {
            nameToEnum.put(suit.getName(), suit);
            idToEnum.put(suit.getId(), suit);
        }
    }

    private int id;
    private String name;

    private Suit(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public static Suit fromName(String name) {
        return nameToEnum.get(name);
    }

    public static Suit fromId(int id) {
        return idToEnum.get(id);
    }
}

enum Pips {
    ACE(1, 1, "Ace"), //
    TWO(2, 2, "Two"), //
    THREE(3, 3, "Three"), //
    FOUR(4, 4, "Four"), //
    FIVE(5, 5, "Five"), //
    SIX(6, 6, "Six"), //
    SEVEN(7, 7, "Seven"), //
    EIGHT(8, 8, "Eight"), //
    NINE(9, 9, "Nine"), //
    TEN(10, 10, "Ten"), //
    JACK(11, 10, "Jack"), //
    QUEEN(12, 10, "Queen"), //
    KING(13, 10, "King");

    private static Map<String, Pips> nameToEnum = new HashMap<>();
    private static Map<Integer, Pips> idToEnum = new HashMap<>();

    static {
        for (Pips pips : Pips.values()) {
            nameToEnum.put(pips.getName(), pips);
            idToEnum.put(pips.getId(), pips);
        }
    }

    private int id;
    private int value;
    private String name;

    private Pips(int id, int value, String name) {
        this.id = id;
        this.value = value;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public int getValue() {
        return value;
    }

    public String getName() {
        return name;
    }

    public static Pips fromName(String name) {
        return nameToEnum.get(name);
    }

    public static Pips fromId(int id) {
        return idToEnum.get(id);
    }

}

В этих новых перечислениях мы модифицируем Card.toString() для использования новых методов getName():

    return pips.getName() + " of " + suit.getName();

И теперь, когда мы работаем с картами, мы можем использовать любой идентификатор, имя или перечисление и свободно конвертировать между ними:

    Card card = new Card(Suit.SPADES, Pips.ACE);
    System.out.println("Card: " + card);
    System.out.println("Numeric suit: " + card.suit.getId());
    System.out.println("Numeric pips: " + card.pips.getId());
    System.out.println("Suit by ID: " + Suit.fromId(3).getName());
    System.out.println("Pips by Name: " + Pips.fromName("Ace").getName());
    System.out.println("Pips value by Name: " + Pips.fromName("King").getValue());
avatar
hamid ghasemi
8 апреля 2018 в 06:19
3

Я рекомендую использовать Enum, чтобы вы могли легко сравнивать карты. ваш желаемый класс перечисления будет:

public enum Cards {
    ace (1),
    two (2),
    three (3),
    four (4),
    five (5),
    six (6),
    seven (7),
    eight (8),
    nine (9),
    ten (10),
    jack (11),
    queen (12),
    king (13)
    ;

    private final int code;

    Cards(int code){
        this.code = code;
    }
    public Integer value(){
        return code;
    }

    public static Cards getRelatedEnum(Integer code){
        if(code == null)
            return null;

        switch (code){
            case 1: return ace;
            case 2: return two;
            case 3: return three;
            case 4: return four;
            case 5: return five;
            case 6: return six;
            case 7: return seven;
            case 8: return eight;
            case 9: return nine;
            case 10: return ten;
            case 11: return jack;
            case 12: return queen;
            case 13: return king;
            default: return null;
        }
    }

    public static String toString(Cards card){
        if(card == null)
            return "";
        switch (card){
            case ace: return "ace";
            case two: return "2";
            case three: return "3";
            case four: return "4";
            case five: return "5";
            case six: return "6";
            case seven: return "7";
            case eight: return "8";
            case nine: return "9";
            case ten: return "10";
            case jack: return "jack";
            case queen: return "queen";
            case king: return "king";
            default: return null;
        }
    }

}

тогда вы можете изменить метод dealCard() на:

public static Cards dealCard() {
    int value = (int)(Math.random() * 13);
    return Cards.getRelatedEnum(value);
}  

для сравнения значений карт используйте что-то вроде:

public static void main(String[] args){
    System.out.println("---------------------Black Jack--------------------------");
    System.out.println("Welcome to BlackJack!");
    System.out.println("Available balance is $"+balance);
    System.out.print("How much would you like to bet on this hand?: ");
    int bet = input.nextInt();
    balance -= bet;
    System.out.println("You just bet $"+bet+"......Dealing cards!");
    System.out.println("-------------------------------------------");

    Cards pCard1 = dealCard();
    Cards pCard2 = dealCard();

    System.out.println("Your hand is a "+pCard1.toString() +" and "+pCard2.toSring());
    System.out.print("Would you like to Hit or Stand? :");
    String hOs = input.next();

    if(hOs.equals("Hit")) {
        Cards pCard3 = dealCard();
        if(pCard1.value() + pCard2.value() > pCard3.value());
    }
}
PizzaParrot
8 апреля 2018 в 17:24
0

Я пробовал это, но все еще получаю ту же ошибку при попытке сравнить pCard1 и т. д. Можете ли вы показать, как именно это сделать? Должны ли pCard 1,2,3 и т. д. быть строковыми типами данных?

hamid ghasemi
8 апреля 2018 в 17:51
0

@PizzaParrot Я не знаю правил этой игры, я добавил в свой ответ простое выражение сравнения. проверьте это, пожалуйста.

avatar
Tech Support 1101
8 апреля 2018 в 06:13
2

Десятка, валет, дама и король имеют разные ранги, но имеют одинаковое значение 10. Поскольку все они имеют одинаковое значение, вам нужно больше, чем просто значение карты, чтобы определить ее ранг. По общему признанию, вы могли бы представить значение валета как 11, даму как 12 и т. д., а затем запрограммировать свои методы для распознавания любого значения больше 10 как 10, но это плохая практика кодирования.

Вместо этого вы должны закодировать как ранг, так и значение каждой карты (Кроме того, вы можете включить масть; хотя это может не иметь значения для блэкджека).

Вместо того, чтобы представлять карту в виде строки, я рекомендую создать класс Card с рангом String и целочисленным значением. Кроме того, это была бы хорошая возможность изучить перечисления в Java, как прокомментировали другие.