我正在针对计算机制作一个玩家Tic-Tac-Toe游戏,并且想知道我如何能够在数组中选择一个假的随机布尔值,其中某些值为true且某些值为false。我知道使用Math.random()但是我想知道如果所选元素为true而不是false,我将如何能够选择不同的随机元素?或者,如果有人知道更好的方法,而不是使用Math.random()。
答案 0 :(得分:1)
在不改变代码结构的情况下,一种可能的方法是收集数组中错误值的所有索引,然后随机选择其中一个索引。
这样的事情:
Random r = new Random();
boolean[] values = { true, false, false, true, false, true, false, false, false };
int[] falseIndices = IntStream.range(0, values.length)
.filter(i -> !values[i])
.toArray();
System.out.println(Arrays.toString(falseIndices));
int randomFalseIndex = falseIndices[r.nextInt(falseIndices.length)];
System.out.format("%s: %s%n", randomFalseIndex, values[randomFalseIndex]);
答案 1 :(得分:0)
你有一个布尔值数组,我假设索引代表你游戏中的某些东西。如果你需要从数组中随机检索一个布尔值(我假设你的意思是你想要布尔值的索引),那么使用Math.random()
并继续选择直到得到假值变得低效。相反,考虑重新设计您的问题以拥有2个整数数组,一个表示真值,另一个表示假值。您可以将int 3存储在false数组中,而不是在索引3处使用布尔值false。一旦像这样重新设计,要访问一个随机的false元素,你只需将Math.random()
一次用到你的错误的int数组上。
或者,您可以只使用一个额外的int数组来跟踪false值的索引,您可以使用Math.random()
将其索引以获取随机的false值。
答案 2 :(得分:0)
我已经为一个很好的tictactoe实现实现了一个小片段,请忽略我之前的实现,因为它非常有问题。在这里你可以设置起点&通过适当的枚举,您可以更恰当地遵循董事会。这个答案更像是类似Java的IMO;
public static void main(String[] args) throws Exception {
Boolean aiStarts = true;
Integer size = 9, step = 0;
List<Spot> board = new ArrayList<>(Collections.nCopies(size, Spot.E));
do {
int i;
do {
i = (int)(Math.random() * size);
} while (!Spot.E.equals(board.get(i)));
board.set(i, step++ % 2 == (aiStarts ? 0 : 1) ? Spot.X : Spot.O);
} while (board.stream().filter(s -> Spot.E.equals(s)).count() > 0);
System.out.println(board.subList(0, 3));
System.out.println(board.subList(3, 6));
System.out.println(board.subList(6, 9));
}
enum Spot {
X, O, E;
}
AI使用X
而用户使用“O&#39;”时,可以用用户输入替换自动插入逻辑。这打印出来,作为一个例子;
[O, X, O]
[X, X, X]
[O, X, O]
答案 3 :(得分:0)