2015-03-26 5 views
0

первый раз постер, давний lurker.Сложность вызова ArrayLists и методы из другого класса в Java

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

Моя проблема - это «колода» ArrayList. Из моего файла Blackjack.java, независимо от того, что я делаю, я не могу назвать это, я не могу вызывать какие-либо методы в классе карты, я не могу манипулировать им, я не могу ничего сделать, не получив какую-то ошибку.

public class Blackjack { 
    public int bet; 
    public int earnings = 0; 
    public int total = 100; 
    public boolean inputNeeded = true; 

    public Blackjack() { 
     Scanner s = new Scanner(System.in); 

     System.out.println("    Welcome to Blackjack."); 
     System.out.println("    Enter any key to continue."); 
     System.out.println("   Otherwise, please type Exit to quit."); 

     while (!s.nextLine().toString().toLowerCase().equals("exit")) //Main Game Loop - Only ends when user types Exit. 
     { 
      while (inputNeeded) { 
       System.out.println("You currently have $" + total + "."); 
       System.out.print("Please place your bets now. (Min $10): $"); 

       if (s.hasNextInt()) { 
        bet = s.nextInt(); 
        String betString = String.valueOf(bet); 
        inputNeeded = false; 

        if (bet < 10 || bet % 5 != 0) { 
         System.out.println("Your bet is not valid. Your bet must be a minimum of $10 and be a factor of 5."); 
         System.out.println(""); 
         inputNeeded = true; 
        } 
       } else { 
        System.out.println("Your bet is not valid. Your bet must be a minimum of $10 and be a factor of 5."); 
        System.out.println(""); 
       } 
      } 
      inputNeeded = true; 

      /* 
      * RESERVED SPACE (stuff to-do) 
      * 
      * Deal two cards to dealer and player. 
      * Flip cards, add totals 
      * If dealer has ace, prompt user if he wants insurance incase dealer blacjack 
      * Main loop, as long as neither player has blackjack, prompt user to hit, stay, double down etc. 
      * Once loop exits, calculate bets, add into totals. 
      * Increase count of how many games it's been, shuffle the decks at X games depending on howManyDecks (card.java) 
      * 
      * RESERVED SPACE (stuff to-do) 
      * 
      */ 
      deck.shuffle(); 

      break; //until game is finished 
     } 

     System.out.print("Thank you for playing!"); 
    } 

    public static void main(String[] args) { 
     Blackjack game = new Blackjack(); 
    } 
} 

А класс карты (я знаю, что я мог бы сделать 52 карт в цикле, но для простоты я решил не). Из того, что я читал, если я не хочу статических методов, я должен использовать методы «getter». Я не совсем уверен, как методы возврата помогут мне, например, перетасовать колоду из класса блэкджека или вытащить карты из класса блэкджека (еще не реализованы), поскольку эти методы будут недействительными в качестве возвращаемого типа. Я даже не уверен, что мои методы getter верны, поскольку я никогда не пытался «получить» параметр, который требуется для конструктора раньше.

