Just for fun I have written a Conway's Game of Life in cmd batch file. I like writing in batch - its restrictions and limits are its appeal.
However - it is slow, very slow on a large grid. Any tips to speed it up?
I think the slowest part is the function GETNCOUNT
- this gets the count of the neighbouring 'live' cells so it is called once per cell.
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
IF "%3"=="" GOTO HELP
SET WIDTH=%1
SET HEIGHT=%2
SET DENSITY=%3
SET LIFECYCLE=0
::::::::::::::::::::
:: Generate Grid 'A'
:: Also for safety, delete any Grid 'B' cells that might be in memory
FOR /L %%h IN (1, 1, %HEIGHT%) DO (
FOR /L %%w IN (1, 1, %WIDTH%) DO (
SET /A RAND=!RANDOM!*100/32768
SET /A RAND=!RAND!+1
IF !DENSITY! GEQ !RAND! (
SET A[%%w][%%h]=@
) ELSE (
SET "A[%%w][%%h]= "
)
SET B[%%w][%%h]=
)
)
::::::::::::::::::::::::::::::
:: TOP OF MAIN PROCESSING LOOP
::
:: Loop through all the Grid 'A' cells
:: - Count number of neighbours
:: - Check if alive or not
:: - If required assign new alive/dead status in Grid 'B'
::
:PROCESS
SET /A LIFECYCLE=%LIFECYCLE%+1
CLS
ECHO Conway's Game of Life.
CALL :DISPLAY
ECHO Current lifecycle: %LIFECYCLE%
FOR /L %%h IN (1, 1, %HEIGHT%) DO (
FOR /L %%w IN (1, 1, %WIDTH%) DO (
CALL :GETNCOUNT %%w %%h
IF "!A[%%w][%%h]!"=="@" (SET ALIVE=Y) ELSE (SET ALIVE=N)
IF "!ALIVE!"=="Y" (
IF !NCOUNT! LSS 2 (
SET "B[%%w][%%h]= "
)
IF !NCOUNT! EQU 2 (
SET B[%%w][%%h]=@
)
IF !NCOUNT! EQU 3 (
SET B[%%w][%%h]=@
)
IF !NCOUNT! GTR 3 (
SET "B[%%w][%%h]= "
)
)
IF "!ALIVE!"=="N" (
IF !NCOUNT! EQU 3 (
SET B[%%w][%%h]=@
)
)
)
)
:: Now check if we have any Grid 'B' cells
:: If so, assign these to Grid 'A' cells
FOR /L %%h IN (1, 1, %HEIGHT%) DO (
FOR /L %%w IN (1, 1, %WIDTH%) DO (
IF DEFINED B[%%w][%%h] (
IF "!B[%%w][%%h]!"==" " (
SET "A[%%w][%%h]= "
)
IF "!B[%%w][%%h]!"=="@" (
SET A[%%w][%%h]=@
)
)
)
)
:: loop back to the top of process to start again
GOTO PROCESS
::::::::::::::::::::::::::
:: BOTTOM OF PROCESS LOOP
::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: THIS FUNCTION COUNTS THE NUMBER OF NEIGHBOURS FOR THE GIVEN X AND Y CO-ORDINATES
:: THE COUNT IS STORED IN VARIABLE 'NCOUNT'
::
:: TL | TM | TR
:: ML | | MR
:: BL | BM | BR
::
:: %1=x %2=y
::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:GETNCOUNT
SET NCOUNT=0
::::::
:: TOP
IF %2 EQU 1 (SET Y=%HEIGHT%) ELSE (SET /A Y=%2-1)
:: TOP-LEFT
IF %1 EQU 1 (SET X=%WIDTH%) ELSE (SET /A X=%1-1)
IF !A[%X%][%Y%]! EQU @ (SET /A NCOUNT=!NCOUNT!+1)
:: TOP-MIDDLE
SET X=%1
IF !A[%X%][%Y%]! EQU @ (SET /A NCOUNT=!NCOUNT!+1)
:: TOP-RIGHT
IF %1 EQU %WIDTH% (SET X=1) ELSE (SET /A X=%1+1)
IF !A[%X%][%Y%]! EQU @ (SET /A NCOUNT=!NCOUNT!+1)
:::::::::
:: MIDDLE
SET Y=%2
:: MIDDLE-LEFT
IF %1 EQU 1 (SET X=%WIDTH%) ELSE (SET /A X=%1-1)
IF !A[%X%][%Y%]! EQU @ (SET /A NCOUNT=!NCOUNT!+1)
:: MIDDLE-RIGHT
IF %1 EQU %WIDTH% (SET X=1) ELSE (SET /A X=%1+1)
IF !A[%X%][%Y%]! EQU @ (SET /A NCOUNT=!NCOUNT!+1)
:::::::::
:: BOTTOM
IF %2 EQU %HEIGHT% (SET Y=1) ELSE (SET /A Y=%2+1)
:: BOTTOM-LEFT
IF %1 EQU 1 (SET X=%WIDTH%) ELSE (SET /A X=%1-1)
IF !A[%X%][%Y%]! EQU @ (SET /A NCOUNT=!NCOUNT!+1)
:: BOTTOM-MIDDLE
SET X=%1
IF !A[%X%][%Y%]! EQU @ (SET /A NCOUNT=!NCOUNT!+1)
:: BOTTOM-RIGHT
IF %1 EQU %WIDTH% (SET X=1) ELSE (SET /A X=%1+1)
IF !A[%X%][%Y%]! EQU @ (SET /A NCOUNT=!NCOUNT!+1)
::ECHO BR=X:%X% Y:%Y%
GOTO EOF
::::::::::::::::::::::::::::::::::::::::::::
:: THIS FUNCTION DISPLAYS GRID 'A' ON SCREEN
::::::::::::::::::::::::::::::::::::::::::::
:DISPLAY
SET TOP=
SET BOT=
FOR /L %%h IN (1, 1, %height%) DO (
IF %%h EQU 1 (FOR /L %%w IN (1, 1, %width%) DO (SET TOP=_!TOP!))
IF %%h EQU 1 ECHO .!TOP!.
SET ROW=
FOR /L %%w IN (1, 1, %WIDTH%) DO (
SET ROW=!ROW!!A[%%w][%%h]!
)
ECHO ^|!ROW!^|
IF %%h EQU %height% (FOR /L %%w IN (1, 1, %width%) DO (SET BOT=~!BOT!))
IF %%h EQU %height% ECHO `!BOT!'
)
GOTO EOF
:HELP
ECHO/
ECHO 'Conway's Game of Life' - Batch Edition - Chazjn 25/02/2017
ECHO ===========================================================
ECHO Usage is as follows:
ECHO life [width] [height] [%%density]
ECHO E.g.
ECHO life 8 5 25
ECHO/
ECHO For more infomation visit: https://en.wikipedia.org/wiki/Conway's_Game_of_Life
GOTO EOF
:EOF