java编写Nim游戏AI算法
1、初始化挑战者名字,石子数量n以及每次能拿走的石子数量上限m

2、轮到人拿石子,如果拿走后,没有剩余石子,则电脑获胜,若有剩余石子,则轮到电脑。

3、这一步是该程序的核心,也就是确保电脑获胜的ai算法,如果n % (m + 1) =1,则随机取,等待人犯错,直到剩余石子数remain % (n+1) 不为1为止,如果此时 remain % (n+1) = 0则电脑取m个石子,即不为0也不为1则取remain % (n + 1) - 1个石子

4、从运行结果来分析可以得出,只有人没有按必胜测路犯一次错误,则电脑就必胜了。


5、最后输入N便可结束游戏,否则继续游戏。

6、全部代码:
import java.util.Random;
import java.util.Scanner;
public class NimGame {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
int stones = 0;
int upperBound = 0;
System.out.print("Please enter your name:");
String name = scn.nextLine();
while (true) {
System.out.print("Please enter upper bound of "
+ "stone removal(m):");
upperBound = scn.nextInt();
scn.nextLine();
System.out.print("Please enter initial number "
+ "of stones:(n)");
stones = scn.nextInt();
scn.nextLine();
while (stones != 0) {
System.out.print(stones + " stones left:");
for (int i = 0; i < stones; i++) {
System.out.print(" *");
}
System.out.println();
System.out.print(name + "'s turn, remove how many?");
int remove = scn.nextInt();
scn.nextLine();
if (stones - remove == 0) {
System.out.println("Game Over");
System.out.println("computer wins!");
System.out.println();
break;
}
stones -= remove;
System.out.print(stones + " stones left:");
for (int i = 0; i < stones; i++) {
System.out.print(" *");
}
System.out.print("computer's turn - remove ");
int computerRemove;
Random random = new Random();
if (stones % (upperBound + 1) == 1) {
if (stones > upperBound)
computerRemove = random.nextInt(upperBound) + 1;
else computerRemove = random.nextInt(stones) + 1;
} else {
if (stones % (upperBound + 1) == 0)
computerRemove = upperBound;
else computerRemove = stones % (upperBound + 1) - 1;
}
System.out.println(computerRemove);
if (stones - computerRemove == 0) {
System.out.println("Game Over");
System.out.println(name + " wins!");
System.out.println();
break;
}
stones -= computerRemove;
}
System.out.print("Do you want to play again (Y/N):");
String cmd = scn.nextLine();
if ("N".equals(cmd)) {
scn.close();
break;
}
}
}
}