2015-11-09 2 views
0

У меня есть карточная игра, которую я пытаюсь сделать. Большинство из них работает, но мне трудно понять эффективный способ присвоения целочисленных значений строковым элементам, которые у меня есть в моих массивах. По сути, у меня есть ArrayList с каждой карточкой в ​​стандартной колоде, и по два разворачиваются каждый ход. Несмотря на то, что они - струны (Туз Пик и т. Д.), Мне нужно, чтобы они каким-то образом обладали численным значением, поэтому две карты можно сравнить, чтобы определить победителя (Джек бьет 7 и т. Д.). Я дал ему попытку, которая, я думаю, должна быть способна работать, но это не так.Присвоение целочисленных значений строкам в ArrayList

boolean checkAce = deckList.get(0).startsWith("Ace"); 
boolean checkTwo = deckList.get(0).startsWith("Two"); 
boolean checkThree = deckList.get(0).startsWith("Three"); 
boolean checkFour = deckList.get(0).startsWith("Four"); 
boolean checkFive = deckList.get(0).startsWith("Five"); 
boolean checkSix = deckList.get(0).startsWith("Six"); 
boolean checkSeven = deckList.get(0).startsWith("Seven"); 
boolean checkEight = deckList.get(0).startsWith("Eight"); 
boolean checkNine = deckList.get(0).startsWith("Nine"); 
boolean checkTen = deckList.get(0).startsWith("Ten"); 
boolean checkJack = deckList.get(0).startsWith("Jack"); 
boolean checkQueen = deckList.get(0).startsWith("Queen"); 
boolean checkKing = deckList.get(0).startsWith("King"); 

boolean checkAceP2 = deckList.get(1).startsWith("Ace"); 
boolean checkTwoP2 = deckList.get(1).startsWith("Two"); 
boolean checkThreeP2 = deckList.get(1).startsWith("Three"); 
boolean checkFourP2 = deckList.get(1).startsWith("Four"); 
boolean checkFiveP2 = deckList.get(1).startsWith("Five"); 
boolean checkSixP2 = deckList.get(1).startsWith("Six"); 
boolean checkSevenP2 = deckList.get(1).startsWith("Seven"); 
boolean checkEightP2 = deckList.get(1).startsWith("Eight"); 
boolean checkNineP2 = deckList.get(1).startsWith("Nine"); 
boolean checkTenP2 = deckList.get(1).startsWith("Ten"); 
boolean checkJackP2 = deckList.get(1).startsWith("Jack"); 
boolean checkQueenP2 = deckList.get(1).startsWith("Queen"); 
boolean checkKingP2 = deckList.get(1).startsWith("King"); 

int playerOneScore = 0; 
int playerTwoScore = 0; 

if (checkAce = true) { 
    playerOneScore = 14; 
}else if (checkTwo = true) { 
    playerOneScore = 2; 
}else if (checkThree = true) { 
    playerOneScore = 3; 
}else if (checkFour = true) { 
    playerOneScore = 4; 
}else if (checkFive = true) { 
    playerOneScore = 5; 
}else if (checkSix = true) { 
    playerOneScore = 6; 
}else if (checkSeven = true) { 
    playerOneScore = 7; 
}else if (checkEight = true) { 
    playerOneScore = 8; 
}else if (checkNine = true) { 
    playerOneScore = 9; 
}else if (checkTen = true) { 
    playerOneScore = 10; 
}else if (checkJack = true) { 
    playerOneScore = 11; 
}else if (checkQueen = true) { 
    playerOneScore = 12; 
}else if (checkKing = true) { 
    playerOneScore = 13; 
} 

