CS 初学者尝试在 java 中制作刽子手游戏

Beginning CS student trying to make a hangman game in java

所以我得到了代码来做我想做的事。

接收用户输入的字符 将它与随机数组中的每个字符进行比较 如果它们彼此相等,则将它们彼此相等时的位置保存到变量中 将猜对的字符保存到同一位置的空白字符数组中。 重复...

我遇到的问题是在循环时,程序循环了 3 次,而不是在第一次循环后只要求另一个输入。

***Ex.(What code prints):***
Enter A letter: 
a
[a, , , , ]
Enter A letter:
[a, , , , ]
Enter A letter:
[a, , , , ]
Enter A letter:

**Ex.(What I would like code to print)***
Enter A letter:
a
[a, , , , ]
Enter A letter:
p
[a, p, p, , ]

String[] str = {"apple", "apple"};
int attempts = 0;

String randStr = str[rand.nextInt(str.length)];
    
    char [] ans = randStr.toCharArray();
    char [] guess = new char[ans.length];

while(attempts<=10){
    System.out.println("Enter A letter: ");
    char userAns = (char) System.in.read();
    
    for(int i = 0;i<ans.length;i++) 
    {
        if(ans[i]==userAns) 
        {
            int loc = i;
            guess[loc] = ans[loc];
            correct++;
        }
    }
    attempts++;
    System.out.println(Arrays.toString(guess)); 
}

您的问题在于使用 System.in.read(). 您认为您正在阅读一个字符,但实际上您正在阅读更多。你输入 'a' 然后你点击 [Enter]。实际发生的是 [Enter] 键生成两个额外的 non-printing 字符:\r(回车符 return)和 '\n'(换行符),这是 Windows。 System.in.read() 并不专门读取下一个 char,而是读取下一个数据字节,无论它是什么。看起来像是循环的两次额外迭代实际上是对 read() 的调用消耗了按 [Enter] 创建的两个字符。

解决此问题的最简单方法是使用 Scanner class 读取输入,这几乎是从控制台读取用户数据的标准。

您想导入 Scanner,创建一个 Scanner 实例,然后用它从用户那里获取一个字符串。然后使用 String.charAt() 从用户输入的任何字符串中获取第一个字符(因为没有直接的方法从 Scanner 读取 char 类型的输入)。

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

public class Test
{
  public static void main(String[] args)
  {
    Random rand = new Random();
    String[] str = {"apples", "apples"};
    int attempts = 0;
    int correct = 0;
// New code (one line)
    Scanner scanner = new Scanner(System.in);

    String randStr = str[rand.nextInt(str.length)];

    char userAns = '[=10=]';
    char [] ans = randStr.toCharArray();
    char [] guess = new char[ans.length];

    while(attempts < 10)
    {
        System.out.println("Enter A letter: ");
// New code (one line)
        userAns = (scanner.nextLine()).charAt(0);

        for(int i = 0; i < ans.length; i++)
        {
            if(ans[i] == userAns)
            {
                int loc = i;
                guess[loc] = ans[loc];
                correct++;
            }
        }
        attempts++;

        System.out.println(Arrays.toString(guess));
    }
  }
}

如果你不会Scanner(因为你的导师没有介绍),好吧...欢迎来到Kludgeville。您将需要阅读无关的 non-printing 字符并默默地丢弃它们。

而不是:

char userAns = (char) System.in.read();

你会做:

char userAns = (char) System.in.read();
char garbage = (char) System.in.read();
char trash = (char) System.in.read();

您还需要解决以下问题:即使用户猜对了单词,您的程序也永远不会结束。提示:通过改变 while 循环的条件来检测 correct 何时等于答案中的字符数来修复它。有更优雅的方法可以解决该问题,但该方法可以满足您的目的。