Random() 方法不断更改 Java 中的最终字符串
Random() method keeps changing final String in Java
我正在尝试制作剪刀石头布游戏,并在 Java 中自学更多有关子程序的知识。为了检查其背后的逻辑是否正确,我在程序中分两部分编写了检查对方玩家当前手牌的部分。但是,每次都不一样,即使我在单独的方法中将它分配给最终字符串。
import java.util.Scanner;
public class RockPaperScissors {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String choice = "start";
System.out.println("Welcome to a friendly game of Rock, Paper, Scissors!");
System.out.println("Type in 'start' , 'continue' or 'yes' to play the game, and 'quit' or 'no' to quit the game");
choice = input.nextLine();
try {
while (choice.equalsIgnoreCase("start") || choice.equalsIgnoreCase("continue") || choice.equalsIgnoreCase("yes")) {
System.out.println("Rock, Paper or Scissors?");
String answer = input.nextLine();
System.out.println("Enemy player chose " + set()); // checks current position
comparison(answer);
System.out.println("Would you like to continue?");
choice = input.next();
}
System.out.println("Thank you for playing!");
System.out.println("Have a wonderful day!");
System.exit(1);
} catch (Exception e) {
System.out.println("Invalid player input.");
}
}
static String random() {
int random = (int) (Math.random() * 3);
String current = null;
switch (random) {
case 0:
current = "Rock";
break;
case 1:
current = "Paper";
break;
case 2:
current = "Scissors";
break;
}
return current;
}
static String set() {
final String a = random();
return a;
}
static void comparison(String filler) {
String answer = null;
System.out.println(set()); // checks current position
if (filler.equalsIgnoreCase(random())) {
System.out.println("Draw!");
System.out.println();
System.out.printf("You both chose %s ", random());
System.out.println();
} else if (filler.equalsIgnoreCase("Rock")) {
if (set().equals("Scissors"))
System.out.println("Rock beats Scissors, you win!");
else
System.out.println("Paper beats Rock, you lose...");
} else if (filler.equalsIgnoreCase("Paper")) {
if (set().equalsIgnoreCase("Rock"))
System.out.println("Paper beats Rock, you win!");
else
System.out.println("Scissors beat Paper, you lose...");
} else if (filler.equalsIgnoreCase("Scissors")) {
if (set().equalsIgnoreCase("Paper"))
System.out.println("Scissors beat paper, you lose...");
else
System.out.println("Rock beats scissors, you lose...");
} else
System.out.println("Unknown player input.");
}
}
您的方法 set() 是错误的。它使用内部变量 'a' ,每次调用方法时都会擦除(在堆栈上创建新变量)。您需要将变量 a 更改为 class 变量。
无论如何 final 在这里不起作用,你需要检查变量 a 是否为 null 然后才赋值。
问题是
static String set()
{
final String a = random();
return a;
}
每次调用此函数都会创建一个新的最终字符串 a。变量 a 仅在本地创建并在方法完成时分派,尽管系统不记得它已经是 final
如果您希望您的 AI 只选择一次,请在 main 方法的开头创建一个最终字符串。
public static void main(String args[]){
.
.
final String pick=set();
try
final
局部变量仅在声明它的方法内不可更改 - 并且对于每次调用它都可以不同。
但是您可以为此使用一个字段 - 第一次,您将使用随机选择初始化该字段,在进一步调用时,您将使用该字段的值。
如果您不制作所有内容,效果会更好 static
。但是要使您当前的代码正常工作,您可以这样做:
private static String choice;
static String set()
{
if (choice == null) {
choice = random();
}
return choice;
}
正如其他人所说,每次您调用一个方法时它会再次 运行s,因此该方法中的变量和 return 值会发生变化。
所以您必须 运行 方法随机一次,然后使用然后将结果传递到需要的地方:
//...
String enemy = random();
System.out.println("Enemy player chose " + enemy); //checks current position
comparison(answer, enemy);
//...
static void comparison(String answer, String enemy) {
//do not call random() or set() in here
//just use the answer and enemy parameters
}
我正在尝试制作剪刀石头布游戏,并在 Java 中自学更多有关子程序的知识。为了检查其背后的逻辑是否正确,我在程序中分两部分编写了检查对方玩家当前手牌的部分。但是,每次都不一样,即使我在单独的方法中将它分配给最终字符串。
import java.util.Scanner;
public class RockPaperScissors {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String choice = "start";
System.out.println("Welcome to a friendly game of Rock, Paper, Scissors!");
System.out.println("Type in 'start' , 'continue' or 'yes' to play the game, and 'quit' or 'no' to quit the game");
choice = input.nextLine();
try {
while (choice.equalsIgnoreCase("start") || choice.equalsIgnoreCase("continue") || choice.equalsIgnoreCase("yes")) {
System.out.println("Rock, Paper or Scissors?");
String answer = input.nextLine();
System.out.println("Enemy player chose " + set()); // checks current position
comparison(answer);
System.out.println("Would you like to continue?");
choice = input.next();
}
System.out.println("Thank you for playing!");
System.out.println("Have a wonderful day!");
System.exit(1);
} catch (Exception e) {
System.out.println("Invalid player input.");
}
}
static String random() {
int random = (int) (Math.random() * 3);
String current = null;
switch (random) {
case 0:
current = "Rock";
break;
case 1:
current = "Paper";
break;
case 2:
current = "Scissors";
break;
}
return current;
}
static String set() {
final String a = random();
return a;
}
static void comparison(String filler) {
String answer = null;
System.out.println(set()); // checks current position
if (filler.equalsIgnoreCase(random())) {
System.out.println("Draw!");
System.out.println();
System.out.printf("You both chose %s ", random());
System.out.println();
} else if (filler.equalsIgnoreCase("Rock")) {
if (set().equals("Scissors"))
System.out.println("Rock beats Scissors, you win!");
else
System.out.println("Paper beats Rock, you lose...");
} else if (filler.equalsIgnoreCase("Paper")) {
if (set().equalsIgnoreCase("Rock"))
System.out.println("Paper beats Rock, you win!");
else
System.out.println("Scissors beat Paper, you lose...");
} else if (filler.equalsIgnoreCase("Scissors")) {
if (set().equalsIgnoreCase("Paper"))
System.out.println("Scissors beat paper, you lose...");
else
System.out.println("Rock beats scissors, you lose...");
} else
System.out.println("Unknown player input.");
}
}
您的方法 set() 是错误的。它使用内部变量 'a' ,每次调用方法时都会擦除(在堆栈上创建新变量)。您需要将变量 a 更改为 class 变量。 无论如何 final 在这里不起作用,你需要检查变量 a 是否为 null 然后才赋值。
问题是
static String set()
{
final String a = random();
return a;
}
每次调用此函数都会创建一个新的最终字符串 a。变量 a 仅在本地创建并在方法完成时分派,尽管系统不记得它已经是 final
如果您希望您的 AI 只选择一次,请在 main 方法的开头创建一个最终字符串。
public static void main(String args[]){
.
.
final String pick=set();
try
final
局部变量仅在声明它的方法内不可更改 - 并且对于每次调用它都可以不同。
但是您可以为此使用一个字段 - 第一次,您将使用随机选择初始化该字段,在进一步调用时,您将使用该字段的值。
如果您不制作所有内容,效果会更好 static
。但是要使您当前的代码正常工作,您可以这样做:
private static String choice;
static String set()
{
if (choice == null) {
choice = random();
}
return choice;
}
正如其他人所说,每次您调用一个方法时它会再次 运行s,因此该方法中的变量和 return 值会发生变化。
所以您必须 运行 方法随机一次,然后使用然后将结果传递到需要的地方:
//...
String enemy = random();
System.out.println("Enemy player chose " + enemy); //checks current position
comparison(answer, enemy);
//...
static void comparison(String answer, String enemy) {
//do not call random() or set() in here
//just use the answer and enemy parameters
}