2012-08-30 2 views
0

Пожалуйста, ребята, со мной, я отправил много вопросов, и люди продолжают голосовать, чтобы закрыть вопрос, поэтому я надеюсь, что это одно. Я занят написанием приложения hangman и sofar. Я нахожусь в точке, где мне нужно написать код, чтобы скрыть каждый символ в строке (догадываемое слово) с помощью «-» ... И я опубликовал много вопросы по мотыге, чтобы сделать это, и один из моих ответов был: Hangman - hide String and then unhide each char if guessed correctHangman masking string, unhiding character

public class HangmanWord { 

private static final char HIDECHAR = '_'; 

private String original;  
private String hidden; 

public HangmanWord(String original) { 
    this.original = original; 
    this.hidden = this.createHidden(); 
} 

private String createHidden() { 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < this.original.length; i++) { 
     sb.append(HIDECHAR); 
    } 
    return sb.toString(); 
} 

public boolean check(char input) { 
    boolean found = false; 
    for (int i = 0; i < this.original.length; i++) { 
     if (this.original[i].equals(input)) { 
      found = true; 
      this.hidden[i] = this.original[i]; 
     } 
    } 
    return found; 
} 

//getter and setter 
} 

public class TestClass() { 

public static void main(String[] args) { 
    String secret = "stackoverflow"; 
    int wrongGuesses = 0; 
    HangmanWord hngm = new HangmanWord(secret); 
    System.out.println(hngm.getHidden()); // _____________ 
    if (hngm.check('a')) { 
     System.out.println(hngm.getHidden()); // __a_________ 
    } 
    else { 
     wrongGuesses++; 
    } 
    //... and so on... 
} 
} 

Я пытался использовать этот код с моим, и у меня было много ошибок и вывод он не работает с моим кодом. В моем коде я создал кнопки массива, где, если человек нажимает на кнопку, я получаю сообщение, говорящее, что буква в слове или нет ... Теперь я хочу заменить этот код тем, где он не дает мне сообщение, но позволяет отобразить полукокс и если нет гольца он должен изменить образ

если возможно кто может объяснить, почему он не работает с моим кодом или может кто-нибудь, пожалуйста, объясните мне, что делать ...

кнопка мой массив:

public JButton getButton(final String text){ 
    final JButton button = new JButton(text); 
    button.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      if(original.toUpperCase().indexOf(button.getText())!=-1){ 
       JOptionPane.showMessageDialog(null, "Your word does contain " + text  ); 
      } 
      else{ 
       JOptionPane.showMessageDialog(null, "There is no " + text); 
       error++; 
        if(error >= 0) imageName = "hangman1.jpg"; 
        if(error >= 1) imageName = "hangman2.jpg"; 
        if(error >= 2) imageName = "hangman3.jpg"; 
        if(error >= 3) imageName = "hangman4.jpg"; 
        if(error >= 4) imageName = "hangman5.jpg"; 
        if(error >= 5) imageName = "hangman6.jpg"; 
        if(error >= 7) imageName = "hangman7.jpg"; 
      } 
      } 
      }); 
      return button; 
} 

мой полный код:

import java.awt.*; 
import java.awt.event.*; 
import java.util.Arrays; 
import javax.swing.*; 
import java.io.*; 
import java.util.ArrayList; 
import java.util.Random; 
import java.util.List; 

