我這個程式在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.堵對對方獲得勝利最有利的點 說白了就是堵對方的棋子 做到這兩步就能實現乙個初級階段的人工智慧了。那麼接下來就講講關於計算獲得勝利最有...
五子棋的人工智慧演算法
以前曾研究過五子棋的人工智慧演算法,這篇文章就是講的實現與原理。當然也只是做了最簡單的研究,人工智慧是個高深的學問,我基本上不懂,這裡的實現也只是憑自己的感覺來寫的,程式也不是我寫的,但是原理就是這樣。我相信還有高手,我的文章也只能提供給一些初學者看看了。電腦下子實際上是分兩個步驟的,第乙個步驟是盡...