我的tic tac toe游戏完成了90%,并且有一种计算机AI,但结果并不太好。我正在寻找一种新的更容易的来源,为电脑在游戏板上移动产生一个点。
我需要这个计算机移动选择来选择一个位置,但也要确保该位置是免费可用的并且该位置没有'X'。关于如何让电脑选择一个地方的任何想法?
/* I have 3 other methods drawing the board, and determining a tie, a loss, and a win not shown here for simplicity*/
public static void main(String[] args) {
//Variable declaration
Scanner kbReader = new Scanner(System.in);
char[][] Board = new char[3][3];
String MenuInput;
int BoardOutput;
int UserSpotChoice;
int ComputerSpotChoice = 0;
int UserTurn = 0;
int Winner = 0;
Board[0][0] = '-';
Board[0][1] = '-';
Board[0][2] = '-';
Board[1][0] = '-';
Board[1][1] = '-';
Board[1][2] = '-';
Board[2][0] = '-';
Board[2][1] = '-';
Board[2][2] = '-';
//Welcome
System.out.println("Welcome to Alex Montague's Tic Tac Toe game!");
System.out.println("");
System.out.println("If you wish to play, type 'Play'");
System.out.println("If you wish to read the instructions, type 'Instructions'");
System.out.println("If you wish to exit, type 'Exit'");
MenuInput = kbReader.next();
do {
if (MenuInput.equals("Play") || MenuInput.equals("play")) {
while (!GameOver) {
System.out.println("\f");
System.out.println(" Tic Tac Toe");
BoardOutput = DrawBoard(Board);
System.out.println(" 1 2 3");
System.out.println(" 4 5 6");
System.out.println(" 7 8 9");
System.out.println("Please enter the number you would like to move your spot to");
UserSpotChoice = kbReader.nextInt();
if (UserSpotChoice == 1) Board[0][0] = 'X';
if (UserSpotChoice == 2) Board[0][1] = 'X';
if (UserSpotChoice == 3) Board[0][2] = 'X';
if (UserSpotChoice == 4) Board[1][0] = 'X';
if (UserSpotChoice == 5) Board[1][1] = 'X';
if (UserSpotChoice == 6) Board[1][2] = 'X';
if (UserSpotChoice == 7) Board[2][0] = 'X';
if (UserSpotChoice == 8) Board[2][1] = 'X';
if (UserSpotChoice == 9) Board[2][2] = 'X';
do {
ComputerSpotChoice = (int)(Math.random() * 9) + 1;
}
while (Board[(ComputerSpotChoice - 1) / 3][(ComputerSpotChoice - 1) % 3] != '-'); //HERE IS THE OLD COMPUTER SPOT GENERATION THAT DID NOT WORK
if (ComputerSpotChoice == 1) Board[0][0] = 'O';
if (ComputerSpotChoice == 2) Board[0][1] = 'O';
if (ComputerSpotChoice == 3) Board[0][2] = 'O';
if (ComputerSpotChoice == 4) Board[1][0] = 'O';
if (ComputerSpotChoice == 5) Board[1][1] = 'O';
if (ComputerSpotChoice == 6) Board[1][2] = 'O';
if (ComputerSpotChoice == 7) Board[2][0] = 'O';
if (ComputerSpotChoice == 8) Board[2][1] = 'O';
if (ComputerSpotChoice == 9) Board[2][2] = 'O';
Winner(Board);
Loser(Board);
Tie(Board);
} //While loop
//if (GameOver) System.exit (0) ;
} //If play
else if (MenuInput.equals("Instructions") || MenuInput.equals("instructions")) {
System.out.println("\f");
System.out.println("You will be playing the game of Tic Tac Toe against the computer.");
System.out.println("The object of this game is to get three of your own x's or o's in a line.");
System.out.println("You take turns placing the x's and o's and whoever gets three in a row first wins.");
System.out.println("Good Luck!");
System.out.println("");
System.out.println("If you wish to play, type 'Play'");
System.out.println("If you wish to exit, type 'Exit'");
MenuInput = kbReader.next();
} else if (MenuInput.equals("Exit") || MenuInput.equals("exit")) {
System.out.println("Thank you for using Alex Montague's Tic Tac Toe game!");
System.exit(0);
} else {
System.out.println("Sorry, that is not a valid choice.");
System.out.println("If you wish to play, type 'Play'");
System.out.println("If you wish to read the instructions, type 'Instructions'");
System.out.println("If you wish to exit, type 'Exit'");
MenuInput = kbReader.next();
}
} //do while
while (!MenuInput.equals("Instructions") || !MenuInput.equals("instructions") || !MenuInput.equals("Play") || !MenuInput.equals("play") || !MenuInput.equals("Exit") || !MenuInput.equals("exit"));
答案 0 :(得分:0)
创建方法public static boolean isSpotAvailable(int x, int y)
。在随机找到一个PC点后检查,如果有,请使用它,否则请选择一个新点。
答案 1 :(得分:0)
一种简单的方法可能是,对于您拥有的每个方格,您可以检查可以从该行创建的3个项目的行数。因此,例如,中间的正方形将产生4(因为您可以创建从中间传递的水平行,从中间和两个对角线传递的垂直行)。另一方面,边缘的正方形将产生2的值(因为你可以有1个垂直和1个水平)。
如果您希望采用更强大的方法,那么我认为推荐的方法是使用MiniMax Tree。这将允许您构建决策树,以便您的算法决定放置下一个部分的位置。可以找到这种tic tac toe方法的一个例子here。
答案 2 :(得分:0)
您可以使用HashSet对象跟踪索引。只要您可以成功地将1到9之间的位置添加到设置对象中,该位置就可用。另一种方法是使用ArrayDequeue对象。每次使用一个点,相关的点索引将被删除"如果已经出局,则计算机无法使用它。
/* For HashSet<Integer> object - Integer is an immutable wrapper class for int */
spotObj.add(spotLoc); // Returns falls if the spot already exists i.e. used
/* For ArrayDequeue<Integer> object */ - Implementation of Queue interface */
spotObj.remove(spotLoc); returns false if it is already removed i.e. used
希望这可以帮助您解决问题
答案 3 :(得分:0)
有一种简单的方法可以改善你的AI。
首先:检查电路板的当前状态并找到AI的所有可能移动(这意味着:找到所有空的字段)。
第二:找到赢得这场比赛的机会,这意味着你应该从我们的第一步模拟所有可能的动作,看看是否有任何一个让你赢得比赛。
- &GT;如果是这样的话:做那个动作!
- &GT;如果不是:随意移动。
通过这样做,您的AI已经得到改善。但是你可以通过使用一个简单的数据库来进一步发展。跟踪AI和敌人所做的所有动作。 每当你发现自己从现在开始随意移动的情况下,只要检查你的数据库,如果你曾经遇到过这种情况,那么结果如何。根据你的数据库中前一个游戏的结果,再次做同样的动作或尝试不同的东西(通过随机移动)可能是个好主意。 只需将每个游戏及其结果附加到此数据库中,您就会看到人工智能将如何在游戏中变得更好。
如果您需要任何代码示例,请告诉我。
问候蒂姆