如何用宝可梦属性玩剪刀石头布?

如何用宝可梦属性玩剪刀石头布? 图片 1
如何用宝可梦属性玩剪刀石头布? 图片 2
如何用宝可梦属性玩剪刀石头布? 图片 3

读者早上好,中午好,下午好,晚上好,本人上了五天班之后终于在周末开始发疯了(其实没那么难受,工作待遇挺好的,我只是想发疯),所以我们今天来玩石头剪刀布。

因为我想看的《星期三》《人生切割术》和《同乐者》都还没出新剧集,而《瑞克与莫蒂》在周一才更新,所以我从头到尾刷了七遍《老友记》(当然是从我第一次看这部剧到现在的时间累计的),《生活大爆炸》次之,大概有三四遍吧。回顾已经看过的电视剧集会给人一种安全感,貌似有相关研究,但鉴于这篇文章我是来发疯的,所以就不扯心理学了,免得搬起石头砸自己的脚。

在《生活大爆炸》里,Sheldon 说剪刀石头布不足以做出有意义的区分,而且在熟悉的人之间,人们更容易打成平手。所以,他提议用剪刀、石头、布、蜥蜴、史波克1代替简单的石头剪刀布,规则是这样的:

  1. 剪刀剪断纸
  2. 纸包住石头
  3. 石头压死蜥蜴
  4. 蜥蜴毒死史波克
  5. 史波克砸烂剪刀
  6. 剪刀断首蜥蜴
  7. 蜥蜴吃掉纸
  8. 论文(paper)证明史波克不存在
  9. 史波克蒸发石头
  10. 石头压碎剪刀

——出自第二季第八集 片段

如果你没看懂这个规则,没关系,我也没看懂,下面是图示:

🖖 是史波克,🤏 是蜥蜴;图源: Wikipedia

这个游戏也出现在《去月球》系列游戏里的某段对话里,具体出自哪部游戏,我已经忘记了。

尽管是情景喜剧里的笑料,但这个改良版本的石头剪刀布,通过引入两个新的出招选择,巧妙地改变了石头剪刀布的环状结构。仔细观察,上图中每个出招都有两个弱点和两个克制对象。如果忽略上图的箭头,把这张图看成是五阶完全图,每个结点都有四的度;如果看成有向图,则每个结点有两个入度和两个出度,由于出度和入度相等,所以这是张五阶平衡有向图。

你以为我要通过图论得出什么结论吗?我都说了我是来发疯的,我只是想炫耀一下我的图论知识。有一说一,石头、剪刀、布、蜥蜴、史波克还是太简单了,这个图里连自环都没有(意思是说一个结点有指向自身的一条边),两个节点之间最多只有一条边,也没有权重。想看看真正复杂的游戏吗?

Behold. The Pokemon type chart! 2

表格的左侧代表进攻方,上方代表防御方(受击方),每个表项代表攻击倍率。可以先看第一行,一般系(NORMAL)作为攻击方时,对岩石系(ROCK)和钢系(STEEL)造成 ½ 倍率的伤害,对幽灵系(GHOST)造成 0 倍率的伤害。

不难理解,宝可梦属性相克表实际上是个带权有向图的邻接矩阵,其中权重代表的是攻击方对防御方造成的伤害倍率,空白的格子其实应该是 1。我们可以把图画出来…… 噢等等,看样子还是算了吧。

一般而言,攻击方对防御方造成 2 倍伤害被称作「克制」,比如火系克制草系;造成 0.5 倍伤害则被称作「抵抗」,比如水系抵抗自身;造成 0 倍伤害叫作「无效」,比如幽灵系对一般系无效。如果要用宝可梦属性玩剪刀石头布,就要考虑倍率问题。直觉上,由于火系克制草系,那么出「火」的玩家应该能立刻打败出「草」的玩家,那么「火」对「电」呢?倍率为 1 的情况下怎么判定?如果假设玩家有 2 的生命值,而两次出「火」就能打败两次都出「电」的玩家,那只要不是低概率出现的「无效」,所有玩家都能在两回合内战胜彼此,游戏就没有太多意义了。

等等,好像也说不定?你等我写个程序模拟一下。

先定义 type-list,用 Clojure 的关键词类型列出所有的属性。

(def type-list [:NORMAL 
 :FIGHTING 
 :POISON
 :FLYING
 :GROUND
 :ROCK 
 :BUG 
 :GHOST
 :STEEL
 :FIRE 
 :WATER 
 :GRASS 
 :ELECTRIC
 :PSYCHIC
 :ICE 
 :DRAGON
 :DARK
 :FAIRY])

然后写两个简单的小函数,方便获取属性在表中的索引,或者用索引获得属性名称,这就很像枚举类型了。

(defn type-index [type-name]
 (.indexOf type-list type-name))

(type-index :BUG) ;; => 6

(defn type-name [type-index]
 (get type-list type-index))

(type-name 2) ;; => POISON

接下来录入所有的属性相克关系,不必惊慌,可以直接复制属性相克表,粘贴到代码中变成一个二级数组,也就是矩阵的结构,然后运行 Vim 的 :%s/.../... 命令替换掉 × 之类的字符,就得到了一张干净的邻接矩阵。哦对了,Clojure 里 1/2 是不合法的,应该写成 (/ 1 2),这里批量替换为 0.5 就好。

(def type-effects [[1	1	1	1	1	0.5	1	0	0.5	…
添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论