sencillo poo palabra juego interfaz graficos grafica exelearning ejemplo con codigo ahorcado adivina java swing user-interface jframe actionlistener

poo - Juego del ahorcado de Java con GUI, problemas con el aumento/disminución de los números



juego del ahorcado en java con interfaz grafica (1)

La siguiente parte del código no funciona, ya que el recuento de ganados / perdidos aumenta en más de 1 por cada palabra, y algunas veces obtengo una nullpointereception con la longitud de la cadena. Además, aunque se supone que el jugador tiene 7 intentos (int no), a veces obtiene más, a veces menos. Las cadenas se toman de un archivo de texto "Hangeng.txt". Todo el juego está dentro de un oyente con teclado tipo key key que está dentro de un oyente de botón. Cualquier consejo sobre cómo se debe organizar el diseño del juego en general para evitar errores es bienvenido, ya que solo estoy empezando a trabajar con swing y gui.

public class test{ static int won = 0; static int lost = 0; static String key = ""; static String word = null; static int no = 0; static StringBuffer toguess; public static void main(String[] args) throws IOException{ JFrame frame = new JFrame(); frame.setLayout(new GridLayout(3,1)); JPanel panel1 = new JPanel(); JPanel panel2 = new JPanel(); JPanel panel3 = new JPanel(); JButton button = new JButton(); JLabel label = new JLabel(); JLabel label2 = new JLabel(); panel1.add(label); panel2.add(button); panel3.add(label2); frame.setSize(800,600); frame.add(panel1); frame.add(panel2); frame.add(panel3); frame.setVisible(true); //the button that starts the game or gets a new word button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { frame.requestFocus(); no = 0; label2.setText("won " + won + ", lost " + lost); button.setText("Next"); //get random word from file BufferedReader reader = null; try { reader = new BufferedReader(new FileReader( "hangeng.txt")); } catch (FileNotFoundException e1) { e1.printStackTrace(); } int lineno = (int) (Math.random() * 100); for (int i = 0; i < lineno; i++) { try { reader.readLine(); } catch (IOException e1) { e1.printStackTrace(); } } try { word = reader.readLine().replace(" ", ""); } catch (IOException e1) { e1.printStackTrace(); } String missing = ""; for (int u = 0; u < (word.length() - 2); u++) { missing = missing + "*"; } final String guess = word.charAt(0) + missing + word.charAt((word.length() - 1)); toguess = new StringBuffer(guess); label.setText(toguess.toString()); final ArrayList<String> tried = new ArrayList<String>(); //keylistener that listens to key clicks by the user frame.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent arg0) { } public void keyReleased(KeyEvent arg0) { } public void keyTyped(KeyEvent arg0) { key = "" + arg0.getKeyChar(); String guessing = null; boolean k = false; if ((no < 6)) { guessing = key; System.out.println(guessing); if (!(tried.contains(guessing))) { tried.add(guessing); for (int length = 1; length < (guess .length() - 1); length++) { if (guessing.equals(String.valueOf(word.charAt(length)))) { toguess.replace(length, (length + 1), String.valueOf(word.charAt(length))); k = true; } } if (k == true) { label.setText(toguess.toString()); } else { no = no + 1; } k = false; } label.setText(toguess.toString()); if (toguess.toString().equals(word)) { label.setText("Correct! The word was " + word); no = 6; won = won + 1; } } else if ((no == 6) && (!(toguess.toString().equals(word)))) { label.setText("Sorry, but the word was " + word); lost = lost + 1; } } }); } }); } }


+1 a todos los comentarios ....

Agregando a ellos:

  • No use KeyListener use un KeyAdapter sin embargo, como está utilizando Swing y no AWT, debe usar KeyBinding s para Swing, vea aquí, por ejemplo.

  • No te olvides de crear y manipular los componentes Swing en Event Dispatch Thread través de SwingUtiltities.invokeLater(..) block ver aquí para más.

  • Verifique los esquemas de nomenclatura de clases que deberían comenzar con la letra mayúscula, es decir, la test debe ser Test y cada nueva palabra posterior debe escribirse en mayúscula.

  • No llame a setSize en JFrame sino que utilice el LayoutManager apropiado y / o anule el valor de getPreferredSize() de JPanel y devuelva un tamaño que se ajuste a su contenido y al pack() llamadas pack() en la instancia de JFrame después de agregar todos los componentes.

  • También SSCCE debería ser compilable desde copiar y pegar esto no es ... es decir, las variables deben cambiarse a final y no tengo una muestra de Hangeng.txt así que no puedo probar

  • Por último, use la anotación @Override para asegurarse de que está anulando los métodos correctos, es decir,

    @Override public void actionPerformed(ActionEvent e) { }