这里很麻烦。
这是我的代码:
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);
}
}
}
答案 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
,我将不再有猜测。只有在原始文本中找不到匹配时才应该减少猜测...