.bat (배치 파일)로 라이프 게임 (신규)

배치 파일로 라이프 게임을 만들었습니다.

다시 만들기 전에 여기

종횡의 크기, 벽의 유무가 선택 가능(벽 없음이라면 상하 좌우가 반대측에 루프하는, 도라 ○에의 지도와 같은)입니다.
또, 고정 물체만이 되거나 전 셀이 사멸하면 정지하게 되어 있습니다.
진동자에 대해서는 조사하면 무거워지므로 정지 기능은 없습니다.

초기 상태는 난수입니다. 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

좋은 웹페이지 즐겨찾기