Unity3D (C#) で AI を使用して Connect Four ゲームを開発しています。これには、この (ドイツ語) Pseudocodeによる MiniMax アルゴリズムを使用します。
AIはまだかなり悪いプレイをしています。空いているフィールドは 3 つしかありませんが、連続して 4 つでも取得しようとします。AI は常に列を通過し、必要な場合にのみブロックします。残念ながら、常にブロックされるわけではありません。
問題をどこに隠すか?私は何を忘れましたか?
次の動きで誰も勝ったり負けたりしないときに、AI のランダムな動きを統合するにはどうすればよいですか。
ここに私のソースコードがあります:
ミニマックス深さ = 4
関数呼び出し: Max (minimaxDepth, fieldCopy);
int Max (int depth, int[,] fieldCopy)
{
int maxValue = -9999;
int moveValue;
bool winAI = false;
bool winHuman = false;
bool isStoneBelow = false;
for (int y = 0; y < 6; y++) {
for (int x = 0; x < 7; x++) {
if (y > 0) {
//is a stone under it?
if (fieldCopy [x, y - 1] == 1 || fieldCopy [x, y - 1] == 2) {
isStoneBelow = true;
} else {
isStoneBelow = false;
}
} else {
isStoneBelow = true;
}
// possible move?
if (fieldCopy [x, y] != 1 && fieldCopy [x, y] != 2 && isStoneBelow == true) {
isStoneBelow = false;
fieldCopy [x, y] = 2; //simulate move
winAI = false;
winHuman = false;
//Is there a winner?
if (CheckWin (x, y, 2, fieldCopy)) {
winAI = true;
winHuman = false;
}
//No more moves possible?
if (depth <= 1 || winAI == true) {
moveValue = evaluationFunction (winAI, winHuman); //evaluate the move
} else {
moveValue = Min (depth - 1, fieldCopy);
}
fieldCopy [x, y] = 0; //Reset simulated move
if (moveValue > maxValue) {
maxValue = moveValue;
if (depth == minimaxDepth) {
aiMoveX = x; // next move
}
}
}
}
}
return maxValue;
}
int Min (int depth, int[,] fieldCopy)
{
int minValue = 9999;
int moveValue;
bool winAI = false;
bool winHuman = false;
bool isStoneBelow = false;
bool loopBreak = false;
for (int y = 0; y < 6; y++) {
for (int x = 0; x < 7; x++) {
if (y > 0) {
//is a stone under it?
if (fieldCopy [x, y - 1] == 1 || fieldCopy [x, y - 1] == 2) {
isStoneBelow = true;
} else {
isStoneBelow = false;
}
} else {
isStoneBelow = true;
}
// possible move?
if (fieldCopy [x, y] != 1 && fieldCopy [x, y] != 2 && isStoneBelow == true) {
isStoneBelow = false;
fieldCopy [x, y] = 1; //simulate move
winHuman = false;
winAI = false;
//Is there a winner?
if (CheckWin (x, y, 1, fieldCopy)) {
winHuman = true;
winAI = false;
}
//No more moves possible?
if (depth <= 1 || winHuman == true) {
moveValue = evaluationFunction (winAI, winHuman); //evaluate the move
} else {
moveValue = Max (depth - 1, fieldCopy);
}
fieldCopy [x, y] = 0; //Reset simulated move
if (moveValue < minValue) {
minValue = moveValue;
}
}
}
}
return minValue;
}
int evaluationFunction (bool winAI, bool winHuman)
{
if (winAI) {
return 1;
} else if (winHuman) {
return -1;
} else {
return 0;
}
}
ご協力いただきありがとうございます!