Advertisement
_PaRaD0X_

Snaker - The Interactive Snake Game

Nov 10th, 2017
587
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Batch 10.22 KB | None | 0 0
  1. @echo off
  2. title Snaker
  3. color 0a
  4. echo Starting...
  5. timeout /t 15 /nobreak
  6. cls
  7. echo Snaker v.1.0.0.0
  8. echo Welcome. Press any key to start
  9. pause
  10. if "%~1" == "startGame" goto :game
  11. if "%~1" == "startController" goto :controller
  12.  
  13.  
  14.  
  15. set "choice="
  16. 2>nul >nul choice /c:yn /t 0 /d y
  17. if errorlevel 1 if not errorlevel 2 set "choice=choice /cs"
  18. if not defined choice (
  19.   2>nul >nul choice /c:yn /t:y,1
  20.   if errorlevel 1 if not errorlevel 2 set "choice=choice /s"
  21. )
  22. if not defined choice (
  23.   echo ERROR: This game requires the CHOICE command, but it is missing.
  24.   echo Game aborted. :(
  25.   echo(
  26.   echo A 16 bit port of CHOICE.EXE from FREEDOS is available at
  27.   echo http://winsupport.org/utilities/freedos-choice.html
  28.   echo(
  29.   echo A 32 bit version from ??? suitable for 64 bit machines is available at
  30.   echo http://hp.vector.co.jp/authors/VA007219/dkclonesup/choice.html
  31.   echo(
  32.   exit /b
  33. )
  34.  
  35.  
  36.  
  37.  
  38. set "keys=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
  39. set "keyFile=key.txt"
  40. set "cmdFile=cmd.txt"
  41. set "highscoreFile=last score on !difficulty!.txt"
  42.  
  43.  
  44. copy nul "%keyFile%" >nul
  45. start "" /b "%~f0" startController 9^>^>%keyFile% 2^>nul ^>nul
  46. cmd /c "%~f0" startGame 9^<%keyFile% ^<nul
  47. echo(
  48.  
  49.  
  50.  
  51. :close
  52. 2>nul (>>"%keyFile%" call )||goto :close
  53. del "%keyFile%"
  54. exit /b
  55. :!!
  56.  
  57. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  58. :game
  59. setlocal disableDelayedExpansion
  60. title %~nx0
  61. cls
  62.  
  63.  
  64.  
  65. set "up=W"
  66. set "down=S"
  67. set "left=A"
  68. set "right=D"
  69.  
  70. ::Both max to 99! And width to 40 and height to 25!
  71. set "width=40"   max=99
  72. set "height=25"  max=99
  73. :: max playing field: (width-2)*(height-2) <= 1365
  74.  
  75.  
  76.  
  77. set /a cols=width+1, lines=height+10, area=(width-2)*(height-2)
  78. if %area% gtr 1365 (
  79.   echo ERROR: Playfield area too large
  80.   >"%cmdFile%" (echo quit)
  81.   exit
  82. )
  83. if %lines% lss 14 set lines=14
  84. if %cols% lss 46 set cols=46
  85. mode con: cols=%cols% lines=%lines%
  86.  
  87.  
  88. set "spinner1=|"
  89. set "spinner2=/"
  90. set "spinner3=-"
  91. set "spinner4=\"
  92. set "spinner5=O"
  93. set "spinner6=$"
  94. set "spinner= spinner1 spinner2 spinner3 spinner4 spinner5 spinner6"
  95.  
  96. set "space= "
  97. set "bound=*"
  98. set "food=+"
  99. set "head=@"
  100. set "body=O"
  101. set "death=X"
  102. set "playerSpace=%space%%food%"
  103.  
  104. set "xDiff%up%=+0"
  105. set "xDiff%down%=+0"
  106. set "xDiff%left%=-1"
  107. set "xDiff%right%=+1"
  108.  
  109. set "yDiff%up%=-1"
  110. set "yDiff%down%=+1"
  111. set "yDiff%left%=+0"
  112. set "yDiff%right%=+0"
  113.  
  114. set "%up%Axis=Y"
  115. set "%down%Axis=Y"
  116. set "%left%Axis=X"
  117. set "%right%Axis=X"
  118.  
  119. set "delay1=20"
  120. set "delay2=16"
  121. set "delay3=12"
  122. set "delay4=7"
  123. set "delay5=5"
  124. set "delay6=3"
  125. set "delay0=0"
  126.  
  127. set "desc1=Mega Slow"
  128. set "desc2=Crawler"
  129. set "desc3=Slow"
  130. set "desc4=Normal"
  131. set "desc5=Fast"
  132. set "desc6=Insane"
  133. set "desc0=Impossible"
  134.  
  135. set "spinnerDelay=3"
  136.  
  137. set /a "width-=1, height-=1"
  138.  
  139.  
  140.  
  141. set LF=^
  142.  
  143.  
  144.  
  145.  
  146.  
  147. set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"
  148.  
  149. :: setErr
  150. :::  Sets the ERRORLEVEL to 1
  151. set "setErr=(call)"
  152.  
  153. :: clrErr
  154. :::  Sets the ERRORLEVEL to 0
  155. set "clrErr=(call )"
  156.  
  157.  
  158.  
  159. set getKey=%\n%
  160. for %%# in (1 2) do if %%#==2 (for /f "eol= delims= " %%1 in ("!args!") do (%\n%
  161.   set "validKeys=%%1"%\n%
  162.   set "key="%\n%
  163.   ^<^&9 set /p "key="%\n%
  164.   if defined key if "!key!" neq ":" (%\n%
  165.     set /a key-=1%\n%
  166.     for %%K in (!key!) do set "key=!keys:~%%K,1!"%\n%
  167.   )%\n%
  168.   for %%K in (!key!) do if "!validKeys:%%K=!" equ "!validKeys!" set "key="%\n%
  169. )) else set args=
  170.  
  171.  
  172.  
  173. set draw=%\n%
  174. cls%\n%
  175. for /l %%Y in (0,1,%height%) do echo(!line%%Y!%\n%
  176. echo Mode=!Difficulty!%\n%
  177. echo Score=!score!
  178.  
  179.  
  180. set test=%\n%
  181. for %%# in (1 2) do if %%#==2 (for /f "tokens=1-3" %%1 in ("!args!") do (%\n%
  182.   for %%A in ("!line%%2:~%%1,1!") do if "!%%3:%%~A=!" neq "!%%3!" %clrErr% else %setErr%%\n%
  183. )) else set args=
  184.  
  185. ::ZemByte
  186.  
  187. set plot=%\n%
  188. for %%# in (1 2) do if %%#==2 (for /f "tokens=1-3" %%1 in ("!args!") do (%\n%
  189.   set "part2=!line%%2:~%%1!"%\n%
  190.   set "line%%2=!line%%2:~0,%%1!!%%3!!part2:~1!"%\n%
  191. )) else set args=
  192.  
  193.  
  194. ::--------------------------------------
  195. :: start the game
  196. setlocal enableDelayedExpansion
  197. call :initialize
  198.  
  199.  
  200. ::--------------------------------------
  201. :: main loop (infinite loop)
  202. for /l %%. in (1 0 1) do (
  203.  
  204.   %=== compute time since last move ===%
  205.   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"
  206.   if !tDiff! lss 0 set /a tDiff+=24*60*60*100
  207.  
  208.   if !tDiff! geq !delay! (
  209.     %=== delay has expired, so time for movement ===%
  210.  
  211.     %=== establish direction ===%
  212.     %getKey% ASDW
  213.     for %%K in (!key!) do if "!%%KAxis!" neq "!axis!" (
  214.       set /a "xDiff=xDiff%%K, yDiff=yDiff%%K"
  215.       set "axis=!%%KAxis!"
  216.     )
  217.  
  218.     %=== erase the tail ===%
  219.     set "TX=!snakeX:~-2!"
  220.     set "TY=!snakeY:~-2!"
  221.     set "snakeX=!snakeX:~0,-2!"
  222.     set "snakeY=!snakeY:~0,-2!"
  223.     %plot% !TX! !TY! space
  224.  
  225.     %=== compute new head location and attempt to move ===%
  226.     set /a "X=PX+xDiff, Y=PY+yDiff"
  227.     set "X= !X!"
  228.     set "Y= !Y!"
  229.     set "X=!X:~-2!"
  230.     set "Y=!Y:~-2!"
  231.     (%test% !X! !Y! playerSpace) && (
  232.  
  233.       %=== move successful ===%
  234.  
  235.       %=== remove the new head location from the empty list ===%
  236.       for %%X in ("!X!") do for %%Y in ("!Y!") do set "empty=!empty:#%%~X %%~Y=!"
  237.  
  238.       (%test% !X! !Y! food) && (
  239.         %=== moving to food - eat it ===%
  240.  
  241.         %=== restore the tail ===%
  242.         %plot% !TX! !TY! body
  243.         set "snakeX=!snakeX!!TX!"
  244.         set "snakeY=!snakeY!!TY!"
  245.  
  246.         %=== increment score and locate and draw new food ===%
  247.         set /a "score+=1, F=(!random!%%(emptyCnt-=1))*6+1"
  248.         for %%F in (!F!) do (%plot% !empty:~%%F,5! food)
  249.        
  250.  
  251.       ) || (
  252.         %=== moving to empty space ===%
  253.  
  254.         %=== add the former tail position to the empty list ===%
  255.         set "empty=!empty!#!TX! !TY!"
  256.       )
  257.  
  258.       %=== draw the new head ===%
  259.       if defined snakeX (%plot% !PX! !PY! body)
  260.       %plot% !X! !Y! head
  261.  
  262.       %=== Add the new head position to the snake strings ===%
  263.       set "snakeX=!X!!snakeX!"
  264.       set "snakeY=!Y!!snakeY!"
  265.       set "PX=!X!"
  266.       set "PY=!Y!"
  267.  
  268.       %draw%
  269.  
  270.     ) || (
  271.  
  272.       %=== failed move - game over ===%
  273.       %plot% !TX! !TY! body
  274.       call :spinner !PX! !PY! death
  275.       %draw%
  276.       echo(
  277.       color 2c
  278.       echo Note: If you quit now, your score will be
  279.       echo saved in the last score file of !difficulty!
  280.       echo If you press Y, you will go back to the start menu.
  281.       echo If you don't want to override your old file of !difficulty!, then hit Y
  282.       call :ask "Game Over, your score is: !score! on !difficulty!          Would you like to play again? (Y/N)" YN
  283.       color 2e
  284.       if /i "!key!" equ "N" (
  285.         >"%highscoreFile%"  (echo %DATE% %Time% Last score is:!score! on !difficulty!.)
  286.         >"%cmdFile%" (echo quit)
  287.         exit
  288.       ) else (
  289.         call :initialize
  290.       )
  291.     )
  292.  
  293.     set /a t1=t2
  294.   )
  295. )
  296.  
  297. :ask  Prompt  ValidKeys
  298.  
  299. >"%cmdFile%" (echo prompt)
  300. <nul set /p "=%~1 "
  301. :purge
  302. (%getKey% :)
  303. if not defined key goto :purge
  304. :getResponse
  305. (%getKey% %2)
  306. if not defined key (
  307.   >"%cmdFile%" (echo one)
  308.   goto :getResponse
  309. )
  310. exit /b
  311. ::ZemByte
  312.  
  313. :spinner  X  Y  ValueVar
  314. set /a d1=-1000000
  315. for /l %%N in (1 1 5) do for %%C in (%spinner%) do (
  316.   call :spinnerDelay
  317.   %plot% %1 %2 %%C
  318.   %draw%
  319. )
  320. call :spinnerDelay
  321. (%plot% %1 %2 %3)
  322. exit /b
  323.  
  324. :spinnerDelay
  325. 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"
  326. if %dDiff% lss 0 set /a dDiff+=24*60*60*100
  327. if %dDiff% lss %spinnerDelay% goto :spinnerDelay
  328. set /a d1=d2
  329. exit /b
  330.  
  331.  
  332. ::-------------------------------------
  333. :initialize
  334. title Snaker - By: _PaRaD0X_
  335. cls
  336. echo        Snaker
  337.  
  338. echo ()()()()()()()()()()()()()()()()()()()()()()
  339.  
  340. echo        Options:
  341. echo(                      
  342. echo    @   Description    delay
  343. echo   ___  ___________    ______
  344. echo    1   Mega slow C       0.20
  345. echo    2   Crawler   Y      0.16
  346. echo    3   Slow      N      0.12
  347. echo    4   Normal    O      0.07
  348. echo    5   Fast      Y      0.05
  349. echo    6   Insane    T      0.03
  350. echo    0   Impossible C     none
  351. echo(
  352. echo    To exit the game, hit the close button.
  353. echo    Do not delete the "cmd" and/or
  354. echo    the "key" file!
  355. echo(
  356. call :ask "Pick a speed (1-6, 0):" 1234560
  357. set "difficulty=!desc%key%!"
  358. set "delay=!delay%key%!"
  359. echo %key% - %difficulty%
  360. color 0a
  361. echo(
  362. <nul set /p "=Initializing."
  363. set "axis=X"
  364. set "xDiff=+1"
  365. set "yDiff=+0"
  366. set "empty="
  367. set /a "PX=1, PY=height/2, FX=width/2+1, FY=PY, score=0, emptyCnt=0, t1=-1000000"
  368. set "snakeX= %PX%"
  369. set "snakeY= %PY%"
  370. set "snakeX=%snakeX:~-2%"
  371. set "snakeY=%snakeY:~-2%"
  372. for /l %%Y in (0 1 %height%) do (
  373.   <nul set /p "=."
  374.   set "line%%Y="
  375.   for /l %%X in (0,1,%width%) do (
  376.     set "cell="
  377.     if %%Y equ 0        set "cell=%bound%"
  378.     if %%Y equ %height% set "cell=%bound%"
  379.     if %%X equ 0        set "cell=%bound%"
  380.     if %%X equ %width%  set "cell=%bound%"
  381.     if %%X equ %PX% if %%Y equ %PY% set "cell=%head%"
  382.     if not defined cell (
  383.       set "cell=%space%"
  384.       set "eX= %%X"
  385.       set "eY= %%Y"
  386.       set "empty=!empty!#!eX:~-2! !eY:~-2!"
  387.       set /a emptyCnt+=1
  388.     )
  389.     if %%X equ %FX% if %%Y equ %FY% set "cell=%food%"
  390.     set "line%%Y=!line%%Y!!cell!"
  391.   )
  392. )
  393. (%draw%)
  394. echo(
  395. echo Movement keys: %up%=up %down%=down %left%=left %right%=right
  396. echo Avoid running into yourself (%body%%body%%head%) or wall (%bound%)
  397. echo Eat food (%food%) to grow.
  398. echo(
  399. call :ask "Press any alpha-numeric key to start... A/Z" %keys%
  400. >"%cmdFile%" (echo go)
  401. exit /b
  402.  
  403.  
  404. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  405. :controller
  406.  
  407. setlocal enableDelayedExpansion
  408. set "cmd=hold"
  409. set "key="
  410. for /l %%. in (1 0 1) do (
  411.   if "!cmd!" neq "hold" (
  412.     %choice% /n /c:!keys!
  413.     set "key=!errorlevel!"
  414.   )
  415.   if exist "%cmdFile%" (
  416.     <"%cmdFile%" set /p "cmd="
  417.     del "%cmdFile%"
  418.   )
  419.   if "!cmd!" equ "quit" exit
  420.   if defined key (
  421.     if "!cmd!" equ "prompt" >&9 (echo :)
  422.     >&9 (echo !key!)
  423.     if "!cmd!" neq "go" set "cmd=hold"
  424.     set "key="
  425.   )
  426. )
  427.  
  428. :incorrect_pass
  429. cls
  430. pause
  431. exit
  432.  
  433.  
  434. -- DO NOT PASTE BELOW HERE --
  435. If you are a stupid little kid who wants to use this, go into Notepad, paste, press "File" >> "Save As", and save it with any name and .bat
  436. Example:
  437. name.bat
  438. YOU MUST HAVE .bat
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement