2016-01-13 73 views
-2

我正忙于完成这个“穷人”Hang子手,这是我班的一部分。我已经完成了大部分工作,但我有一件事阻止了我完成。初学者:无法完成游戏

我的问题是,我觉得我的

nextGuess = nextGuess.concat(String.valueOf(guess.charAt(i))); 

用空格代替我的 “*” 占位符。这个词必须用星号和间隔来掩盖,所以“披萨”将是“* * * * *”。

但是,当有人按下字母时,单词中的某些字符会从游戏区域中消失。有任何想法吗?

package hang; 

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

public class Hang { 


    JButton stopButton = null; 
    JButton startButton = null; 

    JLabel gameField = null; 
    JLabel messageArea = null; 
    java.util.List keysArray= new ArrayList(); 
    Iterator keyIterator = null; 

    boolean reset  = true; 
    boolean disable  = false; 





    String[] answerWord = { 
     "pizza" 
     }; 


    String guess; 
    String currentWord; 
    String newLetter; 
    int numberWrong  = 0; 

    int next    = 0; 

    public void setUpNewGame() { 
     numberWrong = 0; 



     Iterator keyIterator = keysArray.iterator(); 
     while(keyIterator.hasNext()) { 
      ((JButton)keyIterator.next()).setEnabled(reset); 
     } 


     startButton.setEnabled(disable); 


     gameField.setBackground(Color.lightGray); 


     double numb = Math.random(); 
     next = (int)(numb * answerWord.length); 
     currentWord = answerWord[next]; 


     guess = "*"; 

     for(int i=0; i<currentWord.length()-1; i++) { 
      guess = guess.concat(" " + "*"); 
     } 
     gameField.setText(guess); 



    } 





