java - 如何创建基于Java文本的刽子手游戏等问题

标签 java

我正在用 Java 创建一个 Hangman 游戏,它几乎可以完美运行。所以我有两个问题。第一个是:

当用户输入一个字母并且该单词有重复的字母时,如何让它打印该字母的两个实例。

  • 我创建了一个 while 循环,但是该循环直到下一次循环之后才会输出修改后的单词。如果这有道理吗? 第二个问题: 我需要能够防止用户两次输入相同的字母
  • 我尝试过列表、数组和哈希集。各种各样的方法,但似乎都不起作用。

我的代码如下:

可能还有其他线程有相同的问题,但似乎没有一个有帮助,因为我无法将其实现到此人的代码中。

import java.util.Scanner;
import java.util.Arrays;

public class Hangman{

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

    String[] CollectionOfWords = {"","gravity","banana","gate","processor","momentum","earth","star","light","television","pan","cupboard"};

    int radmNumber = (int) Math.ceil (Math.random() * CollectionOfWords.length);
    int counter = 10;
    String radmWord = CollectionOfWords[radmNumber];

    char[] genRadmLetter = radmWord.toCharArray();
    char[] genRadmLetter2 = radmWord.toCharArray();
    for (int x = 0; x<genRadmLetter.length; x++){
        genRadmLetter[x]='?';
    }

    System.out.println(String.valueOf(genRadmLetter));
    System.out.println("Hello. Guess a letter.");
    char guessedLetter = Input.next().charAt(0);
    int RW = radmWord.indexOf(guessedLetter);

    if (RW >= 0 ){

    genRadmLetter[RW] = guessedLetter;
    System.out.println(genRadmLetter);

    }

    if (RW == -1){
        System.out.println("Wrong letter, try again.");
        counter = counter - 1; 
        System.out.println("Lives left: " + counter);
    }

    while (counter != 0) {

        System.out.println("Guess a letter.");
        guessedLetter = Input.next().charAt(0);
        RW = radmWord.indexOf(guessedLetter);


        if (RW >= 0 ){

        genRadmLetter[RW] = guessedLetter;
        System.out.println(genRadmLetter);
    }

        if (RW == -1){
            System.out.println("Wrong letter, try again.");
            counter = counter - 1; 
            System.out.println("Lives left: " + counter);
    } else {
            System.out.println(genRadmLetter);
            while (RW >= 0 ){
                genRadmLetter[RW] = guessedLetter;
                RW = radmWord.indexOf(guessedLetter, RW+1); 
            }
    }

        boolean result = Arrays.equals(genRadmLetter, genRadmLetter2);
        if (result == true){
            break;
        }

        if (counter == 0){
            break;
        }

    }

    if (counter == 0){
        System.out.println("You lose. The word was: " + radmWord);
    }

    else {
        System.out.println("Well done, you have guessed the word.");
        System.out.println("Your final score is: " + counter);
    }

}

}

最佳答案

而不是使用...

int RW = radmWord.indexOf(guessedLetter);

要确定输入的值是否与字符匹配(这只会返回第一个索引),您应该使用某种循环来检查每个字符

boolean found = false;
for (int rw = 0; rw < genRadmLetter2.length; rw++) {

    if (genRadmLetter2[rw] == guessedLetter) {

        genRadmLetter[rw] = guessedLetter;
        found = true;

    }

}

现在,因为您依赖 RW 的值来确定是否找到匹配项,所以我对其进行了更改,以便可以使用 boolean found 标志,例如...

if (!found) {
    System.out.println("Wrong letter, try again.");
    counter = counter - 1;
    System.out.println("Lives left: " + counter);
}

您还有重复的代码集,可以将其简化为单个 do-while 循环,这将使阅读和更改变得更容易,例如......

do {

    //...

} while (counter != 0);

对于你的第二个问题,某种Set将是最简单的解决方案......

Set<Character> guesses = new HashSet<Character>();
//...
char guessedLetter = Input.next().charAt(0);

if (guesses.contains(guessedLetter)) {

    System.out.println("You've used this guess, guess again");

} else {

    guesses.add(guessedLetter);

例如...

而且因为翻译代码片段并不总是那么容易......这是我的测试代码......

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Hangman {

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

        String[] CollectionOfWords = {"", "gravity", "banana", "gate", "processor", "momentum", "earth", "star", "light", "television", "pan", "cupboard"};

        int radmNumber = (int) Math.ceil(Math.random() * CollectionOfWords.length);
        int counter = 10;
        String radmWord = "banana"; //CollectionOfWords[radmNumber];

        char[] genRadmLetter = radmWord.toCharArray();
        char[] genRadmLetter2 = radmWord.toCharArray();
        for (int x = 0; x < genRadmLetter.length; x++) {
            genRadmLetter[x] = '?';
        }

        Set<Character> guesses = new HashSet<Character>();
        do {

            System.out.println("Guess a letter.");

            System.out.println(String.valueOf(genRadmLetter));
            System.out.println("Hello. Guess a letter.");
            char guessedLetter = Input.next().charAt(0);

            if (guesses.contains(guessedLetter)) {

                System.out.println("You've used this guess, guess again");

            } else {

                guesses.add(guessedLetter);
                boolean found = false;
                for (int rw = 0; rw < genRadmLetter2.length; rw++) {

                    if (genRadmLetter2[rw] == guessedLetter) {

                        genRadmLetter[rw] = guessedLetter;
                        found = true;

                    }

                }

                if (!found) {
                    System.out.println("Wrong letter, try again.");
                    counter = counter - 1;
                    System.out.println("Lives left: " + counter);
                }

            }

            boolean result = Arrays.equals(genRadmLetter, genRadmLetter2);
            if (result == true) {
                break;
            }

            if (counter == 0) {
                break;
            }

        } while (counter != 0);

        if (counter == 0) {
            System.out.println("You lose. The word was: " + radmWord);
        } else {
            System.out.println("Well done, you have guessed the word.");
            System.out.println("Your final score is: " + counter);
        }

    }

}

关于java - 如何创建基于Java文本的刽子手游戏等问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23799013/

相关文章:

java - 移动窗口时OpenGL停止绘制lwjgl

java - 在 Java 中计算两个 long 的百分比的溢出安全方法

java - 在使用c3p0连接池配置的Mysql主从复制中偶尔会遇到到slave的通信链路故障

java - 从android应用程序中的大图片中提取和使用图像缩略图

java套接字编程问题

java - 在 Eclipse 中调试 : inspect variable -> errors during evaluation

java - 如何将Array嵌套在ArrayList中(ArrayList of ArrayList)?

java - 如何管理调用另一个 JInternalFrame 的 JInternalFrame?

Java,Spring "saveOrUpdate",DAO 中的 "update"

java - 将匹配 6 个字符的正则表达式,仅允许数字、前导和尾随空格