public final class Hangman extends JFrame implements ActionListener{ 
String original = readWord(); 
int error; 
String imageName; 

JButton btnAddWord = new JButton("Add New Word"); 
JButton btnRestart = new JButton("Restart"); 
JButton btnHelp = new JButton("Help"); 
JButton btnExit = new JButton("Exit"); 

JLabel word = new JLabel(original); 

static JPanel panel1 = new JPanel(); 
static JPanel panel2 = new JPanel(); 
static JPanel panel3 = new JPanel(); 
static JPanel panel4 = new JPanel(); 

public Hangman(){ 
    Container content =getContentPane(); 
    content.setLayout(new GridLayout(0,1)); 

    btnAddWord.addActionListener(this); 
    btnRestart.addActionListener(this); 
    btnHelp.addActionListener(this); 
    btnExit.addActionListener(this); 

    ImageIcon icon = null; 
    if(imageName != null){ 
    icon = new ImageIcon(imageName); 
        } 
    JLabel image = new JLabel(); 
    image.setIcon(icon); 
    panel2.add(image); 

    panel3.add(word); 
    panel4.add(btnAddWord); 
    panel4.add(btnRestart); 
    panel4.add(btnHelp); 
    panel4.add(btnExit); 

    for(char i = 'A'; i <= 'Z'; i++){ 
     String buttonText = new Character(i).toString(); 
     JButton button = getButton(buttonText); 
     panel1.add(button); 
    } 
} 

public JButton getButton(final String text){ 
    final JButton button = new JButton(text); 
    button.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      if(original.toUpperCase().indexOf(button.getText())!=-1){ 
       JOptionPane.showMessageDialog(null, "Your word does contain " + text ); 
      } 
      else{ 
       JOptionPane.showMessageDialog(null, "There is no " + text); 
       error++; 
        if(error >= 0) imageName = "hangman1.jpg"; 
        if(error >= 1) imageName = "hangman2.jpg"; 
        if(error >= 2) imageName = "hangman3.jpg"; 
        if(error >= 3) imageName = "hangman4.jpg"; 
        if(error >= 4) imageName = "hangman5.jpg"; 
        if(error >= 5) imageName = "hangman6.jpg"; 
        if(error >= 7) imageName = "hangman7.jpg"; 
      } 
      } 
      }); 
      return button; 
} 
public String readWord(){ 
    try{ 
     BufferedReader reader = new BufferedReader(new FileReader("Words.txt")); 
     String line = reader.readLine(); 
     List<String> words = new ArrayList<String>(); 
     while(line != null){ 
      String[] wordsLine = line.split(" "); 
      boolean addAll = words.addAll(Arrays.asList(wordsLine)); 
      line = reader.readLine(); 
     } 
     Random rand = new Random(System.currentTimeMillis()); 
     String randomWord = words.get(rand.nextInt(words.size())); 
     return randomWord; 

}catch (Exception e){ 
    return null; 
} 
} 
public void actionPerformed(ActionEvent e){ 
    if(e.getSource() == btnAddWord){ 
     try{ 
      FileWriter fw = new FileWriter("Words.txt", true); 
      PrintWriter pw = new PrintWriter(fw, true); 

      String word = JOptionPane.showInputDialog("Please enter a word: "); 

      pw.println(word); 
      pw.close(); 
     } 
     catch(IOException ie){ 
      System.out.println("Error Thrown" + ie.getMessage()); 
     } 
    } 
    if(e.getSource() == btnRestart){ 

    } 
    if(e.getSource() == btnHelp){ 
     String message = "The word to guess is represented by a row of dashes, giving the number of letters and category of the word." 
       + "\nIf the guessing player suggests a letter which occurs in the word, the other player writes it in all its correct positions." 
       + "\nIf the suggested letter does not occur in the word, the other player draws one element of the hangman diagram as a tally mark." 
       + "\n" 
       + "\nThe game is over when:" 
       + "\nThe guessing player completes the word, or guesses the whole word correctly" 
       + "\nThe other player completes the diagram"; 
     JOptionPane.showMessageDialog(null,message, "Help",JOptionPane.INFORMATION_MESSAGE); 
    } 
    if(e.getSource() == btnExit){ 
     System.exit(0); 
    } 
} 

public static void main (String [] args){ 
    Hangman frame = new Hangman(); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(400, 600); 
    frame.add(panel1, BorderLayout.NORTH); 
    frame.add(panel2, BorderLayout.CENTER); 
    frame.add(panel3, BorderLayout.SOUTH); 
    frame.add(panel4, BorderLayout.SOUTH); 
} 
} 

