java - 如何在另一种方法中使用布尔值?
问题描述
我正在编写一个井字游戏,它似乎工作得很好。我现在要实现的是在游戏赢、输或平局后重新开始游戏的选项。为了获得想要的结果,我将整个 main 方法嵌入到一个 while 循环(“imGange”)中,当游戏结束时,循环应该设置为 false。为了实现这一点,我想我会在“checkWinner()”方法中的所有 if 语句中将布尔值“imGange”和“cool”设置为 false。一旦我输入“cool = false”,灯泡就会出现错误:“无法访问的代码”在第 136 行弹出,即使布尔值是为整个井字游戏类声明的。
我能做些什么呢?提前致谢!
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
public class TicTacToe {
static ArrayList<Integer> playerPositions = new ArrayList<Integer>();//List<Bitch> = List of Bitch, or List of Integers in diesem BSP
static ArrayList<Integer> cpuPositions = new ArrayList<Integer>();
public static void main (String[] args) {
//boolean imGange = true;
while(imGange) {
char[][] gameBoard = {{' ','|',' ', '|',' '}, {'-','+','-', '+','-'}, {' ','|',' ', '|',' '}, {'-', '+','-', '+','-'}, {' ','|',' ', '|',' '}};//2dimensionales Array mit jeder {} für eine "row" und die Symbole zwischendrin
printGameBoard(gameBoard);//damit keine rote Linie unter row : gameBoard
//boolean cool = true;
while(cool) {
Scanner scan = new Scanner(System.in);
System.out.println("Enter your placement (1-9):");
int pos = scan.nextInt();
while(playerPositions.contains(pos) || cpuPositions.contains(playerPositions)) {
System.out.println("Position taken! Enter another Position!");
pos = scan.nextInt();
}
//System.out.println(pos);
placePiece(gameBoard, pos, "player");
Random rand = new Random();
int cpuPos = rand.nextInt(9) +1;// 1-9
while(playerPositions.contains(cpuPos) || cpuPositions.contains(cpuPos)) {
cpuPos = rand.nextInt(9) +1;// 1-9
}
placePiece(gameBoard, cpuPos, "CPU");
printGameBoard(gameBoard);
String result = checkWinner();
System.out.println(result);
}
}
System.out.println("Wollen Sie eine weitere Runde spielen?");
Scanner s = new Scanner(System.in);
int eingabe = s.nextInt();
if(eingabe == 1) {
imGange = true;
}else if(eingabe == 0) {
System.exit(0);
}
}
public static void printGameBoard(char[][] gameBoard) {
for(char[] row : gameBoard) {
for(char c : row) {
System.out.print(c);
}
System.out.println();
}
}
public static void placePiece(char[][] gameBoard, int pos, String user) {//needs to know about gameBoard, which it is
char symbol = ' ';//default
if(user.equals("player")){//.equals used with Strings!
symbol = 'X';
playerPositions.add(pos);
}else if(user.equals("CPU")){
symbol = 'O';
cpuPositions.add(pos);
}
switch(pos) {
case 1:
gameBoard[0][0] = symbol;
break;
case 2:
gameBoard[0][2] = symbol;
break;
case 3:
gameBoard[0][4] = symbol;
break;
case 4:
gameBoard[2][0] = symbol;
break;
case 5:
gameBoard[2][2] = symbol;
break;
case 6:
gameBoard[2][4] = symbol;
break;
case 7:
gameBoard[4][0] = symbol;
break;
case 8:
gameBoard[4][2] = symbol;
break;
case 9:
gameBoard[4][4] = symbol;
break;
default:
break;
}
}
public static String checkWinner() {
List topRow = Arrays.asList(1, 2, 3);
List midRow = Arrays.asList(4, 5, 6);
List botRow = Arrays.asList(7, 8, 9);
List leftCol = Arrays.asList(1, 4, 7);
List midCol = Arrays.asList(2, 5, 8);
List rightCol = Arrays.asList(3, 6, 9);
List cross1 = Arrays.asList(1, 5, 9);
List cross2 = Arrays.asList(7, 5, 3);
List<List> winning = new ArrayList<List>();
winning.add(topRow);
winning.add(midRow);
winning.add(botRow);
winning.add(leftCol);
winning.add(midCol);
winning.add(rightCol);
winning.add(cross1);
winning.add(cross2);
for(List l : winning){//for each List inside of winning
if(playerPositions.containsAll(l)) {
return"Congratulations you won!";
cool = false;
}else if (cpuPositions.containsAll(l)) {
return"CPU wins!";
}else if(playerPositions.size() + cpuPositions.size() == 9) {
return"Tie!";
}
}
return "";
}
static boolean cool;
static boolean imGange;
}
解决方案
与其从方法返回或使用更多静态变量,不如在打印结果后要求继续。
while (true) {
...
String result = checkWinner();
System.out.println(result);
System.out.println("Play again? [y/N]");
char playAgain = scan.next();
if (playAgain != 'y' || playAgain != 'Y') break;
}
推荐阅读
- c# - 如何使用基于策略的身份验证在 .net 核心中注册多个策略
- vue.js - 如何使用单个按钮播放/停止由 v-for 在 Vuejs 中创建的多个视频子元素?
- android - 如何使用 Android Room Persistant Library 从没有主键的表中迁移?
- javascript - 将数组转换为打字稿中的索引对象
- c++ - 在 Delphi 中定义类,没有实现细节
- flutter - Listview 使应用程序 Flutter 崩溃
- c# - AppDomain.CurrentDomain.UnhandledException 未在异步方法中捕获异常
- reactjs - React - 如何在 Jest 中对 API 调用进行单元测试?
- oracle - 为什么我收到此错误:“状态:失败 - 测试失败:ORA-01017:用户名/密码无效;登录被拒绝”?
- python - 在用户定义的 Python 类中应该如何实现散列?