if (checkAceP2 = true) { 
    playerTwoScore = 14; 
}else if (checkTwoP2 = true) { 
    playerTwoScore = 2; 
}else if (checkThreeP2 = true) { 
    playerTwoScore = 3; 
}else if (checkFourP2 = true) { 
    playerTwoScore = 4; 
}else if (checkFiveP2 = true) { 
    playerTwoScore = 5; 
}else if (checkSixP2 = true) { 
    playerTwoScore = 6; 
}else if (checkSevenP2 = true) { 
    playerTwoScore = 7; 
}else if (checkEightP2 = true) { 
    playerTwoScore = 8; 
}else if (checkNineP2 = true) { 
    playerTwoScore = 9; 
}else if (checkTenP2 = true) { 
    playerTwoScore = 10; 
}else if (checkJackP2 = true) { 
    playerTwoScore = 11; 
}else if (checkQueenP2 = true) { 
    playerTwoScore = 12; 
}else if (checkKingP2 = true) { 
    playerTwoScore = 13; 
} 

if (playerOneScore > playerTwoScore) { 
    System.out.println("Player One Wins!"); 
}else if (playerTwoScore > playerOneScore) { 
    System.out.println("Player Two Wins!"); 
}else if (playerOneScore == playerTwoScore) { 
    System.out.println("Tie"); 
} 

Идея заключается в том, что каждый цикл я преформы, чтобы раздать карты будет проверять ArrayList Element, чтобы увидеть, если начало соответствует строке номинальной стоимости. Затем оператор if проверяет, какой из них является истинным, и присваивает соответствующие очки значению для каждого игрока и сравнивает их. По какой-то причине каждый раз, когда я запускаю его checkAce и checkAceP2, оба оценивают true независимо от того, какие карты на самом деле находятся на deckList.get(0) и .get(1). В результате каждый раз получается ничья. Может ли кто-нибудь увидеть недостаток в моем коде? Или может кто-нибудь рекомендовать лучший метод для достижения моей цели?

ответ

1

(checkAce = true) назначает true к checkAce и (как побочный эффект) оценивает истина. Вам нужно == или просто логическое (для всех ваших if).

if (checkAce == true) 

или короче

if (checkAce) 
+0

Ах, спасибо! Это решило мою проблему. – andrewxt

0

Чтобы ответить

У меня возникли проблемы выяснить, эффективный способ присвоения целочисленных значений строковых элементов у меня в массивах.

Я бы использовал Перечисление вместо String, если возможно, так как значение каждой карты будет постоянным. Затем, вместо того, чтобы иметь ArrayList of Strings, у вас будет ArrayList of Cards.

public enum Card { 
    ACE(14), 
    ONE(1), 
    TWO(2), 
    ... 
    KING(13); 

    /** The point value associated to each card. */ 
    private int pointValue; 

    private Card(int pointValue) { 
     this.pointValue = pointValue; 
    } 

    public int getPointValue() { 
     return this.pointValue; 
    } 

} 
+0

«Карточка» обычно представляет собой комбинацию «ранг» (например, королева) и «костюм» (например, сердца). – Andreas

+0

Согласовано. Если OP строго обеспокоен различием значений точек, тогда атрибут suit не полезен в этом сценарии (предполагая, что все костюмы карты имеют одинаковые значения точки). – Zizek

0

Ваша проблема заключается в том, что вы храните карточку как строку. Карта обычно представляется как объект с двумя атрибутами: Ранг и Костюм.

Строковое представление карты легко построить из Ранга и Костюма. Извлечение Ранга и Костюма из String, однако, не так просто, особенно если ваша карточная игра становится популярной и ее нужно перевести на другие языки. Это также намного медленнее, чем наоборот.

Поэтому я бы сказал, что ваша беда в том, что вы ошибались. Создайте класс карты с полем Rank и поле Suit. Оба поля могут выиграть от перечислений:

public enum Rank { TWO, THREE, ... , JACK, QUEEN, KING, ACE } 
public enum Suit { SPADES, HEARTS, DIAMONDS, CLUBS } 
public class Card { 
    public final Rank rank; 
    public final Suit suit; 
    public Card(Rank rank, Suit suit) { 
     this.rank = rank; 
     this.suit = suit; 
    } 
    @Override 
    public String toString() { 
     // code here 
    } 
} 

Или сделать поля private и добавить методы геттер.

Таким образом, ваш код становится проще:

if (deckList.get(0).rank == Rank.ACE) { 

и печати карты (или весь deckList) все равно будет показывать полный текст, например, «Королева сердец», любезно метода toString().