Охота на Вумпуса
Gregory Yob, 1973
Twenty caves, three tunnels out of each, one wumpus asleep somewhere in the dark. You smell it before you reach it, you never see it, and when you shoot you name a single cave. Gregory Yob laid the map out as a dodecahedron in 1973 because he was tired of games played on a grid.

Run this disk · The image, 256,256 bytes
Gregory Yob had had enough of hide-and-seek on a checkerboard. Every hunting game of the early seventies put its target in a square of a grid, and the strategy was always the same halving, over and over, until the square fell out. So he took the grid away and handed the player a graph: twenty rooms, three doors each, the vertices and edges of a dodecahedron. You cannot draw that from inside it without effort, and the effort is the game. Real topology, in a program from 1973, on machines whose owners had never heard the word.
The warnings are what make it playable. A smell means the wumpus is one room away, a draft means a pit is one room away, and neither of them tells you which room. You are being asked to build a map out of local evidence and then bet an arrow on it. Children who could not have defined a graph learned to reason across one, because the alternative was being eaten. It traveled the way the whole canon traveled, as a listing in David Ahl's second collection, and a printed listing needs no license, no distributor and no export permit. Somebody just types it in.
The adjacency is a table of sixty entries written out by hand, three per cave, and it is the actual object rather than a suggestion of one: twenty vertices, every one of degree three, every connection symmetric, shortest cycle five, and no two caves more than five moves apart. Wumpus, pit and bats are placed at the start, none of them on top of each other or on you. Each turn prints your cave and the three that lead out, then any warnings, then asks whether to walk or shoot. The bats carry you off to a random cave, which can drop you straight onto the wumpus. A missed arrow can wake it and move it somewhere else.
This is the title that leans hardest on chance: four placements at the start, the bat teleport, the waking of the wumpus. RND appears nowhere in the recovered software, because a program that computes wages has no use for randomness and so the dialect never gave the atom up. There was nothing to copy. The generator is therefore plain BASIC, six lines of it, with the modulo done by subtracting a hundred until the number fits, and a truncation routine sits next to it doing the job of INT. Everything unpredictable on this disk comes out of those two subroutines.
And then it runs. ЧУВСТВУЮ ВУМПУСА on a screen built for wage tables, on a machine whose other recovered disks compute stipends for a vocational school and carry a planning suite from a Gosplan institute. One hundred and seventy-two lines fit in ten sectors, the catalog gives the program eight characters like everything else, and the interpreter has no opinion about being asked to model a dodecahedron. That is the part I keep coming back to. The machine was never the limitation. Nobody had written this for it, and nobody was going to.
This disk was written in 2026. Yob's design is common property and has been reimplemented for fifty years, but the code in this image is mine, written this year against a dialect reconstructed from the six recovered sides. Nothing here was excavated. No Soviet games disk has ever surfaced, and if one ever does it will look nothing like this. What the image proves is a smaller thing worth more than a forgery: reading a disk format wrong can go unnoticed indefinitely, and writing one that an independent parser then loads, lists and executes cannot.
Warnings ("ЧУВСТВУЮ ВУМПУСА", "СКВОЗНЯК"), bat teleport, pathfinding across the graph, the kill.
What is tested is the emulator, not the hardware. The seed is fixed at 37, since no clock function is attested, so the same cave layout comes up on every run. This is also a reduced hunt: Yob gives you two pits, two bat colonies and five crooked arrows that fly through as many as five rooms. Here there is one pit, one colony of bats, and the arrow goes to a single named cave, though you may keep shooting.
WUMPUS.bas, 172 lines, assembled onto the image with iskra_asm.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
10 REM HUNT THE WUMPUS 20 PRINT "*** ОХОТА НА ВУМПУСА ***" 30 PRINT "20 ПЕЩЕР, В КАЖДОЙ 3 ХОДА." 40 PRINT "БЕРЕГИТЕСЬ ЯМ И ЛЕТУЧИХ МЫШЕЙ." 50 GOSUB 1000 60 V50 = 37 70 GOSUB 900 71 V61 = V50 / 5 72 GOSUB 950 73 V01 = V60 + 1 80 GOSUB 900 81 V61 = V50 / 5 82 GOSUB 950 83 V02 = V60 + 1 84 IF V02 = V01 GOTO 80 90 GOSUB 900 91 V61 = V50 / 5 92 GOSUB 950 93 V03 = V60 + 1 94 IF V03 = V01 GOTO 90 95 IF V03 = V02 GOTO 90 100 GOSUB 900 101 V61 = V50 / 5 102 GOSUB 950 103 V04 = V60 + 1 104 IF V04 = V01 GOTO 100 105 IF V04 = V02 GOTO 100 106 IF V04 = V03 GOTO 100 110 V10 = 0 120 V10 = V10 + 1 130 PRINT "--- ХОД";V10;" ВЫ В ПЕЩЕРЕ";V01 140 V11 = V01 - 1 141 V11 = V11 * 3 142 V12 = V11 + 1 143 V13 = V11 + 2 144 V14 = V11 + 3 150 V15 = A30(V12) 151 V16 = A30(V13) 152 V17 = A30(V14) 160 PRINT "ХОДЫ ВЕДУТ В";V15;V16;V17 170 IF V15 = V02 GOTO 175 171 IF V16 = V02 GOTO 175 172 IF V17 = V02 GOTO 175 173 GOTO 180 175 PRINT "ЧУВСТВУЮ ВУМПУСА!" 180 IF V15 = V03 GOTO 185 181 IF V16 = V03 GOTO 185 182 IF V17 = V03 GOTO 185 183 GOTO 190 185 PRINT "СКВОЗНЯК - РЯДОМ ЯМА!" 190 IF V15 = V04 GOTO 195 191 IF V16 = V04 GOTO 195 192 IF V17 = V04 GOTO 195 193 GOTO 200 195 PRINT "СЛЫШУ ЛЕТУЧИХ МЫШЕЙ!" 200 PRINT "1-ИДТИ 2-СТРЕЛЯТЬ" 210 INPUT V20 220 IF V20 = 2 GOTO 400 230 PRINT "В КАКУЮ ПЕЩЕРУ" 240 INPUT V21 250 IF V21 = V15 GOTO 280 251 IF V21 = V16 GOTO 280 252 IF V21 = V17 GOTO 280 253 PRINT "ТУДА ХОДА НЕТ." 254 GOTO 200 280 V01 = V21 290 IF V01 = V02 GOTO 700 300 IF V01 = V03 GOTO 720 310 IF V01 = V04 GOTO 320 315 GOTO 120 320 PRINT "ЛЕТУЧИЕ МЫШИ УНЕСЛИ ВАС!" 330 GOSUB 900 331 V61 = V50 / 5 332 GOSUB 950 333 V01 = V60 + 1 340 GOTO 290 400 PRINT "В КАКУЮ ПЕЩЕРУ СТРЕЛЯТЬ" 410 INPUT V22 420 IF V22 = V02 GOTO 740 430 PRINT "СТРЕЛА УШЛА В ПУСТОТУ." 440 GOSUB 900 441 IF V50 > 50 GOTO 450 442 GOTO 120 450 PRINT "ВУМПУС ПРОСНУЛСЯ И ПЕРЕШЕЛ!" 460 GOSUB 900 461 V61 = V50 / 5 462 GOSUB 950 463 V02 = V60 + 1 464 IF V02 = V01 GOTO 700 470 GOTO 120 700 PRINT "*** ВУМПУС СЪЕЛ ВАС! ***" 710 GOTO 800 720 PRINT "*** ВЫ УПАЛИ В ЯМУ! ***" 730 GOTO 800 740 PRINT "*** ВУМПУС УБИТ! ПОБЕДА! ***" 750 PRINT "ХОДОВ:";V10 760 END 800 PRINT "ИГРА ОКОНЧЕНА НА ХОДУ";V10 810 END 900 V50 = V50 * 21 910 V50 = V50 + 13 920 IF V50 < 100 GOTO 940 930 V50 = V50 - 100 935 GOTO 920 940 RETURN 950 V60 = 0 960 IF V61 < 1 GOTO 990 970 V60 = V60 + 1 980 V61 = V61 - 1 985 GOTO 960 990 RETURN 1000 A30(1) = 2 1001 A30(2) = 5 1002 A30(3) = 8 1003 A30(4) = 1 1004 A30(5) = 3 1005 A30(6) = 10 1006 A30(7) = 2 1007 A30(8) = 4 1008 A30(9) = 12 1009 A30(10) = 3 1010 A30(11) = 5 1011 A30(12) = 14 1012 A30(13) = 1 1013 A30(14) = 4 1014 A30(15) = 6 1015 A30(16) = 5 1016 A30(17) = 7 1017 A30(18) = 15 1018 A30(19) = 6 1019 A30(20) = 8 1020 A30(21) = 17 1021 A30(22) = 1 1022 A30(23) = 7 1023 A30(24) = 9 1024 A30(25) = 8 1025 A30(26) = 10 1026 A30(27) = 18 1027 A30(28) = 2 1028 A30(29) = 9 1029 A30(30) = 11 1030 A30(31) = 10 1031 A30(32) = 12 1032 A30(33) = 19 1033 A30(34) = 3 1034 A30(35) = 11 1035 A30(36) = 13 1036 A30(37) = 12 1037 A30(38) = 14 1038 A30(39) = 20 1039 A30(40) = 4 1040 A30(41) = 13 1041 A30(42) = 15 1042 A30(43) = 6 1043 A30(44) = 14 1044 A30(45) = 16 1045 A30(46) = 15 1046 A30(47) = 17 1047 A30(48) = 20 1048 A30(49) = 7 1049 A30(50) = 16 1050 A30(51) = 18 1051 A30(52) = 9 1052 A30(53) = 17 1053 A30(54) = 19 1054 A30(55) = 11 1055 A30(56) = 18 1056 A30(57) = 20 1057 A30(58) = 13 1058 A30(59) = 16 1059 A30(60) = 19 1060 RETURN