由于 if 语句,p2 无法解析为变量?
p2 cannot be resolved to a variable due to if statements?
目前,我正在与 2 种不同类型的电脑玩家一起制作一个十字交叉游戏。我希望用户输入要玩多少游戏,他想玩随机游戏还是简单玩家。所以我分别实现了一个while循环和if语句。但是,由于 if 语句,我的 p2 不能再解析为变量,我不知道解决这个问题的方法。任何帮助,将不胜感激。这只是我的代码的主要部分有错误。
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
int Wins = 0;
int Loses = 0;
int Draws = 0;
System.out.println("To choose player type Random or Simple");
String ChoosePlayer = scan.nextLine();
System.out.println("Please enter the number of rounds you want to play:");
int i = scan.nextInt();
int Rounds = 0;
while(Rounds < i){
NCGridV3 theGrid = new NCGridV3(gridSize, gridSize);
GameRunnerV3 theGame = new GameRunnerV3();
Scanner sc = new Scanner(System.in); // only needed if we include human players
HumanPlayer p1 = new HumanPlayer(sc, theGame);
if(ChoosePlayer == "Simple"){
SimpleComputerPlayer p2 = new SimpleComputerPlayer();
p2.setMySymbol(SquareStatus.NOUGHT);
}
else if(ChoosePlayer == "Random"){
RandomComputerPlayer p2 = new RandomComputerPlayer();
p2.setMySymbol(SquareStatus.NOUGHT);
}
p1.setMySymbol(SquareStatus.CROSS);
System.out.println(INITIAL_INSTRUCTIONS);
NCPlayer nextToPlay = p1; // arbitrary decision that p1 goes first
while (theGrid.getGameStatus() == GameStatus.STILLPLAYING)
{
GridCoordinate nextMove = nextToPlay.getNextMove(theGrid) ;
try
{
theGrid.setSquareStatus(nextMove.getRow(), nextMove.getCol(), nextToPlay.getMySymbol());
}
catch (outOfRangeError e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// take turns
if(nextToPlay == p1)
nextToPlay = p2; // possible problem here
else
nextToPlay = p1;
为 RandomComputerPlayer 和 SimpleComputerPlayer 创建一个公共接口/超类,并只在 if/else 块之外定义变量:
ComputerPlayer p2;
if(......) {
p2 = new SimpleComputerPlayer();
} else {
p2 = new RandomComputerPlayer();
}
您正在使用两个不同的 类 来代表 'p2' 玩家。我建议如下:
首先,创建一个 abstract class ComputerPlayer
然后,将 SimpleComputerPlayer
和 RandomComputerPlayer
更改为扩展 ComputerPlayer
。
然后,在您的 if 语句中:
使用ComputerPlayer p2 = new SimpleComputerPlayer();
或ComputerPlayer p2 = new SimpleComputerPlayer();
将每个播放器 类 中的通用代码放入 ComputerPlayer
if(ChoosePlayer == "Random"){
RandomComputerPlayer p2 = new RandomComputerPlayer();
p2.setMySymbol(SquareStatus.NOUGHT);
}
问题是您在 if
指令块中定义了 p2
。
变量在定义后可用,在定义它们的块内。一旦编译器编译了该指令块之外的代码,就不再定义 p2
。
所以,只需在共享它的块中定义 p2
(通常是方法体或作为 class 的属性)并在那里使用它。当然,变量的类型必须允许分配任何可能的值(在这个例子中,它必须是 superclass/interface SimpleComputerPlayer
和 RandomComputerPlayer
extend/implement 来自.
ComputerPlayer p2 = null; <---
if (ChoosePlayer.equals("Simple")) {
p2 = new SimpleComputerPlayer();
} else if (ChoosePlayer.equals("Random")){{
p2 = new RandomComputerPlayer();
}
请注意,您应该始终为 p2 赋值;否则,如果您尝试在表达式中使用它,编译器将导致错误,因为它不允许在表达式中使用未初始化的值,并且不清楚该值是否已初始化(如果 ChoosePlayer
既不是 Simple
也不是 Random
)
此外,检查在 Java 中命名变量的正确方法以及如何执行字符串(和其他对象)比较...
目前,我正在与 2 种不同类型的电脑玩家一起制作一个十字交叉游戏。我希望用户输入要玩多少游戏,他想玩随机游戏还是简单玩家。所以我分别实现了一个while循环和if语句。但是,由于 if 语句,我的 p2 不能再解析为变量,我不知道解决这个问题的方法。任何帮助,将不胜感激。这只是我的代码的主要部分有错误。
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
int Wins = 0;
int Loses = 0;
int Draws = 0;
System.out.println("To choose player type Random or Simple");
String ChoosePlayer = scan.nextLine();
System.out.println("Please enter the number of rounds you want to play:");
int i = scan.nextInt();
int Rounds = 0;
while(Rounds < i){
NCGridV3 theGrid = new NCGridV3(gridSize, gridSize);
GameRunnerV3 theGame = new GameRunnerV3();
Scanner sc = new Scanner(System.in); // only needed if we include human players
HumanPlayer p1 = new HumanPlayer(sc, theGame);
if(ChoosePlayer == "Simple"){
SimpleComputerPlayer p2 = new SimpleComputerPlayer();
p2.setMySymbol(SquareStatus.NOUGHT);
}
else if(ChoosePlayer == "Random"){
RandomComputerPlayer p2 = new RandomComputerPlayer();
p2.setMySymbol(SquareStatus.NOUGHT);
}
p1.setMySymbol(SquareStatus.CROSS);
System.out.println(INITIAL_INSTRUCTIONS);
NCPlayer nextToPlay = p1; // arbitrary decision that p1 goes first
while (theGrid.getGameStatus() == GameStatus.STILLPLAYING)
{
GridCoordinate nextMove = nextToPlay.getNextMove(theGrid) ;
try
{
theGrid.setSquareStatus(nextMove.getRow(), nextMove.getCol(), nextToPlay.getMySymbol());
}
catch (outOfRangeError e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// take turns
if(nextToPlay == p1)
nextToPlay = p2; // possible problem here
else
nextToPlay = p1;
为 RandomComputerPlayer 和 SimpleComputerPlayer 创建一个公共接口/超类,并只在 if/else 块之外定义变量:
ComputerPlayer p2;
if(......) {
p2 = new SimpleComputerPlayer();
} else {
p2 = new RandomComputerPlayer();
}
您正在使用两个不同的 类 来代表 'p2' 玩家。我建议如下:
首先,创建一个 abstract class ComputerPlayer
然后,将 SimpleComputerPlayer
和 RandomComputerPlayer
更改为扩展 ComputerPlayer
。
然后,在您的 if 语句中:
使用ComputerPlayer p2 = new SimpleComputerPlayer();
或ComputerPlayer p2 = new SimpleComputerPlayer();
将每个播放器 类 中的通用代码放入 ComputerPlayer
if(ChoosePlayer == "Random"){
RandomComputerPlayer p2 = new RandomComputerPlayer();
p2.setMySymbol(SquareStatus.NOUGHT);
}
问题是您在 if
指令块中定义了 p2
。
变量在定义后可用,在定义它们的块内。一旦编译器编译了该指令块之外的代码,就不再定义 p2
。
所以,只需在共享它的块中定义 p2
(通常是方法体或作为 class 的属性)并在那里使用它。当然,变量的类型必须允许分配任何可能的值(在这个例子中,它必须是 superclass/interface SimpleComputerPlayer
和 RandomComputerPlayer
extend/implement 来自.
ComputerPlayer p2 = null; <---
if (ChoosePlayer.equals("Simple")) {
p2 = new SimpleComputerPlayer();
} else if (ChoosePlayer.equals("Random")){{
p2 = new RandomComputerPlayer();
}
请注意,您应该始终为 p2 赋值;否则,如果您尝试在表达式中使用它,编译器将导致错误,因为它不允许在表达式中使用未初始化的值,并且不清楚该值是否已初始化(如果 ChoosePlayer
既不是 Simple
也不是 Random
)
此外,检查在 Java 中命名变量的正确方法以及如何执行字符串(和其他对象)比较...