QBasic, 309 byte
Cảnh báo: phiên bản chơi gôn không thân thiện với người dùng: nó có một phương thức nhập liệu kỳ lạ, chạy như một vòng lặp vô hạn và không có bất kỳ độ trễ nào (do đó, chạy quá nhanh trên một số hệ thống). Chỉ chạy nó nếu bạn biết cách chấm dứt chương trình trong môi trường QBasic của bạn. Phiên bản không được khuyến khích (xem bên dưới).
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
Để chạy, chỉ định tại dấu nhắc đầu vào chiều rộng w
và chiều cao cấu hình của bạn h
. 1 Sau đó nhập w*h
mã một chữ số cho các ô (di chuyển từ trái sang phải, sau đó từ trên xuống dưới), với
0
= trống
6
= dây
7
= đầu tín hiệu
1
= đuôi tín hiệu
Khi bạn đã nhập tất cả các ô, mô phỏng sẽ bắt đầu (và tiếp tục mãi mãi cho đến khi bạn tắt chương trình).
Bị đánh cắp
Một phiên bản thân thiện hơn. Để sửa đổi bố cục, sửa đổi các DATA
báo cáo ở cuối.
Mã tận dụng POINT
chức năng, đọc giá trị màu của một pixel từ màn hình. Điều này có nghĩa là chúng ta không phải lưu trữ các ô riêng biệt như một mảng. Để đảm bảo rằng tất cả các ô cập nhật đồng thời, chúng tôi thực hiện cập nhật trên "trang" thứ hai. Chúng tôi có thể chuyển trang hoạt động bằng một phiên bản của SCREEN
câu lệnh và sao chép nội dung của trang này sang trang khác bằng cách sử dụng PCOPY
câu lệnh.
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 Các giá trị tối đa cho chiều rộng và chiều cao tùy thuộc vào chế độ màn hình nào được sử dụng. Trong SCREEN 9
, chiều rộng có thể lên tới 638 và chiều cao lên tới 348. SCREEN 7
có độ phân giải nhỏ hơn (kích thước cấu hình tối đa 318 bằng 198), nhưng các pixel lớn hơn và do đó dễ nhìn hơn (trên DOS QBasic hoặc trình giả lập DOSBox - không may là QB64 cho một cửa sổ nhỏ hơn).
Chạy ví dụ
Phiên bản Ungolfed trên archive.org , với chế độ màn hình 7: