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
何时等于答案中的字符数来修复它。有更优雅的方法可以解决该问题,但该方法可以满足您的目的。
所以我得到了代码来做我想做的事。
接收用户输入的字符 将它与随机数组中的每个字符进行比较 如果它们彼此相等,则将它们彼此相等时的位置保存到变量中 将猜对的字符保存到同一位置的空白字符数组中。 重复...
我遇到的问题是在循环时,程序循环了 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
何时等于答案中的字符数来修复它。有更优雅的方法可以解决该问题,但该方法可以满足您的目的。