Hangman GUI applet java

时间:2013-05-20 20:52:36

标签: java swing jbutton japplet

这里很麻烦。

  1. errorLabel无法显示errorCounter,而是javax.swing.JLabel [.670 ...出现
  2. 点击新游戏,键盘重置但不是wordLabel(为游戏添加新词),如何删除旧wordLabel并替换为新游戏?
  3. 这是我的代码:

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

1 个答案:

答案 0 :(得分:2)

有很多问题,但你似乎围绕着你的主要问题for循环......

此...

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

这......

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

会破坏并抛出ArrayIndexOutOfBoundsException例外。

请记住,Java中的所有数组都是基于0的。也就是说,长度为5的数组将具有0-4

的元素

您的reset方法应该是自包含的,并且能够重建letterLabel数组。还应该从init方法调用此方法以启动并运行游戏。

你的“猜测检查”算法错了......

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

这基本上会减少原始文本中每个字符的猜测次数。因此,如果原始文本是“testin”并且我选择a,我将不再有猜测。只有在原始文本中找不到匹配时才应该减少猜测...