牌式战棋的算法其实我已经想过一些,奈何本人的编程能力不足最终没有成品出来。
先说说我想过的思路吧。你做的战棋,总会有一份角色的数据组吧。存放血量坐标这些的记录。再加两个数组吧,一个用来表示你的套牌,另一个表示你已经抓上手但还没用出去的牌。然后编一个关于每张牌的解释的模块,这个模块其实是由若个可以单独调用的过程组成。
我具体而简单举个例子,假设牌只有四种,移动,攻击,魔法,道具。牌解释模块就要编四个可以分别调用的过程。这些过程其实你应该已经有了,只是写在程序里的哪个位置我就不清楚了。把它们移到模块吧。给四个过程简单的命名1234,套牌数组和手牌数组就是记录这些1234.当使用手牌时,则调用牌解释模块里对应该的过程。两个牌数组的互动关系注意一下,套牌要能洗牌,手牌抓一张套牌少一张。手牌使用则是手牌直接少一张。可以参考一些扑克游戏的代码。
接着是回合流程的编制。传统战棋每回合可以做的事都是确定的,牌式则不是。但真的不是确定的吗?传统战棋可以选择移动,攻击或者用魔法又或者道具。而这四种事在牌式战棋看来都是同一件事,那就是使用牌。所以牌式战棋的回合流程就是,到这个角色了,每回合补充一张牌。然后决定用哪张牌或哪几个张牌。最好给牌的使用加点限制,省得一回合全用光。比如每张牌都有一个时间消耗值,每回合就象补充牌一样补充一定量的时间值,这回合使用牌的总时间值不能超过这个数。当不用牌了。回合让过。
当回合流程定好后就是AI的设计。这才是真正难点。如果人和人玩的话,不用编AI。游戏只要能按回合流程运行下走就好。如果是人机对战,那就要考虑每个动作的价值,还有几个动作的组合会不会产生价值的变化。
传统战棋,NPC的逻辑是怎样的呢?首先判断谁在攻击范围内,或者移动加攻击范围内。在合条件的选项中再计算打谁的价值最高,因为这些是回合都做的,所以AI可能会做在回合流程里。
牌式战棋不能这样,因为牌式战棋每回合能做什么是由拿着什么牌决定的。有牌才有编AI的价值,不能做的事没必要想。所以牌式战棋的AI应该编在牌解释模块里,有这张牌才调出于这张牌对应的AI。
比如编一段移动牌的AI。首先要看看手牌里有没有攻击牌,有的话才接近对手,没有的话应该逃。
其实还有一种可能,那就是装,你的对手不知道你这张牌是什么,所以不用的话,对手可能以为这是攻击牌而不靠近你。所以角色最后表现出来的行为模式是,能打你就一定过来打你,不能打你则可能逃或者不动。
手里有几张牌就调用几次牌解释模块里的AI,其中最麻烦的是几个动作的组合后,动作的价值产生了变化。还是移动牌的AI,如果手上只有两张移动牌呢?按前面的逻辑,如果有攻击牌的话一定上前打,但两移动牌一张选择逃,另一张选择装。这不是暴露出来另一张肯定不是攻击牌嘛。
AI的设计上还是传统战棋容易,因为确定性高,很多假设性的可能都不用考虑。牌式战棋要为每张牌从新写一份AI,工作量增加一大截。不过话回来,牌式本身就有着极大的随机性,所以有什么动作敢说绝对正确?比如你有攻击牌,于是近身对打,然后接着几回合就是抓不到新的攻击牌,情况从上去打人变成上去被打、、、、这个AI也没法算,因为AI也不知道你下回合会抓什么。
关于AI的想法先着这些吧。数学设计这个说法有点笼统,所以我不太确定你是想讨论AI思路还是直接聊代码应该怎样写,如果是后者的话,你要失望了。因为我已经放弃学编程很多年,电脑也换过,以前写过的东西一点没留。
PS:万智牌要一线大城市才有牌店,我搬家了,从一线搬到三线所以找不到人玩了。而且也是很多年前的事,那时还没多少人网上玩万智牌、、、、后来也戒了。顶多偶尔上网看看关于万智牌的消息。