4行(またはconnect4または4つ)のゲームでMinMaxアルゴリズムを実装しようとしています。4行(connect4)ゲームで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()
。
タイプはchar[,]
の配列を持ち、実際のボードとプレーヤーの兆候があります。
このコードはAI Playerクラスにあります。
'AiChooseCol'では' iMix'を 'MinMax'に渡していないので、どの列に評価を求めているのかはどうやって分かりますか? – juharr
ああ、おそらく、私は 'MinMax()'を呼び出す前に既に 'i'列にコインを置いておくべきでしょうか? @juharr – shinzou
ええ、私はそれがリファクタリングできることを知っています。 'AiChooseCol'の修正ではまだ動作しません。 @juharr – shinzou