【问题标题】:Coding for the first time (Java hangman game)- going from console-based to GUI第一次编码(Java 刽子手游戏)——从基于控制台到 GUI
【发布时间】:2014-03-31 17:45:13
【问题描述】:

我是对编程完全陌生,我必须用 Java 完成一些任务(我正在使用 Eclipse)。这是一个刽子手游戏。我的代码如下。我编写了一个基于控制台的程序,该程序基本上可以工作(计算生命而不是绘制刽子手图形)。

我认为这个问题对大多数人来说似乎很简单,但我非常感谢您的帮助。

我正在尽力在网上寻找答案,但作为一个完全新手,很难知道从哪里开始。我真的很想知道我是否走在正确的轨道上,这样我就不会浪费太多时间。

我应该(并且想要!)自己做这件事,所以理想情况下,我想知道应该关注什么。

我的问题是:

  1. 我现在需要创建一个 GUI(我以前从未做过): 我已经编写的这段代码有多大用处?一旦我开始使用 GUI 创建游戏,一切都会完全不同吗?
  2. 我使用StringBuffer 来存储之前猜到的字母。我 想要搜索这个以显示包含所有 以前猜到的字母填写(就目前而言,它只打印 在所有其他字母都被遮盖的情况下排除当前的猜测)。就是它 可能吗?

public static void main(String[] args) {
    Scanner myScanner = new Scanner(System.in);
    StringBuffer buffer = new StringBuffer();

    String secretWord;
    int secretWordLength;
    int position;
    int livesLost = 0;
    int totalLives = 10;
    int lettersRemaining;
    boolean guessInWord;
    char guess;
    StringBuffer prevGuessedLetters;

    //prompt user to enter a word and set as an instance of the secretWord variable
    System.out.println("Enter a word:");
    secretWord = myScanner.next();

    //determine the length of the word entered
    secretWordLength = secretWord.length();
    System.out.println(secretWordLength);
    lettersRemaining = secretWordLength;

    for (position = 0; position < secretWordLength; position++) {
        System.out.print("*");
    }
    System.out.println();

    //loop starts
    while (lettersRemaining > 0 && livesLost < 10) {
        //prompt user to guess a letter
        System.out.println("Guess a letter:");
        guess = myScanner.findWithinHorizon(".", 0).charAt(0);

        //check if the letter guessed is in the secretWord  
        guessInWord = (secretWord.indexOf(guess)) != -1;

        if (guessInWord == false) {
            livesLost++;
            System.out.print("Sorry, you have lost a life. You still have ");
            System.out.print(totalLives -= livesLost);
            System.out.println(" life/lives left. Keep trying.");
        } else {
            System.out.println("That was a good guess, well done!");

            for (position = 0; position < secretWordLength; position++) {
                if (secretWord.charAt(position) == guess) {
                    System.out.print(guess);
                    lettersRemaining--;
                } else {
                    System.out.print("*");
                }
            }
        }
        System.out.println();
        prevGuessedLetters = buffer.append(guess);
        System.out.print("Previously guessed letters: ");
        System.out.println(prevGuessedLetters);
        System.out.print("Letters remaining: ");
        System.out.println(lettersRemaining);
    }

    if (livesLost == totalLives) {
        System.out.println("Sorry, you lose!");
    } else {
        System.out.print("Well done, you win! The word was ");
        System.out.println(secretWord);
    }
}

