Трудно описать тот путь, каким Гугл выведет на интересные открытия. Вышел на статью, в которой упоминались всяческие алгоритмы, но одном из которых я залип, пытаясь написать программу. С наскока не получилось, но все же удалось:
Global Dim o(320,200)
Global Dim n(320,200)
Procedure.a rop(x,y)
re.a=o(x,y)
If x
re=re+o(x-1,y)
EndIf
If y
re=re+o(x,y-1)
EndIf
If x<320
re=re+o(x+1,y)
EndIf
If y<200
re=re+o(x,y+1)
EndIf
ProcedureReturn re
EndProcedure
o(159,99)=1
If InitSprite() And OpenWindow(0,0,0,640*2,2*400,"PERQ",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) And OpenWindowedScreen(WindowID(0),0,0,2*640,2*400,0,0,0)
For s=1 To 4
StartDrawing(ScreenOutput())
For y=0 To 199
For x=0 To 319
Box(x*4,y*4,3,3,$FFFFFF*o(x,y))
r=rop(x,y)
r=r%2
n(x,y)=n(x,y)!r
Next x
Next y
StopDrawing()
FlipBuffers()
;StartDrawing(ScreenOutput())
For y=0 To 199
For x=0 To 319
o(x,y)=o(x,y)!n(x,y)
;Box(x*4,y*4,3,3,$FFFFFF*o(x,y))
Next x
Next y
; StopDrawing()
; FlipBuffers()
Next s
Repeat
If GetAsyncKeyState_(#VK_ESCAPE)&32768
Break
EndIf
Until WindowEvent()=#PB_Event_CloseWindow
EndIf
Global Dim n(320,200)
Procedure.a rop(x,y)
re.a=o(x,y)
If x
re=re+o(x-1,y)
EndIf
If y
re=re+o(x,y-1)
EndIf
If x<320
re=re+o(x+1,y)
EndIf
If y<200
re=re+o(x,y+1)
EndIf
ProcedureReturn re
EndProcedure
o(159,99)=1
If InitSprite() And OpenWindow(0,0,0,640*2,2*400,"PERQ",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) And OpenWindowedScreen(WindowID(0),0,0,2*640,2*400,0,0,0)
For s=1 To 4
StartDrawing(ScreenOutput())
For y=0 To 199
For x=0 To 319
Box(x*4,y*4,3,3,$FFFFFF*o(x,y))
r=rop(x,y)
r=r%2
n(x,y)=n(x,y)!r
Next x
Next y
StopDrawing()
FlipBuffers()
;StartDrawing(ScreenOutput())
For y=0 To 199
For x=0 To 319
o(x,y)=o(x,y)!n(x,y)
;Box(x*4,y*4,3,3,$FFFFFF*o(x,y))
Next x
Next y
; StopDrawing()
; FlipBuffers()
Next s
Repeat
If GetAsyncKeyState_(#VK_ESCAPE)&32768
Break
EndIf
Until WindowEvent()=#PB_Event_CloseWindow
EndIf
Это первое открытие. А второе - компьютер PERQ, упомянутый в статье.
Комментарии
Отправить комментарий