Java 20: невозможно объявить глобальную переменную со значением «статическая».
Я пытаюсь следовать руководству YouTube по созданию игры в крестики-нолики.
Я следую инструкциям и пытаюсь создатьplayerPositions
иcomputerPositions
как ArrayLists. Они должны быть общедоступными/глобальными/статическими, чтобы методы могли их читать. Но если я попытаюсь добавить «public», «static», «protected» и т. д. перед ArrayList, это выдаст ошибку и предложит удалить «public» и т. д.
Я думаю, что это ошибка специально для Java 17–Java 20. В других версиях этой ошибки нет.
Я указал, где объявлены списки ArrayLists и где они используются.
package youtube.alexlee;
import java.util.*;
public class TicTacToe {
public static void main(String[] args) {
// ***** ⬇️⬇️⬇️⬇️
ArrayList<Integer> playerPositions = new ArrayList<Integer>();
ArrayList<Integer> computerPositions = new ArrayList<Integer>();
char[][] gameBoard = {
{'1', '|', '2', '|', '3' },
{'-', '+', '-', '+', '-' },
{'4', '|', '5', '|', '6' },
{'-', '+', '-', '+', '-' },
{'7', '|', '8', '|', '9' }
};
while (true) {
Scanner scan = new Scanner(System.in);
System.out.println("Enter number (1-9) to place marker.");
int playerPos = scan.nextInt();
System.out.println("You selected: " + playerPos);
placePiece(gameBoard, playerPos, "player");
Random rand = new Random();
int compPos = rand.nextInt(9) + 1;
placePiece(gameBoard, compPos, "computer");
System.out.println("Computer selected: " + compPos);
printGameBoard(gameBoard);
String winning = checkWinner();
System.out.println(winning);
if (winning.equals("Congratulations, you win!") || winning.equals("Sorry! Computer wins!")){
System.exit(0);
}
}
}
private static void placePiece(char[][] gameBoard, int pos, String user) {
char symbol = ' ';
if (user.equals("player")) {
symbol = 'X';
// ***** ⬇️⬇️⬇️⬇️
playerPositions.add(pos);
} else if (user.equals("computer")) {
symbol = 'O';
// ***** ⬇️⬇️⬇️⬇️
computerPositions.add(pos);
}
switch (pos) {
case 1 -> gameBoard[0][0] = symbol;
case 2 -> gameBoard[0][2] = symbol;
case 3 -> gameBoard[0][4] = symbol;
case 4 -> gameBoard[2][0] = symbol;
case 5 -> gameBoard[2][2] = symbol;
case 6 -> gameBoard[2][4] = symbol;
case 7 -> gameBoard[4][0] = symbol;
case 8 -> gameBoard[4][2] = symbol;
case 9 -> gameBoard[4][4] = symbol;
}
}
private static void printGameBoard(char[][] gameBoard) {
for (char[] row : gameBoard) {
for (char c : row) {
System.out.print(c);
}
System.out.println();
}
}
public static String checkWinner() {
List<Integer> topRow = Arrays.asList(1, 2, 3);
List<Integer> middleRow = Arrays.asList(4, 5, 6);
List<Integer> bottomRow = Arrays.asList(7, 8, 9);
List<Integer> leftCol = Arrays.asList(1, 4, 7);
List<Integer> middleCol = Arrays.asList(2, 5, 8);
List<Integer> rightCol = Arrays.asList(3, 6, 9);
List<Integer> cross1 = Arrays.asList(1, 5, 9);
List<Integer> cross2 = Arrays.asList(7, 5, 3);
List<List> winningConditions = new ArrayList<List>();
winningConditions.add(topRow);
winningConditions.add(middleRow);
winningConditions.add(bottomRow);
winningConditions.add(leftCol);
winningConditions.add(middleCol);
winningConditions.add(rightCol);
winningConditions.add(cross1);
winningConditions.add(cross2);
for (List l : winningConditions){
// ***** ⬇️⬇️⬇️⬇️
if(playerPositions.containsAll(l)){
return "Congratulations, you win!";
}
// ***** ⬇️⬇️⬇️⬇️
else if(computerPositions.contains(l)){
return "Sorry! Computer wins!";
}
// ***** ⬇️⬇️⬇️⬇️
else if(playerPositions.size() + computerPositions.size() == 9){
return "It's a tie!";
}
}
return "";
}
}
Я ожидал использоватьstatic
как (например)static ArrayList<Integer> playerPositions = new ArrayList<Integer>();
но это приводит к ошибке. я тоже попробовалpublic static
иprotected static
среди других комбинаций.