QBasic,309个字节
警告:高尔夫球版本不是用户友好的:它具有一种怪异的输入法,可以无限循环运行,并且没有任何延迟(因此,在某些系统上运行太快)。仅当您知道如何在QBasic环境中终止程序时才运行它。建议使用非高尔夫版本(请参见下文)。
INPUT w,h
SCREEN 9
FOR y=1TO h
FOR x=1TO w
PSET(x,y),VAL(INPUT$(1))
NEXT
NEXT
DO
FOR y=1TO h
FOR x=1TO w
SCREEN,,0
c=POINT(x,y)
d=c
IF c=7THEN d=1
IF c=1THEN d=6
IF c=6THEN
n=0
FOR v=y-1TO y+1
FOR u=x-1TO x+1
n=n-(POINT(u,v)=7)
NEXT
NEXT
d=7+(n=0OR n>2)
END IF
SCREEN,,1,0
PSET(x,y),d
NEXT
NEXT
PCOPY 1,0
LOOP
要运行,请在输入提示下指定配置的width w
和height h
。1然后输入w*h
单元格的一位数字代码(从左到右,然后从上到下移动),用
输入所有单元格后,模拟将开始(并一直持续到您终止程序为止)。
不打高尔夫球
一个更加用户友好的版本。要修改布局,请最后修改DATA
语句。
该代码利用了该POINT
功能,该功能从屏幕读取像素的颜色值。这意味着我们不必将单元格单独存储为数组。为了确保所有单元同时更新,我们在第二个“页面”上执行更新。我们可以使用该SCREEN
语句的版本切换活动页面,并使用该PCOPY
语句将一个页面的内容复制到另一页面。
SCREEN 9
EMPTY = 0 ' Black
HEAD = 7 ' Light gray
TAIL = 1 ' Blue
WIRE = 6 ' Brown/orange
' First two data values are the width and height
READ w, h
' The rest are the initial configuration, row by row
' Read them and plot the appropriately colored pixels
FOR y = 1 TO h
FOR x = 1 TO w
READ state$
IF state$ = "" THEN value = EMPTY
IF state$ = "H" THEN value = HEAD
IF state$ = "T" THEN value = TAIL
IF state$ = "W" THEN value = WIRE
PSET (x, y), value
NEXT x
NEXT y
' Loop the simulation until user presses a key
DO UNTIL INKEY$ <> ""
' Store current time for delay purposes
t# = TIMER
FOR y = 1 TO h
FOR x = 1 TO w
' Active page = display page = 0
SCREEN , , 0
' Get the color value of the pixel at x,y
oldVal = POINT(x, y)
IF oldVal = EMPTY THEN
newVal = EMPTY
ELSEIF oldVal = HEAD THEN
newVal = TAIL
ELSEIF oldVal = TAIL THEN
newVal = WIRE
ELSEIF oldVal = WIRE THEN
neighbors = 0
FOR ny = y - 1 TO y + 1
FOR nx = x - 1 TO x + 1
IF POINT(nx, ny) = HEAD THEN neighbors = neighbors + 1
NEXT nx
NEXT ny
IF neighbors = 1 OR neighbors = 2 THEN
newVal = HEAD
ELSE
newVal = WIRE
END IF
END IF
' Active page = 1, display page = 0
SCREEN , , 1, 0
' Plot the new value on page 1
PSET (x, y), newVal
NEXT x
NEXT y
' Copy page 1 to page 0
PCOPY 1, 0
' Delay
WHILE TIMER >= t# AND t# + 0.2 > TIMER
WEND
LOOP
DATA 8,5
DATA T,H,W,W,W,W,W,W
DATA W, , , ,W, , ,
DATA , , ,W,W,W, ,
DATA W, , , ,W, , ,
DATA H,T,W,W, ,W,W,W
1宽度和高度的最大值取决于所使用的屏幕模式。在中SCREEN 9
,宽度最多可以为638,高度最多可以为348。SCREEN 7
具有较小的分辨率(最大配置尺寸为318 x 198),但是像素较大,因此更易于查看(在DOS QBasic或DOSBox仿真器上-不幸的是,QB64仅给出一个较小的窗口)。
运行示例
屏幕模式7 上archive.org上的取消发布版本: