2014-12-06 3 views
1

Я работаю над проектом покера, который просто наносит 5 верхних карт из перетасованной колоды и позволяет пользователю отклонить все, некоторые или ничего. Я понимаю, что должно быть идеально 2-3 класса, один с фактическим основным, а два других - карта и колода. Я создал класс Deck и очень базовую программу Tester, которая, как предполагается, должна печатать перетасованные карты. Однако, когда я печатаю колоду, я получаю что-то по строкам «Deck @ ### d ## a». Что я делаю не так?Базовая программа покера - печатная колода

import java.util.Random; 

public class Deck { 
// Constructing a deck from two arrays 
String[] suit = { "Clubs", "Diamonds", "Hearts", "Spades" }; 
String[] rank = { "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King" }; 
String[] deck = new String[suit.length * rank.length]; 

// Storing public variables 
int suits = suit.length; 
int ranks = rank.length; 
int deckSize = deck.length; 

public Deck() 
{ 
    for(int i = 0; i < suits; i++) 
    { 
     for(int j = 0; j < ranks; j++) 
     { 
      deck[ranks*i + j] = rank[j] + " of " + suit[i]; 
     } 
    } 
} 

// Fisher-Yates Shuffle 
public void shuffle() 
{ 
    Random rand = new Random(); 
    for (int i = 0; i < deckSize; i++) 
    { 
     int x = rand.nextInt(deckSize); 
     String temp = deck[x]; 
     deck[x] = deck[i]; 
     deck[i] = temp; 
    } 

} 

} 

А класс тестер:

import java.util.Scanner; 

public class DeckTester { 
public static void main(String[] args) { 
    Deck deck = new Deck(); 

    System.out.println(deck); 
} 

} 

Выход: Deck @ ### d ### метод

+0

Вам необходимо переопределить метод toString в классе Deck. Также рассмотрите использование Enum вместо массивов String, поскольку у вас есть определенный набор значений. –

+0

Кроме того, ваша тасовка НЕ ​​является правильным Fisher-Yates. Если вы скопировали это из другого источника, вы можете сообщить им об их ошибке. Статья в Википедии - хороший источник. –

ответ

2

Вы видите по умолчанию `ToString() из класса Object, и вы обнаружите, что это не слишком полезно. Вы также не создаете карту или истинный класс Deck, и поэтому вы не можете дать классу достойный метод toString().

Решения:

  • Создать класс карты.
  • Дайте ему ранг и поле значений.
  • Дайте ему метод toString().
  • Создать класс палубы
  • Дайте ему коллекцию карточек.
  • Дайте ему порядочный метод toString().

например,

// for Deck 
@Override 
public String toString() { 
    StringBuilder sb = new StringBuilder(); 
    for (Card card: cards) { 
     sb.append(card.toString() + ", "); 
    } 
    return sb.toString(); 
} 
+0

Чтобы просто распечатать все карты колоды, могу ли я использовать Arrays.toString (колода)? Я пытаюсь просто создать объект Deck и распечатать его содержимое (52 карты по порядку в одном списке). Благодаря! – mshades

0

Печать объекта вызывает метод toString(). Если ваш класс или его предки не переопределяют toString(), он вызывает значение по умолчанию, которое является toString() методом Object.

Но по умолчанию toString() не очень умен - он просто дает вам имя и хэш-код колоды.

Поэтому очень рекомендуется для любого класса, который вы собираетесь распечатать (и даже для тех, у кого нет, но вы можете отлаживать), чтобы переопределить метод toString(). В переопределенном методе вы должны построить строку, представляющую содержимое вашего класса. Это может быть так же просто, как позвонить Arrays.toString() в ваш случай. Обратите внимание, что вы определили метод shuffle(), но на самом деле вы его не вызываете нигде, поэтому, когда вам удастся напечатать свою колоду, она не будет перетасована.

+0

Я использовал 'public String toString() { \t \t return Arrays.toString (deck); \t} ', но он печатает все в одной строке.Как я могу получить все это в одном списке? – mshades

+0

Что значит «один список»? – RealSkeptic

+0

Ace of Clubs (следующая строка) 2 из клубов (следующая строка) 3 из клубов – mshades

Смежные вопросы