• 沒有找到結果。

第三章 程式實作方式

3.1 牌型分析

捨棄一張牌使得接下來可以等待的牌為最多,這是求最快胡牌的捨牌基本原 則,在這裡所使用的方式類似於交大那篇論文[2]的作法,我們會預先算出各牌型 的基本分數跟它需要那些牌及其類型並建表,接著在做決策時就從表中取得想要 的資訊。舉例來說,假如我們手上有二萬跟三萬,那麼在查表後就會得到這牌型 含有一個搭子,並且缺少一萬或四萬,同時一萬跟四萬都是要拿來做吃的動作。

表 3-1 搭與組的範例

圖 3-1 牌型拆解範例

最佳為一組與一搭 對各類搭子有用的牌為

一組 一搭

孤張 一組

一搭

孤張

(略)

查閱之前的搜尋成果 一組

圖 3-2 牌型實際搜尋過程

以上圖例子來說,{二筒、三筒、四筒、五筒、六筒}可以先拆解成{(組)二筒、

三筒、四筒}的組,剩餘的則可以選擇{(搭)五筒、六筒},或者是單獨的{(孤)五筒}

與{(孤)六筒},但是我們在拆解上會希望增加組與搭的數量,因此會選擇前者,

最後需要的牌就是{四筒、七筒},而這只是一種拆解法,我們需要再考慮其他的 可能性。如此再搜尋下去又可以發現可以拆成{(搭)二筒、三筒}與{(組)四筒、五 筒、六筒},這種拆解法同樣會有一組以及一搭,而他所需要的牌是{一筒、四筒},

最後與之前的結果做聯集,就會得出最後需要的牌總共有{一筒、四筒、七筒}共 三張。

並且為了加速建表,在搜尋建表過程中會採用動態規劃,也就是實際上當我 們將{二筒、三筒、四筒、五筒、六筒}先拆出{(組)二筒、三筒、四筒}後,剩餘{五 筒、六筒}時,不會再繼續分析下去,而是會直接從以前的搜尋結果中取得{五筒、

六筒}的最佳可能性,如此一來就可以節省大量的搜尋時間,如圖 3-2 所示。

對於每一組牌型,我們所存有的資訊包含該牌型的組數跟搭數,以及還需要 那些牌,而那些需要的牌中,會再紀錄其需要的類型,像是它是用來做吃還是碰,

或者是可以當作眼牌,又或者是間接有效的牌。而所謂間接有效的牌指的是當我 們擁有了這張牌後,可能是可以讓我們搭子數增加的牌,或者是進了此牌後我們 就可以有更多的吃碰牌機會。

舉例來說如果我們擁有四萬跟六萬,那麼因為來五萬我們可以做吃的動作,

所以五萬就是一張需要的牌,並且它的屬性是「吃」,除了我們希望來五萬之外,

如果來了四萬,雖然我們的牌型組搭數不會變,但是會因此讓我們之後可以碰四 萬,因此四萬也是一張我們需要的牌,並且屬性為「間接」。同理六萬也是如此,

而三萬跟七萬也是一樣的情況,因為如果進了三萬,那麼我們就多了一張二萬可 以吃,藉由這些需求張跟其屬性,我們就可以計算該牌型的分數。

利用這樣間接有效的牌,就可以使得我們在捨牌時不只是可以越來越接近胡 牌,同時也可以讓之後更容易進我們想要的牌,也就是不只是希望可以在這個巡 目留下比較好的牌型,更是希望讓往後的巡目也可以有更好的選擇,如圖 3-3 所 示。

而在這樣計算之下也會很容易產生大量的牌都是間接的有效牌,也因此權重 的調整就會更加的重要。

最佳為一搭 對各類搭子有用的牌為

若拿到一張

最佳為二搭 對各類搭子有用的牌為

屬於 的間接有效牌

而牌型分的計算就是將所有需要的牌乘上它的類型分再乘上剩餘的張數,類 型分取決於該牌到手的方式,吃牌我們可以吃上家,也可以自己摸到,但碰牌除 了自己摸到外,不管哪一家打出都可以碰,所以碰的類型分會比較高,而間接類 型或者是眼牌就一定只能自己來摸,所以他們分數就會最低。

當計算牌型分時,間接牌佔的數量非常的多,只算手上只有四萬跟六萬兩張 牌,間接牌就多達三萬、四萬、六萬、七萬共四張,若手上某一色的牌有五張左 右,很容易變成所有的牌都是間接有效的牌,因此雖然間接牌只能用摸來的,而 吃牌可以是自己摸與上家打出這兩種方式,但是分數也不會設定為一比二,因為 不希望每次打牌時都太受間接牌影響,這樣反而會拖慢胡牌速度,因為最終我們 是要完成一組牌,而不是一副可以等非常多牌的牌型,所以比重目前設為一比五。

而最後也會再乘上一個牌的權重,部分字牌的權重會較高,因為字牌是有台數的,

目前各參數的設定是作了簡單測試過後的結果,未來有可能會再作調整的動作。

而表 3-2 則是一個牌型分的試算例子。

可以看到說當我們有兩張四萬跟一張六萬時,如果再來一張四萬我們就可以 碰,因此四萬是屬於直接有效牌,且屬性為「碰」,假如外面還剩下一張,那麼 四萬的分數就是 1*10=10,後面的權重會在之後 3.2 節的內容做說明。以此類推,

而三萬就是屬於間接有效牌,當我們拿到三萬之後,雖然沒有跟任何的牌形成一 組,但是會因此與四萬形成一搭,而使得只要再來一張兩萬就可以形成順,因此 假如外面還有三張三萬,而間接有效牌的牌型分只有 1 分,所以該牌的分數就是 3*1=3。

需要的牌 剩餘張數 牌型分 權重 該牌得分

4 1(間接) 1 4*1*1=4

3 1(間接) 1 3*1*1=3

1 10(碰牌) 1 1*10*1=10

3 5(吃牌) 1 3*5*1=15

1 1(間接) 1 1*1*1=1

2 1(間接) 1 2*1*1=2

2 1(間接) 1 2*1*1=2

總分:4+3+10+15+1+2+2=37

而預建表中的內容則如下表 3-3 所示,最左邊三個數字代表的是這個牌型的

相關文件