拖拉機游戲是一個廣泛流傳的拖拉機游戲,有的地區又叫做升級或者雙摳(也有人說升級和拖拉機有所不同),拖拉機游戲在基本的規則上改變,主要是增加游戲的趣味性,比如有的地區可以一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
{
public interface iuseralgorithm
{
/// <summary>
/// 算法作者
/// </summary>
string author
{
get;
}
/// <summary>
/// 算法作者的email地址
/// </summary>
string email
{
get;
}
/// <summary>
/// 算法名稱
/// </summary>
string name
{
get;
}
/// <summary>
/// 算法介紹
/// </summary>
string description
{
get;
}
/// <summary>
/// 首先出牌的算法。
/// </summary>
/// <param name="who">當前用戶是誰,1為南家,2為北家,3為西家,4為東家</param>
/// <param name="suit">當前主牌的花色,1為紅心,2為黑桃,3為方片,4為梅花,5為王(無主)</param>
/// <param name="rank">當前打幾,0為打2,1為打3,2為打4........11為打k,12為打a,53為打王</param>
/// <param name="master">當前誰為莊家,1為南家,2為北家,3為西家,4為東家</param>
/// <param name="sendcards">當前一局各家已經出掉的牌,sendcards[0]為南家,sendcards[1]為北家,sendcards[2]為西家,sendcards[3]為東家</param>
/// <param name="mycards">此用戶手中的牌</param>
/// <returns></returns>
arraylist shouldsendcards(int who, int suit, int rank, int master, string[] sendcards, string mycards);
/// <summary>
/// 改自己出的牌時的算法(自己不是首家)
/// </summary>
/// <param name="who">當前用戶是誰,1為南家,2為北家,3為西家,4為東家</param>
/// <param name="suit">當前主牌的花色,1為紅心,2為黑桃,3為方片,4為梅花,5為王(無主)</param>
/// <param name="rank">當前打幾,0為打2,1為打3,2為打4........11為打k,12為打a,53為打王</param>
/// <param name="master">當前誰為莊家,1為南家,2為北家,3為西家,4為東家</param>
/// <param name="whoisfirst">誰首先出的牌,1為南家,2為北家,3為西家,4為東家</param>
/// <param name="sendcards">當前一局各家已經出掉的牌,sendcards[0]為南家,sendcards[1]為北家,sendcards[2]為西家,sendcards[3]為東家</param>
/// <param name="currentsendcards">首家以及自己的上家出的牌</param>
/// <param name="mycards">此用戶手中的牌</param>
/// <returns></returns>
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類之所以簡單,是因為它的首家出牌算法是隨便挑一張牌就出了,而隨牌算法假定了首家出的是一張牌,自己隨便出了一張此花色的牌。您可以在這個插件上進行完善。
游戲下載地址(包含了接口和一個簡單的算法實現源代碼):點擊這里, 下載地址2,下載地址三,下載地址四,軟件版本1.2.0.356.
將您編寫的插件編譯成dll放在游戲的plugins目錄,在程序中設置某一方采用您編寫的算法,您就可以和程序中內置的算法進行對戰了。如果您的算法不合法(比如首家出拖拉機,您手中有拖拉機卻不出),說明您的算法還不完善,程序會自動將此方的算法更改為程序中內置的算法。
新聞熱點
疑難解答