擎墨閣文學 2008-5-1 11:57
扑克牌类游戏DIY之一:整体布局的设计 (4)
[table=98%][tr][td]游戏的智能是一个重头戏,设计难度也是最大,前面说过,一手牌可用三个参数来表示,这样我们不妨建一个自定义的数据类型,来记录每一手牌:[/td][/tr][/table][table=98%][tr][td]Private Type PKAttr[/td][/tr][/table][table=98%][tr][td]lnPx As Long '牌型[/td][/tr][/table][table=98%][tr][td]lnPd As Long '牌点[/td][/tr][/table][table=98%][tr][td]lnLp As Long '连牌数[/td][/tr][/table][table=98%][tr][td]End Type[/td][/tr][/table][table=98%][tr][td]我感到最少要设计六个子过程或函数来实现基本智能:[/td][/tr][/table][table=98%][tr][td]1、检测一手牌是否合法,并用一个PKAttr类型的变量记录其参数,当该变量的lnPx属性等于0时即是不合法,等于1-5时对应五种不同的牌型。每手牌都是放在一个临时集合中的全部图片框控件,检查依据是集合中每张牌的Index属性,先算出牌点,根据牌的总数做各种可能牌型的检查。[/td][/tr][/table][table=98%][tr][td]2、比较两手牌的大小。比较的依据当然是PKAttr类型变量所记录两手牌的参数,这个过程设计起来很容易,按规则来就不会错。[/td][/tr][/table][table=98%][tr][td]3、设计一个在三家Pass后或首先出牌时,开牌的过程。这里面的学问很多,一开始不必追求完美,以后在实践中补充,无非就是一系列条件判断的堆积。思考到的条件越多,智能就越高。这个过程中需要做手中牌的形势分析,即将手中牌按牌点归类,依据牌点建立一个0-14的数组,尝试各种组合的出法,我没在这方面找出本质性的规律,主要靠不断收集到的经验,加入新的条件判断。此外,最好为其增加一个调用时的参数,用于指定要出的牌型,便于调用。要是再加上一个可控制是否强制出某种牌型的参数(即使把牌拆开拆乱也要出某一牌型),则更好。[/td][/tr][/table][table=98%][tr][td]4、设计一个怎样管住别人牌的过程。这个过程,要根据上手牌的参数及手中的牌综合找出合理的出牌。和上面过程一样,同样少不了形势分析,和一些控制是否强制的参数。3、4两过程可以根据所找出来的合法出牌对原牌型的影响设定一个优先级参数,以便给后面的智能过程选择最佳出牌有一个依据。[/td][/tr][/table][table=98%][tr][td]5、设计一个智能的主过程,综合利用前四个过程,进行计算,这里要根据规则,按不同的对象建立思考过程。有对同伴的掩护,有对地主的打击,有扛牌,有接牌,总之每个与地主相对关系不同的位置,思考内容均不同,应分别编写。这个过程是软件的智能核心,可以用到一些技巧,过程4可能比较死板,只会从小到大找手中能打到的牌,遇到必须扛牌时,就会出错牌,对这种情况,就不要真的去对上手牌思考,你可以设置一手假想的牌,使它只比你需扛的牌小一个牌点,这样便可以通过过程4找出最佳扛牌。过程3一般只能从小到大的开牌,你可有时把开牌变为对一手假想的牌思考,通过过程4出牌。还有一种高级一点,换位思考法,在特殊情况下,你可暂时改变记录某一游戏者相对地主所在位置的值,使程序按新位置所对应的智能程序去出牌,这种方式较复杂,容易出错,可能还要涉及递归调用,请酌情选用。这个过程相当复杂,设计时要养成好习惯,因在过程可能要用假想牌代替已出过的牌来思考,若程序思考的结果没找到合理的出牌,一定要记住把牌还原,否则会造成后面出错或打出一些莫明其妙的牌来,而且很难找到症结所在。总之要管好该过程的进口与所有可能的出口,保证pass一方不会改变原PKAttr类型变量。[/td][/tr][/table][table=98%][tr][td]6、设计一个将PKAttr类型的数据转换为图片框控件集合的过程。前面的智能代码,都是围绕PKAttr类型的变量而写,这是使用者看不见的,要把这些数据以扑克图片的形式显示到桌面上,还需有一次转换。这种转换可放在3、4两过程中调用,调用时要传递一个PKAttr类型数据,本过程将针对手中牌的Index属性,找出符合的控件,加入出牌的集合中。如:牌型为2、牌点为2 、连牌数为3 时,就应取出牌点为2、3、4的三个对子共6 个控件。这里有个难点:三带二之类的牌怎么取,前面说过PKAttr类型不包含三带二牌型中所带对子的数据,这就需要在3、4两过程中先找出要带的对子,然后分开取牌,即先取三只,再取对子,看成是两手牌的组合,放在一手牌的集合中,最后取完牌退出过程时,记得要返回的PKAttr类型的数据,是真实的三带二牌型就行了。[/td][/tr][/table]