這個部分是一個重點,也是一個痛點,也是一個隊伍最有可能出彩的一部分。我看了一些資料,但是現在我有了新的想法。
大部分演算法中,都要進行兩步。第一步是優先順序的計算,然後是打分。但是我在想能不能通過某種數學模式把這兩種計算融合在一起。也就是說,我們能夠從所打的分中間識別出優先順序。這使我想到了數學十進位中的位。反正我最主要是從四個方向進行判定,所以某些優先順序低的,我們在給其打分的時候,就將它的分數設為處在其優先順序之上的十分之一。其實我覺得這裡只要大於其分數的八倍就可以,因為我最後選取最優位置的方法是累加法,算出分數和最高的位置,這樣的話,即使在四個方向上某較低優先順序都出現了,但是即使全加起來也不會超過較高優先順序的分數,這樣的話,如果出現優先順序較高的情況,那麼我們計算的結果必然是優先順序較高的分數最高。這樣,變省去了一些不必要的分類,使得演算法更直接,更容易理解。
首先我們先來看一下置棋時的優先順序分布以及我為其所指定的打分方案:
首先聲明的是,對於已經五子相連的情況,我們在此部分演算法中不再實現,因為這個時候勝負已經分出,我們調用checkboard類的judge的方法便可以了。這隻不過是在電腦AI後再將judge的代碼複製過去罷了。
我們的目的是給棋盤上的空位進行打分,進而算出分數最高的位置。那麼我在這裡想運用試探法,因為我覺得這樣的話代碼比較好寫。所謂試探法就是,我們找出棋盤上的所有空位,然後我們假設這個空位上放置的是白棋,然後看看相連的情況,然後打分,並將分數加至儲存該空位分數的變數;再假設這個空位上放置的是黑棋,然後再看相連的情況,然後打分,並將分數加至儲存該空位分數的變數;這樣遍曆完所有的空位的時候,我們便完成了打分工作,然後再比較空位的分數,選出分數最高的空位,該位置即為最優的位置。
下面是一些情況的優先順序排列:(假設我們是白棋)下列情況均為在該空位置棋之後:
在實現的時候,我們還需要定義兩個臨時的Checker指標變數,用來儲存相連的一串棋子前後的位置的狀態。color用來儲存棋子的顏色,count用來儲存相連的棋子的個數,temptr1與temptr2用來儲存兩端的棋子指標。文中的我們是電腦哦!
情況 |
所打分數 |
color=1&&count=5我們先贏,贏了再說 |
100 000 0000 |
Color=0&&count=5對方要贏,如果我們不能先贏,那麼一定得先阻攔 |
10 000 0000 |
Color=1&&count=4&&!temptr1&&!temptr2雙方均不會贏,如果我們能成活四,那麼敵方必輸,所以要先置棋 |
1 000 0000 |
Color=1&&count=4&&((!temptr1&&temptr2)||((temptr1)&&!temptr2))雙方均不會贏,那麼如果我們能成沖四,則要先置棋,牽著敵方的鼻子走,因為下過本步棋之後敵方一定會來阻止我們 |
100 0000 |
Color=0&&count=4&&!temptr1&&!temptr2雙方均不會贏,如果對方能成活四,那麼我們一定要優先阻攔,否則便會輸棋 |
10 0000 |
Color=1&&count=3&&!temptr1&&!temptr2雙方均不會贏,如果我們能成活三,則要優先這個位置 |
1 0000 |
Color=0&&count=4&&((!temptr1&&temptr2)||((temptr1)&&!temptr2))雙方均不會贏,如果敵方能成沖四,那麼我們要儘力阻攔 |
1 000 |
Color=1&&count=3&&((!temptr1&&temptr2)||((temptr1)&&!temptr2))雙方均不會贏,如果我們能成沖三,那麼要優先這個位置 |
1 00 |
Color=1&&count=2&&!temptr1&&!temptr2雙方均不會贏,如果我們能成活二,則要優先這個位置 |
1 0 |
Color=1&&count=2&&((!temptr1&&temptr2)||((temptr1)&&!temptr2))雙方均不會贏,如果我們能成沖二,那麼要優先這個位置 |
1 |
其他情況 |
0 |
這個演算法的主要思想是,對於敵方構不成威脅的情況,(即活四以下,但是這裡我們把沖四也算進來了,並賦予了較高的優先順序),我們暫不理會,而是一心想著自己怎麼能贏。這裡我們只能分成這麼多情況,因為假設我們的分數是long型的,那麼它的長度是32位,轉換成十進位,位元也就是10位,因而我選了最大的分數為1000 000 000,這樣剛好能滿足要求。
但是這裡有個小小的問題,就是在剛開始落子的時候,怎麼落?我想這個時候我們可以事先設定某個空位的分值為髙值,落棋之後分數便置為0了。當對方先下的時候,我們就將第一個棋子放在對方棋子的周圍,啟動AI,這樣接下來問題便簡單了,因為一定會出現沖二,進而便是對方的活四,然後再防守,這樣一步步,便展開了。