輕鬆編寫您自己的拖拉機演算法,進行演算法大戰

2021-04-02 18:22:08 字數 2720 閱讀 7569

輕鬆編寫您自己的拖拉機演算法,進行演算法大戰

拖拉機遊戲是乙個廣泛流傳的拖拉機遊戲,有的地區又叫做公升級或者雙摳(也有人說公升級和拖拉機有所不同),拖拉機遊戲在基本的規則上改變,主要是增加遊戲的趣味性,比如有的地區可以一j到底,將莊家從j一下拉到2,也有的可以從a拉到j,q到6等玩法。

拖拉機大戰是採用dotnet framework開發的一款拖拉機遊戲,它實現了拖拉機遊戲的基本規則,剔除了2是常主的功能,增加了一些亮主、流局的規則設定,還有一些扣底演算法的選擇、必打數字的設定、購到底的規則選擇等,還可以使用機械人幫助您打牌,顯示目前的進度情況等。

在介面方面,拖拉機大戰提供了牌面牌背製作功能,您只需輕點幾下滑鼠,就可以將您機器中喜愛的數碼**製作成牌面牌背,也可以在打牌的時候享受**的樂趣。

對於dotnet程式開發者來說,您還可以利用拖拉機大戰的外掛程式機制,開發您自己的出牌演算法外掛程式。您只需實現乙個演算法介面,這個演算法介面定義了兩個方法,您只需實現這兩個演算法,就可以完成您自己的認為比較厲害的出牌演算法。有趣的是,你還可以和其他人進行演算法比賽,以決出誰的演算法更為優秀。

下面將介紹這個介面,以及乙個簡單的而且不太合法的演算法實現。

如果您要準備寫乙個拖拉機的演算法,您就需要引入kuaff.tractor.plugins.dll這個配件,它包含了kuaff.tractor.plugins. iuseralgorithm介面。

這個介面的定義為:

using system;

using system.collections;

using system.text;

namespace kuaff.tractor.plugins

///

/// 演算法作者的email位址

///

string email

///

/// 演算法名稱

///

string name

///

/// 演算法介紹

///

string description

///

/// 首先出牌的演算法。

///

/// 當前使用者是誰,1為南家,2為北家,3為西家,4為東家

/// 當前主牌的花色,1為紅心,2為黑桃,3為方片,4為梅花,5為王(無主)

/// 當前打幾,0為打2,1為打3,2為打4........11為打k,12為打a,53為打王

/// 當前誰為莊家,1為南家,2為北家,3為西家,4為東家

/// 當前一局各家已經出掉的牌,sendcards[0]為南家,sendcards[1]為北家,sendcards[2]為西家,sendcards[3]為東家

/// 此使用者手中的牌

///

arraylist shouldsendcards(int who, int suit, int rank, int master, string sendcards, string mycards);

///

/// 改自己出的牌時的演算法(自己不是首家)

///

/// 當前使用者是誰,1為南家,2為北家,3為西家,4為東家

/// 當前主牌的花色,1為紅心,2為黑桃,3為方片,4為梅花,5為王(無主)

/// 當前打幾,0為打2,1為打3,2為打4........11為打k,12為打a,53為打王

/// 當前誰為莊家,1為南家,2為北家,3為西家,4為東家

/// 誰首先出的牌,1為南家,2為北家,3為西家,4為東家

/// 當前一局各家已經出掉的牌,sendcards[0]為南家,sendcards[1]為北家,sendcards[2]為西家,sendcards[3]為東家

/// 首家以及自己的上家出的牌

/// 此使用者手中的牌

///

arraylist mustsendcards(int who, int suit, int rank, int master, int whoisfirst, string sendcards, arraylist currentsendcards, string mycards);}}

它首先定義了幾個屬性,這幾個屬性分別代表演算法作者的名稱以及email,演算法的名稱以及簡單介紹。

shouldsendcards方法定義了首家出牌的演算法。比如該東家首先出牌時,呼叫shouldsendcards得到東家應該出的牌,接著呼叫mustsendcards得到北家應該出的牌,接著呼叫mustsendcards得到西家應該出的牌,接著呼叫mustsendcards得到南家應該出的牌,程式然後進行計算,得到下一次的首家,然後通過shouldsendcards得到首家出的牌……周而復始,直到手中的牌出完。

通過上面一段的介紹,你也明白了mustsendcards方法的含義,就是非首家應該出牌的演算法。

下面這個sampleuseralgorithm類就是簡單實現了這個介面的乙個類。它的源**可以在遊戲的sources目錄得到,編譯好的配件放在plugins目錄。您編譯好的外掛程式都必須放在plugins目錄,遊戲可以自行讀取plugins檔案下的dll檔案,分析並得到編寫的外掛程式類。

這個sampleuseralgorithm類之所以簡單,是因為它的首家出牌演算法是隨便挑一張牌就出了,而隨牌演算法假定了首家出的是一張牌,自己隨便出了一張此花色的牌。您可以在這個外掛程式上進行完善。

將您編寫的外掛程式編譯成dll放在遊戲的plugins目錄,在程式中設定某一方採用您編寫的演算法,您就可以和程式中內建的演算法進行對戰了。如果您的演算法不合法(比如首家出拖拉機,您手中有拖拉機卻不出),說明您的演算法還不完善,程式會自動將此方的演算法更改為程式中內建的演算法。

編寫自己的TRACE

在編寫mfc程式時我們經常用trace輸出除錯資訊幫助除錯,但使用trace的前提條件必須是定義了 debug並且使用debug庫才行。有時候在寫某些外掛程式的時候,由於廠商只提供release版本的介面,於是只能把自己的工程中去掉 debug並還用非debug庫,雖然還屬於debug版,但 tra...

成為您自己的證書頒發機構

傳輸層安全性 tls 模型有時由較舊的名稱ssl指稱,它基於證書頒發機構 ca 的概念。這些授權機構受到瀏覽器和作業系統的信任,進而簽署伺服器的證書以驗證其所有權。但是,對於intranet,微服務體系結構或整合測試,有時具有本地ca很有用 僅在內部受信任並依次簽署本地伺服器證書的ca。這對於整合測...

自己編寫的linux ls命令

include include include include include include include include include include int aflag 0 int lflag 0 typedef char datatype typedef struct node link...