最近在玩一款编程类的游戏,叫做《程序员升职记》,steam 平台只需¥36。通过组合几条非常基本的指令,例如加减、自加、自减、比较、跳转,实现一些小功能,例如简单的数值绝对值输出、两数乘法、阶乘运算、反转字符串等。游戏的本质是一款支持 11 条指令,最多支持 24 字节内存的 8 位 cpu 的运行。

这款游戏前面的一些关卡主要在引导和介绍游戏,同时不断给出新的指令,开始只有简单的几条指令,后面会加入对内存的使用,间接寻址的使用,因此可以实现指针的操作。每一关都会给出随机的输入,经过你编写的程序后,算出符合要求的输出。编写程序的过程可以通过单步运行来调试,所以可以很快知道程序在哪里出错,并修改。

这款游戏可以很好地帮助你理解 CPU 的运行原理,编写的程序其实就是汇编程序,每一条指令都可以对应到一条汇编指令。通过复制指令到记事本也可以看出。关卡的输入每一次都是随机出现的,这就要求程序要在任何合理的输入下都可以正确运行,而不是当前给定的输入。这款游戏又不像我之前玩过的另一款手机上的编程类游戏–light robot。这款游戏在指令的条数上没有任何限制,也就是说你可以使用不限数量的指令来实现你的程序,但另一方面游戏非常鼓励你找到一种最优解,使得指令条数和运算次数都尽可能的少,这意味着程序所需的代码空间很少,同时运算速度又最快。所以你可以先按照你对这个题目的解题思路来实现这个程序,等程序完美运行没有出错后,再来考虑怎么优化程序。light robot 是一款通过组合指令来实现不同的点灯效果的游戏,但是这个游戏是限制指令数量的,因此你不能先实现再进行优化,你必须一来就找到最优解,这让我在后面的关卡无法继续。

这款游戏还有一个特点就是支持单步调试,通过单步运行,可以很快看出运行出错的地方,结合指令,可以很快看出错误。在简单的测试没有出错之后,又可以全速运行程序,完成题目。因为所有的题目基本上都是需要通过跳转来实现循环结构的,这样可以实现不停的输入。而在你刚开始编写的程序中,很可能是没有考虑到所有情况的,可能这组输入运算正确,而到了下一组就不正确了。因此通过单步,中断运行,回退指令可以查看运算错误的原因,这和平常的开发也很像。

开头说了,这款游戏的解题过程其实就是一款简单 CPU 运行的过程。这款 CPU 最多支持11条指令,可以分为四类。第一类基本输入输出 input/output,第二类对内存的读写 copyfrom/copyto,第三类加减运算,包括加减一个数,和一个数自加一和自减一,第四类跳转指令,包括无条件跳转、值为零跳转、值为负跳转。第一类和第四类指令的运行不需要提供参数,指令的运行仅影响 CPU 寄存器或者仅受 CPU 寄存器的影响。而第二类和第三类的指令是需要提供一个参数的,刚开始这个参数是一个值,后面的关卡中加入了间接寻址,可以通过类似指针的操作来实现更多的功能,因此第二类和第三类指令的参数也支持地址参数。

根据关卡的不同,可以用的内存大小(地毯数量)是不同的,最多的时候有 24 字节,有时候地毯上是有值的,类似于C语言中带初值的全局变量。对内存的使用主要是读写,而且不允许对一个空的内存执行读操作,因为此时该值是未知的。内存用来暂存一些程序运行时的中间数据。很多关卡都会在内存中给一个 0 值,因为 CPU 不支持立即寻址,因此将 0 值通过内存的方式给定,0 值经常被用于计数,因此你可能需要在程序的开始将其复制到另一块内存中,以确保下一次的输入还是可以拷贝一个 0,并从 0 开始计数。

这款游戏的编程语言是汇编,从程序执行结构上来说就只有两种,一种是顺序结构,另一种是选择结构,而循环结构则是需要通过选择结构和跳转指令来实现的。但由于跳转指令只有三条,带条件的只有值为零和值为负两种,也就是说在做某些题是需要判断值为正的,则需要进行对应的转换。在后面的关卡中,出现的题目比较复杂,需要采用子程序的设计来实现,类似于函数的概念。有一关里面甚至给出了一小段程序。

这款游戏的关卡不是很多,通关也不会花费很长的时间,但是程序给出了一个最优解的标准,对指令数量和运行次数的最大值给以限制,想要每一关都可以实现最优解也是需要费一番功夫的。另外游戏本身是有一条故事线的,虽然关系并不大,但是聊胜于无。

