C 五子棋演算法Ai 簡單的電腦智慧型博弈

2021-09-30 14:04:37 字數 2437 閱讀 3601

111,部落格開通有一段時間了,因為太low所以一直沒敢寫部落格,今天再次鼓足勇氣把幾個月前的五子棋ai與大家分享一下,講得不好請見諒(0v0)。

首先,我們要知道五子棋是兩個人之間的博弈,雙方輪流下子,肯定每次要將子下到最有用處的地方才是最有利於自己的(感覺說了堆廢話。。)。我們將五子棋棋盤看成乙個矩陣,用二維陣列表示。然後我們可以在人落子後對場上所有空點進行評分,然後將電腦的棋子下在分最高的空點上。這就是五子棋ai,,簡單吧。。

但是,怎樣對空點進行評分呢?這才是關鍵所在,不同的評分規則會製造出效能不同的ai,就像百萬跑車與幾萬的麵包車一樣,可能別人寫的ai會完爆你的ai(感覺又說了堆廢話。。)。評分規則因人而異,我來講將我的方法吧。

對每個空點分別搜4個方向(為什麼不是8個?因為左上與右下在同一直線上,最好合併算)。對於每個方向,我們可以根據自己平時玩五子棋的經驗,來對這行(只需看這行上以這個空點為中心的臨近幾點即可)可能的每種局勢給個分值(當然這局勢依然有太多種,為了偷懶我們可以將局勢差不多的當成一種來看 ),然後將4個方向上的評分加起來就是這個空點的總分了。是不是越來越糊塗了?可能**比較直接。codeblocks可以執行,執行不了的將標頭檔案該下就可以了。

(還有那種比較正宗的極大極小值博弈演算法,本人能力有限,感興趣的自行找度娘0.0.....)

#includeusing namespace std;

int ch[20][20],score[20][20];

int fang_a[4]=;

int fang_b[4]=;

struct sdian

};sdian buzhou[301];

int sign_buzhou_num;

sdian dian[301];

void chessscore()

,sign_a=1;

int b[4]=,sign_b=2;

a[1]=1;

int sign_qian=5,sign_hou=-5;

///對玩家落點評分

for (k = 1; k <= 4; k++)

///空位

else ///敵方

else ///越界

}sign_a=1;sign_b=1;

for (k = -1; k >= -4; k--)

///空位

else ///敵方

else ///越界

}if(sign_qian-sign_hou>5)

else if(a[1]==3)

else if(a[1]==2)

else

}///對電腦落點評分

a[0]=a[1]=a[2]=0;sign_a=1;

b[0]=b[1]=b[2]=b[3]=0;sign_b=2;

a[1]=1;

sign_qian=5,sign_hou=-5;

for (k = 1; k <= 4; k++)

///空位

else ///敵方

else ///越界

}sign_a=1;sign_b=1;

for (k = -1; k >= -4; k--)

///空位

else ///敵方

else ///越界

}if(sign_qian-sign_hou>5)

else if(a[1]==3)

else if(a[1]==2)

else}}

}void print()

}sdian sign_rand=dian[rand()%sign_num];

aa=sign_rand.a;

bb=sign_rand.b;

ch[aa][bb]=1;

buzhou[++sign_buzhou_num]=sdian(aa,bb);

}}int panduan(int a,int b)

for(int k=-1;k>=-4;k--)

if(num>=5)return ch[a][b];

}return -1;

}int main()

}sdian sign_rand=dian[rand()%sign_num];

a=sign_rand.a;

b=sign_rand.b;

ch[a][b]=1;

buzhou[++sign_buzhou_num]=sdian(a,b);

///sleep(2000);

}else kaiju(buzhou[sign_buzhou_num].a,buzhou[sign_buzhou_num].b,a,b);

}print();

if(sign_bushu%2==0)cout<<"電腦下子的位置:"<>sign_start;

}return 0;

}

五子棋 AI篇

效果圖 贏法陣列 var wins 第count種贏法 var count 0 贏法的統計陣列 var mywin var computerwin 結束標識 var gameover false var chess document.getelementbyid chess var me true ...

五子棋演算法(c )

野路子實現,完全自己想出來的實現方式,將棋盤轉成一維陣列,尋找橫向 縱向 左斜 右斜元素下標的關係。橫向 元素之間下標相差1 縱向 元素之間下標相差棋盤寬度 右斜 元素之間下標相差寬度 1 左斜 元素之間下標相差寬度 1 沒有寫介面,先用測試資料 public static void main st...

下五子棋的bot 五子棋演算法

include include include include include include jsoncpp json.h c 編譯時預設包含此庫 define n 7 每個節點的分支數 以下為各棋型的識別碼 權重 define win 1 4000 define lose 2 4000 defi...