|
Post by Rod on Jul 7, 2023 10:24:34 GMT -5
I was having a look at LB5 again and was really impressed at how quickly this code ran compared to LB4
nomainwin WindowWidth = 600 WindowHeight = 600 open "Conway Life via Linked List" for graphics_nf_nsb as #1 #1 "trapclose [quit]" #1 "down ; fill blue ;size 6"
global oldgrid$
'create a random list of cells in oldgrid$ oldgrid$="" oldpointer=1 for n=1 to 600 x$=rnd$(100) y$=rnd$(100) if instr(oldgrid$,x$+y$,1)=0 then 'no duplicates oldgrid$=oldgrid$+x$+y$+"," #1 "backcolor white ; color white ; set ";val(x$)*6;" ";val(y$)*6 end if next
[cycle] newgrid$="" dupl$="" oldpointer=1 c$="?" while c$<>"" c$=word$(oldgrid$,oldpointer,",") x=val(mid$(c$,1,4)) y=val(mid$(c$,5,4)) 'count surrounding live cells of this live cell 'keep it alive if it has 2-3 neighbours else kill it ct=count(x,y) if ct<2 or ct>3 then #1 "backcolor blue ; color blue ; set ";x*6;" ";y*6 else newgrid$=newgrid$+c$+"," end if 'now check for birthing cells around cell c's x,y for yy=-1 to 1 for xx=-1 to 1 'if we move out of bounds roll round screen scx=x+xx if scx<1 then scx=100 if scx >100 then scx=1 scy=y+yy if scy<1 then scy=100 if scy >100 then scy=1 xy$=right$("0000"+str$(scx),4)+right$("0000"+str$(scy),4) 'if it is a dead cell and we have not already checked, see if it has three neighbours if instr(oldgrid$,xy$,1)=0 and instr(dupl$,xy$,1)=0 then 'record in dupl$ to avoid checking more than once dupl$=dupl$+xy$+"," 'check how many live cells surround it sct=count(scx,scy) if sct = 3 then newgrid$=newgrid$+xy$+"," #1 "backcolor white ; color white ; set ";scx*6;" ";scy*6 end if scan end if next next 'move to the next cell in the list oldpointer=oldpointer+1 wend
[savestate] oldgrid$=newgrid$ #1 "discard"
goto [cycle]
[quit] close #1 end
function rnd$(r) r$=str$(int(rnd(0)*r)+1) rnd$=right$("0000"+r$,4) end function
function count(x,y) x$=right$("0000"+str$(x),4) y$=right$("0000"+str$(y),4) x1=x-1 if x1<1 then x1=100 x1$=right$("0000"+str$(x1),4) x2=x+1 if x2>100 then x2=1 x2$=right$("0000"+str$(x2),4) y1=y-1 if y1<1 then y1=100 y1$=right$("0000"+str$(y1),4) y2=y+1 if y2>100 then y2=1 y2$=right$("0000"+str$(y2),4) ct=ct+(instr(oldgrid$,x1$+y1$,1)>0) ct=ct+(instr(oldgrid$,x$+y1$,1)>0) ct=ct+(instr(oldgrid$,x2$+y1$,1)>0) ct=ct+(instr(oldgrid$,x1$+y$,1)>0) 'miss middle cell ct=ct+(instr(oldgrid$,x2$+y$,1)>0) ct=ct+(instr(oldgrid$,x1$+y2$,1)>0) ct=ct+(instr(oldgrid$,x$+y2$,1)>0) ct=ct+(instr(oldgrid$,x2$+y2$,1)>0) count=ct end function
|
|
|
Post by Rod on Jul 8, 2023 3:32:18 GMT -5
This code runs. I did two things, first off "#handle, command" does not work that is not a legal syntax. Remove the comma. I found this in three places. Secondly I reduced the size of your arrays by 000. So just make everything a little smaller, 10000000 sized arrays are a bit extreem, especially as there are far fewer pixels on display. You need to play with other array sizes.
'life simulation by Atomose 2023
nomainwin GameVersion = 0.29 dim CoorX(10000),CoorY(10000),valU(10000),LIFE(10000),natality(10000),LIFE2(10000),natality2(10000) UNIT = 100 : UNIT2 = 505 : Xcoor = 800 : Ycoor = 580 : XX= 800 : YY= 580 : redim p(XX,YY) : UNITcompt = UNIT : UNITcompt2 = UNIT2 'changed 500005 to 505 not really understanding what to reduce in size for n = 1 to UNIT valU(n) = 1 : CoorX(n) = int(rnd(1)*30+370) : CoorY(n) = int(rnd(1)*30+250) : LIFE(n) = 2000 next n for n = 500001 to UNIT2 valU(n) = 2 : CoorX(n) = int(rnd(1)*100+370) : CoorY(n) = int(rnd(1)*100+250) : LIFE2(n) = 20000 next n
[INI] WindowWidth=807 : WindowHeight=630 : UpperLeftX=int((DisplayWidth-WindowWidth)/2) : UpperLeftY=int((DisplayHeight-WindowHeight)/2) graphicbox #ini.info, 0, 0, 801, 22 graphicbox #ini.main, 0, 22, 801, 601 button #ini.pause, "Stop", [pause], UL, 1, 1,40,20 open "Life Simulation v ";GameVersion for window_nf as #ini #ini "trapclose [quit]" print #ini.main, "down; fill ";250;" ";160;" ";120;"; size 2; color ";0;" ";180;" ";0 print #ini.info, "down; fill white; font Cascadia_Code 8 ; color black; backcolor white"
for YY=0 to Ycoor for XX=0 to Xcoor valor = int(rnd(1)*10+1) select case valor case 1,3,4,5,6,7,8,9,10 valor = 0 case 2 valor = 1000001 : print #ini.main, "set ";XX;" ";YY end select p(XX,YY)= valor next XX next YY
#ini.info "place 590 13 ;\"; "Map editor :" print #ini.info, "size 15; color black; set ";680;" ";10;"; set ";700;" ";10;"; set ";720;" ";10;"; set ";740;" ";10;"; set ";760;" ";10;"; set ";780;" ";10 print #ini.info, "size 13; color ";250;" ";160;" ";120;"; set ";680;" ";10;"; color ";150;" ";200;" ";230;"; set ";700;" ";10;"; color ";0;" ";180;" ";0;"; set ";720;" ";10;"; color brown; set ";740;" ";10;"; color white; set ";760;" ";10;"; color white; set ";780;" ";10 print #ini.info, "size 4; color black; set ";760;" ";10;"; color red; set ";780;" ";10 #ini.info "font Cascadia_Code 8 ; color black; backcolor white; when leftButtonDown [select]; flush" #ini.main "when leftButtonDown [position]; when leftButtonMove [terrain]; flush"
[boucle] scan print #ini.main, "size 2; discard" day = day + 1 #ini.info "place 50 13 ;\"; "Days : ";day;" | Pop1 : ";UNITcompt;" | Pop2 : ";UNITcompt2-500000;" (";death; " kills) "
for t = 1 to 5 [rmk] regenX = int(rnd(1)*794+2) : regenY = int(rnd(1)*572+2) if p(regenX,regenY) >1000000 and antifreeeze < 100 then antifreeeze = antifreeeze + 1 : goto [rmk] p(regenX,regenY) = 1000001 : print #ini.main, "size 2; color ";0;" ";180;" ";0;"; set ";regenX;" ";regenY antifreeeze = 0 next t
for x = 1 to UNIT if (valU(x) = 0 or LIFE(x) = 0) then goto [next] LIFE(x) = LIFE(x) - 1 print #ini.main, "color ";250;" ";160;" ";120;";set ";CoorX(x);" ";CoorY(x) : p(CoorX(x),CoorY(x)) = 0 valor = int(rnd(1)*9+1)
select case valor case 1 if p(CoorX(x)+1,CoorY(x)) < 1000002 and CoorX(x) <795 then CoorX(x) = CoorX(x) + 1 : CoorY(x) = CoorY(x) + 0 if p(CoorX(x)+1,CoorY(x)) >= 1000002 then CoorX(x) = CoorX(x) - 1 : CoorY(x) = CoorY(x) + 0 case 2 if p(CoorX(x)+1,CoorY(x)) < 1000002 and p(CoorX(x),CoorY(x)+1) < 1000002 and CoorX(x) <795 and CoorY(x) <575 then CoorX(x) = CoorX(x) + 1 : CoorY(x) = CoorY(x) + 1 if p(CoorX(x)+1,CoorY(x)) >= 1000002 and p(CoorX(x),CoorY(x)+1) >= 1000002 then CoorX(x) = CoorX(x) - 1 : CoorY(x) = CoorY(x) - 1 case 3 if p(CoorX(x),CoorY(x)+1) < 1000002 and CoorY(x) <575 then CoorX(x) = CoorX(x) + 0 : CoorY(x) = CoorY(x) + 1 if p(CoorX(x),CoorY(x)+1) >= 1000002 then CoorX(x) = CoorX(x) + 0 : CoorY(x) = CoorY(x) - 1 case 4 if p(CoorX(x)-1,CoorY(x)) < 1000002 and p(CoorX(x),CoorY(x)+1) < 1000002 and CoorX(x) >2 and CoorY(x) <575 then CoorX(x) = CoorX(x) - 1 : CoorY(x) = CoorY(x) + 1 if p(CoorX(x)-1,CoorY(x)) >= 1000002 and p(CoorX(x),CoorY(x)+1) >= 1000002 then CoorX(x) = CoorX(x) + 1 : CoorY(x) = CoorY(x) - 1 case 5 if p(CoorX(x)-1,CoorY(x)) < 1000002 and CoorX(x) >2 then CoorX(x) = CoorX(x) - 1 : CoorY(x) = CoorY(x) + 0 if p(CoorX(x)-1,CoorY(x)) >= 1000002 then CoorX(x) = CoorX(x) + 1 : CoorY(x) = CoorY(x) + 0 case 6 if p(CoorX(x)-1,CoorY(x)) < 1000002 and p(CoorX(x),CoorY(x)-1) < 1000002 and CoorX(x) >2 and CoorY(x) >2 then CoorX(x) = CoorX(x) - 1 : CoorY(x) = CoorY(x) - 1 if p(CoorX(x)-1,CoorY(x)) >= 1000002 and p(CoorX(x),CoorY(x)-1) >= 1000002 then CoorX(x) = CoorX(x) + 1 : CoorY(x) = CoorY(x) + 1 case 7 if p(CoorX(x),CoorY(x)-1) < 1000002 and CoorY(x) >2 then CoorX(x) = CoorX(x) + 0 : CoorY(x) = CoorY(x) - 1 if p(CoorX(x),CoorY(x)-1) >= 1000002 then CoorX(x) = CoorX(x) + 0 : CoorY(x) = CoorY(x) + 1 case 8 if p(CoorX(x)+1,CoorY(x)) < 1000002 and p(CoorX(x),CoorY(x)-1) < 1000002 and CoorX(x) <795 and CoorY(x) >2 then CoorX(x) = CoorX(x) + 1 : CoorY(x) = CoorY(x) - 1 if p(CoorX(x)+1,CoorY(x)) >= 1000002 and p(CoorX(x),CoorY(x)-1) >= 1000002 then CoorX(x) = CoorX(x) - 1 : CoorY(x) = CoorY(x) + 1 case 9 [noMoove] CoorX(x) = CoorX(x) : CoorY(x) = CoorY(x) end select
if valU(x) = 1 and LIFE(x) >= 1000 and natality(x) >= 100 then LIFE(x) = LIFE(x) - 500 : natality(x) = 0 : UNIT = UNIT + 1 : valU(UNIT) = 1 : CoorX(UNIT) = CoorX(x) : CoorY(UNIT) = CoorY(x) : LIFE(UNIT) = 2000 : UNITcompt = UNITcompt + 1 if valU(x) = 1 and p(CoorX(x),CoorY(x)) = 1000001 and LIFE(x) < 3000 then LIFE(x) = LIFE(x) + 50 : natality(x) = natality(x) + 1 if LIFE(x) = 0 and valU(x) = 1 then valU(x) = 0 : p(CoorX(x),CoorY(x)) = 0 : UNITcompt = UNITcompt - 1 if valU(x) = 1 then print #ini.main, "color ";0;" ";0;" ";0;"; set ";CoorX(x);" ";CoorY(x) : p(CoorX(x),CoorY(x)) = x [next] next x
for y = 500001 to UNIT2 if (valU(y) = 0 or LIFE2(y) = 0) then goto [next2] LIFE2(y) = LIFE2(y) - 1 if p(CoorX(y),CoorY(y)) <> 1000001 then print #ini.main, "color ";250;" ";160;" ";120;"; set ";CoorX(y);" ";CoorY(y) : p(CoorX(y),CoorY(y)) = 0 if (p(CoorX(y),CoorY(y)) = 1000001 or p(CoorX(y),CoorY(y)-1) = 1000001 or p(CoorX(y),CoorY(y)+1) = 1000001 or p(CoorX(y)-1,CoorY(y)) = 1000001 or p(CoorX(y)+1,CoorY(y)) = 1000001) then print #ini.main, "color ";0;" ";180;" ";0;"; set ";CoorX(y);" ";CoorY(y) valor = int(rnd(1)*9+1)
select case valor case 1 if p(CoorX(y)+2,CoorY(y)) < 1000002 and CoorX(y) <795 then CoorX(y) = CoorX(y) + 2 : CoorY(y) = CoorY(y) + 0 if p(CoorX(y)+2,CoorY(y)) >= 1000002 then CoorX(y) = CoorX(y) - 2 : CoorY(y) = CoorY(y) + 0 case 2 if p(CoorX(y)+2,CoorY(y)) < 1000002 and p(CoorX(y),CoorY(y)+2) < 1000002 and CoorX(y) <795 and CoorY(y) <575 then CoorX(y) = CoorX(y) + 2 : CoorY(y) = CoorY(y) + 2 if p(CoorX(y)+2,CoorY(y)) >= 1000002 and p(CoorX(y),CoorY(y)+2) >= 1000002 then CoorX(y) = CoorX(y) - 2 : CoorY(y) = CoorY(y) - 2 case 3 if p(CoorX(y),CoorY(y)+2) < 1000002 and CoorY(y) <575 then CoorX(y) = CoorX(y) + 0 : CoorY(y) = CoorY(y) + 2 if p(CoorX(y),CoorY(y)+2) >= 1000002 then CoorX(y) = CoorX(y) + 0 : CoorY(y) = CoorY(y) - 2 case 4 if p(CoorX(y)-2,CoorY(y)) < 1000002 and p(CoorX(y),CoorY(y)+2) < 1000002 and CoorX(y) >5 and CoorY(y) <575 then CoorX(y) = CoorX(y) - 2 : CoorY(y) = CoorY(y) + 2 if p(CoorX(y)-2,CoorY(y)) >= 1000002 and p(CoorX(y),CoorY(y)+2) >= 1000002 then CoorX(y) = CoorX(y) + 2 : CoorY(y) = CoorY(y) - 2 case 5 if p(CoorX(y)-2,CoorY(y)) < 1000002 and CoorX(y) >5 then CoorX(y) = CoorX(y) - 2 : CoorY(y) = CoorY(y) + 0 if p(CoorX(y)-2,CoorY(y)) >= 1000002 then CoorX(y) = CoorX(y) + 2 : CoorY(y) = CoorY(y) + 0 case 6 if p(CoorX(y)-2,CoorY(y)) < 1000002 and p(CoorX(y),CoorY(y)-2) < 1000002 and CoorX(y) >5 and CoorY(y) >5 then CoorX(y) = CoorX(y) - 2 : CoorY(y) = CoorY(y) - 2 if p(CoorX(y)-2,CoorY(y)) >= 1000002 and p(CoorX(y),CoorY(y)-2) >= 1000002 then CoorX(y) = CoorX(y) + 2 : CoorY(y) = CoorY(y) + 2 case 7 if p(CoorX(y),CoorY(y)-2) < 1000002 and CoorY(y) >5 then CoorX(y) = CoorX(y) + 0 : CoorY(y) = CoorY(y) - 2 if p(CoorX(y),CoorY(y)-2) >= 1000002 then CoorX(y) = CoorX(y) + 0 : CoorY(y) = CoorY(y) + 2 case 8 if p(CoorX(y)+2,CoorY(y)) < 1000002 and p(CoorX(y),CoorY(y)-2) < 1000002 and CoorX(y) <795 and CoorY(y) >5 then CoorX(y) = CoorX(y) + 2 : CoorY(y) = CoorY(y) - 2 if p(CoorX(y)+2,CoorY(y)) >= 1000002 and p(CoorX(y),CoorY(y)-2) >= 1000002 then CoorX(y) = CoorX(y) - 2 : CoorY(y) = CoorY(y) + 2 case 9 [noMoove2] CoorX(y) = CoorX(y) : CoorY(y) = CoorY(y) end select
if valU(y) = 2 and natality2(y) >= 5 then LIFE2(y) = LIFE2(y) - 1000 : natality2(y) = 0 : UNIT2 = UNIT2 + 1 : valU(UNIT2) = 2 : CoorX(UNIT2) = CoorX(y) : CoorY(UNIT2) = CoorY(y) : LIFE2(UNIT2) = 20000 : UNITcompt2 = UNITcompt2 + 1 killing = p(CoorX(y),CoorY(y)) : if killing > 1000000 then killing = 0 if valU(killing) = 1 then killed = p(CoorX(y),CoorY(y)) : valU(killed) = 0 : LIFE2(killed) = 0 : UNITcompt = UNITcompt - 1 : p(CoorX(y),CoorY(y)) = 0 : LIFE2(y) = LIFE2(y) + 500 : natality2(y) = natality2(y) + 1 : death = death + 1 if LIFE2(y) = 0 and valU(y) = 2 then valU(y) = 0 : print #ini.main, "set ";CoorX(y);" ";CoorY(y) : p(CoorX(y),CoorY(y)) = 0 : UNITcompt2 = UNITcompt2 - 1 if valU(y) = 2 then print #ini.main, "color ";255;" ";255;" ";255;"; set ";CoorX(y);" ";CoorY(y) [next2] next y
goto [boucle]
[select] mX = MouseX : mY = MouseY competence = 0 : antifreeeze = 0 print #ini.info, "size 2; color white; set ";773;" ";3;"; set ";753;" ";3;"; set ";733;" ";3;"; set ";713;" ";3;"; set ";693;" ";3;"; set ";672;" ";3 if mX >670 and mX<688 then competence = 1 : print #ini.info, "size 2; color blue; set ";672;" ";3 if mX >692 and mX<707 then competence = 2 : print #ini.info, "size 2; color blue; set ";693;" ";3 if mX >713 and mX<727 then competence = 3 : print #ini.info, "size 2; color blue; set ";713;" ";3 if mX >734 and mX<747 then competence = 4 : print #ini.info, "size 2; color blue; set ";733;" ";3 if mX >752 and mX<768 then competence = 5 : print #ini.info, "size 2; color blue; set ";753;" ";3 if mX >772 and mX<788 then competence = 6 : print #ini.info, "size 2; color blue; set ";773;" ";3 print #ini.info, "color black" if pause = 0 then goto [boucle] if pause = 1 then wait
[position] mX = MouseX : mY = MouseY if competence = 5 then UNIT = UNIT + 1 : valU(UNIT) = 1 : CoorX(UNIT) = MouseX : CoorY(UNIT) = MouseY : LIFE(UNIT) = 1500 : UNITcompt = UNITcompt + 1 if competence = 6 then UNIT2 = UNIT2 + 1 : valU(UNIT2) = 2 : CoorX(UNIT2) = MouseX : CoorY(UNIT2) = MouseY : LIFE2(UNIT2) = 20000 : UNITcompt2 = UNITcompt2 + 1 if pause = 1 then wait goto [boucle]
[terrain] on error goto [boucle] select case competence case 1 p(MouseX,MouseY) = 0 : p(MouseX+1,MouseY) = 0 : p(MouseX-1,MouseY) = 0 : print #ini.main, "size 1; color ";250;" ";160;" ";120;"; set ";MouseX;" ";MouseY : print #ini.main, "size 1; color ";250;" ";160;" ";120;"; set ";MouseX+1;" ";MouseY : print #ini.main, "size 1; color ";250;" ";160;" ";120;"; set ";MouseX-1;" ";MouseY p(MouseX,MouseY+1) = 0 : p(MouseX+1,MouseY+1) = 0 : p(MouseX-1,MouseY+1) = 0 : print #ini.main, "size 1; color ";250;" ";160;" ";120;"; set ";MouseX;" ";MouseY+1 : print #ini.main, "size 1; color ";250;" ";160;" ";120;"; set ";MouseX+1;" ";MouseY+1 : print #ini.main, "size 1; color ";250;" ";160;" ";120;"; set ";MouseX-1;" ";MouseY+1 p(MouseX,MouseY-1) = 0 : p(MouseX+1,MouseY-1) = 0 : p(MouseX-1,MouseY-1) = 0 : print #ini.main, "size 1; color ";250;" ";162;" ";120;"; set ";MouseX;" ";MouseY-1 : print #ini.main, "size 1; color ";250;" ";160;" ";120;"; set ";MouseX+1;" ";MouseY-1 : print #ini.main, "size 1; color ";250;" ";160;" ";120;"; set ";MouseX-1;" ";MouseY-1 case 2 p(MouseX,MouseY) = 1000002 : p(MouseX+1,MouseY) = 1000002 : p(MouseX-1,MouseY) = 1000002 : print #ini.main, "size 1; color ";150;" ";200;" ";230;"; set ";MouseX;" ";MouseY : print #ini.main, "size 1; color ";150;" ";200;" ";230;"; set ";MouseX+1;" ";MouseY : print #ini.main, "size 1; color ";150;" ";200;" ";230;"; set ";MouseX-1;" ";MouseY p(MouseX,MouseY+1) = 1000002 : p(MouseX+1,MouseY+1) = 1000002 : p(MouseX-1,MouseY+1) = 1000002 : print #ini.main, "size 1; color ";150;" ";200;" ";230;"; set ";MouseX;" ";MouseY+1 : print #ini.main, "size 1; color ";150;" ";200;" ";230;"; set ";MouseX+1;" ";MouseY+1 : print #ini.main, "size 1; color ";150;" ";200;" ";230;"; set ";MouseX-1;" ";MouseY+1 p(MouseX,MouseY-1) = 1000002 : p(MouseX+1,MouseY-1) = 1000002 : p(MouseX-1,MouseY-1) = 1000002 : print #ini.main, "size 1; color ";150;" ";200;" ";230;"; set ";MouseX;" ";MouseY-1 : print #ini.main, "size 1; color ";150;" ";200;" ";230;"; set ";MouseX+1;" ";MouseY-1 : print #ini.main, "size 1; color ";150;" ";200;" ";230;"; set ";MouseX-1;" ";MouseY-1 case 3 p(MouseX,MouseY) = 1000001 : p(MouseX+1,MouseY) = 1000001 : p(MouseX-1,MouseY) = 1000001 : print #ini.main, "size 1; color ";0;" ";180;" ";0;"; set ";MouseX;" ";MouseY : print #ini.main, "size 1; color ";0;" ";180;" ";0;"; set ";MouseX+1;" ";MouseY : print #ini.main, "size 1; color ";0;" ";180;" ";0;"; set ";MouseX-1;" ";MouseY p(MouseX,MouseY+1) = 1000001 : p(MouseX+1,MouseY+1) = 1000001 : p(MouseX-1,MouseY+1) = 1000001 : print #ini.main, "size 1; color ";0;" ";180;" ";0;"; set ";MouseX;" ";MouseY+1 : print #ini.main, "size 1; color ";0;" ";180;" ";0;"; set ";MouseX+1;" ";MouseY+1 : print #ini.main, "size 1; color ";0;" ";180;" ";0;"; set ";MouseX-1;" ";MouseY+1 p(MouseX,MouseY-1) = 1000001 : p(MouseX+1,MouseY-1) = 1000001 : p(MouseX-1,MouseY-1) = 1000001 : print #ini.main, "size 1; color ";0;" ";180;" ";0;"; set ";MouseX;" ";MouseY-1 : print #ini.main, "size 1; color ";0;" ";180;" ";0;"; set ";MouseX+1;" ";MouseY-1 : print #ini.main, "size 1; color ";0;" ";180;" ";0;"; set ";MouseX-1;" ";MouseY-1 case 4 p(MouseX,MouseY) = 1000003 : p(MouseX+1,MouseY) = 1000003 : p(MouseX-1,MouseY) = 1000003 : print #ini.main, "size 1; color ";128;" ";128;" ";0;"; set ";MouseX;" ";MouseY : print #ini.main, "size 1; color ";128;" ";128;" ";0;"; set ";MouseX+1;" ";MouseY : print #ini.main, "size 1; color ";128;" ";128;" ";0;"; set ";MouseX-1;" ";MouseY p(MouseX,MouseY+1) = 1000003 : p(MouseX+1,MouseY+1) = 1000003 : p(MouseX-1,MouseY+1) = 1000003 : print #ini.main, "size 1; color ";128;" ";128;" ";0;"; set ";MouseX;" ";MouseY+1 : print #ini.main, "size 1; color ";64;" ";64;" ";0;"; set ";MouseX+1;" ";MouseY+1 : print #ini.main, "size 1; color ";128;" ";128;" ";0;"; set ";MouseX-1;" ";MouseY+1 p(MouseX,MouseY-1) = 1000003 : p(MouseX+1,MouseY-1) = 1000003 : p(MouseX-1,MouseY-1) = 1000003 : print #ini.main, "size 1; color ";128;" ";128;" ";0;"; set ";MouseX;" ";MouseY-1 : print #ini.main, "size 1; color ";128;" ";128;" ";0;"; set ";MouseX+1;" ";MouseY-1 : print #ini.main, "size 1; color ";128;" ";128;" ";0;"; set ";MouseX-1;" ";MouseY-1 end select if pause = 1 then wait goto [boucle]
[pause] if pause = 1 then pause = 0 : print #ini.pause, "Stop" : goto [boucle] if pause = 0 then pause = 1 : print #ini.pause, "Play" : wait
[quit] close #ini : end
|
|
|
Post by meerkat on Jul 10, 2023 4:48:38 GMT -5
Life can live in a browser. If you'd like to have life run in a client's browser, or even your own, it's simple to use a javascript <canvas> to display it.
Run this program and then click on your output file (getAlife.html). It should run in the browser. You can mess with the cellSize and WindowWidth and others to change the effects.
*EDIT* changed program so you can change variables after you click any key
open "c:\getAlife.html" for output as #f
print #f, " <html> <head> <title>Game of Life</title> </head> <body> <canvas id=""gameCanvas"" width=""600"" height=""600"" style=""border: 2px solid black;""></canvas> <form id=""settingsForm""> <label for=""widthInput"">Window Width:</label> <input type=""number"" id=""widthInput"" value=""600""><br> <label for=""heightInput"">Window Height:</label> <input type=""number"" id=""heightInput"" value=""600""><br> <label for=""cellSizeInput"">Cell Size:</label> <input type=""number"" id=""cellSizeInput"" value=""4""><br> <label for=""colorInput"">Color:</label> <input type=""text"" id=""colorInput"" value=""blue""><br> <input type=""submit"" value=""Submit""> </form> <script> var WindowWidth = 600; var WindowHeight = 600; var cellSize = 4; var gridWidth = Math.floor(WindowWidth / cellSize); var gridHeight = Math.floor(WindowHeight / cellSize); var color = ""blue""; // Default color
var canvas = document.getElementById(""gameCanvas""); var ctx = canvas.getContext(""2d"");
var grid = createEmptyGrid(); randomizeGrid();
function createEmptyGrid() { var newGrid = new Array(gridWidth); for (var x = 0; x < gridWidth; x++) { newGrid[x] = new Array(gridHeight); for (var y = 0; y < gridHeight; y++) { newGrid[x][y] = 0; } } return newGrid; }
function randomizeGrid() { for (var x = 0; x < gridWidth; x++) { for (var y = 0; y < gridHeight; y++) { grid[x][y] = Math.floor(Math.random() * 2); } } }
function update() { var newGrid = createEmptyGrid();
for (var x = 0; x < gridWidth; x++) { for (var y = 0; y < gridHeight; y++) { var alive = grid[x][y]; var neighbors = countNeighbors(x, y);
if (alive && (neighbors === 2 || neighbors === 3)) { newGrid[x][y] = 1; } else if (!alive && neighbors === 3) { newGrid[x][y] = 1; } } }
grid = newGrid; }
function countNeighbors(x, y) { var count = 0; for (var dx = -1; dx <= 1; dx++) { for (var dy = -1; dy <= 1; dy++) { if (dx === 0 && dy === 0) { continue; }
var nx = (x + dx + gridWidth) % gridWidth; var ny = (y + dy + gridHeight) % gridHeight; count += grid[nx][ny]; } } return count; }
function draw() { ctx.clearRect(0, 0, WindowWidth, WindowHeight); ctx.fillStyle = color;
for (var x = 0; x < gridWidth; x++) { for (var y = 0; y < gridHeight; y++) { if (grid[x][y] === 1) { ctx.fillRect(x * cellSize, y * cellSize, cellSize, cellSize); } } } }
function gameLoop() { update(); draw(); setTimeout(gameLoop, 100); }
// Function to update settings based on user input function updateUserSettings(event) { event.preventDefault(); // Prevent the default form submission behavior
WindowWidth = parseInt(document.getElementById(""widthInput"").value); WindowHeight = parseInt(document.getElementById(""heightInput"").value); cellSize = parseInt(document.getElementById(""cellSizeInput"").value); color = document.getElementById(""colorInput"").value;
gridWidth = Math.floor(WindowWidth / cellSize); gridHeight = Math.floor(WindowHeight / cellSize);
canvas.width = WindowWidth; canvas.height = WindowHeight;
grid = createEmptyGrid(); randomizeGrid(); }
// Add event listener to capture user input on form submission document.getElementById(""settingsForm"").addEventListener(""submit"", function (event) { updateUserSettings(event); });
// Remove the existing keydown event listener since we are using the form now document.removeEventListener(""keydown"", updateUserSettings);
gameLoop(); </script> </body> </html>"
close #f
|
|
|
Post by atomose on Jul 11, 2023 6:22:00 GMT -5
wow thx rod ! have you a idea why we dont have a visible text on the top ?
someone should make a syntax translation file for help people to move from lb4 to lb5 ... thx a lot for the work
|
|
|
Post by tenochtitlanuk on Jul 11, 2023 13:06:12 GMT -5
Works nicely once I added Nodejs to my Linux Mint set up.
I do like the ability in LB5 to accept continuous multi-line text. Hadn't realised it existed- I've always had to keep sending separate lines over and over in previous LB.
Nice to see you around here, meerkat...
|
|