中國象棋在我看來最難的人工對戰中電腦怎能走這個問題,以下爲本人淺見,希望各位多多包涵!
1.初步嘗試
電腦的優勢在於強大的計算能力,雖然其不知道怎麼走合適,但是它能夠模擬的將每一種走法都走一遍,選最優的走法來走。我們的思路就有了,首先需要解決兩個問題:
(1)怎麼判斷局面最優?
(2)怎麼模擬走?
第一個問題可以用每一個棋子的重要程度來打分,比如將最重要,所以給1000分,而車次之給100分,炮80等等
第二個問題因爲每一箇中國象棋實現方式不同,所以我分享一下本人代碼
電腦模擬走一步的代碼:
mov Board::getbestmove()
{
/*
* 1.獲取所有可能走的步數
* 2.試着走一下
* 3.看看局面怎麼樣
* 4.選擇最好的走法
*/
QVector<mov> canstep;
canstep = getallstep();
int maxscore = -100000;
mov ret;
for(auto it = canstep.begin();it!=canstep.end();it++)
{
mov step = *it;
fakemove(step); //模擬走一步
int score = ctscore(); //計算局面分
unfakemove(step); //返回
if(score>maxscore) //計算最大的局面分
{
maxscore = score;
ret.equal(step);
}
}
qDebug()<<"get best move!!!";
return ret; //得到最好走法
}
以上代碼可以實現電腦模擬走一步的場景,但是缺點也顯而易見。就是目光短淺,只考慮到自己走一步,並沒有考慮到對手走的一步,例如:我要吃電腦車,它會看着我吃,它只是遍歷了自己走一步局面分最大的走法,但是沒有考慮我走一步會造成的影響。
2.電腦模擬走兩步的走法
我們可以這樣設計--在電腦走一步後考慮我再走一步的結果,就是模擬兩步,比如輪到電腦走有n種走法,電腦走了一步人又有n種走法,在這n*n種選擇中再選最有利的---也就是局面分最大的