编程:从入门到放弃
    前言
    语言和环境
    +=
    C和C++
    Hex
    Map
    Scope(1):"这"是啥
    Scope(2)
    Singleton
    什么顺序
    从A到Z
    函数
    切分字符串
    初始化(1)
    初始化(2)
    单引号,还是双引号
    参数传递
    左,还是右
    引用
    时间(1)
    时间(2)
    时间(3)
    时间(4)
    时间(5)
    比大小
    流氓甘地
    相等,还是不等(1)
    相等,还是不等(2)
    相等,还是不等(3)
    相等,还是不等(4)
    第一个说了算,还是最后一个
    语言和环境
    除以0
    随机数

流氓甘地

Updated: 2021-12-12

入门。

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

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

再举个例子:《文明》,经典的回合制游戏。游戏中的每个领袖都有很多属性,这些属性对游戏玩家是不可见的,内部使用数字来表示大小强弱。由于游戏基于真实的历史和人物,这些属性也是尽量的在反应这些人物的性格和个性。在早期版本中,“侵略性”由一个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

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