QBasic, 309 bajtów
Ostrzeżenie: wersja gry w golfa nie jest przyjazna dla użytkownika: ma dziwną metodę wprowadzania, działa jako nieskończona pętla i nie ma żadnych opóźnień (dlatego działa zbyt szybko w niektórych systemach). Uruchom go tylko, jeśli wiesz, jak zakończyć program w środowisku QBasic. Zalecana jest wersja bez golfa (patrz poniżej).
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
Aby uruchomić, w wierszu poleceń podaj szerokość wi wysokość konfiguracji h. 1 Następnie wpisz w*hjednocyfrowe kody komórek (od lewej do prawej, a następnie od góry do dołu), za pomocą
0 = pusty
6 = drut
7 = głowica sygnalizacyjna
1 = ogon sygnałowy
Po wprowadzeniu wszystkich komórek rozpocznie się symulacja (i będzie trwała wiecznie, aż do momentu zabicia programu).
Bez golfa
Bardziej przyjazna dla użytkownika wersja. Aby zmodyfikować układ, zmodyfikuj DATAinstrukcje na końcu.
Kod wykorzystuje POINTfunkcję, która odczytuje wartość koloru piksela z ekranu. Oznacza to, że nie musimy przechowywać komórek osobno jako tablicy. Aby upewnić się, że wszystkie komórki aktualizują się jednocześnie, wykonujemy aktualizacje na drugiej „stronie”. Możemy przełączać aktywną stronę za pomocą wersji SCREENinstrukcji i kopiować zawartość jednej strony na drugą za pomocą PCOPYinstrukcji.
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 Maksymalne wartości szerokości i wysokości zależą od używanego trybu ekranu. W SCREEN 9, szerokość może wynosić do 638, a wysokość do 348. SCREEN 7ma mniejszą rozdzielczość (maksymalny rozmiar konfiguracji 318 na 198), ale piksele są większe i dlatego łatwiej je zobaczyć (na DOS QBasic lub emulatorze DOSBox - niestety QB64 tylko daje mniejsze okno).
Przykładowy przebieg
Wersja bez golfa na archive.org , z trybem ekranu 7:
