我正在为计算机和用户之间的Tic-Tac-Toe游戏编写代码。要进行移动,将提供未在板上占用的点列表作为参数,对于用户而言,该列表实际上仅用于比较输入是否在列表中。如果是这样,那就构成了一项法律举措。
这是我的代码。它一直说新的举动不包含在列表中,我不知道为什么。我在这里搜索了数据库中的类似问题,发现了一些相关但不是决定性的问题。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class UserTTTPlayer implements TicTacToePlayer{
@Override
public int[] makeMove(ArrayList<int []> unusedMoves) {
Scanner in = new Scanner (System.in);
System.out.println("Your move, user?");
String input = in.nextLine();
int [] move = checkInput(input, unusedMoves);
while (move == null){
input = in.nextLine();
move = checkInput(input, unusedMoves);
}
return move;
}
private int [] checkInput(String input, ArrayList<int []> unusedMoves){
System.out.println("Unused moves: ");
for (int [] move: unusedMoves)
System.out.println(Arrays.toString(move));
//error checking for the length of the input
if (input.length() < 1 || input.length() > 2){
System.out.println("Invalid input. Please try again.");
return null;
}
else{
//convert the input from string to int
int col = input.charAt(0) - 'a';
int row = input.charAt(1) - '0';
int [] move = {row, col};
System.out.println("Intended move: " + Arrays.toString(move));
System.out.println(unusedMoves.contains(move));
//error checking for the bounds of the board
if (col > 3 || col < 0 || row > 3 || col < 0){
System.out.println("Invalid input.");
return null;
}
//error checking for if the space is available
else if (!unusedMoves.contains(move)){
System.out.println("That space is already occupied.");
return null;
}
return move;
}
}
}
这是它的输出。我认为,董事会和其他印刷是来自不同的阶层,但与问题无关。我打印出列表,表明它有新动作,但仍包含返回false。
You go first. You will be X's.
a b c
0 - - -
1 - - -
2 - - -
Your move, user?
a0
Unused moves:
[0, 0]
[0, 1]
[0, 2]
[1, 0]
[1, 1]
[1, 2]
[2, 0]
[2, 1]
[2, 2]
Intended move: [0, 0]
false
That space is already occupied.
任何帮助将不胜感激。
答案 0 :(得分:2)
正如评论所解释的那样,unusedMoves.contains(move)
无法正常工作。 .contains
方法使用列表中对象的.equals
方法来检查给定值是否等于其中一个元素。但是,.equals
数组方法不会比较元素,只使用==
比较数组的标识。
例如:
int[] arr = {1, 2};
// prints false, as the array in the list is not *identical*
System.out.println(Arrays.asList(new int[]{1, 2}).contains(arr));
// prints true, as the array in the list *is* identical
System.out.println(Arrays.asList(arr).contains(arr));
考虑这个辅助方法:
private boolean contains(List<int[]> list, int[] arr) {
return list.stream().anyMatch(x -> Arrays.equals(x, arr));
}
使用此辅助方法,您可以将unusedMoves.contains(move)
替换为contains(unusedMoves, move)
,它应该按预期工作。