2011-04-05 41 views
1

试图让这个游戏的最后部分工作。它是一个hang子手游戏,我只需要它显示正确的猜测他们在这个词。字符数组需要按照一定的顺序和位置显示

这是当一个正确的猜测给出

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

有什么问题吗? – bdares 2011-04-05 07:37:56

回答

2

Y。

应该重构你的代码,并保留在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 
相关问题