0

私は絞首刑執行人のアプリケーションを書いており、文字列内の各文字 (推測されている単語) を "-" で非表示にするコードを書かなければならないところです...そして、たくさんの質問を投稿しましたくわでそれを行うと、私の返信の1つは次のとおりです。

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);
}
}
4

2 に答える 2

1

コードの作成は順調に進んでいますが、コードを作成するに、まず頭の中で設計を明確にする必要があります。次の手順で考えてみましょう。

  • アプリケーションを起動すると、ファイル内のすべての単語が読み込まれます。したがって、これは 1 回だけ実行されるステップであり、その結果 (ファイル内の単語) を保存する必要があります。
  • 前の手順は GUI コードに関連していないように見えるため、mainメソッドで実行してから、結果を GUI クラスに渡すことができます。ランダムな単語を選択するだけでなく、この機能を別のクラスに抽出することもできます。
  • GUI が表示されたら、隠し単語を象徴するラベルを表示します。'-'このラベルのテキストには、単語の文字と同じ数の隠し文字 ( ) を含める必要があります。
  • 正しいボタンが押されるたびに、単語内の一致するすべての文字が表示されます。
  • 間違ったボタンが押されるたびに、エラー カウンターがインクリメントされ、画像が表示されます。
  • 単語全体が明らかになったら、文字ボタンを無効にする必要があります。

これにより、単語ファイルを読み取るためのメソッドと、ランダムな単語を選択するための別のメソッドを備えた別のヘルパー クラスを持つ設計につながります。おそらくこれに沿った何か:

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

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

新しい単語を選択したら、ラベルを更新する必要があります。ここで、HangmanWord上で提案したクラスが役に立ちます。元の単語とその隠れた表現の両方を保存します。これにより、ボタンのハンドラーでメソッドを呼び出し、check更新された非表示表現でラベルのテキストを更新できます。コードの残りの部分は正常に動作するはずですが、まだ改善の余地があります。

于 2012-08-30T21:13:36.230 に答える
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 などをインポートしていることを確認してください(他に使用するものは何でも)

于 2012-08-30T20:52:34.337 に答える