繁体   English   中英

Hangman GUI applet java

[英]Hangman GUI applet java

这里很麻烦。

  1. errorLabel无法显示errorCounter,而是显示javax.swing.JLabel [.670 ...
  2. 通过点击新游戏,键盘重置而不是wordLabel(为游戏添加新词),如何删除旧wordLabel并替换为新词?

这是我的代码:

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

}

有许多问题,但你似乎围绕着你的主要问题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 ,那么我将不再有猜测。 只有在原始文本中找不到匹配项时,才应该减少猜测...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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