Advertisement
Guest User

Snake.bat

a guest
Apr 13th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Winbatch 11.62 KB | None | 0 0
  1. @echo off
  2.  
  3.  color rgb(0,255,0)
  4.  
  5.  if "%~1" == "startGame" goto :game
  6.  
  7.  if "%~1" == "startController" goto :controller
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  ::------------------------------------------------------------
  14.  
  15.  :: verify existence of CHOICE command
  16.  
  17.  :: set up a macro appropriately depending on available version
  18.  
  19.  
  20.  
  21.  set "choice="
  22.  
  23.  2>nul >nul choice /c:yn /t 0 /d y
  24.  
  25.  if errorlevel 1 if not errorlevel 2 set "choice=choice /cs"
  26.  
  27.  if not defined choice (
  28.  
  29.    2>nul >nul choice /c:yn /t:y,1
  30.  
  31.    if errorlevel 1 if not errorlevel 2 set "choice=choice /s"
  32.  
  33.  )
  34.  
  35.  if not defined choice (
  36.  
  37.    echo ERROR: This game requires the CHOICE command, but it is missing.
  38.  
  39.    echo Game aborted. :(
  40.  
  41.    echo(
  42.  
  43.    echo A 16 bit port of CHOICE.EXE from FREEDOS is available at
  44.  
  45.    echo http://winsupport.org/utilities/freedos-choice.html
  46.  
  47.    echo(
  48.  
  49.    echo A 32 bit version from ??? suitable for 64 bit machines is available at
  50.  
  51.    echo http://hp.vector.co.jp/authors/VA007219/dkclonesup/choice.html
  52.  
  53.    echo(
  54.  
  55.    exit /b
  56.  
  57.  )
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  ::---------------------------------------------------------------------
  64.  
  65.  :: setup some global variables used by both the game and the controller
  66.  
  67.  
  68.  
  69.  set "keys=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
  70.  
  71.  set "keyFile=key.txt"
  72.  
  73.  set "cmdFile=cmd.txt"
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  ::------------------------------------------
  80.  
  81.  :: launch the game and the controller
  82.  
  83.  
  84.  
  85.  copy nul "%keyFile%" >nul
  86.  
  87.  start "" /b "%~f0" startController 9^>^>%keyFile% 2^>nul ^>nul
  88.  
  89.  cmd /c "%~f0" startGame 9^<%keyFile% ^<nul
  90.  
  91.  echo(
  92.  
  93.  
  94.  
  95.  ::--------------------------------------------------------------------------------
  96.  
  97.  :: Upon exit, wait for the controller to close before deleting the temp input file
  98.  
  99.  
  100.  
  101.  :close
  102.  
  103.  2>nul (>>"%keyFile%" call )||goto :close
  104.  
  105.  del "%keyFile%"
  106.  
  107.  exit /b
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  114.  
  115.  :game
  116.  
  117.  setlocal disableDelayedExpansion
  118.  
  119.  title akila_malliya(??)
  120.  
  121.  cls
  122.  
  123.  
  124.  
  125.  ::----------------------------
  126.  
  127.  :: user configurable options
  128.  
  129.  
  130.  
  131.  set "up=W"
  132.  
  133.  set "down=S"
  134.  
  135.  set "left=A"
  136.  
  137.  set "right=D"
  138.  
  139.  
  140.  
  141.  set "width=40"   max=99
  142.  
  143.  set "height=25"  max=99
  144.  
  145.  :: max playing field: (width-2)*(height-2) <= 1365
  146.  
  147.  
  148.  
  149.  ::----------------------------
  150.  
  151.  :: resize the console window
  152.  
  153.  
  154.  
  155.  set /a cols=width+1, lines=height+10, area=(width-2)*(height-2)
  156.  
  157.  if %area% gtr 1365 (
  158.  
  159.    echo ERROR: Playfield area too large
  160.  
  161.    >"%cmdFile%" (echo quit)
  162.  
  163.    exit
  164.  
  165.  )
  166.  
  167.  if %lines% lss 14 set lines=14
  168.  
  169.  if %cols% lss 46 set cols=46
  170.  
  171.  mode con: cols=%cols% lines=%lines%
  172.  
  173.  
  174.  
  175.  ::----------------------------
  176.  
  177.  :: define variables
  178.  
  179.  
  180.  
  181.  set "spinner1=-"
  182.  
  183.  set "spinner2=\"
  184.  
  185.  set "spinner3=|"
  186.  
  187.  set "spinner4=/"
  188.  
  189.  set "spinner= spinner1 spinner2 spinner3 spinner4 "
  190.  
  191.  
  192.  
  193.  set "space= "
  194.  
  195.  set "bound=#"
  196.  
  197.  set "food=$"
  198.  
  199.  set "head=A"
  200.  
  201.  set "body=0"
  202.  
  203.  set "death=X"
  204.  
  205.  set "playerSpace=%space%%food%"
  206.  
  207.  
  208.  
  209.  set "xDiff%up%=+0"
  210.  
  211.  set "xDiff%down%=+0"
  212.  
  213.  set "xDiff%left%=-1"
  214.  
  215.  set "xDiff%right%=+1"
  216.  
  217.  
  218.  
  219.  set "yDiff%up%=-1"
  220.  
  221.  set "yDiff%down%=+1"
  222.  
  223.  set "yDiff%left%=+0"
  224.  
  225.  set "yDiff%right%=+0"
  226.  
  227.  
  228.  
  229.  set "%up%Axis=Y"
  230.  
  231.  set "%down%Axis=Y"
  232.  
  233.  set "%left%Axis=X"
  234.  
  235.  set "%right%Axis=X"
  236.  
  237.  
  238.  
  239.  set "delay1=20"
  240.  
  241.  set "delay2=15"
  242.  
  243.  set "delay3=10"
  244.  
  245.  set "delay4=7"
  246.  
  247.  set "delay5=5"
  248.  
  249.  set "delay6=3"
  250.  
  251.  set "delay0=0"
  252.  
  253.  
  254.  
  255.  set "desc1=Sluggard"
  256.  
  257.  set "desc2=Crawl"
  258.  
  259.  set "desc3=Slow"
  260.  
  261.  set "desc4=Normal"
  262.  
  263.  set "desc5=Fast"
  264.  
  265.  set "desc6=Insane"
  266.  
  267.  set "desc0=Unplayable"
  268.  
  269.  
  270.  
  271.  set "spinnerDelay=3"
  272.  
  273.  
  274.  
  275.  set /a "width-=1, height-=1"
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  ::---------------------------
  282.  
  283.  :: define macros
  284.  
  285.  
  286.  
  287.  ::define a Line Feed (newline) string (normally only used as !LF!)
  288.  
  289.  set LF=^
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  ::Above 2 blank lines are required - do not remove
  296.  
  297.  
  298.  
  299.  ::define a newline with line continuation
  300.  
  301.  set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"
  302.  
  303.  
  304.  
  305.  :: setErr
  306.  
  307.  :::  Sets the ERRORLEVEL to 1
  308.  
  309.  set "setErr=(call)"
  310.  
  311.  
  312.  
  313.  :: clrErr
  314.  
  315.  :::  Sets the ERRORLEVEL to 0
  316.  
  317.  set "clrErr=(call )"
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  :: getKey  ValidKeys
  324.  
  325.  ::: Check for keypress. Only accept keys listed in ValidKeys
  326.  
  327.  ::: Return result in Key variable. Key is undefined if no valid keypress.
  328.  
  329.  set getKey=%\n%
  330.  
  331.  for %%# in (1 2) do if %%#==2 (for /f "eol= delims= " %%1 in ("!args!") do (%\n%
  332.  
  333.    set "validKeys=%%1"%\n%
  334.  
  335.    set "key="%\n%
  336.  
  337.    ^<^&9 set /p "key="%\n%
  338.  
  339.    if defined key if "!key!" neq ":" (%\n%
  340.  
  341.      set /a key-=1%\n%
  342.  
  343.      for %%K in (!key!) do set "key=!keys:~%%K,1!"%\n%
  344.  
  345.    )%\n%
  346.  
  347.    for %%K in (!key!) do if "!validKeys:%%K=!" equ "!validKeys!" set "key="%\n%
  348.  
  349.  )) else set args=
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  :: draw
  356.  
  357.  :::  draws the board
  358.  
  359.  set draw=%\n%
  360.  
  361.  cls%\n%
  362.  
  363.  for /l %%Y in (0,1,%height%) do echo(!line%%Y!%\n%
  364.  
  365.  echo Speed=!Difficulty!%\n%
  366.  
  367.  echo Score=!score!
  368.  
  369.  
  370.  
  371.  
  372.  
  373.  :: test  X  Y  ValueListVar
  374.  
  375.  :::  tests if value at coordinates X,Y is within contents of ValueListVar
  376.  
  377.  set test=%\n%
  378.  
  379.  for %%# in (1 2) do if %%#==2 (for /f "tokens=1-3" %%1 in ("!args!") do (%\n%
  380.  
  381.    for %%A in ("!line%%2:~%%1,1!") do if "!%%3:%%~A=!" neq "!%%3!" %clrErr% else %setErr%%\n%
  382.  
  383.  )) else set args=
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  :: plot  X  Y  ValueVar
  390.  
  391.  :::  places contents of ValueVar at coordinates X,Y
  392.  
  393.  set plot=%\n%
  394.  
  395.  for %%# in (1 2) do if %%#==2 (for /f "tokens=1-3" %%1 in ("!args!") do (%\n%
  396.  
  397.    set "part2=!line%%2:~%%1!"%\n%
  398.  
  399.    set "line%%2=!line%%2:~0,%%1!!%%3!!part2:~1!"%\n%
  400.  
  401.  )) else set args=
  402.  
  403.  
  404.  
  405.  
  406.  
  407.  ::--------------------------------------
  408.  
  409.  :: start the game
  410.  
  411.  setlocal enableDelayedExpansion
  412.  
  413.  call :initialize
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  ::--------------------------------------
  420.  
  421.  :: main loop (infinite loop)
  422.  
  423.  for /l %%. in (1 0 1) do (
  424.  
  425.  
  426.  
  427.    %=== compute time since last move ===%
  428.  
  429.    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"
  430.  
  431.    if !tDiff! lss 0 set /a tDiff+=24*60*60*100
  432.  
  433.  
  434.  
  435.    if !tDiff! geq !delay! (
  436.  
  437.      %=== delay has expired, so time for movement ===%
  438.  
  439.  
  440.  
  441.      %=== establish direction ===%
  442.  
  443.      %getKey% ASDW
  444.  
  445.      for %%K in (!key!) do if "!%%KAxis!" neq "!axis!" (
  446.  
  447.        set /a "xDiff=xDiff%%K, yDiff=yDiff%%K"
  448.  
  449.        set "axis=!%%KAxis!"
  450.  
  451.      )
  452.  
  453.  
  454.  
  455.      %=== erase the tail ===%
  456.  
  457.      set "TX=!snakeX:~-2!"
  458.  
  459.      set "TY=!snakeY:~-2!"
  460.  
  461.      set "snakeX=!snakeX:~0,-2!"
  462.  
  463.      set "snakeY=!snakeY:~0,-2!"
  464.  
  465.      %plot% !TX! !TY! space
  466.  
  467.  
  468.  
  469.      %=== compute new head location and attempt to move ===%
  470.  
  471.      set /a "X=PX+xDiff, Y=PY+yDiff"
  472.  
  473.      set "X= !X!"
  474.  
  475.      set "Y= !Y!"
  476.  
  477.      set "X=!X:~-2!"
  478.  
  479.      set "Y=!Y:~-2!"
  480.  
  481.      (%test% !X! !Y! playerSpace) && (
  482.  
  483.  
  484.  
  485.        %=== move successful ===%
  486.  
  487.  
  488.  
  489.        %=== remove the new head location from the empty list ===%
  490.  
  491.        for %%X in ("!X!") do for %%Y in ("!Y!") do set "empty=!empty:#%%~X %%~Y=!"
  492.  
  493.  
  494.  
  495.        (%test% !X! !Y! food) && (
  496.  
  497.          %=== moving to food - eat it ===%
  498.  
  499.  
  500.  
  501.          %=== restore the tail ===%
  502.  
  503.          %plot% !TX! !TY! body
  504.  
  505.          set "snakeX=!snakeX!!TX!"
  506.  
  507.          set "snakeY=!snakeY!!TY!"
  508.  
  509.  
  510.  
  511.          %=== increment score and locate and draw new food ===%
  512.  
  513.          set /a "score+=1, F=(!random!%%(emptyCnt-=1))*6+1"
  514.  
  515.          for %%F in (!F!) do (%plot% !empty:~%%F,5! food)
  516.  
  517.  
  518.  
  519.        ) || (
  520.  
  521.          %=== moving to empty space ===%
  522.  
  523.  
  524.  
  525.          %=== add the former tail position to the empty list ===%
  526.  
  527.          set "empty=!empty!#!TX! !TY!"
  528.  
  529.        )
  530.  
  531.  
  532.  
  533.        %=== draw the new head ===%
  534.  
  535.        if defined snakeX (%plot% !PX! !PY! body)
  536.  
  537.        %plot% !X! !Y! head
  538.  
  539.  
  540.  
  541.        %=== Add the new head position to the snake strings ===%
  542.  
  543.        set "snakeX=!X!!snakeX!"
  544.  
  545.        set "snakeY=!Y!!snakeY!"
  546.  
  547.        set "PX=!X!"
  548.  
  549.        set "PY=!Y!"
  550.  
  551.  
  552.  
  553.        %draw%
  554.  
  555.  
  556.  
  557.      ) || (
  558.  
  559.  
  560.  
  561.        %=== failed move - game over ===%
  562.  
  563.        %plot% !TX! !TY! body
  564.  
  565.        call :spinner !PX! !PY! death
  566.  
  567.        %draw%
  568.  
  569.        echo(
  570.  
  571.        call :ask "Would you like to play again? (Y/N)" YN
  572.  
  573.        if /i "!key!" equ "N" (
  574.  
  575.          >"%cmdFile%" (echo quit)
  576.  
  577.          exit
  578.  
  579.        ) else (
  580.  
  581.          call :initialize
  582.  
  583.        )
  584.  
  585.      )
  586.  
  587.  
  588.  
  589.      set /a t1=t2
  590.  
  591.    )
  592.  
  593.  )
  594.  
  595.  
  596.  
  597.  :ask  Prompt  ValidKeys
  598.  
  599.  :: Prompt for a keypress. ValidKeys is a list of acceptable keys
  600.  
  601.  :: Wait until a valid key is pressed and return result in Key variable
  602.  
  603.  >"%cmdFile%" (echo prompt)
  604.  
  605.  <nul set /p "=%~1 "
  606.  
  607.  :purge
  608.  
  609.  (%getKey% :)
  610.  
  611.  if not defined key goto :purge
  612.  
  613.  :getResponse
  614.  
  615.  (%getKey% %2)
  616.  
  617.  if not defined key (
  618.  
  619.    >"%cmdFile%" (echo one)
  620.  
  621.    goto :getResponse
  622.  
  623.  )
  624.  
  625.  exit /b
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  :spinner  X  Y  ValueVar
  632.  
  633.  set /a d1=-1000000
  634.  
  635.  for /l %%N in (1 1 5) do for %%C in (%spinner%) do (
  636.  
  637.    call :spinnerDelay
  638.  
  639.    %plot% %1 %2 %%C
  640.  
  641.    %draw%
  642.  
  643.  )
  644.  
  645.  call :spinnerDelay
  646.  
  647.  (%plot% %1 %2 %3)
  648.  
  649.  exit /b
  650.  
  651.  
  652.  
  653.  :spinnerDelay
  654.  
  655.  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"
  656.  
  657.  if %dDiff% lss 0 set /a dDiff+=24*60*60*100
  658.  
  659.  if %dDiff% lss %spinnerDelay% goto :spinnerDelay
  660.  
  661.  set /a d1=d2
  662.  
  663.  exit /b
  664.  
  665.  
  666.  
  667.  
  668.  
  669.  ::-------------------------------------
  670.  
  671.  :initialize
  672.  
  673.  cls
  674.  
  675.  
  676.  
  677.  echo Speed Options:
  678.  
  679.  echo                       delay
  680.  
  681.  echo    #   Description  (seconds)
  682.  
  683.  echo   ---  -----------  ---------
  684.  
  685.  echo    1   Sluggard        0.20
  686.  
  687.  echo    2   Crawl           0.15
  688.  
  689.  echo    3   Slow            0.10
  690.  
  691.  echo    4   Normal          0.07
  692.  
  693.  echo    5   Fast            0.05
  694.  
  695.  echo    6   Insane          0.03
  696.  
  697.  echo    0   Unplayable      none
  698.  
  699.  echo(
  700.  
  701.  call :ask "Pick a speed (1-6, 0):" 1234560
  702.  
  703.  set "difficulty=!desc%key%!"
  704.  
  705.  set "delay=!delay%key%!"
  706.  
  707.  echo %key% - %difficulty%
  708.  
  709.  echo(
  710.  
  711.  <nul set /p "=Initializing."
  712.  
  713.  set "axis=X"
  714.  
  715.  set "xDiff=+1"
  716.  
  717.  set "yDiff=+0"
  718.  
  719.  set "empty="
  720.  
  721.  set /a "PX=1, PY=height/2, FX=width/2+1, FY=PY, score=0, emptyCnt=0, t1=-1000000"
  722.  
  723.  set "snakeX= %PX%"
  724.  
  725.  set "snakeY= %PY%"
  726.  
  727.  set "snakeX=%snakeX:~-2%"
  728.  
  729.  set "snakeY=%snakeY:~-2%"
  730.  
  731.  for /l %%Y in (0 1 %height%) do (
  732.  
  733.    <nul set /p "=."
  734.  
  735.    set "line%%Y="
  736.  
  737.    for /l %%X in (0,1,%width%) do (
  738.  
  739.      set "cell="
  740.  
  741.      if %%Y equ 0        set "cell=%bound%"
  742.  
  743.      if %%Y equ %height% set "cell=%bound%"
  744.  
  745.      if %%X equ 0        set "cell=%bound%"
  746.  
  747.      if %%X equ %width%  set "cell=%bound%"
  748.  
  749.      if %%X equ %PX% if %%Y equ %PY% set "cell=%head%"
  750.  
  751.      if not defined cell (
  752.  
  753.        set "cell=%space%"
  754.  
  755.        set "eX= %%X"
  756.  
  757.        set "eY= %%Y"
  758.  
  759.        set "empty=!empty!#!eX:~-2! !eY:~-2!"
  760.  
  761.        set /a emptyCnt+=1
  762.  
  763.      )
  764.  
  765.      if %%X equ %FX% if %%Y equ %FY% set "cell=%food%"
  766.  
  767.      set "line%%Y=!line%%Y!!cell!"
  768.  
  769.    )
  770.  
  771.  )
  772.  
  773.  (%draw%)
  774.  
  775.  echo(
  776.  
  777.  echo Movement keys: %up%=up %down%=down %left%=left %right%=right
  778.  
  779.  echo Avoid running into yourself (%body%%body%%head%) or wall (%bound%)
  780.  
  781.  echo Eat food (%food%) to grow.
  782.  
  783.  echo(
  784.  
  785.  call :ask "Press any alpha-numeric key to start..." %keys%
  786.  
  787.  >"%cmdFile%" (echo go)
  788.  
  789.  exit /b
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  796.  
  797.  :controller
  798.  
  799.  
  800.  
  801.  setlocal enableDelayedExpansion
  802.  
  803.  set "cmd=hold"
  804.  
  805.  set "key="
  806.  
  807.  for /l %%. in (1 0 1) do (
  808.  
  809.    if "!cmd!" neq "hold" (
  810.  
  811.      %choice% /n /c:!keys!
  812.  
  813.      set "key=!errorlevel!"
  814.  
  815.    )
  816.  
  817.    if exist "%cmdFile%" (
  818.  
  819.      <"%cmdFile%" set /p "cmd="
  820.  
  821.      del "%cmdFile%"
  822.  
  823.    )
  824.  
  825.    if "!cmd!" equ "quit" exit
  826.  
  827.    if defined key (
  828.  
  829.      if "!cmd!" equ "prompt" >&9 (echo :)
  830.  
  831.      >&9 (echo !key!)
  832.  
  833.      if "!cmd!" neq "go" set "cmd=hold"
  834.  
  835.      set "key="
  836.  
  837.    )
  838.  
  839.  )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement