Frage

So I have this program somewhat functional so far. I've been using switch statements. I'm not sure if that's proper logic for this, but I have it working. When I input the word I want, it works, and starts drawing the hangman after the first input, but then runs into an error.

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

                    }


                  }

here's my other class

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

    }
}
War es hilfreich?

Lösung

I guess you've got this covered by now, but I was curious, so I made a shot at your classes, and commented my changes. Hopefully you, or someone else, can get some use of it :-]

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

Then the actual Hangman class:

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

Andere Tipps

Your code performs a fall through as it is written now. It enters a case and since you don't have a break it goes to the next case. You need to enter a break after each else statement in your cases.

Example

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top