下班一个小时了,因为下班比较晚,不知道干啥好,感觉干啥都提不怎么起劲,就坐在那里发呆。
刚好最近入了『桌游模拟器TTS』,就想到了自己要不也尝试着在里面做一个桌游,比如拿『去月球』的桌游练练手,这个游戏规则简单应该很好上手。所以就在脑海里构思怎么写这个脚本,没想到单纯出牌这一步就卡住了。
『去月球』桌游规则就是拿手牌(情感牌)尽可能买更多高分的分数牌(记忆卡)。手牌有四种tag(A、B、C、D),两种副tag(其中跟买分数牌相关的副tag只有一个:ᴾ)。购买分数牌要求:手牌的tag在分数牌上有标出,有相应tag的数量要够,而且购买时只能使用同一种tag。如果数量不够也没事,每两张有副tag(ᴾ)的牌可以当一张任意tag的卡牌。
出牌例子:
分数牌(AB,cost数=3)
可购买的方式:
① A A A
② B B B
③ A A Cᴾ Dᴾ
等等
不可行方式:
① A A(数量不够)
② A A B(混搭)
③ C C C(错误tag)
④ A A Cᴾ(数量不够)
等等
规则很简单,线下玩很容易操作,但是做成程序要考虑的太多了(需要考虑玩家骚操作)
我现在的思路:
① 出牌数=cost数?
② -是→
牌中最多的max.牌.tag⊂cost.tag?
→ max.牌.tag.count=cost.count?
→ 都是的话购买成功
③ -否→
// 找到不属于cost.tag的牌
cache_1=[牌.tag⊄cost.tag的部分];
// 在符合cost.tag的牌里可能会有多个max值,所以需要提前给tag排优先度,这里找到优先度最高的tag
pay_1=[max([牌-cache_1].tag,1)];
// 找到除了pay_1之外牌里包含副tag(ᴾ)的牌
cache_2=find([牌-pay_1]=ᴾ);
// pay值
pay=pay_1.count+cache_2.count/2;
→然后看pay是否足够cost需求
→是的话完成购买,并将多余的牌还给玩家
粗看好像没问题,但是细想还是不对。
例子:
tag优先度按照ABCD排列
分数牌(AB,cost数=3)
出牌①:A Aᴾ B Cᴾ Cᴾ Cᴾ
这样虽然也可以判定为出B Aᴾ Cᴾ Cᴾ Cᴾ,但是因为tag优先度问题实际出牌为A Aᴾ Cᴾ Cᴾ,玩家能正常买到牌,没问题,有问题的是下面这种情况:
出牌②:A Aᴾ B B Cᴾ
因为tag优先度的问题,虽然A和B数量一样,上述程序默认是出A,所以出牌会变成A Aᴾ Cᴾ购买失败,但是实际上这组牌里的B B Aᴾ Cᴾ是可以完成购买的。所以说到底,还是得在符合条件的max.tag里遍历,不能单纯只判断第一个……感觉好麻烦啊
说到底,也就是副tag的存在导致了很多地方判断困难,懒一点来说,其实也可以设计两个出牌区域:tag区和副tag区,让玩家主动给出的牌分类,然后程序再完成判定,但是感觉这么设计也好丑啊……