public class Card 
    extends Blackjack //Do I need to extend this? <---- not sure 
{ 
    public String name; 
    public int value; 
    public String suit; 
    public int howManyDecks = 8; //most casino's use 8 decks for blackjack 

    public Card(String n, int v, String s) { 
     name = n; 
     value = v; 
     suit = s; 

     ArrayList<Card> discard = new ArrayList<Card>(); //this will be for any card that is not currently in the deck, I could have called it 'temp' 
     ArrayList<Card> deck = new ArrayList<Card>(howManyDecks * 52); 

     for (int i = 0; i < howManyDecks; i++) { 
      deck.add(new Card("Ace", 1, "Hearts")); 
      deck.add(new Card("2", 2, "Hearts")); 
      deck.add(new Card("3", 3, "Hearts")); 
      deck.add(new Card("4", 4, "Hearts")); 
      deck.add(new Card("5", 5, "Hearts")); 
      deck.add(new Card("6", 6, "Hearts")); 
      deck.add(new Card("7", 7, "Hearts")); 
      deck.add(new Card("8", 8, "Hearts")); 
      deck.add(new Card("9", 9, "Hearts")); 
      deck.add(new Card("10", 10, "Hearts")); 
      deck.add(new Card("Jack", 10, "Hearts")); 
      deck.add(new Card("Queen", 10, "Hearts")); 
      deck.add(new Card("King", 10, "Hearts")); 
      deck.add(new Card("Ace", 1, "Spades")); 
      deck.add(new Card("2", 2, "Spades")); 
      deck.add(new Card("3", 3, "Spades")); 
      deck.add(new Card("4", 4, "Spades")); 
      deck.add(new Card("5", 5, "Spades")); 
      deck.add(new Card("6", 6, "Spades")); 
      deck.add(new Card("7", 7, "Spades")); 
      deck.add(new Card("8", 8, "Spades")); 
      deck.add(new Card("9", 9, "Spades")); 
      deck.add(new Card("10", 10, "Spades")); 
      deck.add(new Card("Jack", 10, "Spades")); 
      deck.add(new Card("Queen", 10, "Spades")); 
      deck.add(new Card("King", 10, "Spades")); 
      deck.add(new Card("Ace", 1, "Diamonds")); 
      deck.add(new Card("2", 2, "Diamonds")); 
      deck.add(new Card("3", 3, "Diamonds")); 
      deck.add(new Card("4", 4, "Diamonds")); 
      deck.add(new Card("5", 5, "Diamonds")); 
      deck.add(new Card("6", 6, "Diamonds")); 
      deck.add(new Card("7", 7, "Diamonds")); 
      deck.add(new Card("8", 8, "Diamonds")); 
      deck.add(new Card("9", 9, "Diamonds")); 
      deck.add(new Card("10", 10, "Diamonds")); 
      deck.add(new Card("Jack", 10, "Diamonds")); 
      deck.add(new Card("Queen", 10, "Diamonds")); 
      deck.add(new Card("King", 10, "Diamonds")); 
      deck.add(new Card("Ace", 1, "Clubs")); 
      deck.add(new Card("2", 2, "Clubs")); 
      deck.add(new Card("3", 3, "Clubs")); 
      deck.add(new Card("4", 4, "Clubs")); 
      deck.add(new Card("5", 5, "Clubs")); 
      deck.add(new Card("6", 6, "Clubs")); 
      deck.add(new Card("7", 7, "Clubs")); 
      deck.add(new Card("8", 8, "Clubs")); 
      deck.add(new Card("9", 9, "Clubs")); 
      deck.add(new Card("10", 10, "Clubs")); 
      deck.add(new Card("Jack", 10, "Clubs")); 
      deck.add(new Card("Queen", 10, "Clubs")); 
      deck.add(new Card("King", 10, "Clubs")); 
     } 
    } 

    public void shuffle() { 
     ArrayList<Card> temp = new ArrayList<Card>(); 
     while (!deck.isEmpty()) { 
      int loc = (int) (Math.random() * deck.size()); 
      temp.add(deck.get(loc)); 
      deck.remove(loc); 
     } 
     deck = temp; 
    } 

    public Card getDeck() { 
     return deck; 
    } 

    public Sting getCardName(int arrayIndex) { 
     return deck(arrayIndex, Name); 
    } 

    public int getCardValue(int arrayIndex) { 
     return deck(arrayIndex, Value); 
    } 

    public String getCardSuit(arrayIndex, Suit); 
    { 
     return deck(arrayIndex, Suit); 
    } 
} 

Попробуйте запустить:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    deck cannot be resolved 

    at Blackjack.<init>(Blackjack.java:61) 
    at Blackjack.main(Blackjack.java:72) 

Спасибо за помощь заранее!

+0

'deck.shuffle();' вы не определили 'deck' в этой области. – Epicblood

+0

'public String getCardSuit (arrayIndex, Suit); { колода возврата (arrayIndex, Suit); } ' Это забавная ошибка с точкой с запятой, что делает мое автоматическое форматирование неработоспособным. Эта точка с запятой: «Костюм»), ' – EpicPandaForce

ответ

7

Много проблем ...

  • Вы пытаетесь запустить uncompilable код - никогда не делать это. Сначала устраните проблемы компиляции, прежде чем пытаться запустить программу.
  • Вы пытаетесь вызвать метод для переменной, которая не была объявлена ​​в классе. Блэкджеку нужна переменная колоды, которая инициализируется, если вы хотите вызвать метод на ней.
  • Я бы подумал о создании класса Deck, который содержит ArrayList и который имеет все поведение (методы) колоды карт.
  • Класс карты не должен иметь поле колоды. По логике вещей, почему бы нужна карта, чтобы знать о палубе он находится.
  • карта должна определенно не продлить блэкджек
  • Вместо карты должен инкапсулировать идею одной карты, то есть его костюм и его ранг, и ничего больше.
  • Позже вы можете использовать HashMap для объединения каждой Карты с изображением или ImageIcon, если это необходимо.
  • Концепция Card/Deck является одним из канонических примеров, используемых при обучении перечислениям, поэтому заимствуйте эту идею - сделайте свой Костюм и ваш Ранг в перечислениях, и у вашего класса карты есть поле каждого из этих перечислений.

Что касается,

Что вы имеете в виду, пытаясь запустить uncompilable код?

Всякий раз, когда вы видите это:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    deck cannot be resolved 

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

Я имею в виду, без колоды.shuffle(); , он компилируется и работает нормально.

Затем вы должны исправить ошибку deck.shuffle(), прежде чем повторять попытку запуска кода.

Разве так, как этот код структурирован, попытки достичь моих целей будут невозможны?

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

«Блэкджеку нужна переменная колоды, которая инициализируется, если вы хотите вызвать метод на ней». Но я думал, что могу использовать переменную Deck в другом классе?

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

Могу ли я ссылаться на массивы, объекты, переменные, статические вещи, что угодно и т. Д. Из других классов так или иначе? Извините за мое непонимание, я все еще очень скуден.

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

+1

, почему карта должна * содержать любую другую карточку, включая себя. * – EpicPandaForce

+0

@EpicPandaForce: хорошая точка зрения, я еще не смотрел этот код глубоко в код. –

+1

Технически я просмотрел его, чтобы переформатировать его. Но да, решение этого - создать фактический класс «Deck», как вы упомянули. – EpicPandaForce

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