人工智慧實現簡單的五子棋程式

2021-08-02 10:23:08 字數 3964 閱讀 8073

我這個程式在qq五子棋上實驗了一下,結果是黑棋先手全勝,白棋后手的勝率卻慘不忍睹,原因有下:

1、五子棋的先手是有優勢的,所以職業比賽裡都會有禁手來實現公平

2、水平有限,對局面的評估只有一小部分

主要思路就是博弈樹,程式向前看一步,對對手可能的走法進行評估,評估的策略主要有兩條:

1、掃瞄整個棋盤,判斷出現了多少個三子成線並且兩端未堵的情況,對方每出現一種該情況,評估大幅下降,因為這幾乎是必堵的,反之評估大幅上公升,程式追求的就是這種情況;

2、判斷出現了多少個兩子成線的情況,這種情況的評估值比上一種要少

此外還有乙個幾乎是沒用的判斷,是我從九宮格的評估方案上「拿」過來的,用兩種顏色的棋子分別填滿棋盤,判斷出現了多少個五子成龍的情況,不過很雞肋

#include #include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f

using namespace std;

int changex=8,changey=8;

struct node

;void mcopy(int des[16][16],int src[16][16])

bool check(int flag,int tmp[16][16])

for(int i=1; i<=10; ++i) //垂直方向

for(int j=1; j<=15; ++j)

for(int i=1; i<=10; ++i) //正斜方向

for(int j=1; j<=10; ++j)

for(int i=1; i<=10; ++i) //反斜方向

for(int j=15; j>=6; --j)

//棋譜2:最簡單的五子成型

for(int i=1; i<=15; ++i) //水平方向

for(int j=1; j<=11; ++j)

for(int i=1; i<=11; ++i) //垂直方向

for(int j=1; j<=15; ++j)

for(int i=1; i<=11; ++i) //正斜方向

for(int j=1; j<=11; ++j)

for(int i=1; i<=11; ++i) //反斜方向

for(int j=15; j>=5; --j)

return false;

}int h(int flag,int a[16][16])

for(int i=1; i<=11; ++i) //垂直方向

for(int j=1; j<=15; ++j)

for(int i=1; i<=11; ++i) //正斜方向

for(int j=1; j<=11; ++j)

for(int i=1; i<=11; ++i) //反斜方向

for(int j=15; j>=5; --j)

//出現未堵住的兩子,評價次之

for(int i=1; i<=15; ++i) //水平方向

for(int j=1; j<=12; ++j)

for(int i=1; i<=12; ++i) //垂直方向

for(int j=1; j<=15; ++j)

for(int i=1; i<=12; ++i) //正斜方向

for(int j=1; j<=12; ++j)

for(int i=1; i<=12; ++i) //反斜方向

for(int j=15; j>=4; --j)

/*if(val!=0)

*/for(int i=1; i<=15; ++i)

for(int j=1; j<=15; ++j)

if(tmp[i][j]==8)

tmp[i][j]=flag;

int sum1=0;

for(int i=1; i<=15; ++i) //水平方向

for(int j=1; j<=11; ++j)

if(tmp[i][j]==flag&&tmp[i][j+1]==flag&&tmp[i][j+2]==flag&&tmp[i][j+3]==flag&&tmp[i][j+4]==flag)

sum1++;

for(int i=1; i<=11; ++i) //垂直方向

for(int j=1; j<=15; ++j)

if(tmp[i][j]==flag&&tmp[i+1][j]==flag&&tmp[i+2][j]==flag&&tmp[i+3][j]==flag&&tmp[i+4][j]==flag)

sum1++;

for(int i=1; i<=11; ++i) //正斜方向

for(int j=1; j<=11; ++j)

if(tmp[i][j]==flag&&tmp[i+1][j+1]==flag&&tmp[i+2][j+2]==flag&&tmp[i+3][j+3]==flag&&tmp[i+4][j+4]==flag)

sum1++;

for(int i=1; i<=11; ++i) //反斜方向

for(int j=15; j>=5; --j)

if(tmp[i][j]==flag&&tmp[i+1][j-1]==flag&&tmp[i+2][j-2]==flag&&tmp[i+3][j-3]==flag&&tmp[i+4][j-4]==flag)

sum1++;

mcopy(tmp,a);

for(int i=1; i<=15; ++i)

for(int j=1; j<=15; ++j)

if(tmp[i][j]==8)

tmp[i][j]=fflag;

int sum0=0;

for(int i=1; i<=15; ++i) //水平方向

for(int j=1; j<=11; ++j)

if(tmp[i][j]==fflag&&tmp[i][j+1]==fflag&&tmp[i][j+2]==fflag&&tmp[i][j+3]==fflag&&tmp[i][j+4]==fflag)

sum0++;

for(int i=1; i<=11; ++i) //垂直方向

for(int j=1; j<=15; ++j)

if(tmp[i][j]==fflag&&tmp[i+1][j]==fflag&&tmp[i+2][j]==fflag&&tmp[i+3][j]==fflag&&tmp[i+4][j]==fflag)

sum0++;

for(int i=1; i<=11; ++i) //正斜方向

for(int j=1; j<=11; ++j)

if(tmp[i][j]==fflag&&tmp[i+1][j+1]==fflag&&tmp[i+2][j+2]==fflag&&tmp[i+3][j+3]==fflag&&tmp[i+4][j+4]==fflag)

sum0++;

for(int i=1; i<=11; ++i) //反斜方向

for(int j=15; j>=5; --j)

if(tmp[i][j]==fflag&&tmp[i+1][j-1]==fflag&&tmp[i+2][j-2]==fflag&&tmp[i+3][j-3]==fflag&&tmp[i+4][j-4]==fflag)

sum0++;

return val+sum1-sum0;

}int move1(int a[16][16])

cout<>myturn;

while(1)

else

solve1(node);

}else

show(node.a);

flag=0;

}else

else

solve0(node);

}else

show(node.a);

flag=1;}}

return 0;

}

五子棋(人工智慧)

五子棋 人人對戰 人機對戰 include include 字元陣列的函式定義的標頭檔案 include standard library標準庫標頭檔案 define kong 0 define wanjia 1 define diannao 2 空位置設為0 玩家下的位置設為1 電腦下的位置設為2...

人工智慧五子棋實現原理

關於棋盤棋子的實現邏輯我就不多說了,大家可以看原始碼,並不複雜,說說ai部分的實現吧 我的實現思路是 1.走對自己獲得勝利最有利的點 說白了就是最接近5子連線的點 2.堵對對方獲得勝利最有利的點 說白了就是堵對方的棋子 做到這兩步就能實現乙個初級階段的人工智慧了。那麼接下來就講講關於計算獲得勝利最有...

五子棋的人工智慧演算法

以前曾研究過五子棋的人工智慧演算法,這篇文章就是講的實現與原理。當然也只是做了最簡單的研究,人工智慧是個高深的學問,我基本上不懂,這裡的實現也只是憑自己的感覺來寫的,程式也不是我寫的,但是原理就是這樣。我相信還有高手,我的文章也只能提供給一些初學者看看了。電腦下子實際上是分兩個步驟的,第乙個步驟是盡...