All pastes #996029 Raw Edit

Sokoban game in *.bat-file

public text v1 · immutable
#996029 ·published 2008-04-24 17:48 UTC
rendered paste body
@echo off

rem
rem  Sokoban.bat  
rem  (c) 2008 Aleksej Borisov aka Imp5
rem


rem testing for CHOICE
set choice_supported=1
choice /? > nul
if %errorlevel% NEQ 0 set choice_supported=0

rem ---------------------------------------------------------------

set level=0
goto load_level_%level%

rem ---------------------------------------------------------------
:main_loop
cls
echo.
echo%z0%
echo%z1%
echo%z2%
echo%z3%
echo%z4%
echo%z5%
echo%z6%
echo%z7%
echo%z8%
echo%z9%
echo%z10%
echo%z11%
echo%z12%
echo%z13%
echo.
echo.

set /a dx=0
set /a dy=0

if %need_score% NEQ 0 goto skip_well_done
	call :level_complete
	goto load_level_%level%
:skip_well_done


if %choice_supported% NEQ 0 goto skip_set_p
	echo  Type [W] [S] [A] [D] to move  [Q] to exit  and press [Enter].
	set /p ch=
	if not '%ch%'=='' set ch=%ch:~0,1%
	if (%ch%)==(W) goto key_up
	if (%ch%)==(S) goto key_down
	if (%ch%)==(A) goto key_left
	if (%ch%)==(D) goto key_right
	if (%ch%)==(Q) goto key_exit
	if (%ch%)==(w) goto key_up
	if (%ch%)==(s) goto key_down
	if (%ch%)==(a) goto key_left
	if (%ch%)==(d) goto key_right
	if (%ch%)==(q) goto key_exit
	goto end_switch_keys
:skip_set_p

if %choice_supported% NEQ 1 goto skip_choice
	echo  Press [W] [S] [A] [D] to move  [Q] to exit.
	choice /C:WSADQ > nul
	if errorlevel 5 goto key_exit
	if errorlevel 4 goto key_right
	if errorlevel 3 goto key_left
	if errorlevel 2 goto key_down
	if errorlevel 1 goto key_up
	goto end_switch_keys
:skip_choice


:key_exit
cls
goto EOF

:key_right
set /a dx=1
set /a dy=0
goto end_switch_keys

:key_left
set /a dx=-1
set /a dy=0
goto end_switch_keys

:key_down
set /a dx=0
set /a dy=1
goto end_switch_keys

:key_up
set /a dx=0
set /a dy=-1
goto end_switch_keys

:end_switch_keys

set /a next_x=x+dx
set /a next_y=y+dy
set /a next_x2=x+dx*2
set /a next_y2=y+dy*2

call :getvalue %next_x% %next_y%
set next_value=%result%
if %next_value%==@ set next_value=.

if %next_value%==. goto can_move
if %next_value%==# goto cannot_move

if %next_value% NEQ 0 goto skip_zero
	call :getvalue %next_x2% %next_y2%
	if %result% NEQ X goto skip_x0
		call :setvalue %next_x2% %next_y2% 0 
		call :setvalue %next_x% %next_y% . 
		set next_value=X
		goto can_move
	:skip_x0	

	if %result% NEQ . goto skip_dot0
		call :setvalue %next_x2% %next_y2% o 
		call :setvalue %next_x% %next_y% . 
		set next_value=X
		set /a need_score=need_score+1
		goto can_move
	:skip_dot0

	goto cannot_move
:skip_zero

if %next_value% NEQ o goto skip_o
	call :getvalue %next_x2% %next_y2%
	if %result% NEQ X goto skip_x1
		call :setvalue %next_x2% %next_y2% 0 
		call :setvalue %next_x% %next_y% . 
		set next_value=.
		set /a need_score=need_score-1
		goto can_move
	:skip_x1	

	if %result% NEQ . goto skip_dot1
		call :setvalue %next_x2% %next_y2% o 
		call :setvalue %next_x% %next_y% . 
		set next_value=.
		goto can_move
	:skip_dot1

	goto cannot_move
:skip_o

:can_move

call :setvalue %x% %y% %saved_value%
set saved_value=%next_value%
set /a x+=dx
set /a y+=dy
call :setvalue %x% %y% @

:cannot_move

goto main_loop
rem ---------------------------------------------------------------

:load_level_0
	set  z0=.                 
	set  z1=  #############   
	set  z2=  #......###..#   
	set  z3=  #......###..#   
	set  z4=  #...o.......#   
	set  z5=  #........X..#   
	set  z6=  #...o.......#   
	set  z7=  #........X..#   
	set  z8=  #...........#   
	set  z9=  #..###......#   
	set z10=  #..###......#   
	set z11=  #...........#   
	set z12=  #############   
	set z13=.                 

	set /a x=4
	set /a y=3
	set /a need_score=2
	set saved_value=.
	call :setvalue %x% %y% @
goto main_loop

rem ---------------------------------------------------------------
:load_level_1
	set  z0=.                 
	set  z1=.                 
	set  z2=     #########    
	set  z3=     #.......#    
	set  z4=     #.o.##..#    
	set  z5=  ######.##..#    
	set  z6=  #.....o....#    
	set  z7=  #.o........#    
	set  z8=  ######..#####   
	set  z9=    #.........#   
	set z10=    #..X.X.X..#   
	set z11=    #.........#   
	set z12=    ###########   
	set z13=.                 

	set /a x=6
	set /a y=9
	set /a need_score=3
	set saved_value=.
	call :setvalue %x% %y% @
goto main_loop

rem ---------------------------------------------------------------
:load_level_2
	set  z0=                 #########      
	set  z1=                ##.......#      
	set  z2=   #######      #........#      
	set  z3=   #.....###    #.o......#      
	set  z4=  ##.###.o.######..####..###    
	set  z5=  #.o..............#  #....#    
	set  z6=  #...#...####.....#  #....#    
	set  z7=  ##XX#...#  #######  ###.##    
	set  z8=   ##.#####             #.#     
	set  z9=    #.#        #####    #.#     
	set z10=    #.##########...##   #.#     
	set z11=   ##...............#####.#     
	set z12=   #.X.#######............#     
	set z13=   #####     ##############     

	set /a x=4
	set /a y=4
	set /a need_score=3
	set saved_value=.
	call :setvalue %x% %y% @
goto main_loop

rem ---------------------------------------------------------------
:load_level_3
        cls
	echo.
	echo.
	echo.
	echo    -------------------------------------
	echo        C O N G R A T U L A T I O N S
	echo    -------------------------------------
	echo.
	echo.
	pause > nul
goto EOF

rem ---------------------------------------------------------------
:level_complete
	echo  Well Done!
	pause > nul
	set /a level=level+1
goto EOF

rem ---------------------------------------------------------------
:setvalue
	set xx=%1
	set yy=%2
	set /a xx_plus_1=xx+1
	call set z%yy%=%%z%yy%:~0,%xx%%%%%3%%z%yy%:~%xx_plus_1%%%
goto EOF

rem ---------------------------------------------------------------
:getvalue
	set xx=%1
	set yy=%2
	call set result=%%z%yy%:~%xx%,1%%
goto EOF
:EOF