2013-12-14 1 views
1

Итак, у меня эта программа несколько функциональна до сих пор. Я использовал инструкции switch. Я не уверен, что это правильная логика для этого, но у меня есть работа. Когда я ввожу слово, которое я хочу, он работает и начинает рисовать палача после первого ввода, но затем запускает ошибку.Программирование Hangman в Java, исключение в ошибке основного потока (наряду с другими)

   public class Hangman { 
        public static void main (String[] args){ 
         JFrame frame = new JFrame ("Hangman"); 
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

         HangmanPanel Panel = new HangmanPanel(); 

         frame.getContentPane().add(Panel); 
         frame.pack(); 
         frame.setVisible(true); 

        } 


        } 

вот мой другой класс

import javax.swing.JPanel; 

import java.awt.event.*; 

import javax.swing.*; 

import java.util.Random; 
import java.util.Scanner; 
import java.io.*; 
import java.util.Scanner; 

public class HangmanPanel extends JPanel { 
    int lives; 
    String guessletter; 
    String inputw; 
    char[] hiddenWord; 
    char[] aOfWord; 
    String[] words = { "ADA", "COBOL", "LOGO", "BASIC", "PROLOG", "UBUNTU", 
      "UHURU" }; 

    Scanner scan = new Scanner(System.in); 
    boolean isFound; 
    int a; 

    public HangmanPanel() { 

     System.out.println("Enter the word to be searched: "); 
     inputw = scan.nextLine(); 

     aOfWord = inputw.toCharArray(); 
     this.setLives(inputw.length()); 
     // this.output(); 

     hiddenWord = new char[aOfWord.length]; 

     for (int j = 0; j < hiddenWord.length; j++) 
      hiddenWord[j] = '*'; 

     this.output(); 

     while (lives > 0) 
      System.out.println("Please choose a letter: "); 
     guessletter = scan.nextLine(); 
     this.checkForMatch(guessletter); 
     if (isFound == true) { 
      hiddenWord[a] = guessletter.charAt(0); 
     } else { 
      System.out.println("_____"); 
      System.out.println("| |"); 
      System.out.println("| "); 
      System.out.println("| "); 
      System.out.println("| "); 
      this.reduceLives(); 

      while (lives > 0) 
       System.out.println("Please choose a letter: "); 
      guessletter = scan.nextLine(); 
      this.checkForMatch(guessletter); 
      if (isFound == true) { 
       hiddenWord[a] = guessletter.charAt(1); 
      } else { 
       System.out.println("_____"); 
       System.out.println("| |"); 
       System.out.println("| o"); 
       System.out.println("| "); 
       System.out.println("| "); 
       this.reduceLives(); 

      } 

      while (lives > 0) 
       System.out.println("Please choose a letter: "); 
      guessletter = scan.nextLine(); 

      this.checkForMatch(guessletter); 
      if (isFound == true) { 
       hiddenWord[a] = guessletter.charAt(2); 
      } else { 
       System.out.println("_____"); 
       System.out.println("| |"); 
       System.out.println("| o"); 
       System.out.println("| | "); 
       System.out.println("| "); 
       this.reduceLives(); 
      } 

      while (lives > 0) 
       System.out.println("Please choose a letter: "); 
      guessletter = scan.nextLine(); 

      this.checkForMatch(guessletter); 
      if (isFound == true) { 
       hiddenWord[a] = guessletter.charAt(3); 
      } else { 
       System.out.println("_____"); 
       System.out.println("| |"); 
       System.out.println("| o"); 
       System.out.println("| /| "); 
       System.out.println("| "); 
       this.reduceLives(); 
      } 

      while (lives > 0) 

       System.out.println("Please choose a letter: "); 
      guessletter = scan.nextLine(); 

      this.checkForMatch(guessletter); 
      if (isFound == true) { 
       hiddenWord[a] = guessletter.charAt(4); 
      } else { 
       System.out.println("_____"); 
       System.out.println("| |"); 
       System.out.println("| o"); 
       System.out.println("| /|\\ "); 
       System.out.println("| "); 
       this.reduceLives(); 
      } 

      while (lives > 0) 

       System.out.println("Please choose a letter: "); 
      guessletter = scan.nextLine(); 

      this.checkForMatch(guessletter); 
      if (isFound == true) { 
       hiddenWord[a] = guessletter.charAt(5); 
      } else { 
       System.out.println("_____"); 
       System.out.println("| |"); 
       System.out.println("| o"); 
       System.out.println("| /|\\ "); 
       System.out.println("| \\"); 
       this.reduceLives(); 
      } 

      while (lives > 0) 

       System.out.println("Please choose a letter: "); 
      guessletter = scan.nextLine(); 

      this.checkForMatch(guessletter); 
      if (isFound == true) { 
       hiddenWord[a] = guessletter.charAt(6); 
      } else { 
       System.out.println("_____"); 
       System.out.println("| |"); 
       System.out.println("| o"); 
       System.out.println("| /|\\"); 
       System.out.println("|/\\"); 
       this.reduceLives(); 
      } 


     } 
     this.output(); 

    } 

