バッチファイルでライフゲームを作りました。
作り直す前がこちら
縦横の大きさ、壁の有無が選択可能(壁無しだと上下左右が反対側にループする、ドラ○エの地図みたいな)です。
また、固定物体だけになるか全セルが死滅すると停止するようになっています。
振動子については調査すると重くなるので停止機能はありません。
初期状態は乱数です。0と1で初期状態を書いたtxtをこのバッチの上にドラッグ&ドロップすると、その状態から始めることができます。
Stepは世代、Wallは壁の有無です。総セル数が大きくなるとかなり時間を要するようになります。縦横ともに20くらいが限界かと思われます。
LifeGame.bat
@echo off
setlocal enabledelayedexpansion
:Initialize
if "%1" neq "" goto LoadFile
set /p cellx="セル数(横)を指定してください。"
set /p celly="セル数(縦)を指定してください。"
for /l %%i in (1,1,%celly%) do for /l %%j in (1,1,%cellx%) do set /a cell[%%j][%%i]=!random!%%2
:Initialize2
set /p wall="壁無しなら0、壁有りなら1を指定してください。"
set /a step=0,overx=cellx+1,overy=celly+1
for /l %%i in (1,1,%celly%) do set /a cell[0][%%i]=0,cell[%overx%][%%i]=0
for /l %%i in (0,1,%overx%) do set /a cell[0][%%i]=0,cell[%overy%][%%i]=0
goto Main
:LoadFile
for /f %%i in (%1) do (
set /a celly+=1
set text[!celly!]=1%%i
)
set text=%text[1]:~1%
for /l %%i in (1,1,100000) do (
set cellx=%%i
set text=!text:~1!
if "!text!" == "" (
for /l %%j in (1,1,%celly%) do for /l %%k in (1,1,!cellx!) do set cell[%%k][%%j]=!text[%%j]:~%%k,1!
goto Initialize2
)
)
:Main
call :DrawCell
call :Calc
call :SetCell
goto Main
:Calc
rem loopx,loopyに計算対象の座標を代入
set /a loopy+=1
if %loopy% gtr %celly% set /a loopx+=1,loopy=0& goto Calc
if %loopx% gtr %cellx% exit /b
rem 対象の上下左右の座標をそれぞれyd,yi,xd,xiに代入。tempcellに太陽の座標の現在の値を代入。
set /a xd=loopx-1,xi=loopx+1,yd=loopy-1,yi=loopy+1,tempcell=cell[%loopx%][%loopy%]
rem 壁無しならxd,xi,yd,yiを反対側に置換
if %wall% == 0 (
if %xd% == 0 set xd=%cellx%
if %xi% == %overx% set xi=1
if %yd% == 0 set yd=%celly%
if %yi% == %overy% set yi=1
)
rem ムーア近傍のセルの数値を全て足す。
set /a mooresum=cell[%xd%][%yd%]+cell[%loopx%][%yd%]+cell[%xi%][%yd%]+cell[%xd%][%loopy%]+cell[%xi%][%loopy%]+cell[%xd%][%yi%]+cell[%loopx%][%yi%]+cell[%xi%][%yi%]
rem 死亡で周囲が3なら誕生、生存で周囲が2か3以外なら死亡をtempcellに代入する。
if %tempcell% == 0 if %mooresum% == 3 set tempcell=1
if %tempcell% == 1 if %mooresum% neq 2 if %mooresum% neq 3 set tempcell=0
rem 最後に、tempcell[][]にtempcellを代入。
set tempcell[%loopx%][%loopy%]=%tempcell%
goto Calc
:SetCell
rem tempcellの中身をcellに転写
for /l %%i in (1,1,%celly%) do for /l %%j in (1,1,%cellx%) do set /a cell[%%j][%%i]=tempcell[%%j][%%i]
exit /b
:DrawCell
rem 表示。前回と今回が全く一緒ならpause-exit
cls
set /a prevstep=step,step+=1,loopx=1,loopy=0,same=0
echo Step=%step%,Wall=%wall% X%cellx%*Y%celly%
echo.
for /l %%i in (1,1,%celly%) do (
for /l %%j in (1,1,%cellx%) do (
if !cell[%%j][%%i]! == 0 (
set line[%step%][%%i]=!line[%step%][%%i]!□
) else set line[%step%][%%i]=!line[%step%][%%i]!■
)
echo !line[%step%][%%i]!
if !line[%step%][%%i]!0 == !line[%prevstep%][%%i]!0 set /a same+=1
)
if %same% == %celly% goto Finish
if %step% == 1 echo 初期状態& pause >nul
exit /b
:Finish
echo 固定物体のみになるか、全セルが死亡しました。
pause >nul
exit