• 沒有找到結果。

第三章 MJTALK 程式實作與 MAHJONGDAXIA 的演算法探討

3.1 麻將平台與人工智慧程式溝通指令

本小節引用自「麻將平台與人工智慧程式溝通協定」中的指令說明。

麻將牌張定義共 144 張牌,包括萬、條、筒、字和花牌,將每一張牌定義一個唯一的號碼,作為 平台與程式溝通之用。如表 3-1。

表 3-1:字牌定義

人工智慧程式使用 standinput 接收麻將平台 Server 傳送的指令;並使用 standoutput 傳送指 令給麻將平台。如圖 3-1。

圖 3-1 麻將平台和人工智慧程式溝通方法 麻將平台傳給人工智慧程式的指令如下:

1. /start MJ <position> <ProgramPAth>

遊戲開始時,Server 以/start MJ 告知 Program 遊戲開始,並給予 Program 的位置和 Program 程式 的名字。Program 的名字代表被呼叫程式的檔名為 ProgramPath.exe。

舉例:/start MJ 2 Program_1 此例表示:名為 Program_1.exe,座位為 2 號。

2. /initGame <wind><game><open><banker><continue>

送出/start 指令後,Server 以/initGame 告知 Program 該局的訊息,包括幾風、幾局、開門位置、

莊家位置和目前連莊數目。風<wind>和局<game>為 east、south、west、north 其中之一。

舉例:/initGame east east 3 2 0 此例表示:風東局,3 號玩家開門,2 號玩家為莊家,連莊數為 0。

3. /initCard <card1> <card2>…<card16>

送出/initGame 指令後,Server 以/initCard 告知玩家起始拿到哪些牌。

若為莊家則拿 17 張牌;若非莊家則拿 16 張牌。

舉例:/initCard 121 122 142 143 152 220 241 260 270 342 351 370 383 390 462 463 此例表示:

Program 拿到 121 122 142 143 152 220 241 260 270 342 351 370 383 390 462 463。

4. /mo <card>

遊戲進行時,Server 傳/mo 指令給 Program,告知 Program 摸到哪張牌。

舉例:/mo 410 此例表示:Program 摸到牌 410。

5. /ask throw

遊戲進行時,Server 要求玩家丟牌,會傳送/ask throw 要求玩家丟牌。可能發生在玩家摸、吃、碰、

槓牌後。

10. /throw <position> <card>

遊戲進行時,玩家丟出牌後,Server 將廣播/throw 訊息給四個玩家知道。

舉例:/throw 3 410 此例表示:3 號玩家打出牌 410。

11. /eat <position> <card1> <card2> <card3>

遊戲進行時,有玩家吃牌,Server 將廣播/eat 訊息給四個玩家知道。

吃來的牌放中間,且小於<card1>、<card3>。

舉例:/eat 4 280 271 292 此例表示:4 號玩家吃 280、271、292 三張牌。

12. /pong <position> <card1> <card2> <card3>

遊戲進行時,有玩家碰牌,Server 將廣播/pong 訊息給四個玩家知道。

碰牌順序為<card1>、<card2>、<card3>由左至右遞增。

舉例:/pong 2 320 321 323 此例表示:2 號玩家碰 320、321、324 三張牌。

13. /gong <position> 4 <card1> <card2> <card3> <card4>

遊戲進行時,有玩家槓牌,且為明槓,Server 將廣播/gong 4 訊息給四個玩家知道。

槓牌順序為<card1>、<card2>、<card3>、<card4>由左至右遞增。

舉例:/gong 2 4 160 161 162 163 此例表示:2 號玩家明槓 160、161、162、163 四張牌。

14. /gong <position>0

/gong <position> 0 <card1> < card2> < card3> < card4>

遊戲進行時,有玩家槓牌,且為暗槓,Server 將廣播/gong <position> 0 訊息給四個玩家知道。

槓牌順序為<card1>、<card2>、<card3>、<card4>由左至右遞增。

