編寫五子棋程式中與機器對奕的問題

  • 作者:由 匿名使用者 發表于 體育
  • 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];

}

}

}

}

Top