毕业设计已经大致完成,在比较闲暇的时间里终于完成了《程序员升职记》这款编程游戏。这款游戏对应的计算机专业课程应当是汇编程序设计,作为一个科班出身的码农,对于编程这项工作再熟悉不过,然而事情并没有那么简单。

游戏介绍

刷题是锻炼码农们思维的一种有效途径,而本游戏可以认为是汇编版的LeetCode。如果可以采用高级语言,那么游戏中的编程提都是非常简单的,但是指令集和编辑器给玩家带来了一定难度。

  • 有限的指令集:游戏中能够使用的指令只有11条,几乎不存在冗余。主角充当了总线,而地板充当了内存,寻址方式有直接寻址和间接寻址。有限的指令集导致一些非常简单的操作变得复杂,例如乘法和除法这种在8086中一条指令完成的工作在游戏则需要使用循环。
指令 参数 功能
INBOX × 从输入获取一个数到手中
OUTBOX × 将手中的数送到输出,清空手中的数
COPYFROM 地板编号/[间接地板编号] 将地板中的数复制到手中
COPYTO 地板编号/[间接地板编号] 将手中的数复制到地板
BUMPIN 地板编号/[间接地板编号] 将地板上的数加一,同时将结果保存到地板和手中
BUMPDN 地板编号/[间接地板编号] 将地板上的数减一,同时将结果保存到地板和手中
ADD 地板编号/[间接地板编号] 将手中的数加上地板上的数,结果保存在手中
SUB 地板编号/[间接地板编号] 将手中的数减去地板上的数,结果保存在手中
JUMP 跳转位置 无条件跳转到指定位置
JUMPN 跳转位置 如果手中的数为负数,则跳转到指定位置
JUMPZ 跳转位置 如果手中的数为零,则跳转到指定位置
  • 拖拽的编辑器:码农作为代码搬运工,失去复制粘贴这个生产力工具,导致无法选择复制自己之前的代码段,只能用鼠标一条条指令重新摆放。另外,程序跳转的位置是用箭头表示的,加上GOTO指令本身就饱受诟病,代码可读性极差。

挑战优化

游戏中的编程题都是非常简单的,因此总是可以完成的,然而使用尽可能少的代码量或者运行时间才是游戏的精髓。笔者个人使用的优化方法主要有以下几个方面:

  • 循环展开:将循环中的一部分展开可以减少执行跳转指令的时间开销;

  • 数据复用:除了OUTBOX之外,其他指令执行之后的结果都会保留在手中,如果即可使用结果可以减少COPYFROM的使用次数;
  • 算法调整:算法优化需要视问题而定,例如除法实现可以使用二分法提高速度,最后一关使用插入排序会比冒泡排序和选择排序更快。

以上几种优化思路中,循环展开、二分法主要针对时间优化,而数据复用和算法调整是通过减少指令数量来减少运行时间。除此之外,还有很多优化方式难以一一概括,需要玩家发挥主观能动性。

码农宿命

在玩家努力之下,主人公终于完成了全部的工作和挑战,从青春少年变成油腻大叔。出色的工作得到了老板们的赏识,自己的职业生涯也到达了顶峰。

然后,他被公司找个理由炒了。

如果只有编程题而没有剧情,那么编程游戏顶多算个付费版的LeetCode。《程序员升职记》里包含了一些剧情,而其中主人公的命运令人唏嘘。主人公做着类似于汇编的工作,一方面越来越精通于自己的工作,但是同时也限制了自己,最后也被随随便便地赶出了公司。