我正在开展一个项目,在这个项目中我给了4x4 tic tac toe的一段代码但是必须在其中实现我自己的AI,它可以击败预先安装的AI。 2 AI面临的简单随机。随机只是在一个正方形上随机插入X&,简单的播放器从左上方开始,并向右迭代1平方。因此,为了拦截简单的玩家,我已将我的第一个O放在第一行,并且基本上做了一条垂直线,直到连续4个为止。但是,随机播放器可以拦截我的线路,然后我的电脑玩家随机将O形图放在空白方块中进行绘制。但是,由于我的播放器停止转弯可能因为它不知道去哪里,所以这种方法不能正常工作。如果有人能够纠正我的概念,我将不胜感激。
这只是我的代码的一部分
package noughtsAndCrossesV3;
import ncErrors.outOfRangeError;
import java.util.ArrayList;
import java.util.Random;
public class MyCompPlayer extends GenericPlayer implements NCPlayer {
Random theGenerator;
public MyCompPlayer()
{
super(); // no further initialisation required
theGenerator = new Random();
}
// NCGrid is the grid the class that displays the grid and rules to win
@Override
public GridCoordinate getNextMove(NCGridV3 currentGrid) {
int Row;
int Col;
GridCoordinate theSquare = null;
int randomSelection;
ArrayList<GridCoordinate> freeSquares = new ArrayList<GridCoordinate>(); // array finding free squares
//iterates through row and column
for (Row = 0; (theSquare == null) && (Row < currentGrid.getGridRowDimension()); Row++){
for (Col = 0; (theSquare == null) && (Col < currentGrid.getGridColDimension()); Col++){
try{
//If last column is empty, then draw a row of O's downwards in a straight line.
if(currentGrid.getSquareStatus(Row,3)==NCGridV3.SquareStatus.EMPTY){
theSquare = new GridCoordinate(Row,3);
return theSquare;
}
//If there is a nought then randomize movement. This doesnt work yet.
else if(currentGrid.getSquareStatus(Row,3)==NCGridV3.SquareStatus.NOUGHT)
freeSquares.add(new GridCoordinate(Row, Col));
// adds free sqaures to array and plots coordinate there but doesnt work.
}
catch (outOfRangeError e)
{
}
}
}
randomSelection = theGenerator.nextInt(freeSquares.size());
return freeSquares.get(randomSelection);
}
}
答案 0 :(得分:0)
在一天结束的时候,如果你使用一个简单的计数器AI,随机的AI总会偶然发现毁了你的一天。我认为这个想法是创建一种算法,将发生这种情况的可能性降至最小。也许不是只是在一个专栏中向下走,你会继续朝着不同的方向前进,并始终优先考虑你上次的方向,除非不可能。
在一天结束时,游戏是确定性的,并且选项的数量并不像国际象棋那样疯狂,你可以编写一个算法,在给定足够的运行时间的情况下获得所有时间。我建议你看看minimax方法,这是为国际象棋,西洋棋棋子或者tic tac toe等游戏编写你的第一个AI的经典方法。