拖拉机游戏是一个广泛流传的拖拉机游戏,有的地区又叫做升级或者双抠(也有人说升级和拖拉机有所不同),拖拉机游戏在基本的规则上改变,主要是增加游戏的趣味性,比如有的地区可以一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类之所以简单,是因为它的首家出牌算法是随便挑一张牌就出了,而随牌算法假定了首家出的是一张牌,自己随便出了一张此花色的牌。您可以在这个插件上进行完善。

游戏下载地址(包含了接口和一个简单的算法实现源代码):点击这里, 下载地址二, 下载地址三,软件版本1.2.0.356.

将您编写的插件编译成dll放在游戏的plugins目录,在程序中设置某一方采用您编写的算法,您就可以和程序中内置的算法进行对战了。如果您的算法不合法(比如首家出拖拉机,您手中有拖拉机却不出),说明您的算法还不完善,程序会自动将此方的算法更改为程序中内置的算法。

转载于:https://www.cnblogs.com/believeit/archive/2006/02/13/2183206.html

轻松编写您自己的拖拉机算法,进行算法大战相关推荐

  1. c语言 连通域算法 递归,VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!...

    VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!0 填充函数代码如下: void CComputerGraphicsView::PolygonFill2()//区域填充函 ...

  2. javascript之jQuery:一个轻松编写js的库

    以下内容来自廖雪峰的js教程,整理了下作为笔记 1.简介 JavaScript世界中使用最广泛的一个库,我把它理解为轻松编写js的一个库 jQuery能帮我们干这些事情: 消除浏览器差异:你不需要自己 ...

  3. MATLAB轻松绘制地图路线——Dijkstra(迪杰斯特拉)算法最短路径规划

    文章目录 1. 地图绘制 2. 计算各节点之间的距离 3. Dijkstra(迪杰斯特拉)算法 4. 根据计算出的距离利用Dijkstra(迪杰斯特拉)算法找出指定节点之间的最短路径 工程文件(可直接 ...

  4. 新手如何学习算法?算法如何入门以及零基础入门算法应该学些什么?

    搬运工,看到一篇关于算法学习之路的总结,希望对你有帮助. 原文链接:zh.lucida.me/blog/on-le 我的算法学习之路 MAY 4TH, 2014 | COMMENTS  关于 严格来说 ...

  5. 数据结构与算法:算法简介

    数据结构与算法:算法简介 雪柯 大工生物信息 提笔为写给奋进之人 已关注 你说呢 . shenwei356 等 70 人赞同了该文章 引用自算法图解,作者[美] Aditya Bhargava 译袁国 ...

  6. 二、【绪论】算法和算法评价

    算法和算法评价 1 算法的基本概念 算法(Algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作.一般具有下列5个重要特性: 有穷性:一个算法必须在执 ...

  7. 数据追加用什么函数_RL用算法发现算法:DeepMind 数据驱动「价值函数」自我更新,14款Atari游戏完虐人类!...

    [新智元导读]击败卡斯帕罗夫的「深蓝」并不是真正的人工智能,它过度依赖了人类设计的规则,而最近DeepMind的一项深度强化学习新研究表明,不用人工介入,完全数据驱动,算法自己就能发现算法. 「深蓝」 ...

  8. 缓存淘汰算法--LRU算法

    缓存淘汰算法--LRU算法 参考: https://www.cnblogs.com/dailidong/p/7571178.html https://blog.csdn.net/wangxilong1 ...

  9. 视频教程-区块链算法—共识算法-区块链

    区块链算法-共识算法 工科硕士,持有高校计算机教师资格证书,从事计算机科学少儿分级体系课程的教研与教学工作,先后开设计算思维.Scratch.Python等少儿编程课等. Gardener ¥498. ...

  10. Sysweld笔记:利用稳态算法加速算法模拟焊接过程的残余应力

    作者:贾亚波博士,仿真秀专栏作者 在进行热力耦合的仿真过程中,如果模型足够的长并且热源速度恒定,通常其热学,相变以及热力耦合都会达到稳态的过程,因此如何直接计算稳态问题成为了大家研究的热点问题. 由于 ...

最新文章

  1. 手工计算深度学习模型中的参数数量
  2. Python学习day5作业
  3. CSS学习16之层级
  4. Hadoop下如何执行脚本
  5. SAP UI5 jQuery.sap.includeStyleSheet
  6. mysql crash定位分析_MySQL实例crash的案例详细分析
  7. 基于JAVA+SpringMVC+MYSQL的数码商城
  8. 实现APP-V服务全程跟踪(二)
  9. 数据:本周DOT将解锁476.59万枚 上周共质押171.2万枚
  10. 经典排序算法(二十二)--图书馆排序(Library Sort)
  11. 《普林斯顿微积分读本》笔记-第1章函数、图像和直线
  12. Proteus十字路口交通灯
  13. novoton-msys_init函数
  14. 总裁演说思维语言沟通学习心得有哪些
  15. 电信 IPRAN 设备组网方案_IPRAN 5G典型组网
  16. 【git学习】解决git提交代码时报错: Unable to create ‘XXX/.git/index.lock‘: File exists.
  17. JFinal在线官方文档
  18. 中职学校计算机应用基础学什么,浅谈中职学校《计算机应用基础》课程改革的一点建议...
  19. 固态硬盘逻辑坏道简单修复方法(2015-04-02更新)
  20. 算法训练第五十天 | 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

热门文章

  1. PHP 3D大富翁,大富翁3D版 Monopoly Classic HD
  2. [机器学习与scikit-learn-20]:算法-逻辑回归-线性逻辑回归linear_model.LogisticRegression与代码实现
  3. 安装 emoji 字体
  4. matlab 神经网络工具箱 nntraintool 详解
  5. Angular设置代理
  6. 燃烧远征怀旧服务器人数小程序,魔兽怀旧服一直更新下去,最终会开到哪个版本?...
  7. 汽车零部件行业需求分析及解决方案
  8. 开启服务器防火墙 局域网内连接sqlserver数据库问题
  9. Java反射 二三事
  10. windbg 查看结构体_windbg常见命令