流氓甘地

Updated: 2018-12-30

入门

电子游戏,说到底都是基于数学和逻辑的模拟。

比如在战斗类的游戏中,你的攻击力是个数字,对方的防御力是另一个数字,而一次攻击掉血的量是基于这两个数字和很多其他变量算出的。

再举个例子:《文明》,经典的回合制游戏。游戏中的每个领袖都有很多属性,这些属性对游戏玩家是不可见的,内部使用数字来表示大小强弱。由于游戏基于真实的历史和人物,这些属性也是尽量的在反应这些人物的性格和个性。在早期版本中,“侵略性”由一个0255的整数表示。比如甘地,“非暴力”本人,天生和平不具有侵略性,所以是全场最低的1。

坑!

你玩着《文明》,邻居是和蔼可亲的甘地大爷,所以完全没有提防,直到有一轮,甘地突然冲你宣战,你一脸懵逼的被推了。悄悄告诉你,此时甘地的“侵略性”从1暴增到了255...

所以,这是你所不知道的历史上真是的甘地,还是哪个临时工程序员写的bug?

Gandhi

进阶

255, 很容易联想到2^8,也就是用8个比特位能表达的最大的整数,比如C中的unsigned char就被用来表达[0, 255]的整数。由于是unsigned,它无法表达负数。

游戏中如果有人选择了“民主(democracy)”,那侵略性会减2,所以对于甘地而言,他的侵略性就成了...负1。如果负数无法被表达,会发生什么?

unsigned char a = 1;
a = a - 2;
printf("%hhu", a); // => 255

所以,“侵略性”爆表,意味着一个战争贩子的诞生。