    public void setLives(int a) { 
     this.lives = a; 
    } 

    public void reduceLives() { 
     lives = lives - 1; 
     System.out.println("Lives remaining: " + this.getLives()); 

    } 

    public int getLives() { 
     return lives; 
    } 

    public void output() { 
     System.out.println("Lives remaining: " + this.getLives()); 
     System.out.println("Word found so far "); 

     for (int i = 0; i < hiddenWord.length; i++) { 
      System.out.print(hiddenWord[i] + "\n"); 
     } 

    } 

    public void checkForMatch(String l) { 

     for (int i = 0; i < aOfWord.length; i++) { 

      if (l.charAt(0) == aOfWord[i]) { 
       isFound = true; 
       a = i; 
       break; 
      } else { 
       isFound = false; 
      } 
     } 

    } 
} 
+3

сообщение Ошибка здесь, пожалуйста? – iWumbo

+1

Вы не «ломаете» или «возвращаете» после каждого «случая», поэтому, возможно, ваш код работает процедурно и дает вам неожиданные ошибки. – SnakeDoc

+0

Я не думаю, что перерывы в этом случае будут иметь большое значение, поскольку все случаи являются взаимоисключающими. – MxyL

ответ

1

Я предполагаю, что у вас есть это охватывается сейчас, но мне было интересно, поэтому я сделал выстрел в классах, и комментировал мои изменения. Надеюсь, вы, или кто-то другой, может получить некоторую пользу этого: -]

// renamed from Hangman 
public class Main { 
    public static void main(String[] args) { 

     // removed need for JFrame as no GUI is actually used. 
     Hangman hangman = new Hangman(); 
     // starting a thread with the hangman runnable 
     new Thread(hangman).start(); 

     // main thread will end here, but the hangman thread will keep the program running. 
    } 
} 

Тогда фактическая Виселица класс:

import java.util.Arrays; 
import java.util.Scanner; 


// Renamed from HangmanPanel, changed from JPanel to Runnable since no GUI is shown. 
public class Hangman implements Runnable { 

    // always use 7 lives, as this is the number of "hangman images" in reduceLives() 
    private int lives = 7; 

    private char[] hiddenWord; 
    private char[] aOfWord; 

    // I'm guessing that at some point you will use these randomly? 
    private String[] words = { "ADA", "COBOL", "LOGO", "BASIC", "PROLOG", "UBUNTU", "UHURU" }; 


    @Override 
    public void run() { 
     // This is the new Try-With-Resources in Java 7. 
     // If you don't have Java 7, just change the 
     // try (Scanner scan = new Scanner(System.in)) { 
     // to 
     // try { 
     // Scanner scan = new Scanner(System.in); 
     try (Scanner scan = new Scanner(System.in)) { 

      System.out.println("Enter the word to be searched: "); 
      String inputw = scan.nextLine(); 

      aOfWord = inputw.toCharArray(); 
      hiddenWord = new char[aOfWord.length]; 

      // nice method for filling an array. 
      Arrays.fill(hiddenWord, '_'); 

      // renamed from output 
      showStatus(); 

      // fixed outer while-loop 
      while (lives > 0 && Arrays.equals(aOfWord, hiddenWord) == false) { 
       System.out.println("Please choose a letter: "); 
       String guessletter = scan.nextLine(); 
       if(guessletter.isEmpty()) { 
        System.out.println("You must enter a letter. Try again!"); 
       } else { 
        checkForMatch(guessletter); 
       } 

       // refactored all inner loops into checkForMatch() and reduceLives() 
      } 

      System.out.println("Game over, you " + (lives > 0 ? "won" : "lost")); 
     } catch (Exception e) { 
      System.err.println("Error: " + e.getMessage()); 
     } 
    } 

