Creating a simple snake game using batch programming

How To Make A Simple Snake Game In 15 Easy Steps | Batch Programming

We play many games on our laptop/PC. In the past, we used to play a classic game of a snake where you have to feed a snake and make him longer and to survive.

So, In this article, we will show you how you can make a snake game in Notepad using Batch Programming language easily in 15 steps. Here’s how our game will look like:


So, Let’s Get Started!

First of all Open Notepad or Notepad++ from in your PC. Now follow the instructions step by step to create a snake game:
[For Direct Code Download Link Drop A Comment]

Step 1:

We will use “@ECHO OFF” to prevent any of the commands in the batch file from being displayed so that the information outputted by the command only.
Then we will use “IF” to check for a certain condition if the condition exists. If that condition exists it performs that function and “%“(the percent) is followed by a numeric value, beginning with one, allows you to add matched variables to a batch file.
“GOTO” jumps to a label or section of a batch file. The goto can make it easy to jump back to the start or end of a batch file if a condition is met, or an error occurs.  So, we will add these lines first:

@echo off
if "%~1" == "startGame" goto :game
if "%~1" == "startController" goto :controller

Now we will set up some global variables used by both the game and the controller. The global variables will make the game to run and make it playable. To set up this we will use this code:

setlocal disableDelayedExpansion

Step 2:

Then we need to set up a function to save data automatically in different files for different works and we will save those data in their system. To do so, we will add these codes:

if defined temp (set "tempFileBase=%temp%") else if defined tmp set "tempFileBase=%tmp%"
set "tempFileBase=%tempFileBase%Snake%time::=_%"
set "keyFile=%tempFileBase%_key.txt"
set "cmdFile=%tempFileBase%_cmd.txt"
set "gameLock=%tempFileBase%_gameLock.txt"
set "gameLog=%tempFileBase%_gameLog.txt"
set "signal=%tempFileBase%_signal.txt"
set "saveLoc=%userprofile%Snake"
set "userPref=%saveLoc%SnakeUserPref.txt"
set "hiFile=%saveLoc%Snake!growth!Hi"
set "keyStream=9"
set "cmdStream=8"
set "lockStream=7"

you can change these but this will may not work if someone else uses the game from you.

Step 3:

We will need to Lock a game session and launch it, Loopback and try a new session if failure and Cleanup and exit when finished. This codes will do these works:

call :launch %lockStream%>"%gameLock%" || goto :getSession
del "%tempFileBase%*"
exit /b

Step 4:

So, now we will add some code to launch the game and the controller:

