Big trouble here.
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.