2013-06-27 5 views
0

Так что у меня здесь немного проблем в java-игре BlackJack. Я перешел от использования hashmaps для имен и значений карт и преобразовал их в String [] только потому, что это намного проще. Тем не менее, я, казалось, нарушил какой-то код в нем:BlackJack Java String [] не работает

private void createDeck(int numCards, int numSuits) { 

    deck = new ArrayList<Card>(); 
    cardUsed = new ArrayList<Card>(); 
    if ((numCards % numSuits) > 0) return; 

    for (int i=0; i < numSuits; i++) { 
     for(int j=1; j <= (numCards/numSuits); j++) { 
      deck.add(new Card(new Suit(i), j + "", j)); 
     } 
    } 
} 

Это не будет работать, и дает мне нерешенная проблема компиляции: Конструктор карты (костюм, String, Int) не определено. Однако у меня есть параметры карты как Card (Suit, String [], int). Есть ли способ обойти это, по-прежнему используя массив String? Он подчеркивает deck.add(new Card(new Suit(i), j + "", j)); в программе.

Вот источник для Card.java

public class Card { 

private String[] cardRank = new String[] {"Ace", "Two", "Three", "Four", 
     "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"} ; 

private Suit suit = null; 

private int cardValue = 0; 

public Card(Suit suit, String[] cardRank, int cardValue) { 
    this.cardRank = cardRank; 
    this.suit = suit; 
    this.cardValue = cardValue; 
} 

public String toString() { 
    return cardRank + " of " + suit.getSuitName(); 
} 

public String[] getCardRank() { 
    return cardRank; 
} 

public void setCardRank(String[] cardRank) { 
    this.cardRank = cardRank; 
} 

public Suit getSuit() { 
    return suit; 
} 

public void setSuit(Suit suit) { 
    this.suit = suit; 
} 

public int getCardValue() { 
    return cardValue; 
} 

public void setCardValue(int cardValue) { 
    this.cardValue = cardValue; 
} 

}

+0

Можете ли вы разместить источник Card.java? – hexafraction

+1

Пропустить массив строк вместо строки? Что-то вроде новой String [] {j + ""}? – kosa

+0

'Конструкторская карта (Suit, String, int) не определена' ... это означает, что в' Card' нет конструктора, который принимает аргументы 'Suit' и' int'. –

ответ

1

Попробуйте это:

new Card(new Suit(i), new String[]{j + ""}, j) 

Вы проезжали в качестве второго параметра j + "", который является String. Чтобы передать String[], который является ожидаемым, просто упакуйте эту строку в одноэлементный массив: new String[]{j + ""}.

На более фундаментальном уровне: почему рейтинг карты определяется как String[] в первую очередь? он должен быть String, единственная карта имеет только один ранг! лучше зафиксировать Card класс и изменить его, чтобы иметь private String cardRank как атрибут:

public class Card { 

    private Suit suit = null; 
    private String cardRank; 
    private int cardValue = 0; 

    public Card(Suit suit, String cardRank, int cardValue) { 
     this.cardRank = cardRank; 
     this.suit = suit; 
     this.cardValue = cardValue; 
    } 

} 

Теперь исходный код инициализации будет работать как задумано:

new Card(new Suit(i), j + "", j) 
+0

Прекрасно работает! Спасибо! – DarkZal

+0

Не помещал бы карты и их значения в String [], хотя, потому что тогда он может хранить несколько карт и значений без прохождения и определения каждого из них отдельно? – DarkZal

+0

@DarkZal: Нет ... если вы хотите назвать класс 'Card', он должен представлять собой одну карту. Если вы хотите использовать несколько карт, используйте массив - или создайте 'Hand',' Deck', 'CardPile' или что-то-вы. – cHao

0

Вы передаете в String, а не String[]. Один из них - всего лишь один объект, а другой - массив объектов.

j + "" результат один String, а не набор String s.

Вы можете решить это, поставив String в массив из String s, прежде чем передавать его в свой конструктор.

2

Ну я думаю, что это плохой дизайн в целом. Но для этого конкретного вопроса ответ, скорее всего, будет заменен j + "" на new String[] {j + ""}

+0

Почему это плохой дизайн? Я все еще изучаю язык Java, поэтому пока не знаю много. – DarkZal

+0

Пожалуйста, разместите свой класс карты, затем я могу дать еще один анализ. Но странно преобразовать значение int в строку, значения integer сопоставимы намного быстрее. Btw: Вы могли бы пометить мой или ответ выше как правильный. – charno