若 Program 位置為暗槓時的玩家位置,則 Server 會傳「/gong <position> 0 <card1> <card2> <card3>

<card4>」給 Program。

若 Program 位置不是暗槓時的玩家位置,則 Server 會傳「/gong <position> 0」給 Program。

舉例:/gong 2 0 160 161 162 163 此例表示:Server 傳給 2 號玩家,自己暗槓 160、161、162、163 四張牌。/gong 2 0 此例表示 Server 傳給非 2 號玩家,2 號玩家暗槓四張牌。

15. /gong <position> 1 <card>

遊戲進行時,有玩家槓牌,且為補槓,Server 將廣播/gong 1 訊息給四個玩家知道。

舉例:/gong 1 1 154 此例表示:1 號玩家補槓牌 154。

16. /hu <position> <hucard> <card1> <card2>…

遊戲進行時,有玩家胡牌,Server 將廣播/hu 訊息給四個玩家知道。其中<hucard>為敵家放槍或自摸 的牌, <card1> <card2>…為胡牌玩家還沒現出來的牌。

舉例:/hu 3 232 112 120 132 192 193 231 233 372 382 392 471 472 473 此例表示:3 號玩家胡 232 這張牌,3 號玩家未現出來的手牌為 112 120 132 192 193 231 233 372 382 392 471 472 473。

17. /exit <score1> <score1> <score3> <score4>

Server 要求 Program 中斷時傳給 Program 的指令。通常發生在一局結束時,也可能發生在 Program 超時、Program 傳送指令錯誤、Server 異常結束等狀況。<score1>、<score2>、<score3>、<score4>

分別為座位 1、2、3、4 的玩家該局得到的分數。

人工智慧程式傳給麻將平台的指令如下:

1. /throw <card>

遊戲進行時,Server 送出/ask throw 指令後,Program 丟牌使用/throw 指令。

舉例:/throw 112 此例表示:Program 丟出牌 112。

2. /eat <card1> <card2>

遊戲進行時,Server 送出/ask eat 指令後,Program 吃牌使用/eat 指令。<card1>、<card2>為 Program 自己擁有的牌,用來吃上家的丟出的牌。

舉例:/eat 132 145 此例表示:Program 用 132、145 兩張牌吃上家丟出的牌。

3. /pong <card1> <card2>

遊戲進行時,Server 送出/ask pong 指令後,Program 碰牌使用/pong。<card1>、<card2>為 Program 自 己擁有的牌,用來碰上家的丟出的牌。

舉例:/pong 112 113 此例表示:Program 用 112、113 兩張牌碰敵家丟出的牌。

4. /gong 4 <card1> <card2> <card3>

遊戲進行時,Server 送出/ask gong 指令後,Program 明槓牌使用/gong 4 指令。明槓時使用指令「/gong 4 <card1> <card2> <card3>」,其中 card1、card2、card3 為 Program 自己擁有的牌,用來槓敵家丟出的 牌。

5. /gong 0 <card1> <card2> <card3> <card4>

遊戲進行時,Server 送出/ask gong 指令後,Program 暗槓牌使用/gong 0 指令。暗槓時使用指令「/gong 0 <card1> <card2> <card3> <card4>」,其中<card1>、<card2>、<card3>、<card4>為 Program 自己擁有 的牌。

6. /gong 1 <card>

遊戲進行時,Server 送出/ask gong 指令後,Program 補槓牌使用/gong 1 指令。補槓時使用指令「/gong 1 <card>」,其中 card 為 Program 自己擁有的牌,用來和自己已經碰出的刻子型成槓子。

7. /hu

遊戲進行時,Server 送出/ask hu 指令後,Program 胡牌使用/hu 指令。

8. /pass

遊戲進行時,Server 送出/ask eat、/ask pong、/ask gong、/ask hu 指令後,若 Program 不想吃、碰、槓、

胡,則使用/pass 指令。

相關文件