4 連続 (または connect4 または connect 4) ゲームの MinMax アルゴリズムを実装しようとしています。
私はそれのアイデアを得たと思います、それは可能なボードのツリーを特定の深さまで構築し、それらを評価してスコアを返し、それらのスコアの最大値を取るだけです。
そのため、aiChooseCol()
呼び出して可能なすべての列のスコアをチェックMinMax()
し、最大スコアの列を返します。
よくわかりませんでしたが、これは正しい呼び出し方MinMax()
ですか?
チェックするのは正しいtemp = Math.Max(temp, 1000);
ですか?
私はまだヒューリスティック関数を作成していませんが、これは少なくとも勝者の列を認識して選択する必要がありますが、現在は左から最初の空いている列を選択するだけです...何が間違っているのかわかりません。
private int AiChooseCol()
{
int best = -1000;
int col=0;
for (int i = 0; i < m_Board.Cols; i++)
{
if (m_Board.CheckIfColHasRoom(i))
{
m_Board.FillSignInBoardAccordingToCol(i, m_Sign);
int t = MinMax(5, m_Board, board.GetOtherPlayerSign(m_Sign));
if (t > best)
{
best = t;
col = i;
}
m_Board.RemoveTopCoinFromCol(i);
}
}
return col;
}
private int MinMax(int Depth, board Board, char PlayerSign)
{
int temp=0;
if (Depth <= 0)
{
// return from heurisitic function
return temp;
}
char otherPlayerSign = board.GetOtherPlayerSign(PlayerSign);
char checkBoard = Board.CheckBoardForWin();
if (checkBoard == PlayerSign)
{
return 1000;
}
else if (checkBoard == otherPlayerSign)
{
return -1000;
}
else if (!Board.CheckIfBoardIsNotFull())
{
return 0; // tie
}
if (PlayerSign == m_Sign) // maximizing Player is myself
{
temp = -1000;
for (int i = 0; i < Board.Cols; i++)
{
if (Board.FillSignInBoardAccordingToCol(i, PlayerSign)) // so we don't open another branch in a full column
{
var v = MinMax(Depth - 1, Board, otherPlayerSign);
temp = Math.Max(temp, v);
Board.RemoveTopCoinFromCol(i);
}
}
}
else
{
temp = 1000;
for (int i = 0; i < Board.Cols; i++)
{
if (Board.FillSignInBoardAccordingToCol(i, PlayerSign)) // so we don't open another branch in a full column
{
var v = MinMax(Depth - 1, Board, otherPlayerSign);
temp = Math.Min(temp, v);
Board.RemoveTopCoinFromCol(i);
}
}
}
return temp;
}
いくつかのメモ:
FillSignInBoardAccordingToCol()
成功した場合はブール値を返します。
board
タイプには、実際のボードとプレーヤーのサインを含む配列char[,]
があります。
このコードは AI Player クラスにあります。