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...