记一款游戏--《程序员升职记》相关推荐

  1. [转载]一个游戏程序员的学习资料

    想起写这篇文章是在看侯杰先生的<深入浅出MFC>时,突然觉得自己在大学这几年关于游戏编程方面还算是有些心得,因此写出这篇小文,介绍我眼中的游戏程序员的书单与源代码参考.一则是作为自己今后两 ...

  2. 转 一个游戏程序员的学习资料

    想 起写这篇文章是在看侯杰先生的<深入浅出MFC>时,突然觉得自己在大学这几年关于游戏编程方面还算是有些心得,因此写出这篇小文,介绍我眼中的游戏程序 员的书单与源代码参考.一则是作为自己今 ...

  3. 一个游戏程序员的学习资料(转)

    源地址:http://software.intel.com/zh-cn/blogs/2012/03/20/400010004/?cid=sw:prccsdn2194 想起写这篇文章是在看侯杰先生的&l ...

  4. 一个游戏程序员的学习资料【转】

    转自: http://software.intel.com/zh-cn/blogs/2012/03/20/400010004/?cid=sw:prccsdn2194 想起写这篇文章是在看侯杰先生的&l ...

  5. 【转】一个游戏程序员的学习资料

    想起写这篇文章是在看侯杰先生的<深入浅出MFC>时, 突然觉得自己在大学这几年关于游戏编程方面还算是有些心得,因此写出这篇小文,介绍我眼中的游戏程序 员的书单与源代码参考.一则是作为自己今 ...

  6. 【游戏人生】一个游戏程序员的学习资料

    想起写这篇文章是在看侯杰先生的<深入浅出MFC>时, 突然觉得自己在大学这几年关于游戏编程方面还算是有些心得,因此写出这篇小文,介绍我眼中的游戏程序 员的书单与源代码参考.一则是作为自己今 ...

  7. 一个游戏程序员的学习资料 (zz)

    一个游戏程序员的学习资料 //z 2012-4-19 14:39:51 PM IS2120@CSDN 想起写这篇文章是在看侯杰先生的<深入浅出MFC>时, 突然觉得自己在大学这几年关于游戏 ...

  8. 《程序员升职记》0.简介

    <程序员升职记>(英文名:Human Resource Machine)是一款编程类的游戏,通过模几条简单的指令模拟CPU实现各种各样的功能. 游戏中的主人公扮演一名程序员入职明日公司,从 ...

  9. 一个游戏程序员的资料一(转)

    想起写这篇文章是在看侯杰先生的<深入浅出MFC>时,突然觉得自己在大学这几年关于游戏编程方面还算是有些心得,因此写出这篇小文,介绍我眼中的游戏程序员的书单与源代码参考.一则是作为自己今后两 ...

最新文章

  1. 3.5.5 CSMA/CA 协议
  2. 无插件无 Flash HTML5 浏览器直接玩《Quake II》
  3. Linux内核源码分析--内核启动之(2)Image内核启动(汇编部分)(Linux-3.0 ARMv7) 【转】...
  4. 转:AMS之dumpsys篇
  5. CALL FUNCTION START NEW TASK
  6. inventory tool for Microsoft Uplates简介
  7. 2005年7月19日
  8. 601. 体育馆的人流量
  9. VMware12序列号
  10. Android 测试(Unit Test Instrument Test)
  11. CentOS 编译安装 Nebula Graph 3.10
  12. 想加薪怎么和领导谈?学会这四招轻松涨薪
  13. 网络诊断显示服务器有问题,Win7系统网络诊断提示DNS服务器未响应怎么解决
  14. win10更新时强制关机会如何
  15. 并行传输数据和串行传输数据_为什么串行数据传输比并行数据传输快?
  16. Babel转码器详解
  17. python字典求平均值_Python
  18. 在Ubuntu中配置中文输入法
  19. 高分子物理名词解释归纳
  20. ios 内存深度优化_iPhone6用1GB内存 优化太好还是另有玄机

热门文章

  1. iOS App Store 上传项目报 隐私政策网址(URL)!~解决方法
  2. 关于Jonathan S. Weissman与RIT(罗切斯特理工学院,位于纽约)
  3. Dubbox框架使用手册
  4. Scaling Instruction-Finetuned Language Models翻译
  5. Dart的mixin详解
  6. java用数组存放账号密码_从零自学Java-7.使用数组存储信息
  7. 3.1.hole_behind_comprehensive_teaching_complex 综教楼后的那个坑
  8. 克里金插值详细步骤_openlayers4 入门开发系列之前端动态渲染克里金插值 kriging 篇(附源码下载)...
  9. Android 9.0 framework 授予安装未知来源应用权限(去掉未知来源弹窗)
  10. power bi -分组累计求和