用Java编程Hangman,主线程错误中的异常(以及其他错误)



所以到目前为止,我已经有了这个程序的功能。我一直在使用switch语句。我不确定这是否是正确的逻辑,但我已经做到了。当我输入我想要的单词时,它会起作用,并在第一次输入后开始绘制刽子手,但随后遇到错误。

                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;
            }
        }
    }
}

我想你现在已经了解了这一点,但我很好奇,所以我尝试了一下你的类,并评论了我的更改。希望你或其他人能利用它:-]

// 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. 
    }
}

然后实际的Hangman类:

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));
    }
}

您的代码按照现在的编写方式执行失败。它进入一个案例,由于您没有中断,它进入下一个案例。在您的案例中,您需要在每个其他语句之后输入break

示例

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

相关内容

  • 没有找到相关文章

最新更新