ответ

0

Вы можете получить символы из строки, и заменить угадывания буквы с «-» в новой строке, и отображение, что (в то время как за кулисами у вас еще есть одно полное)

public [static] String hideString(String string, int[] guessedLetterIndices) { 
    char[] chars = string.toCharArray(); 
    for(int index : guessedLetterIndices) 
     chars[i] = '-';//Replace this with any letter 
    for(int i = 0; i < chars.length; i++) { 
     char c = '-'; 
     for(int index : guessedLetterIndices) 
      if(index == i) 
       c = chars[i]; 
     chars[i] = c; 
    } 

    return new String(chars); 
} 

или если вы в настоящее время есть массив символов, которые они выбрали, в отличие от индексов символов ...

public [static] String hideString(String string, char[] guessedLetters) { 
    char[] chars = string.toCharArray(); 
    char[] hidden = (string.replaceAll("(.|\n)", "-").toCharArray(); 
    for(int i=0;i<chars.length;i++) { 
     for(char c : guessedLetters) 
      if(chars[i] == c) { 
       hidden[i] = chars[i]; 
       break; 
      } 
    ] 
    return new String(chars); 
} 

Вот что я сделаю. Насколько вы не работаете, не могли бы вы рассказать мне об ошибках, которые вы получаете? Убедитесь, что вы импортируете StringBuilder и прочее (что бы они ни использовали)

+0

Ваш код не имеет смысла, насколько я понимаю, ваш код заменяет букву на «-», и я хочу, чтобы точно разобрался, где код скрыт с «-» и когда пользователь догадался о правильной букве, char unhides ... как я сказал, насколько я понимаю, поэтому, пожалуйста, исправьте меня, если я ошибаюсь ... и да, я бы хотел, чтобы я мог дать вам свои ошибки, но я снова и снова перезапускал этот код, и я попробовал чтобы сжечь этот код с моими неделями назад –

+0

@ user1614977 Хорошо, извините, я был глупым и делал противоположное от палача, lol, исправленный сейчас, не тестировал ни один из них, поэтому попробуйте их и посмотрите, работает ли один :) –

1

У вас было хорошее начало с вашим кодом, но сначала вам нужно убрать дизайн в своем уме, до код записи. Давайте подумаем об этом, в шагах:

  • Когда приложение запущено, вы загружаете все слова в файл. Итак, это шаг, который выполняется только один раз, и его результат (слова в файле) должен быть сохранен.
  • Предыдущий шаг, кажется, не связан с вашим графическим интерфейсом, поэтому вы можете сделать это в своем методе main, а затем передать результаты в свой GUI-класс. Вы даже можете извлечь эту функциональность в отдельный класс, а также выбрать случайное слово.
  • После отображения графического интерфейса пользователя вы увидите ярлык, символизирующий скрытое слово. Текст этого ярлыка должен содержать столько скрытых символов ('-'), что и символы слова.
  • Всякий раз, когда нажимается правильная кнопка, должны отображаться все соответствующие символы в слове.
  • При каждом нажатии неправильной кнопки счетчик ошибок увеличивается и отображается изображение.
  • Когда все слово раскрыто, кнопки символов должны быть отключены.

Это приводит к дизайну, в котором у вас есть отдельный класс-помощник с методом чтения файла слов и другой для выбора случайного слова. Возможно, что-то вроде этого:

class WordsReader { 
    public String[] readWords(String filename) { 
     // ... 
    } 

    public String chooseWord(String[] words) { 
     // ... 
    } 
} 

Как только новое слово выбрано, вы должны обновить ярлык. Именно здесь предлагается класс HangmanWord. Он хранит как исходное слово, так и его скрытое представление. Это позволяет вам вызвать метод check в обработчике кнопок и обновить текст метки с помощью обновленного скрытого представления. Остальная часть вашего кода должна работать нормально, хотя его все еще можно улучшить.