編寫五子棋程式中與機器對奕的問題
- 2021-08-11
只實現玩家之間下棋,一直沒想到怎麼實現人機對奕,能給個思路否?不用太詳細,只要演算法就行。
在計算中,首先需要計算整個棋盤的權值,示例程式碼如下所示。
Code
public void Down(int[,] board)
{
int[,] q = new int[15, 15];
for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 15; j++)
{
if (board[i, j] != -1)//如果這個位置沒有子的話
{
q[i, j] = -1;//權值為-1即可咯
}
else
{
q[i, j] = FindQz(i, j, board);//找權值
}
}
}
ForMax(q);
}
上述程式碼使用了FindQz方法尋找權值,示例程式碼如下所示。
Code
public int FindQz(int x,int y,int[,] board)
{
int qz = 0;
int w1 = 10000000;
int w2 = 50000;
int w3 = 10000;
int w4 = 5000;
int w5 = 1000;
int w6 = 500;
int w7 = 100;
int w8 = 50;
int w9 = -100000000;
int[] move = new int[4];
if (mifis)
{
board[x, y] = 0;
}
else
{
board[x, y] = 1;
}
move[0] = Rules。X1(x, y, board);
move[1] = Rules。X2(x, y, board);
move[2] = Rules。X3(x, y, board);
move[3] = Rules。X4(x, y, board);
if (x == 7 && y == 7)
{
qz += 1;
}
for (int i = 0; i < 4; i++)
{
if (Abs(move[i]) == 5)
{
qz += w1;
}
else if (move[i] == 4)
{
qz += w3;
}
else if (move[i] == 3)
{
qz += w5;
}
else if (move[i] == 2)
{
qz += w7;
}
if (mifis)
{
if (Rules。Fails(move, board[x, y]))
{
qz += w9;
}
}
}
if (mifis)
{
board[x, y] = 1;
}
else
{
board[x, y] = 0;
}
move[0] = Rules。X1(x, y, board);
move[1] = Rules。X2(x, y, board);
move[2] = Rules。X3(x, y, board);
move[3] = Rules。X4(x, y, board);
for (int i = 0; i < 4; i++)
{
if (Abs(move[i]) == 5)
{
qz += w2;
}
else if (move[i] == 4)
{
qz += w4;
}
else if (move[i] == 3)
{
qz += w6;
}
else if (move[i] == 2)
{
qz += w8;
}
}
board[x, y] = -1;
return qz;
}
上述程式碼就不詳細解釋了,如果有不會的朋友可以逐步執行並檢視區域性變數的值。其中,Rules中包括計算四個方向的連子的方法,其中一個方法的程式碼如下所示。
Code
//左右方向
public static int X1(int x, int y, int[,] board)
{
int flag=0;
int count=1;
int i = x + 1;
while(i<15)
{
if (board[x, y] == board[i, y])
{
count++;
i++;
}
else
{
break;
}
}
if (i == 15)
{
flag++;
}
else
{
if (board[i, y] != -1)
{
flag++;
}
}
i = x - 1;
while (i > 0)
{
if (board[x, y] == board[i, y])
{
count++;
i——;
}
else
{
break;
}
}
if (i == -1)
{
flag++;
}
else
{
if (board[i, y] != -1)
{
flag++;
}
}
if (flag == 2)
{
return -count;
}
else
{
if (flag == 1 && count == 3)
{
return -count;
}
else
{
return count;
}
}
}
需要找四個方向,就需要四個方法進行權值的計算,同樣在程式碼中可以看到,這裡就不重複張貼。計算了整個棋盤的的權值之後,還需要找到最大的權值點,示例程式碼如下所示。
Code
public void ForMax(int[,] q)
{
int max=0;
for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 15; j++)
{
if (q[i, j] > max)
{
X = i;
Y = j;
max = q[i, j];
}
}
}
}
下一篇:存的四字詞語