字符数组需要以特定的顺序和位置显示

时间:2011-04-05 07:32:02

标签: java swing arrays

试图让这个游戏的最后一部分发挥作用。它是一个刽子手游戏,我只是需要它来显示正确的猜测。

这是给出正确猜测的代码片段

else
            {
                int alreadyGuessed = guesses.indexOf(guess);
                if (alreadyGuessed == -1)
                {

                    guesses = guesses + guess + "";
                    jlbWord.setText("Word: " + charWord[currentGuess]);
                }
                else{}

            }

现在它只显示每个字母。我也可以设置它,因此它会在输入时显示每个,但它的顺序不正确,这使得用户更难以猜出单词是什么。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.awt.Dimension;

public class RightPanel extends JPanel implements KeyListener
{
JLabel jlbMissed, jlbWord, jlbTimer;
Color btnColor;
JComboBox jcbDifficulty;
JButton jbtStart, jbtQuit;
String[] difficulties = {"Easy", "Medium", "Hard"};
String[] words = {"First", "Next", "Hello", "World"};
char guess;
String word, guesses = "";
char[] charWord;
public static int incorrectGuesses = 0;
boolean clockIsRunning = false;
boolean gameInPlay = false;
int sec = 0;
int min = 0;



public RightPanel()
{

    this.setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    Random ran = new Random();  //
    int rand = ran.nextInt(4);  // Generates random number then selects word from words array
    word = words[rand];         //
    charWord = word.toCharArray();
    ActionHandler actionHandler = new ActionHandler();
    jlbMissed   = new JLabel("Missed: ");
    jlbWord     = new JLabel("Word: ");
    jlbTimer    = new JLabel("Time: " + "0:00");
    jbtStart    = new JButton("Start");
    jbtQuit     = new JButton("Quit");
    jcbDifficulty = new JComboBox();
    jbtStart.addActionListener(actionHandler);
    jbtQuit.addActionListener(actionHandler);
    jcbDifficulty.addKeyListener(this);
    jbtStart.addKeyListener(this);
    for (int i = 0; i < 3; i++)
    {
        jcbDifficulty.addItem(difficulties[i]); // Creates Difficutly ComboBox
    }
    this.add(jcbDifficulty, getConstraints(0,0,1,1, GridBagConstraints.WEST));
    this.add(jlbMissed, getConstraints(0,1,1,1, GridBagConstraints.WEST));
    this.add(jlbWord, getConstraints(0,2,1,1, GridBagConstraints.WEST));
    this.add(jlbTimer, getConstraints(0,4,1,1, GridBagConstraints.WEST));
    this.add(jbtStart, getConstraints(0,6,1,1, GridBagConstraints.WEST));
    this.add(jbtQuit, getConstraints(0,7,1,1, GridBagConstraints.WEST));




}

public void keyPressed(KeyEvent e){}
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e)
{
    guess = e.getKeyChar();
    if (gameInPlay == false)
    {
        JOptionPane.showMessageDialog(this, "You have not started the game yet!", "Game has not Started", JOptionPane.ERROR_MESSAGE);
        System.out.println("Game Not in Play");
    }
    else
    {
        if (Character.isLetter(guess))
        {

            if (incorrectGuesses > 11)
            {
                clockIsRunning = false;
                gameInPlay = false;
                JOptionPane.showMessageDialog(this, "You Killed Him! \nThe word was " + word, "He Ceases to Exist", JOptionPane.ERROR_MESSAGE);
                jbtStart.setText("Retry?");
                jbtStart.setBackground(Color.RED);

            }
            else
            {
                int currentGuess = word.indexOf(guess);
                if (currentGuess == -1)
                {
                    int alreadyGuessed = guesses.indexOf(guess);
                    if (alreadyGuessed == -1)
                    {
                        guesses = guesses + guess + "";
                        System.out.println(alreadyGuessed);
                        System.out.println(guesses);
                        String temp = jlbMissed.getText();
                        jlbMissed.setText(temp + guess + ", ");
                        incorrectGuesses++;
                        leftPanel.hangmanPic.setIcon(leftPanel.image[RightPanel.incorrectGuesses]);
                    }
                    else {}
                }
                else
                {
                    int alreadyGuessed = guesses.indexOf(guess);
                    if (alreadyGuessed == -1)
                    {

                        guesses = guesses + guess + "";
                        jlbWord.setText("Word: " + charWord[currentGuess]);
                    }
                    else{}

                }
            }
        }
        else
            JOptionPane.showMessageDialog(this, "That is not a valid guess!\n Please enter a character from A-Z", "Invalid Guess", JOptionPane.ERROR_MESSAGE);


    }

}


private GridBagConstraints getConstraints(int gridx, int gridy, int gridwidth, int gridheight, int anchor)
{
    GridBagConstraints c = new GridBagConstraints();
    c.insets = new Insets(5,5,5,5);
    c.ipadx = 0;
    c.ipady = 0;
    c.gridx = gridx;
    c.gridy = gridy;
    c.gridwidth = gridwidth;
    c.gridheight = gridheight;
    c.anchor = anchor;
    return c;
}

class ActionHandler implements ActionListener
  {
public void actionPerformed(ActionEvent e)
{
    Object source = e.getSource();
    if (source == jbtStart)
    {
        if (clockIsRunning == true){}
        else
        {
            if (jbtStart.getText() == "Start")
            {
                btnColor = jbtStart.getBackground();
                clockIsRunning = true;
                MyTimer timer = new MyTimer();
                timer.start();
                gameInPlay = true;
            }
            else if (jbtStart.getText() == "Retry?")
            {
                jbtStart.setText("Start");
                jbtStart.setBackground(btnColor);
                jlbTimer.setText("Time: " + "0:00");
                sec = 0;
                min = 0;
                MyTimer timer = new MyTimer();
                timer.start();
                clockIsRunning = true;
                gameInPlay = true;
                incorrectGuesses = 0;
                guesses = "";
                jlbMissed.setText("Missed: ");
                jlbWord.setText("Word: ");
                leftPanel.hangmanPic.setIcon(leftPanel.image[RightPanel.incorrectGuesses]);
                Random ran = new Random();
                int rand = ran.nextInt(4);
                word = words[rand];
            }
        }
    }
    else if (source == jbtQuit)
    {
        System.exit(0);
    }

}
  }
  class MyTimer extends Thread
  {
public void run()
{
    while(true)
    {
        if(!clockIsRunning)
            break;
        try
        {
            Thread.sleep(1000);
        }
        catch (InterruptedException ecp)
        {
        }

        if (sec == 59)
        {
            min++;
            sec = 0;
        }
        else
            sec++;
        if(sec < 10)
            jlbTimer.setText("Time:" + min+":0"+sec);
        else
            jlbTimer.setText("Time:" + min+":"+sec);
    }
}
  }







}

1 个答案:

答案 0 :(得分:2)

让人惊讶。

重构代码并将猜测保留在TreeSet<Character>数据结构中。它确保每个字符只存储一次,并且迭代器按升序返回所有存储的字符。

段:

 Set<Character> guesses = new HashSet<Character>();

 // add a guess
 guesses.add('e');
 guesses.add('r');
 guesses.add('a');
 guesses.add('e'); // will not be added, already in the set

 // test
 if (guesses.contains('e')) { ... }

 // test if a word is "guessed"
 boolean foundIt = true;
 for (char c:word.toCharArray()) {
    if (!guesses.contains(c)) {
      foundIt = false;
      break;
    }
 }
 // foundIt is true if all chars of word have been guessed

 // print
 for (char c:guesses)
   System.out.print(c);  // prints: aer