如何为没有输入和输出设备的计算机编写游戏

没有任何输入设备的电磁继电器上计算机 ,以及从输出设备(仅转储八个寄存器)的计算机上,可以做什么?

当然玩游戏! 古代人使用MK-61 / 52计算器玩,这一点更加明显。



猜数字


我从游戏开始,其中使用半数除法的计算机应找到玩家隐藏的整数(从0到100)。

计算机将其预感写入寄存器A,然后停止。

继电器内置的LED可以显示所有寄存器的值:



现在,播放器必须更改ROM中的程序代码,替换加载到寄存器D中的常数。如果不为0,则意味着假设大于您要求的数量。 否则,少一些。 之后,您需要单击“继续工作”按钮。 在检查情况D之后,计算机在下一次尝试中将先前的假设用作上限或下限。

程序的第一个版本
MOVI B, 1 ; 00: 10000001 00000001 MOVI C, 101 ; 01: 10000010 01100101 Loop: ADD A, B, C ; 02: 01001000 00011010 SHR A, A ; 03: 01111000 00001100 HALT ; 04: 00010000 00000000 MOVI D, guess ; 05: 10000011 iiiiiiii OR F, D, D ; 06: 01101000 00110011 JMP NZ, Greater ; 07: 11100111 00001010 MOV B, A ; 08: 00011001 00000000 JMP Loop ; 09: 10000111 00000010 Greater: MOV C, A ; 0a: 00011010 00000000 JMP Loop ; 0b: 10000111 00000010 




第一个程序的缺点是使用不方便。 可以通过查看ROM的照片来理解这一点-在玩游戏时切换如此小的拨动开关并不容易(但您还需要确保程序不会意外破坏它)。

所以我想出了一个不同的输入选项。 为了调试在每个寄存器旁边提供了一个拨动开关以重置其值。 切换它比更改ROM更方便。

现在,计算机会提前将单元输入寄存器D中,然后播放器将其丢弃(如果猜测小于预期数字),或者将其保留原样(如果猜测大于预期)。

程序的最终版本
  MOVI B, 1 ; 00: 10000001 00000001 MOVI C, 101 ; 01: 10000010 01100101 Loop: ADD A, B, C ; 02: 01001000 00011010 SHR A, A ; 03: 01111000 00001100 MOVI D, 1 ; 04: 10000011 00000001 HALT ; 05: 00010000 00000000 OR F, D, D ; 06: 01101000 00110011 JMP NZ, Greater ; 07: 11100111 00001010 MOV B, A ; 08: 00011001 00000000 JMP Loop ; 09: 10000111 00000010 Greater: MOV C, A ; 0a: 00011010 00000000 JMP Loop ; 0b: 10000111 00000010 



减法游戏(bashe游戏)


新手程序员经常实施的另一个经典游戏是Bachet游戏。
在游戏中,来自最初包含N个物品的堆中的两个玩家轮流使用至少一个且不超过M个物品。 失败者是一无所有的人。



在我的版本中,游戏配有计算机。 最初,一堆21个项目(例如21个匹配项)。 玩家在回合中进行1到3场比赛,最后一场比赛获胜。

游戏为第一个玩家制定了获胜策略-始终保留比赛次数,该数目是四的倍数。 由于0也是4的倍数,因此第二个玩家将无法将游戏带到该位置,这意味着他将输掉比赛。

计算机排在第二位,给人们留下了机会,但它不会出错。 并且,如果玩家不遵循获胜策略,则计算机会做到这一点。

程序的第一个版本
  MOVI A, 21 ; 00: 10000000 00001101 Loop: HALT ; 01: 00010000 00000000 MOVI B, move ; 02: 10000001 000000mm SUB A, A, B ; 03: 01011000 00001001 AND C, A, 3 ; 04: 01100010 10001011 MOVI Z, C, 1 ; 05: 10010010 00000001 SUB A, A, C ; 06: 01011000 00001010 JMP Loop ; 07: 10000111 00000001 


在第一个版本中,使用了与“猜测数字”相同的方法-轮到您,您必须在其中一条指令中编码匹配数。 您甚至可以一次计算并参加所有比赛,计算机不会注意到任何东西。

但是后来我也重写了这个程序。 现在,计算机在三个寄存器(B,C,D)中分别输入1,并且播放器必须重置其中的0、1或2。 剩下的单位就是他参加的那些比赛。 如果您重置所有三个寄存器(就像您什么都没拿一样),也可能会作弊。

程序的最终版本
  MOVI A, 21 ; 00: 10000000 00010101 Loop: MOVI B, 1 ; 01: 10000001 00000001 MOVI C, 1 ; 02: 10000010 00000001 MOVI D, 1 ; 03: 10000011 00000001 HALT ; 04: 00010000 00000000 SUB A, A, B ; 05: 01011000 00001001 SUB A, A, C ; 06: 01011000 00001010 SUB A, A, D ; 07: 01011000 00001011 AND C, A, 3 ; 08: 01100010 10001011 MOVI Z, C, 1 ; 09: 10010010 00000001 SUB A, A, C ; 0a: 01011000 00001010 JC Exit ; 0b: 10110111 00001101 JNZ Loop ; 0c: 11100111 00000001 Exit: HALT ; 0d: 00010000 00000000 


当然,该程序实际上要更长一些,但是使用起来要方便得多。


此外,我计划完成ROM(现在可能只有64个字,现在只有32个字),并且还以拨动开关矩阵的形式添加输入设备。 也许那时您至少可以打井字游戏。

Source: https://habr.com/ru/post/zh-CN421491/


All Articles