简体   繁体   中英

Hangman GUI applet java

Big trouble here.

  1. the errorLabel isn't able to show the errorCounter, instead javax.swing.JLabel[.670... appears
  2. by clicking new game, the keyboard reset but not the wordLabel(which put the new word for the game), how can remove the old wordLabel and replace by new one?

here's my code:

import java.net.*;
import java.io.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
import java.util.*;

public class Hangman extends JApplet implements ActionListener
{
private    static final long serialVersionUID = 2005L;
private    Container    window;
private    JButton      restart;
private    JLabel       errorLabel;
private    WordList     aWordList;
private    int          errorsCounter;
private    JLabel[]     letterLabel;
private    ArrayList<JButton>    letterButton;
private    JPanel       keyboard;
private    JPanel       wordPanel;
private    int          noWordsCorrect;
private    boolean      gameOver;

public void init()
{
    window = new DoubleBufferedPanel();
    setContentPane(window);
    readWordList("words.txt");
    createAppearance();
    createGUI();
    //createAlphabets();
    // JOptionPane.showMessageDialog(this, "" + aWordList.size());
}

public void createAppearance(){
    window.setLayout(null);
}

public void createGUI()
{
    errorsCounter = 6;
    gameOver = false;
    window.removeAll();
    createAlphabets();
    findWord();
    restart = new JButton("New Game");
    restart.setLocation(50, 50);
    restart.setSize(100, 50);
    restart.addActionListener(this);
    window.add(restart);

    errorLabel = new JLabel("6 errors to go");
    errorLabel.setSize(150, 50);
    errorLabel.setLocation(670, 70);
    window.add(errorLabel);
    //testLabel = new JLabel("word");
    //testLabel.setSize(400, 30);
    //testLabel.setLocation(50, 120);
    //window.add(testLabel);

    //createAlphabets();
    //findWord();
}

public void readWordList(String fileName){
    try {
        aWordList = new WordList(new URL(getCodeBase(), fileName), 7, 13);
    }
    catch (Exception ex) {
        JOptionPane.showMessageDialog(this, ex.toString());
    }
}

public void reset(){
    for(JButton b : letterButton){
        b.setVisible(true);
    }

    if(letterLabel != null)
    {
        for(JLabel lbl : letterLabel)
        {
            wordPanel.remove(lbl);
        }
        wordPanel.invalidate();//signal java got to fix n redo layout 
        wordPanel.validate();
    }

}

public void actionPerformed(ActionEvent e){

    if(e.getSource() == restart)
    {
        reset();
        String t = aWordList.getRandomWord();
        wordPanel.setLayout(new GridLayout(1, t.length()));
        JOptionPane.showMessageDialog(null, t);
        letterLabel = new JLabel[t.length()];

        for(int i = 0; i <= t.length(); i++)
        {
            letterLabel[i] = new JLabel(t.substring(i , i + 1));
            letterLabel[i].setVisible(false);
            wordPanel.add(letterLabel[i]);
        }

    }
    else if(e.getSource() instanceof JButton)
    {
        JButton letter = (JButton) e.getSource();
        for(int i = 0; i <= letterLabel.length; i++)
        {
            if((letterLabel[i].getText()).equals(letter.getText()))
            {
                letterLabel[i].setVisible(true);
                letter.setVisible(false);
                noWordsCorrect++;
            }
            else
            {

                letter.setVisible(false);
                errorsCounter--;
                errorLabel.setText("" + errorsCounter + " error to go");
            }

        }

    }
    else if(noWordsCorrect >= letterLabel.length)
    {
        JOptionPane.showMessageDialog(null, "Congratz you win!");
        //createGUI();
        gameOver = true;
    }

    else if(errorsCounter == 0)
    {
        JOptionPane.showMessageDialog(null, "OMG you lost!");
        gameOver = true;
    }
    repaint();
}

public void createAlphabets(){
    keyboard = new JPanel(new GridLayout(2,13));
    keyboard.setSize(750,150);
    keyboard.setBorder(BorderFactory.createLineBorder (Color.blue, 2));
    keyboard.setLocation(200,200);

    letterButton = new ArrayList<JButton>();
    for(char c = 'a'; c <= 'z'; c++)
    {
        JButton s = new JButton("" + c);
        s.addActionListener(this);
        keyboard.add(s);
        letterButton.add(s);
    }

    window.add(keyboard);
    //setVisible(true);
}

public void findWord(){
    wordPanel = new JPanel(new GridLayout(1, 13));
    wordPanel.setSize(250,150);
    wordPanel.setBorder(BorderFactory.createLineBorder (Color.red, 2));
    wordPanel.setLocation(200,50);
    window.add(wordPanel);
}
// JOptionPane.showMessageDialog(this, "[" + t + "]");
//testLabel.setText(t);

class DoubleBufferedPanel extends JPanel {
    private static final long    serialVersionUID = 44L;

    public void paint(Graphics g){
        super.paint(g);
    }
}

}

There are a number of problems, but the main one you seem to be having revolves around you for loops...

This...

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

and this...

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

Will both break and throw ArrayIndexOutOfBoundsException exceptions.

Remember, all arrays in Java are 0 based. That is, an array with a length of 5 will have elements at 0-4

Your reset method should be self contained and capable for rebuilding the letterLabel array. This method should also be called from the init method to get the game up and running.

Your "guess checking" algorithm is wrong...

for (int i = 0; i < letterLabel.length; i++) {
    if ((letterLabel[i].getText()).equals(letter.getText())) {
        letterLabel[i].setVisible(true);
        letter.setVisible(false);
        noWordsCorrect++;
    } else {
        letter.setVisible(false);
        errorsCounter--;
        System.out.println("errorsCounter = " + errorsCounter);
        errorLabel.setText("" + errorsCounter + " error to go");
    }
}

This will, basically, reduce the number of guess per character in the original text. So, if the original text is "testin" and I select a , I will have no more guesses left. Guesses should only be reduced if no match at all can be found in the original text...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM