snake game එකක් හදමු



......................COPY THIS CODES....................  ⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩


@echo offcolor 0eif "%~1" == "startGame" goto :gameif "%~1" == "startController" goto :controller

::------------------------------------------------------------:: verify existence of CHOICE command:: set up a macro appropriately depending on available version
set "choice="2>nul >nul choice /c:yn /t 0 /d yif errorlevel 1 if not errorlevel 2 set "choice=choice /cs"if not defined choice (  2>nul >nul choice /c:yn /t:y,1  if errorlevel 1 if not errorlevel 2 set "choice=choice /s")if not defined choice (  echo ERROR: This game requires the CHOICE command, but it is missing.  echo Game aborted. :(  echo(  echo A 16 bit port of CHOICE.EXE from FREEDOS is available at  echo http://winsupport.org/utilities/freedos-choice.html  echo(  echo A 32 bit version from ??? suitable for 64 bit machines is available at  echo http://hp.vector.co.jp/authors/VA007219/dkclonesup/choice.html  echo(  exit /b)

::---------------------------------------------------------------------:: setup some global variables used by both the game and the controller
set "keys=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"set "keyFile=key.txt"set "cmdFile=cmd.txt"

::------------------------------------------:: launch the game and the controller
copy nul "%keyFile%" >nulstart "" /b "%~f0" startController 9^>^>%keyFile% 2^>nul ^>nulcmd /c "%~f0" startGame 9^<%keyFile% ^<nulecho(
::--------------------------------------------------------------------------------:: Upon exit, wait for the controller to close before deleting the temp input file
:close2>nul (>>"%keyFile%" call )||goto :closedel "%keyFile%"exit /b

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::gamesetlocal disableDelayedExpansiontitle %~nx0cls
::----------------------------:: user configurable options
set "up=W"set "down=S"set "left=A"set "right=D"
set "width=40"   max=99set "height=25"  max=99:: max playing field: (width-2)*(height-2) <= 1365
::----------------------------:: resize the console window
set /a cols=width+1, lines=height+10, area=(width-2)*(height-2)if %area% gtr 1365 (  echo ERROR: Playfield area too large  >"%cmdFile%" (echo quit)  exit)if %lines% lss 14 set lines=14if %cols% lss 46 set cols=46mode con: cols=%cols% lines=%lines%
::----------------------------:: define variables
set "spinner1=-"set "spinner2=\"set "spinner3=|"set "spinner4=/"set "spinner= spinner1 spinner2 spinner3 spinner4 "
set "space= "set "bound=#"set "food=+"set "head=@"set "body=O"set "death=X"set "playerSpace=%space%%food%"
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 "delay1=20"set "delay2=15"set "delay3=10"set "delay4=7"set "delay5=5"set "delay6=3"set "delay0=0"
set "desc1=Sluggard"set "desc2=Crawl"set "desc3=Slow"set "desc4=Normal"set "desc5=Fast"set "desc6=Insane"set "desc0=Unplayable"
set "spinnerDelay=3"
set /a "width-=1, height-=1"

::---------------------------:: define macros
::define a Line Feed (newline) string (normally only used as !LF!)set LF=^

::Above 2 blank lines are required - do not remove
::define a newline with line continuationset ^"\n=^^^%LF%%LF%^%LF%%LF%^^"
:: setErr:::  Sets the ERRORLEVEL to 1set "setErr=(call)"
:: clrErr:::  Sets the ERRORLEVEL to 0set "clrErr=(call )"

:: getKey  ValidKeys::: Check for keypress. Only accept keys listed in ValidKeys::: Return result in Key variable. Key is undefined if no valid keypress.set getKey=%\n%for %%# in (1 2) do if %%#==2 (for /f "eol= delims= " %%1 in ("!args!") do (%\n%  set "validKeys=%%1"%\n%  set "key="%\n%  ^<^&9 set /p "key="%\n%  if defined key if "!key!" neq ":" (%\n%    set /a key-=1%\n%    for %%K in (!key!) do set "key=!keys:~%%K,1!"%\n%  )%\n%  for %%K in (!key!) do if "!validKeys:%%K=!" equ "!validKeys!" set "key="%\n%)) else set args=

:: draw:::  draws the boardset draw=%\n%cls%\n%for /l %%Y in (0,1,%height%) do echo(!line%%Y!%\n%echo Speed=!Difficulty!%\n%echo Score=!score!

:: test  X  Y  ValueListVar:::  tests if value at coordinates X,Y is within contents of ValueListVarset 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=

:: plot  X  Y  ValueVar:::  places contents of ValueVar at coordinates X,Yset 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=

::--------------------------------------:: start the gamesetlocal enableDelayedExpansioncall :initialize

::--------------------------------------:: main loop (infinite loop)for /l %%. in (1 0 1) do (
  %=== 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 ===%
    %=== establish direction ===%    %getKey% ASDW    for %%K in (!key!) do 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=!"
      (%test% !X! !Y! food) && (        %=== moving to food - eat it ===%
        %=== restore the tail ===%        %plot% !TX! !TY! body        set "snakeX=!snakeX!!TX!"        set "snakeY=!snakeY!!TY!"
        %=== increment score and locate and draw new food ===%        set /a "score+=1, F=(!random!%%(emptyCnt-=1))*6+1"        for %%F in (!F!) do (%plot% !empty:~%%F,5! food)
      ) || (        %=== moving to empty space ===%
        %=== 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 ===%      %plot% !TX! !TY! body      call :spinner !PX! !PY! death      %draw%      echo(      call :ask "Would you like to play again? (Y/N)" YN      if /i "!key!" equ "N" (        >"%cmdFile%" (echo quit)        exit      ) else (        call :initialize      )    )
    set /a t1=t2  ))
:ask  Prompt  ValidKeys:: Prompt for a keypress. ValidKeys is a list of acceptable keys:: Wait until a valid key is pressed and return result in Key variable>"%cmdFile%" (echo prompt)<nul set /p "=%~1 ":purge(%getKey% :)if not defined key goto :purge:getResponse(%getKey% %2)if not defined key (  >"%cmdFile%" (echo one)  goto :getResponse)exit /b

:spinner  X  Y  ValueVarset /a d1=-1000000for /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
:spinnerDelayfor /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*100if %dDiff% lss %spinnerDelay% goto :spinnerDelayset /a d1=d2exit /b

::-------------------------------------:initializecls
echo Speed Options:echo                       delayecho    #   Description  (seconds)echo   ---  -----------  ---------echo    1   Sluggard        0.20echo    2   Crawl           0.15echo    3   Slow            0.10echo    4   Normal          0.07echo    5   Fast            0.05echo    6   Insane          0.03echo    0   Unplayable      noneecho(call :ask "Pick a speed (1-6, 0):" 1234560set "difficulty=!desc%key%!"set "delay=!delay%key%!"echo %key% - %difficulty%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 "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!"  ))(%draw%)echo(echo Movement keys: %up%=up %down%=down %left%=left %right%=rightecho Avoid running into yourself (%body%%body%%head%) or wall (%bound%)echo Eat food (%food%) to grow.echo(call :ask "Press any alpha-numeric key to start..." %keys%>"%cmdFile%" (echo go)exit /b

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::controller
setlocal enableDelayedExpansionset "cmd=hold"set "key="for /l %%. in (1 0 1) do (  if "!cmd!" neq "hold" (    %choice% /n /c:!keys!    set "key=!errorlevel!"  )  if exist "%cmdFile%" (    <"%cmdFile%" set /p "cmd="    del "%cmdFile%"  )  if "!cmd!" equ "quit" exit  if defined key (    if "!cmd!" equ "prompt" >&9 (echo :)    >&9 (echo !key!)    if "!cmd!" neq "go" set "cmd=hold"    set "key="  ))              


Comments

Popular Posts