GW-BASIC, 1086 1035 байт (токенизирован)
В токенизированной форме это 1035 байтов. (Форма ASCII, конечно, немного длиннее.) Вы получаете токенизированную форму, используя SAVE"life
команду без добавления ",a
в интерпретатор.
10 DEFINT A-Z:DEF SEG=&HB800:KEY OFF:COLOR 7,0:CLS:DEF FNP(X,Y)=PEEK((((Y+25)MOD 25)*80+((X+80)MOD 80))*2)
20 X=0:Y=0
30 LOCATE Y+1,X+1,1
40 S$=INKEY$:IF S$=""GOTO 40
50 IF S$=CHR$(13)GOTO 150
60 IF S$=" "GOTO 130
70 IF S$=CHR$(0)+CHR$(&H48)THEN Y=(Y-1+25)MOD 25:GOTO 30
80 IF S$=CHR$(0)+CHR$(&H50)THEN Y=(Y+1)MOD 25:GOTO 30
90 IF S$=CHR$(0)+CHR$(&H4B)THEN X=(X-1+80)MOD 80:GOTO 30
100 IF S$=CHR$(0)+CHR$(&H4D)THEN X=(X+1)MOD 80:GOTO 30
110 IF S$="c"THEN CLS:GOTO 20
120 GOTO 40
130 Z=PEEK((Y*80+X)*2):IF Z=42 THEN Z=32ELSE Z=42
140 POKE(Y*80+X)*2,Z:GOTO 40
150 LOCATE 1,1,0:ON KEY(1)GOSUB 320:KEY(1) ON
160 V!=TIMER+.5:FOR Y=0 TO 24:FOR X=0 TO 79:N=0
170 Z=FNP(X-1,Y-1):IF Z=42 OR Z=46 THEN N=N+1
180 Z=FNP(X,Y-1):IF Z=42 OR Z=46 THEN N=N+1
190 Z=FNP(X+1,Y-1):IF Z=42 OR Z=46 THEN N=N+1
200 Z=FNP(X-1,Y):IF Z=42 OR Z=46 THEN N=N+1
210 Z=FNP(X+1,Y):IF Z=42 OR Z=46 THEN N=N+1
220 Z=FNP(X-1,Y+1):IF Z=42 OR Z=46 THEN N=N+1
230 Z=FNP(X,Y+1):IF Z=42 OR Z=46 THEN N=N+1
240 Z=FNP(X+1,Y+1):IF Z=42 OR Z=46 THEN N=N+1
250 Z=PEEK((Y*80+X)*2):IF Z=32 THEN IF N=3 THEN Z=43
260 IF Z=42 THEN IF N<2 OR N>3 THEN Z=46
270 POKE(Y*80+X)*2,Z:NEXT:NEXT:FOR Y=0 TO 24:FOR X=0 TO 79:Z=PEEK((Y*80+X)*2):IF Z=46 THEN Z=32
280 IF Z=43 THEN Z=42
290 POKE(Y*80+X)*2,Z:NEXT:NEXT
300 IF TIMER<V!GOTO 300
310 IF INKEY$=""GOTO 160
320 SYSTEM
Это максимальная версия для игры в гольф, но она по-прежнему интересна: при запуске вы получаете редактор, в котором вы можете перемещаться с помощью клавиш курсора; пробел включает / выключает бактерии на текущем поле, c
очищает экран, Return запускает режим игры.
Ниже следует менее запутанная версия, которая также устанавливает начальную игровую доску с двумя структурами (вращающаяся по кругу вещь и планер):
1000 REM Conway's Game of Life
1001 REM -
1002 REM Copyright (c) 2012 Thorsten "mirabilos" Glaser
1003 REM All rights reserved. Published under The MirOS Licence.
1004 REM -
1005 DEFINT A-Z:DEF SEG=&hB800
1006 KEY OFF:COLOR 7,0:CLS
1007 DEF FNP(X,Y)=PEEK((((Y+25) MOD 25)*80+((X+80) MOD 80))*2)
1010 PRINT "Initial setting mode, press SPACE to toggle, RETURN to continue"
1020 PRINT "Press C to clear the board, R to reset. OK? Press a key then."
1030 WHILE INKEY$="":WEND
1050 CLS
1065 DATA 3,3,4,3,5,3,6,3,7,3,8,3,3,4,4,4,5,4,6,4,7,4,8,4
1066 DATA 10,3,10,4,10,5,10,6,10,7,10,8,11,3,11,4,11,5,11,6,11,7,11,8
1067 DATA 11,10,10,10,9,10,8,10,7,10,6,10,11,11,10,11,9,11,8,11,7,11,6,11
1068 DATA 4,11,4,10,4,9,4,8,4,7,4,6,3,11,3,10,3,9,3,8,3,7,3,6
1069 DATA 21,0,22,1,22,2,21,2,20,2,-1,-1
1070 RESTORE 1065
1080 READ X,Y
1090 IF X=-1 GOTO 1120
1100 POKE (Y*80+X)*2,42
1110 GOTO 1080
1120 X=0:Y=0
1125 LOCATE Y+1,X+1,1
1130 S$=INKEY$
1140 IF S$="" GOTO 1130
1150 IF S$=CHR$(13) GOTO 1804
1160 IF S$=" " GOTO 1240
1170 IF S$=CHR$(0)+CHR$(&h48) THEN Y=(Y-1+25) MOD 25:GOTO 1125
1180 IF S$=CHR$(0)+CHR$(&h50) THEN Y=(Y+1) MOD 25:GOTO 1125
1190 IF S$=CHR$(0)+CHR$(&h4B) THEN X=(X-1+80) MOD 80:GOTO 1125
1200 IF S$=CHR$(0)+CHR$(&h4D) THEN X=(X+1) MOD 80:GOTO 1125
1210 IF S$="c" THEN CLS:GOTO 1120
1220 IF S$="r" GOTO 1050
1225 IF S$=CHR$(27) THEN END
1230 GOTO 1130
1240 Z=PEEK((Y*80+X)*2)
1250 IF Z=42 THEN Z=32 ELSE Z=42
1260 POKE (Y*80+X)*2,Z
1270 GOTO 1130
1804 LOCATE 1,1,0
1900 ON KEY(1) GOSUB 2300
1910 KEY(1) ON
2000 V!=TIMER+.5
2010 FOR Y=0 TO 24
2020 FOR X=0 TO 79
2030 N=0
2040 Z=FNP(X-1,Y-1):IF Z=42 OR Z=46 THEN N=N+1
2050 Z=FNP(X ,Y-1):IF Z=42 OR Z=46 THEN N=N+1
2060 Z=FNP(X+1,Y-1):IF Z=42 OR Z=46 THEN N=N+1
2070 Z=FNP(X-1,Y ):IF Z=42 OR Z=46 THEN N=N+1
2080 Z=FNP(X+1,Y ):IF Z=42 OR Z=46 THEN N=N+1
2090 Z=FNP(X-1,Y+1):IF Z=42 OR Z=46 THEN N=N+1
2100 Z=FNP(X ,Y+1):IF Z=42 OR Z=46 THEN N=N+1
2110 Z=FNP(X+1,Y+1):IF Z=42 OR Z=46 THEN N=N+1
2120 Z=PEEK((Y*80+X)*2)
2130 IF Z=32 THEN IF N=3 THEN Z=43
2140 IF Z=42 THEN IF N<2 OR N>3 THEN Z=46
2150 POKE (Y*80+X)*2,Z
2160 NEXT X
2170 NEXT Y
2200 FOR Y=0 TO 24
2210 FOR X=0 TO 79
2220 Z=PEEK((Y*80+X)*2)
2230 IF Z=46 THEN Z=32
2240 IF Z=43 THEN Z=42
2250 POKE (Y*80+X)*2,Z
2260 NEXT X
2270 NEXT Y
2280 IF TIMER<V! GOTO 2280
2290 IF INKEY$="" GOTO 2000
2300 SYSTEM
Я написал это за 15 минут, скучая и ожидая друга, который одновременно занимался игрой в гольф со своим «учеником» для «Игры жизни» Конвея.
Он работает следующим образом: он сразу использует экранный буфер текстового режима 80x25 (измените исходное значение, DEF SEG
чтобы использовать его, &hB000
если вы используете видеокарту Hercules; эти настройки работают с Qemu и (более медленным) dosbox). Звездочка *
- это бактерия.
Он работает в два прохода: во-первых, места рождения помечены, +
а смерть помечает цели .
. Во втором проходе +
и .
заменяются на *
и
соответственно.
Дело в TIMER
том, чтобы заставить его ждать полсекунды после каждого раунда, если ваш хост Qemu работает очень быстро very
Я рассчитываю не на цену с кратчайшим выигрышем, а на крутую, особенно учитывая начальную настройку платы. У меня также есть версия, в которой игровой движок был заменен ассемблерным кодом, если вам интересно ...