Присваивание значения int строке
Я разрабатываю программу Блэк Джек. Моя проблема в том, что я использую случай переключения для генерации случайной карты. Но когда приходит время сравнивать стоимость карточек.... допустим 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;
}
}
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()
преобразовать Suit и Pips в строки, в то время как числовое значение с нулевым индексом можно получить с помощью 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());
Эта простая реализация имеет несколько ограничений. Во-первых, имя костюма или пипса может быть только строковой версией имени перечисления. Что если вы хотите, чтобы все ваши перечисления в UPPER CASE были в хорошем стиле? Вторая проблема заключается в том, что порядковый номер всегда индексируется нулями. Что если вам понадобится какая-то другая система идентификации для пунктов?
В этом случае мы добавляем карты в каждое перечисление для хранения этих отображений. К сожалению, мы не можем использовать наследование, чтобы разделить код между перечислениями, и поэтому наглядное представление становится немного запутанным.
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());
Я рекомендую использовать 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());
}
}
Десять, Джек, Королева и Король - все разные ранги, но имеют одинаковое значение 10. Поскольку все они имеют одинаковое значение, вам нужно больше, чем просто значение карты, чтобы определить ее ранг. Следует признать, что вы можете представить значение Джека как 11, Королеву как 12 и т. Д., А затем кодировать свои методы, чтобы распознавать любое значение свыше 10 как 10, но это плохая практика кодирования.
Вместо этого вам следует кодировать как ранг, так и значение в каждой карте (кроме того, вы можете включить масть; хотя это может не иметь значения для блэкджека).
Вместо того, чтобы представлять вашу карту как строку, я рекомендую создать класс Card, имеющий ранг String и целочисленное значение. Кроме того, это была бы хорошая возможность изучить перечисления в Java, как прокомментировали другие.