    public void processAnswer(String answer) {   // Have Vanna turn the correct letters over 
     char newCharacter = answer.charAt(0); 


     String nextGuess = ""; 
     boolean foundAMatch = false; 
     for(int i=0; i<currentWord.length(); i++) { 
      char characterToMatch = currentWord.charAt(i); 
      if(characterToMatch == newCharacter) { 
       nextGuess = nextGuess.concat(String.valueOf(newCharacter)); 
       foundAMatch = true; 
      } 
      else { 
       nextGuess = nextGuess.concat(String.valueOf 
                (guess.charAt(i))); 

      } 
     } 
     guess = nextGuess; 
     gameField.setText(guess); 


     if(guess.equals(currentWord)) { 

      Iterator keyIterator = keysArray.iterator(); 
      while(keyIterator.hasNext()) { 
       ((JButton)keyIterator.next()).setEnabled(disable); 
      } 

      startButton.setEnabled(reset); 
      stopButton.setEnabled(reset); 
     } 

     else { 
      if(!foundAMatch) { 
       numberWrong++; 



      } 

     } 
    } 

public Component wordPane() { 
     JPanel pane = new JPanel(); 
     pane.setLayout(new BoxLayout(pane, BoxLayout.X_AXIS)); 
     pane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10)); 
     pane.add(Box.createHorizontalGlue()); 
     gameField = new JLabel("Welcome to Hangman"); 
     gameField.setFont(new Font("Helvetica", Font.PLAIN, 24)); 
     gameField.setBackground(Color.lightGray); 
     gameField.setForeground(Color.black); 
     pane.add(gameField); 
     pane.add(Box.createHorizontalGlue()); 
     return pane; 
    } 




    public Component keyboardPane() { 
     ActionListener alphabetButtonAction = new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       JButton buttonPushed = (JButton)e.getSource(); 
       buttonPushed.setEnabled(disable); 
       processAnswer(buttonPushed.getText()); 
      } 
     }; 

     JPanel pane = new JPanel(); 
     pane.setBorder(BorderFactory.createLoweredBevelBorder()); 
     GridBagLayout gridbag = new GridBagLayout(); 
     GridBagConstraints c = new GridBagConstraints(); 
     pane.setLayout(gridbag); 
     c.fill = GridBagConstraints.BOTH; 


     JButton button = new JButton("a"); 

     c.gridx  = 0; 
     c.gridy  = 0; 
     c.gridheight = 1; 

     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("b"); 

     c.gridx  = 1; 
     c.gridy  = 0; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("c"); 

     c.gridx  = 2; 
     c.gridy  = 0; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("d"); 

     c.gridx  = 3; 
     c.gridy  = 0; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("e"); 

     c.gridx  = 4; 
     c.gridy  = 0; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("f"); 

     c.gridx  = 5; 
     c.gridy  = 0; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 


     button = new JButton("g"); 

     c.gridx  = 6; 
     c.gridy  = 0; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("h"); 

     c.gridx  = 7; 
     c.gridy  = 0; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("i"); 

     c.gridx  = 8; 
     c.gridy  = 0; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("j"); 

     c.gridx  = 9; 
     c.gridy  = 0; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("k"); 

     c.gridx  = 0; 
     c.gridy  = 1; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("l"); 

     c.gridx  = 1; 
     c.gridy  = 1; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("m"); 

     c.gridx  = 2; 
     c.gridy  = 1; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("n"); 

     c.gridx  = 3; 
     c.gridy  = 1; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("o"); 

     c.gridx  = 4; 
     c.gridy  = 1; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("p"); 

     c.gridx  = 5; 
     c.gridy  = 1; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("q"); 

     c.gridx  = 6; 
     c.gridy  = 1; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("r"); 

     c.gridx  = 7; 
     c.gridy  = 1; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("s"); 

     c.gridx  = 8; 
     c.gridy  = 1; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("t"); 

     c.gridx  = 9; 
     c.gridy  = 1; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("u"); 

     c.gridx  = 2; 
     c.gridy  = 3; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("v"); 

     c.gridx  = 3; 
     c.gridy  = 3; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("w"); 

     c.gridx  = 4; 
     c.gridy  = 3; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("x"); 

     c.gridx  = 4; 
     c.gridy  = 3; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("y"); 

     c.gridx  = 5; 
     c.gridy  = 3; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     button = new JButton("z"); 

     c.gridx  = 6; 
     c.gridy  = 3; 
     gridbag.setConstraints(button, c); 
     button.addActionListener(alphabetButtonAction); 
     pane.add(button); 
     keysArray.add(button); 

     keyIterator = keysArray.iterator(); 
     while(keyIterator.hasNext()) { 
      ((JButton)keyIterator.next()).setEnabled(disable); 
     } 
     return pane; 
    } 





    public Component menuPane() { 
     ActionListener controlButtonListener = new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       JButton buttonPushed = (JButton)e.getSource(); 
       if(buttonPushed.getText().equals("Start")) { 
        setUpNewGame(); 
       } 
       else { 
        System.exit(0); 
       } 
      }//actionPerformed 
     };//controlButtonListener 

     JPanel pane = new JPanel(); 
     pane.setBorder(BorderFactory.createLoweredBevelBorder()); 
     pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS)); 

     startButton = new JButton("Start"); 
     startButton.setFont(new Font("Helvetica", Font.PLAIN, 18)); 
     startButton.setAlignmentX(Component.CENTER_ALIGNMENT); 
     startButton.addActionListener(controlButtonListener); 
     pane.add(startButton); 

     pane.add(Box.createVerticalGlue()); 

     stopButton = new JButton("Stop"); 
     stopButton.setFont(new Font("Helvetica", Font.PLAIN, 18)); 
     stopButton.setAlignmentX(Component.CENTER_ALIGNMENT); 
     stopButton.addActionListener(controlButtonListener); 
     pane.add(stopButton); 


     return pane; 
    } 




    public Component createComponents() { 
     JPanel pane = new JPanel(); 
     pane.setBorder(BorderFactory.createLoweredBevelBorder()); 
     pane.setLayout(new BorderLayout()); 
     pane.add(wordPane(), BorderLayout.NORTH); 
    pane.add(keyboardPane(), BorderLayout.CENTER); 
     pane.add(menuPane(), BorderLayout.SOUTH); 

     return pane; 
    } 



    public static void main(String[] args) { 
    String lookAndFeel; 

    lookAndFeel=UIManager.getCrossPlatformLookAndFeelClassName(); 
    if (args.length == 1) 
    { 
     if (args[0].equals("motif")) 
      lookAndFeel = 
      "com.sun.java.swing.plaf.motif.MotifLookAndFeel"; 
     if (args[0].equals("metal")) 
      lookAndFeel = 
      "javax.swing.plaf.metal.MetalLookAndFeel"; 
     else if (args[0].equals("system")) 
      lookAndFeel= 
      UIManager.getSystemLookAndFeelClassName() ; 
    } 
     try { 
      UIManager.setLookAndFeel(lookAndFeel); 
     } catch (Exception e) { } 

     //Create the top-level container and add contents to it. 
     JFrame frame = new JFrame("Hangman"); 
     frame.setSize(new Dimension(800,480)); 
     Hang game = new Hang(); 
     Component contents = game.createComponents(); 

     frame.getContentPane().add(contents); 


     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 

     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+5

这确实应该减少:参见[MCVE] 。 –

+0

它甚至没有格式化好,就像1/5它是无用的空格 – redFIVE

+1

'guess'有更多的字符,然后'currentWord',但是你试图连接来自'guess'的值到它里面......这是不匹配 – MadProgrammer

回答

1

这是你的模型/数据与您的演示文稿/视图

guess有更多的字符,那么currentWord混合的经典范例,但你正在尝试基于指数从guess值连接成它currentWord ...不匹配。

相反,我会简单地维持guesscurrentWord之间的关系,1-1,所以它们具有相同的字符数,并简单地改变它的显示方式...

所以,当你过叫gameField.setText(guess);你需要先格式化文本,例如gameField.setText(pad(guess));

pad可能看起来像......

protected String pad(String value) { 
    StringJoiner sj = new StringJoiner(" "); 
    for (char c : value.toCharArray()) { 
     sj.add(Character.toString(c)); 
    } 
    return sj.toString(); 
} 

刚刚injec每个角色之间有一个空格。

这也意味着,当你做到这一点

if (guess.equals(currentWord)) { 

事实上,你会得到一个有效的结果(因为​​不等于pizza:P)

+0

' t似乎使用StringJoiner的构造函数......我会研究为什么。感谢您的建议! – Remsen

+0

您使用的是Java 8吗?它只适用于Java 8+ – MadProgrammer