call :fixLogs
copy nul "%keyFile%" >nul
copy nul "%cmdFile%" >nul
start "" /b cmd /c ^""%~f0" startController %keyStream%^>^>"%keyFile%" %cmdStream%^<"%cmdFile%" 2^>nul ^>nul^"
cmd /c ^""%~f0" startGame %keyStream%^<"%keyFile%" %cmdStream%^>^>"%cmdFile%" ^
echo(

This code will load data from game files and restore all things what it was before you closed it last time.
Now we will set some functions which will be used to upon exit, wait for the controller to close before returning:

:close
2>nul (>>"%keyFile%" call )||goto :close
if not exist "%~dp0CursorPos.exe" (
echo Game Developed By Mahedi Zaman Zaber
echo If you are facing errors continiously then contact on
echo http://zealtyro.com
echo(
echo %cmdcmdline%|find /i "%~f0">nul&&pause
)
exit /b 0

Step 5:

This codes will be used to set the tile of the game by its name:

:game
title %~nx0
cls

It will config the Playfield size:

set "width=40" max=99
set "height=25" max=99

The max playing field is: (width-2)*(height-2) <= 1365
Now we will be using these codes to resize the console window, I mean the program height+width, etc:

set /a cols=width+1, lines=height+10, area=(width-2)*(height-2)
if %area% gtr 1365 (
echo ERROR: Playfield area too large
%sendCmd% quit
exit
)
if %lines% lss 14 set lines=14
if %cols% lss 46 set cols=46
mode con: cols=%cols% lines=%lines%

Step 6:

This is one of the most important parts of the game.  Add these codes to define some variables.
We we set menu for move keys, settings, level choosing, and starting a game in here:

set "configOptions=diffCode difficulty growth moveKeys up down left right"
set "configOptionCnt=9"

now we will set the control buttons:

set "moveKeys=4"

set "up=W"
set "down=S"
set "left=A"
set "right=D"
set "pause=P"

now we will set the basic designs:

set "space= "
set "bound=#"
set "food=+"
set "head=@"
set "body=O"
set "death=X"

set "growth=1"

if exist "%userPref%" for /f "usebackq delims=" %%V in ("%userPref%") do set "%%V"

set "spinner1=-"
set "spinner2="
set "spinner3=|"
set "spinner4=/"
set "spinner= spinner1 spinner2 spinner3 spinner4 "

set "delay1=20"
set "delay2=15"
set "delay3=10"
set "delay4=7"
set "delay5=5"
set "delay6=3"

set "desc1=Sluggard"
set "desc2=Crawl"
set "desc3=Slow"
set "desc4=Normal"
set "desc5=Fast"
set "desc6=Insane"

set "spinnerDelay=3"

set /a "width-=1, height-=1"

Step 7:

Now we have to define LF as a Line Feed (newline) character:

set ^"LF=^

^" Above empty line is required - do not remove

This is the codes to define CR as a Carriage Return character:

for /f %%A in ('copy /Z "%~dpf0" nul') do set "CR=%%A"

This is the codes to define BS as a BackSpace character:

for /f %%A in ('"prompt $H&for %%B in (1) do rem"') do set "BS=%%A"

set "upper=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"
set "invalid=*~="

Step 8:

This will define macros. This will run the game

if exist "%~dp0CursorPos.exe" (
set "cls=CursorPos 0 0"
set "ClearLine=echo( &CursorPos 0 -1"
set "ClearPrev=CursorPos 0 -0&echo( "
) else (
set "cls=cls"
set "ClearLine="
set "ClearPrev="
)

We will define a newline with line continuation:

set ^"n=^^^%LF%%LF%^%LF%%LF%^^"

Now we need to run setErr. The code below sets the ERRORLEVEL to 1:

set "setErr=(call)"

Then we need to run clrErr. The code below sets the ERRORLEVEL to 0:

set "clrErr=(call )"

Now we will send Cmd command. It sends a command to the controller:

set "sendCmd=>&%cmdStream% echo"

Step 9:

To getKey [ValidKey] [ValidKey…] we need to use the codes below. This will check for a keypress from the controller. Only accept a Valid Key. Token delimiters and poison characters must be quoted. Accept any key if no ValidKey specified and Return result in Key variable. The Key is undefined if no valid keypress.

set getKey=%n%
for %%# in (1 2) do if %%#==2 (%n%
set key=%n%
set inKey=%n%
set keyTest=%n%
^<^&%keyStream% set /p "inKey="%n%
if defined inKey (%n%
set inKey=!inKey:~0,-1!%n%
for %%C in (!args!) do set /a keyTest=1^&if /i !inKey! equ %%~C set key=!inKey!%n%
)%n%
if not defined keyTest set key=!inKey!%n%
) else set args=

Step 10:

Let’s draw the board now:

set draw=%n%
set screen=%n%
for /l %%Y in (0,1,%height%) do set screen=!screen!!line%%Y!!LF!%n%
set screen=!screen!Speed = !Difficulty! !replay!!LF!Growth Rate = !growth! HighScore = !hi!!LF!Score = !score! Time = !m!:!s!%n%
if defined replay if not defined replayFinished (%n%
set screen=!screen!!LF!!LF!Press a key to abort the replay%n%
)%n%
%cls%^&echo(!screen!

Step 11:

Let’s add codes to test X Y Value List Var. We will tests if the value at coordinates X, Y is within the contents of ValueListVar:

set test=%n%
for %%# in (1 2) do if %%#==2 (for /f "tokens=1-3" %%1 in ("!args!") do (%n%
for %%A in ("!line%%2:~%%1,1!") do if "!%%3:%%~A=!" neq "!%%3!" %clrErr% else %setErr%%n%
)) else set args=

To set plot X Y ValueVar and place the contents of ValueVar at coordinates X, Y we will use these codes:

set plot=%n%
for %%# in (1 2) do if %%#==2 (for /f "tokens=1-3" %%1 in ("!args!") do (%n%
set "part2=!line%%2:~%%1!"%n%
set "line%%2=!line%%2:~0,%%1!!%%3!!part2:~1!"%n%
)) else set args=

Step 12:

This will be used start the game:

setlocal enableDelayedExpansion
if not exist "%saveLoc%" md "%saveLoc%"
set "replay= Aborting... "
set "replayAvailable="
call :loadHighScores
call :mainMenu

This is the main part of the game to play or setting up. [main loop (infinite loop)]. Discover the codes and drop comments if you want to know more about a specific line:

 for /l %%. in () do (
%=== check for and process abort signal if in replay mode ===%
if defined replay if exist "%signal%" (
del "%signal%"
set "replayFinished=1"
%draw%
echo(
%ClearLine%
nul <&%keyStream%
for %%A in (!configOptions!) do set "%%A=!%%ASave!"
call :mainMenu
)

%=== compute time since last move ===%
for /f "tokens=1-4 delims=:.," %%a in ("!time: =0!") do set /a "t2=(((1%%a*60)+1%%b)*60+1%%c)*100+1%%d-36610100, tDiff=t2-t1"
if !tDiff! lss 0 set /a tDiff+=24*60*60*100

if !tDiff! geq !delay! (
%=== delay has expired, so time for movement ===%
set /a t1=t2

%=== compute game time ===%
if not defined gameStart set "gameStart=!t2!"
set /a "gameTime=(t2-gameStart)"
if !gameTime! lss 0 set /a "gameTime+=24*60*60*100"
set /a "gameTime=(gameTime-pauseTime)/100, m=gameTime/60, s=gameTime%%60"
if !m! lss 10 set "m=0!m!"
if !s! lss 10 set "s=0!s!"

%=== get keypress ===%
%getKey% !keys!
if /i !key! equ !pause! (

%=== pause game ===%
echo(
call :ask "PAUSED - Press a key to continue..."
%ClearPrev%
%sendCmd% go
for /f "tokens=1-4 delims=:.," %%a in ("!time: =0!") do set /a "t2=(((1%%a*60)+1%%b)*60+1%%c)*100+1%%d-36610100, tDiff=t2-t1"
if !tDiff! lss 0 set /a tDiff+=24*60*60*100
set /a pauseTime+=tDiff

) else (

%=== establish direction ===%
if not defined replay (echo(!key!.) >>"!gameLog!"
for %%K in (!key!) do if !moveKeys! equ 2 (
set /a "xDiff=xTurn%%K*!yDiff!, yDiff=yTurn%%K*!xDiff!"
) else if "!%%KAxis!" neq "!axis!" (
set /a "xDiff=xDiff%%K, yDiff=yDiff%%K"
set "axis=!%%KAxis!"
)
%=== erase the tail ===%
set "TX=!snakeX:~-2!"
set "TY=!snakeY:~-2!"
set "snakeX=!snakeX:~0,-2!"
set "snakeY=!snakeY:~0,-2!"
%plot% !TX! !TY! space
%=== compute new head location and attempt to move ===%
set /a "X=PX+xDiff, Y=PY+yDiff"
set "X= !X!"
set "Y= !Y!"
set "X=!X:~-2!"
set "Y=!Y:~-2!"
(%test% !X! !Y! playerSpace) && (
%=== move successful ===%

%=== remove the new head location from the empty list ===%
for %%X in ("!X!") do for %%Y in ("!Y!") do set "empty=!empty:#%%~X %%~Y=!"

%=== eat any food that may be present ===%
(%test% !X! !Y! food) && (
%=== initiate growth ===%
set /a grow+=growth
%=== locate and draw new food ===%
if defined replay (
<&%keyStream% set /p "F="
) else (
set /a "F=(!random!%%(emptyCnt-1))*6+1"
(echo !F!) >>"!gameLog!"
)
for %%F in (!F!) do (%plot% !empty:~%%F,5! food)
)

if !grow! gtr 0 (
%=== restore the tail ===%
%plot% !TX! !TY! body
set "snakeX=!snakeX!!TX!"
set "snakeY=!snakeY!!TY!"
set /a emptyCnt-=1
%=== manage score ===%
set /a "score+=1, grow-=1"
if not defined replay if !score! gtr !hi! set /a "hi+=1, newHi=1"

) else (
%=== add the former tail position to the empty list ===%
set "empty=!empty!#!TX! !TY!"
)
%=== draw the new head ===%
if defined snakeX (%plot% !PX! !PY! body)
%plot% !X! !Y! head
%=== Add the new head position to the snake strings ===%
set "snakeX=!X!!snakeX!"
set "snakeY=!Y!!snakeY!"
set "PX=!X!"
set "PY=!Y!"

%draw%

) || (
%=== failed move - game over ===%
set "replayFinished=1"
%plot% !TX! !TY! body
call :spinner !PX! !PY! death
%draw%
if defined newHi (
echo(
echo New High Score - Congratulations^^!
set "hi!diffCode!=!score!"
copy "!gameLog!" "%hiFile%!diffCode!.txt" >nul
>>"%hiFile%!diffCode!.txt" echo ::!score!
)
echo(
%ClearLine%
call :ask "Press a key to continue..."
for %%A in (!configOptions!) do set "%%A=!%%ASave!"
call :mainMenu
)
)
)
)

Step 13:

Prompt for a string with a max lenght of MaxLen. Valid keys are alpha-numeric, space, underscore, and dash. The string is terminated by Enter. Backspace works to delete the previous character. The Result is returned in Var:

:getString Prompt Var MaxLen
set /a "maxLen=%3"
set "%2="
%sendCmd% prompt
<nul set /p "=%~1 "
call :purge
:getStringLoop
(%getKey% !upper! 0 1 2 3 4 5 6 7 8 9 " " _ - {Enter} !BS!)
if defined key (
if !key! equ {Enter} (
echo(
exit /b
)
if !key! neq !BS! if !maxLen! gtr 0 (
set /a maxLen-=1
<nul set /p "=.!BS!!key!"
set "%2=!%2!!key!
)
if !key! equ !BS! if defined %2 (
set /a maxLen+=1
<nul set /p "=!BS! !BS!"
set "%2=!%2:~0,-1!"
)
)
if defined inKey %sendCmd% one
goto :getStringLoop

Prompt for a keypress. Wait until a Valid Key is pressed and return the result in Key variable.
Token delimiters, ), and poison characters must be quoted:

:ask Prompt ValidKey [Validkey]...

%sendCmd% prompt
<nul set /p "=%~1 "
(set validKeys=%*)
(set validKeys=!validKeys:%1=!)
call :purge
:getResponse
(%getKey% !validKeys!)
if not defined key (
if defined inKey %sendCmd% one
goto :getResponse
)
exit /b


:purge
set "inKey="
for /l %%N in (1 1 1000) do (
set /p "inKey="
if "!inKey!" equ "{purged}." exit /b
)<&%keyStream%
goto :purge

:spinner X Y ValueVar
set /a d1=-1000000
for /l %%N in (1 1 5) do for %%C in (%spinner%) do (
call :spinnerDelay
%plot% %1 %2 %%C
%draw%
)
call :spinnerDelay
(%plot% %1 %2 %3)
exit /b

Step 14:

These codes are for the main menu, controller options, settings, game menu, level select, etc. The main functions of the game are here. Discover the codes and drop comments if you want to know more about a specific line:

set /a d1=-1000000
for /l %%N in (1 1 5) do for %%C in (%spinner%) do (
call :spinnerDelay
%plot% %1 %2 %%C
%draw%
)
call :spinnerDelay
(%plot% %1 %2 %3)
exit /b
:delay  centiSeconds
setlocal
for /f "tokens=1-4 delims=:.," %%a in ("!time: =0!") do set /a "spinnerDelay=%1, d1=(((1%%a*60)+1%%b)*60+1%%c)*100+1%%d-36610100"
:spinnerDelay
for /f "tokens=1-4 delims=:.," %%a in ("!time: =0!") do set /a "d2=(((1%%a*60)+1%%b)*60+1%%c)*100+1%%d-36610100, dDiff=d2-d1"
if %dDiff% lss 0 set /a dDiff+=24*60*60*100
if %dDiff% lss %spinnerDelay% goto :spinnerDelay
set /a d1=d2
exit /b
:mainMenu
cls
set "loadAvailable="
echo Developed By Mahedi Zaman Zaber
echo Official Website: https://wwww.zealtyro.com
echo(
echo Growth rate = !growth!
echo(
echo Main Menu:
echo(
echo N - New game
if defined replayAvailable echo R - Replay previous game
if defined saveAvailable echo S - Save a game
if exist *.snake.txt echo L - Load and watch a saved game&set "loadAvailable=L"

echo C - Control options
echo G - Graphic options
echo Q - Quit
echo(
set "hiAvailable="
for /l %%N in (1 1 6) do if defined hi%%N (
if not defined hiAvailable (
echo Replay High Score:
echo(
)
set "desc=!desc%%N!........"
set "hiAvailable=!hiAvailable! %%N"
echo %%N - !desc:~0,8! !hi%%N!
)
if defined hiAvailable echo(
set "keys=N C G Q !hiAvailable! !replayAvailable! !saveAvailable! !loadAvailable!"
call :ask ">" !keys!
if /i !key! equ Q (
%sendCmd% quit
cls
exit
)
if /i !key! equ N (
set "replay="
set "replayAvailable=R"
set "saveAvailable=S"
goto :initialize
)
if /i !key! equ S (
if defined replayAvailable (
call :ask "HighScore # or P for Previous:" !hiAvailable! P
) else (
call :ask "HighScore #:" !hiAvailable!
)
echo !key!
if /i !key! equ P (set "src=!gameLog!") else set "src=%hiFile%!key!.txt"
call :getString "Save file name:" file 20
copy "!src!" "!file!.snake.txt"
call :ask "Press a key to continue..."
)
if /i !key! equ L (
call :getString "Load file name:" file 20
if exist "!file!.snake.txt" (
set "replay=!file!.snake.txt"
goto :initialize
)
echo Error: File "!file!.snake.txt" not found
call :ask "Press a key to continue..."
)
if /i !key! equ R (
set "replay=!gameLog!"
goto :initialize
)
if !key! geq 1 if !key! leq 6 (
set "replay=%hiFile%!key!.txt"
goto :initialize
)
if /i !key! equ C call :controlOptions
if /i !key! equ G call :graphicOptions
goto :mainMenu
:controlOptions
cls
set "keys={Enter} T L R P"
if !moveKeys! equ 4 set "keys=!keys! U D"
echo Control Options:
echo(
echo T - Type... = !moveKeys! keys
echo(
echo L - Left... = !left!
echo R - Right.. = !right!
if !moveKeys! equ 4 echo U - Up..... = !up!
if !moveKeys! equ 4 echo D - Down... = !down!
echo(
echo P - Pause.. = !pause!
echo(
echo {Enter} - Return to Main Menu
echo(
call :ask ">" !keys!
if !key! equ {Enter} goto :saveUserPrefs
if /i !key! equ T (
if !moveKeys! equ 2 (set "moveKeys=4") else set "moveKeys=2"
goto :controlOptions
)
set "option= LLeft RRight UUp DDown PPause"
for /f %%O in ("!option:* %key%=!") do (
call :ask "Press a key for %%O:"
for %%K in (0 1 2) do if "!key!" equ "!invalid:~%%K,1!" goto :controlOptions
for %%C in (!upper!) do set "key=!key:%%C=%%C!"
set "%%O=!key!"
)
goto :controlOptions
:graphicOptions
cls
echo Graphic Options:
echo(
echo B - Border...... = !bound!
echo E - Empty space. = !space!
echo H - snake Head.. = !head!
echo S - Snake body.. = !body!
echo F - Food........ = !food!
echo D - Death....... = !death!
echo(
echo G - Growth rate. = !growth!
echo(
echo {Enter} - Rturn to Main Menu
echo(
call :ask ">" B E H S F D G {Enter}
if !key! equ {Enter} goto :saveUserPrefs
if /i !key! equ G (
call :ask "Press a digit for growth rate (0 = 10)" 0 1 2 3 4 5 6 7 8 9
if !key! equ 0 set "key=10"
set "growth=!key!"
call :loadHighScores
) else (
set "option=-BBorder:bound:-EEmpty Space:space:-HSnake Head:head:-SSnake Body:body:-FFood:food:-DDeath:death:"
for /f "tokens=1,2 delims=:" %%A in ("!option:*-%key%=!") do (
call :ask "Press a key for %%A"
for %%K in (0 1 2) do if "!key!" equ "!invalid:~%%K,1!" goto :graphicOptions
set "%%B=!key!"
)
)
goto :graphicOptions
:saveUserPrefs
(for %%V in (moveKeys up down left right space bound food head body death pause growth) do echo %%V=!%%V!) >"%userPref%"
exit /b
:initialize
cls
if defined replay (
echo Replay Speed Options:
) else (
echo Speed Options:
)
echo delay
echo # Description (seconds)
echo --- ----------- ---------
for /l %%N in (1 1 6) do (
set "delay=0!delay%%N!"
set "desc=!desc%%N! "
echo %%N !desc:~0,11! 0.!delay:~-2!
)
echo(
call :ask "Pick a speed (1-6):" 1 2 3 4 5 6
set "difficulty=!desc%key%!"
set "delay=!delay%key%!"
set "diffCode=%key%"
echo %key% - %difficulty%
echo(
echo(
<nul set /p "=Initializing."
set "axis=X"
set "xDiff=+1"
set "yDiff=+0"
set "empty="
set /a "PX=1, PY=height/2, FX=width/2+1, FY=PY, score=0, emptyCnt=0, t1=-1000000"
set "gameStart="
set "m=00"
set "s=00"
set "snakeX= %PX%"
set "snakeY= %PY%"
set "snakeX=%snakeX:~-2%"
set "snakeY=%snakeY:~-2%"
for /l %%Y in (0 1 %height%) do (
<nul set /p "=."
set "line%%Y="
for /l %%X in (0,1,%width%) do (
set "cell="
if %%Y equ 0 set "cell=%bound%"
if %%Y equ %height% set "cell=%bound%"
if %%X equ 0 set "cell=%bound%"
if %%X equ %width% set "cell=%bound%"
if %%X equ %PX% if %%Y equ %PY% set "cell=%head%"
if not defined cell (
set "cell=%space%"
set "eX= %%X"
set "eY= %%Y"
set "empty=!empty!#!eX:~-2! !eY:~-2!"
set /a emptyCnt+=1
)
if %%X equ %FX% if %%Y equ %FY% set "cell=%food%"
set "line%%Y=!line%%Y!!cell!"
)
)
for %%A in (!configOptions!) do set "%%ASave=!%%A!"
set "replayFinished="
if defined replay (
%sendCmd% replay
%sendCmd% !replay!
call :waitForSignal
set "replay=(REPLAY at !difficulty!)"
set "read=1"
<&%keyStream% (
for /l %%N in (1 1 !configOptionCnt!) do if defined read (
set /p "ln="
if "!ln!" equ "END" (set read=) else set "!ln!"
)
)
set "keys="
set "hi=0"
for /f "delims=:" %%A in ('findstr "^::" "%hiFile%!diffCode!.txt" 2^>nul') do set "hi=%%A"
(%draw%)
call :delay 100
) else (
if defined hi%diffCode% (set "hi=!hi%diffCode%!") else set "hi=0"
(%draw%)
>"!gameLog!" (
for %%A in (!configOptions!) do (echo %%A=!%%A!)
(echo END)
)
echo(
if !moveKeys! equ 4 (
echo Controls: !up!=up !down!=down !left!=left !right!=right !pause!=pause
) else (
echo Controls: !left!=left !right!=right !pause!=pause
)
echo Avoid running into yourself (!body!!body!!head!^) or wall (!bound!^)
echo Eat food (!food!^) to grow.
echo(
call :ask "Press a key to start..."
%sendCmd% go
)
set "pauseTime=0"
set "xDiff!up!=+0"
set "xDiff!down!=+0"
set "xDiff!left!=-1"
set "xDiff!right!=+1"
set "yDiff!up!=-1"
set "yDiff!down!=+1"
set "yDiff!left!=+0"
set "yDiff!right!=+0"
set "!up!Axis=Y"
set "!down!Axis=Y"
set "!left!Axis=X"
set "!right!Axis=X"
set "xTurn!left!=1"
set "xTurn!right!=-1"
set "yTurn!left!=-1"
set "yTurn!right!=1"
set "playerSpace=!space!!food!"
set ^"keys="!left!" "!right!" "!pause!"^"
set "newHi="
set "grow=0"
if !moveKeys! equ 4 set ^"keys=!keys! "!up!" "!down!"^"
if exist "%~dp0CursorPos.exe" if not defined replay (
cursorpos 0 -4
for /l %%N in (1 1 5) do (echo( )
)
exit /b
:waitForSignal
if not exist "%signal%" goto :waitForSignal
del "%signal%"
exit /b
:loadHighScores
set "saveAvailable="
for /l %%N in (1 1 6) do (
set "hi%%N="
for /f "delims=:" %%A in ('findstr "^::" "%hiFile%%%N.txt" 2^>nul') do (
set "hi%%N=%%A"
set "saveAvailable=S"
)
)
exit /b
:fixLogs
setlocal enableDelayedExpansion
for %%F in (*.snake) do (
ren "%%F" "%%F.txt"
call :fixLog "%%F.txt"
)
pushd "%SaveLoc%"
for /f "delims=" %%F in ('dir /b SnakeHi*.txt 2^>nul') do (
set "file=%%~nF"
set "file=Snake1Hi!file:~-1!.txt"
ren "%%F" "!file!"
call :fixLog "!file!"
)
popd
exit /b

:fixLog filePath
>"%~1.new" (
<"%~1" ( for %%A in (diffCode difficulty moveKeys up down left right) do ( set /p "val=" (echo %%A=!val!) ) ) (echo growth=1) (echo END) more +7 "%~1" ) move /y "%~1.new" "%~1" >nul
exit /b

Step 15:

So, we are at the end of the project. Now we will detect keypresses and send the information to the game via a key file:

:controller
setlocal enableDelayedExpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
set "cmd=hold"
set "inCmd="
set "key="
for /l %%. in () do (
if "!cmd!" neq "hold" (
for /f "delims=" %%A in ('xcopy /w "%~f0" "%~f0" 2^>nul') do (
if not defined key set "key=%%A"
)
set "key=!key:~-1!"
if !key! equ !CR! set "key={Enter}"
)
<&%cmdStream% set /p "inCmd="
if defined inCmd (
if !inCmd! equ quit exit
set "cmd=!inCmd!"
if !inCmd! equ replay (
<&%cmdStream% set /p "file=" type "!file!" >&%keyStream%
copy nul "%signal%"
)
set "inCmd="
)
if defined key (
if "!cmd!" equ "prompt" (echo {purged}.)
if "!cmd!" equ "replay" (
copy nul "%signal%" >nul
set "cmd=go"
) else (echo(!key!.)
if "!cmd!" neq "go" set "cmd=hold"
set "key="
)>&%keyStream%
)

The controller has various modes of input that are activated by commands sent from the game via a cmd file… Modes Are:

  1. hold – No input, wait for command
  2. go – Continuously get/send keypresses
  3. prompt – Send {purged} marker to allow the game to purge input buffer, then get/send a single keypress and hold
  4. one – Get/send a single keypress and hold
  5. replay – Copy a game log to the key file. The next line in the cmd file specifies the name of the log file to copy. During replay, the controller will send an abort signal to the game if a key is pressed.
  6. quit – Immediately exit the controller process

As written, this routine incorrectly reports ! as ), but that doesn’t matter since we don’t need that key. Both and Enter key are reported as {Enter}.
An extra character is appended to the output to preserve any control chars when read by SET /P.

We Are Done,
Now We Will Save The Files As Shown Below:

  • Now after completing the codes Go to file menu in notepad and click on the “save as” option.
How To Make A Simple Snake Game In 15 Easy Steps - Batch Programing
  • Then choose where to save and choose a great name for the game, I will choose ‘Hungry Snake’ as its name. After the name you must write “.bat”, this will make a batch file. Now click “Save”.
How To Make A Simple Snake Game In 15 Easy Steps - Batch Programing
  • All done! Now go the directory and run “[the game name].bat, Example: Hungry Snake.bat.
Snake Game Using Batch Programing
  • Start a new game by pressing ‘n’ then choose difficulty and play!
How To Make A Simple Snake Game In 15 Easy Steps - Batch Programing

You can also convert “[your game name].bat” to “[your game name].exe”.
If you want to do so Check this:
How To Convert A Batch (.bat) File Into Executable (.exe) File Easily

CONGRATS!!

YOU CREATED YOUR FIRST SNAKE GAME USING NOTEPAD BY YOURSELF……

Thanks For Allowing Us To Help You 🙂

If you are confused or want to know something, then let us know in the comment box, we will reach you as soon as possible. Don’t Forget To Subscribe our Newsletter, YouTube Channel, and Like Our Facebook Page To Keep Updated With Awesome Things. Follow us on Twitter to stay updated with the latest news & changes.

Was this helpful?

Mahedi Zaman Zaber

I'm a Driven and ambitious individual who is currently pursuing a Bachelor of Science in Computer Science and Engineering. With a passion for innovation and a desire to make a lasting impact, I aspire to become a distinguished software engineer and entrepreneur.

More Reading

Post navigation

Leave a Comment

Leave a Reply

Your email address will not be published. Required fields are marked *

ZealTyro Blog We would like to show you notifications for the latest news and updates.
Dismiss
Allow Notifications