    private void checkForMatch(String letter) { 
     boolean found = false; 

     for (int i = 0; i < aOfWord.length; i++) { 
      if (letter.charAt(0) == aOfWord[i]) { 
       found = true; 
       hiddenWord[i] = letter.charAt(0); 
       // removed break when found to allow searching entire word 
      } 
      // removed else condition to avoid clearing 'found' when searching rest of word 
     } 

     if(!found) { 
      // reduceLives() will also print new hangman 
      reduceLives(); 
     } 

     // printing summary 
     showStatus(); 
    } 

    private void reduceLives() { 
     lives = lives - 1; 

     switch (lives) { 
     case 6: 
      System.out.println("_____"); 
      System.out.println("| |"); 
      System.out.println("| "); 
      System.out.println("| "); 
      System.out.println("| "); 

      break; 
     case 5: 

      System.out.println("_____"); 
      System.out.println("| |"); 
      System.out.println("| o"); 
      System.out.println("| "); 
      System.out.println("| "); 

      break; 
     case 4: 
      System.out.println("_____"); 
      System.out.println("| |"); 
      System.out.println("| o"); 
      System.out.println("| | "); 
      System.out.println("| "); 

      break; 
     case 3: 
      System.out.println("_____"); 
      System.out.println("| |"); 
      System.out.println("| o"); 
      System.out.println("| /| "); 
      System.out.println("| "); 

      break; 
     case 2: 
      System.out.println("_____"); 
      System.out.println("| |"); 
      System.out.println("| o"); 
      System.out.println("| /|\\ "); 
      System.out.println("| "); 

      break; 
     case 1: 
      System.out.println("_____"); 
      System.out.println("| |"); 
      System.out.println("| o"); 
      System.out.println("| /|\\ "); 
      System.out.println("| \\"); 

      break; 
     case 0: 
      System.out.println("_____"); 
      System.out.println("| |"); 
      System.out.println("| o"); 
      System.out.println("| /|\\"); 
      System.out.println("|/\\"); 

      break; 
     } 

    } 

    private void showStatus() { 
     System.out.println("Lives remaining: " + lives); 
     System.out.println("Word found so far " + new String(hiddenWord)); 
    } 
} 
+0

Спасибо. Это полезно. Я не мог полностью понять это задание, поэтому я просто передал его, чтобы получить кредит. Но приятно видеть, как это работает. Я скопировал и вложил это в свой редактор. Я определенно буду использовать это как ссылку в будущем. Благодарю. – user3019802

1

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

Пример

case 1: 
      System.out.println("Please choose a letter: "); 
      guessletter = scan.nextLine(); 
      this.checkForMatch(guessletter); 
      if (isFound == true) { 
       hiddenWord[a] = guessletter.charAt(0); 
      } else { 
       System.out.println("_____"); 
       System.out.println("| |"); 
       System.out.println("| "); 
       System.out.println("| "); 
       System.out.println("| "); 
       this.reduceLives(); 
      } 
      break;         // Add this for each case 
+0

Спасибо. Просто попробовал это.Я по-прежнему получаю исключение в ошибке основного потока. Я попытаюсь удалить инструкции switch и сделать, если еще – user3019802

+0

Хорошо. Желаем удачи, если у вас есть еще вопросы, не стесняйтесь спрашивать. Также вы сказали, что вы новичок, поэтому здесь есть ссылка на хорошую книгу, которую я бы рекомендовал прочитать. [link] (https://www.dropbox.com/s/gxcpyl686r8fg5r/Prentice.Hall.Introduction.to.Java.Programming.Comprehensive.8th.Edition.Jan.2010.pdf) – cogle

+0

Спасибо человеку. Ну, я сменил все эти операторы switch на \t \t while (lives> 0), а затем, если остальное для каждого из них. Не когда я запускаю его, он печатает «Пожалуйста, выберите букву» в бесконечном цикле – user3019802

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