Doesn't work: Say's invalid image handle.
Code archives/Algorithms/"Life" on infinite field
This code has been declared by its author to be Public Domain code.
Download source code
| From article: Infinite life (rus) Image used: |
;J. H. Conway's Game of Life on nearly infinite field by Matt Merkulov ; The index and simultaneously a cell Type ptr Field nxt.ptr[3]; following indexes in hierarchy Field prev.ptr; the previous index in hierarchy Field prevpos; an arrangement of the previous index Field neig.ptr[7]; addresses of neighbours(for a cell(cage)) Field x, y, nq; coordinates and quantity(amount) of neighbours End Type ; Indexes on cells for which change of a condition is possible(probable) Type chang Field p.ptr End Type Const loadorg$="locomot.png" ; Const loadorg$="virus.png" Const xres=800, yres=600 Global cellq, scrx, scry, ib ; Breakdown of a file of indexes on 3 lists Dim pmark.ptr(3) For n=0 To 3 pmark(n)=New ptr Next Graphics xres, yres SetFont LoadFont(" Arial cyr ", 14) Dim change(24) For n=0 To 1 Read m$ For nn=0 To 8 change(n*16+nn)=Sgn(Instr(m$, nn)) Next Next Data "3", "0145678" i=CreateImage(xres, yres) ib=ImageBuffer(i) i2=LoadImage(loadorg$) ib2=ImageBuffer(i2) xsiz=ImageWidth(i2) ysiz=ImageHeight(i2) For x=0 To xsiz-1 For y=0 To ysiz-1 If ReadPixel(x, y, ib2) And 255 Then ; The first met cell - a starting point for creation of the others If cellq=0 Then cell.ptr=New ptr ptrq=ptrq+1 cell\x=400 cell\y=300 xx=x yy=y End If newborn findcell(cell, x-xx, y-yy) End If Next Next FreeImage i2 Repeat DrawBlock i, 0,0 gen=gen+1 ; The cursor of the mouse moves to the center of the screen(to not cling to edges(territories)) MoveMouse xres Sar 1, yres Sar 1 If cellq=0 Then Exit ; All the cells subject to changes, pereeshchayutsya in the list ¹2 For ch.chang=Each chang If change(ch\p\nq) Then Insert ch\p After pmark(2) Next Delete Each chang ; We change a condition of all cells(cages) from the list ¹2 cell=pmark(2) Repeat cell=After cell If cell=pmark(3) Then Exit If cell\nq <16 Then newborn cell Else ; For all neighbours - reduction of their counter of neighbours For n=0 To 7 cell2.ptr=cell\neig[n] cell2\nq=cell2\nq-1 ; Entering the neighbour in the list of cells which, probably, will change the condition If change(cell2\nq) Then ch.chang=New chang: ch\p=cell2 Next ; Deenergizing a bat zapolnennosti cell\nq=cell\nq And 15 WritePixel scrx+cell\x, scry+cell\y, 0, ib cellq=cellq-1 ; Entering the processed cell in the list of potentially changing cells If change(cell\nq) Then ch.chang=New chang: ch\p=cell End If Forever ; Cells from the list ¹2 pass all in the list ¹1(are stabilized) Insert pmark(2) Before pmark(3) ; Displacement of the cursor of the mouse is defined(determined) dx=MouseX()-xres Sar 1 dy=MouseY()-yres Sar 1 ; If the cursor was displaced, there is a copying of cells(cages)(all 1-st list) If dx <> 0 Or dy <> 0 Then scrx=scrx+dx scry=scry+dy SetBuffer ib Cls SetBuffer FrontBuffer() cell=pmark(1) Repeat cell=After cell If cell=pmark(2) Then Exit If cell\nq And 16 Then WritePixel scrx+cell\x, scry+cell\y,-1, ib Forever End If SetBuffer ib Color 0,0,0 Rect 0,0,100,36 Color 255,255,255 Text 0,0, "FPS: "+1000.0 /(MilliSecs()-fps) Text 0,12, "Cells(Cages): "+cellq Text 0,24, "Generation: "+gen fps=MilliSecs() SetBuffer FrontBuffer() Until KeyHit(1) End ; Function of search of a cell in hierarchy on a starting point and displacement ; If the cell does not exist, it(she) is created together with a chain of indexes Function findcell.ptr(cell.ptr, x, y) ; If displacement zero, result - a starting point If x=0 And y=0 Then Return cell ; We remember coordinates of a required cell(in case it(she) should be created) xx=x+cell\x yy=y+cell\y pmax=1; the Counter of a level in hierarchy ; The first stage - rise upwards Repeat ; Addition of the new index from above if the top of hierarchy is reached(achieved) If cell\prev=Null Then p.ptr=New ptr Insert p After pmark(0) ; The position is defined(determined) by position of a required cell pos=(x <0)+(y <0) Shl 1 p\nxt[pos]=cell cell\prev=p cell\prevpos=pos Else ; Differently - transition to higher level in hierarchy pos=cell\prevpos p.ptr=cell\prev End If ; Change of coordinates according to moving If pos And 1 Then x=x+pmax If pos And 2 Then y=y+pmax ; Increase of a level pmax=pmax Shl 1 cell=p ; An output(exit) if the point is reached(achieved), whence it is possible to go down up to required Until x>=0 And y>=0 And x <pmax And y <pmax ; The second stage - descent(release) Repeat ; Downturn of a level pmax=pmax Shr 1 ; Definition of a direction pos=((x And pmax)=pmax)+((y And pmax)=pmax) Shl 1 ; Creation of the new index if the branch is absent If cell\nxt[pos]=Null Then p.ptr=New ptr Insert p After pmark(0) cell\nxt[pos]=p p\prev=cell p\prevpos=pos ; If we create a cell(cage)(the index of 1-st level) it is moved it(her) to the list ¹1 and ; We appropriate(give) the remembered coordinates If pmax=1 Then Insert p After pmark(1) p\x=xx p\y=yy End If End If cell=cell\nxt[pos] ; If will reach(achieve) a bottom of hierarchy(a level of cells(cages)) - an output(exit) Until pmax=1 Return cell End Function ; Function of a birth of a new cell(cage) Function newborn(cell.ptr) ; Search, storing of neighbours and increase in their counter of quantity(amount) of neighbours For xx=-1 To 1 For yy=-1 To 1 If xx Or yy Then cell2.ptr=findcell(cell, xx, yy) cell2\nq=cell2\nq+1 ; Entering the neighbour in the list of cells which, probably, will change the condition If change(cell2\nq) Then ch.chang=New chang: ch\p=cell2 cell\neig[n]=cell2 n=n+1 End If Next Next ; Inclusion a bat zapolnennosti cell\nq=cell\nq Or 16 ; Entering the processed cell in the list of potentially changing cells If change(cell\nq) Then ch.chang=New chang: ch\p=cell WritePixel cell\x+scrx, cell\y+scry,-1, ib cellq=cellq+1 End Function |
Comments
Image used:
[http://blitzetc.boolean.name/code/locomot.png]
[http://blitzetc.boolean.name/code/locomot.png]
Download that image, save it to the same directory you save the above source code to, and learn to read before you post.
Hehe, this kind of feedback is better than nothing at all. :) So, thanks for attention!