【问题讨论】:

    标签: java user-interface stringbuffer


    【解决方案1】:

    Java 附带一个名为 Swing 的 GUI 工具包,您应该学习使用它来完成手头的任务。

    就搜索以前猜到的字母而言,Set 可能会更好地为您服务,这是一个独特元素的Collection。您可以使用SetCharacters,即Set&lt;Character&gt;

    一个粗略的例子:

    Set<Character> guesses = new HashSet<Character>();
    Character guess;
    // etc.
    
    while (lettersRemaining > 0 && livesLost < 10)
    {
        //prompt user to guess a letter
        System.out.println("Guess a letter:");
        guess = myScanner.findWithinHorizon(".",0).charAt(0);
    
        if (guesses.contains(guess)) {
            System.out.println("You have already guessed this character!");
        } else {
            guesses.add(guess);
            //check if the letter guessed is in the secretWord
            guessInWord = (secretWord.indexOf(guess))!= -1;
            // etc.
        }
    }
    

    实际上,如果元素不在集合中,您可以利用 true 返回 true 的事实,从 add 方法中获得一些额外的好处:

        if (guesses.add(guess)) {
            //check if the letter guessed is in the secretWord
            guessInWord = (secretWord.indexOf(guess))!= -1;
            // etc.
        } else {
            System.out.println("You have already guessed this character!");
        }
    

    【讨论】:

      【解决方案2】:

      好吧,对于你的第一个问题:

      -您的代码对您的目标很有用,所以请坚持下去。搜索 Swing 库,它是 java 的图形库,它可以让您轻松制作 GUI。

      关于你的第二个问题:

      -现在我帮不了你,但没那么难,所以继续寻找。

      【讨论】:

      • 这作为评论会更好,因为它不能解决 OP 遇到的整个问题。
      【解决方案3】:
      1. 通过添加 GUI,您的应用程序将变得更长且结构更复杂。像您当前的程序一样,将所有代码放在 1 个主要方法中可能不是一个好主意。因此,您可能希望将代码重新排列为几种不同的方法(在其他语言中也称为过程/子例程)。这种技术称为过程式编程,旨在让您的编码生活更轻松。

        也就是说,在切换到 GUI 时,您的代码并没有完全浪费。游戏逻辑保持不变。除了程序与用户交互的方式之外,没有任何变化。这一次,您使用像 JTextField 这样的 Swing 对象接收猜测并输出答案(Swing 是 Java 的默认图形库。那里有很多,但这是一个好的开始)。您还需要查看 JPanel 和 JFrame(告诉图形窗口您想要将您的东西准确放在哪里的方法 - 所谓的布局)。

      2. StringBuffer 只是 String 的可修改版本。要执行搜索/通读操作,请尝试使用类似数组的数据结构。这里我使用ArrayList,这是Java中非常基本的数据结构:

         ArrayList<String> buffer;
         boolean addGuess(String inputString){ 
              boolean isNewGuess = true;
              for (String s: buffer){
                  if (s.equals(inputString)){
                  isNewGuess = false;
                  break;
                  } 
              } 
             if (isNewGuess) buffer.add(inputString);
             return isNewGuess;
         }
        

      【讨论】:

        【解决方案4】:

        使用 Hang-Man Game 简单逻辑

        可选,这是包名

        包 arr_game;

        import java.util.Random;
        import java.util.Scanner;
        public class HangMan {
        public static char[] star;
            public static void main (String args[])
            {   
                char game[];
                Scanner input = new Scanner(System.in);
                Random r = new Random();
                String[] arr = { "pakistan", "india", "jarmany", "america", "rashia", "iran", "iraq", "japan", "sudan", "canada"};
        
                String word = arr[r.nextInt(arr.length)];
                int count = word.length();
                char[] CharArr=word.toCharArray(); 
                char[] star = word.toCharArray();
                for(int i=0;i<star.length;i++)
                {
                    star[i] = '*';
                    System.out.print(star[i]);
                }
        
                for (int i=1; i<=3; i++)
                {
                    System.out.printf ("\nGuess a Letter:");
                    char letter= input.next().charAt(0);
        
                    for (int j=0;j<CharArr.length; j++)
                    {
                        if(letter == star[j])
                        {
                            System.out.println("this word already exist");
                        }
                        else
                        {
                            if(letter==CharArr[j])
                            {
                                star[j]=letter;
                                i--;
                                System.out.printf("CORRECT GUESS!\n");
                            }
                        }
                    }
                    System.out.print(star);
                    switch(i+0)
                    {
                            case 1: System.err.printf("Strike 1\n");
                                break;
                            case 2: System.err.printf("Strike 2\n");
                                break;
                            case 3: System.err.printf("Strike 3\n");
                                System.err.printf("You're out!!! The word is Not_Matched\n");
                                break;
                    }   
        
                    System.out.printf("\n");
                    if((new String(word)).equals(new String(star))) 
                    {
                        System.err.printf("Winner Winner, Chicken Dinner!\n");
                        break;
                    }
                }
            }
        }
        

        【讨论】:

        • 这既没有回答 OP 的问题,也没有在将近一年后增加任何价值。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多