Board logo

标题: [原创]推箱子批处理游戏 [打印本页]

作者: netbenton     时间: 2009-8-26 11:12    标题: [原创]推箱子批处理游戏

推箱子游戏

2009-8-29更新
纯批,不用三方,不生成任何临时文件(除玩家的记录),小巧,自由增加关级,转换后放到最后即可

2009-08-30 更新
连玩家记录也不用临时文件了。

2009-09-06 更新
消除了刷屏时闪烁的问题

2009-09-14 更新
支持超大地图

2010-03-22 修正了增强版的一个小BUG
@goto :begin 1@                                                    此为记录数据行,请不要删移!
e 100 cd 16 86 c4 b4 02 cd 10 b4 4C CD 21
g
:begin
@echo off
pushd "%~dp0"
chcp 437 >nul
graftabl 936 >nul
rem color 2f
set "a=i83=10;i1=7;i72=1;i80=3;i75=2;i77=4;i73=8;i81=9;i57=5;i28=6;c1=n-;c2=m-;c3=n+;c4=m+;∷=^^!r!n!.!m!^^!-∷;☆=^^!r!n!.!m!^^!-☆;▓∷=▓-∷;▓☆=★-∷;★∷=▓-☆;★☆=★-☆;原=∷
set %a:;=&set %
setlocal enabledelayedexpansion
for /f "tokens=2,3 delims=囧" %%a in (%~nx0) do (
  set var=!var!%%a
  if "%%b" equ "" (
    set lev!n!=!var!
    set/a n+=1
    set var=
  )
)
set a=a=■;b=∷;c=▓;d=☆;e=★;f=大;tc=abcdefg;tn=1234567890;g=;/a end=n,z=8180,x=0,n=0,m=0;$a= 
set cr=^

&set %a:;=&set %
set/p yg=< %~nx0 >nul
set yg=!yg:~13,52!
set lev=%yg:@=&rem %
set yg= !yg:* =!
set/a n0=0,n9=17,m0=-1
goto :skend
:restart
endlocal&set lev=%lev%
:skend
cls&setlocal enabledelayedexpansion
set str=!lev%lev%!
for /l %%a in (1,1,14) do (set/a "y=(z-x)/2+x"
    for %%b in (!y!) do if "!str:~%%b,1!" equ "" (set/a z=y) else (set/a x=y)
)
for /l %%a in (0,1,!x!) do (set/a t=%%a+1
for %%b in (!t!) do (
    for /f "tokens=1-3 delims=-" %%1 in ("!str:~%%a,1!-!str:~%%b,1!-!n!") do (
        if "!tc:%%1=!" neq "!tc!" (
            if "!tn:%%2=!" neq "!tn!" (set k=%%2) else (set k=1)
            for /l %%k in (1,1,!k!) do (set r!n!.!m!=!%%1!&set rr!%%1!=!n!.!m!
              if "!%%1!" equ "☆" set "ke=!ke!^!r!n!.!m!^!"
              set /a m+=1
            )
        ) else (if "%%1" equ " " set /a n+=1,m=0)
    )
))
setlocal enabledelayedexpansion
for /l %%a in (1,1,!n!) do set lev%%a=
set /a n=!rr大:.=,m=!
set ji=%ke%&set ji=!ji:☆=★!
if "!yg: %lev% =!" neq "!yg!" (set cyg=☆已过☆) else set cyg=
title   批处理推箱子  第%lev%关   !cyg!
:loop
(
if !n! geq !n9! set /a n0=n-17,n9=n
if !n0! lss 0 set /a n0=0,n9=17
if !n! lss !n0! set /a n0=n,n9=n+17
if !m! geq !m9! set /a m0=m-33,m9=m
if !m0! lss 0 set /a m0=0,m9=33
if !m! lss !m0! set /a m0=m,m9=m+33
set/a en0=n0-2,em0=m0-2,en9=n9+2,em9=m9+2
if "!m0!!m9!" neq "%m0%%m9%" (
  set ebs=
  for /l %%b in (!em0!,1,!em9!) do (
     set "ebs=!ebs!^!@%%b^!^^^!$a^!@%%b^!^^^!
  )
)
)
for /l %%a in (!en0!,1,!en9!) do (
    for %%c in ("!ebs:@=r%%a.!") do (
        for %%d in ("%%~c") do (set ebuf=!ebuf!%%~d!cr!)
    )
)
if "%ke%" equ "!ji!" cls&echo !ebuf!   恭喜你过关了!&pause&goto me9
set ebuf=!ebuf!方向键移动,空格后退一步,回车重来, Pu上一关,Pd下一关,Esc退出,Del删除记录。玩法:用“大”把“▓”全部推到“☆”内为过关
set/p=!ebuf!<nul
set ebuf=
debug <%~nx0 >nul
set err=%errorlevel%
set in=!i%err%!
if !in! equ 0 goto :loop
if !in! gtr 4 goto :me%in%
set/a sm=m,sn=n,!c%in%!=1,bm=m,bn=n,!c%in%!=1
for /f "tokens=1,2" %%a in ("!r%bn%.%bm%! !r%bn%.%bm%!!r%n%.%m%!") do (
    for %%c in ("!%%a!!%%b!") do (
        for /f "tokens=1,2 delims=-" %%1 in (%%c) do (
            if "!%%b!" neq "" set save=r%sn%.%sm%=!r%sn%.%sm%!^&set r%bn%.%bm%=!r%bn%.%bm%!^&set r%n%.%m%=!r%n%.%m%!^&set 原=%原%^&set/a m=%sm%,n=%sn%
            set r%sn%.%sm%=!原!&set r%bn%.%bm%=大&set r%n%.%m%=%%1&set/a m=bm,n=bn&set 原=%%2
            goto :loop
        )
    set/a m=sm,n=sn
    )
)
goto :loop
:me5
if defined save (
    set r%n%.%m%=%原%
    set %save%
    set save=
)
goto :loop
:me6
endlocal&goto :restart
:me7
if "!yg:~50!" neq "" set yg=!yg:* =!&goto :me7
set a=a 10d`db "!lev!@!yg! "``w`q
(echo %a:`=&echo;%) |debug %~nx0 >nul
exit /b
:me8
set/a lev-=2
:me9
set/a lev+=1
if !lev! equ !end! set lev=1
if !lev! equ 0 set/a lev=end-1
endlocal&(if %in% leq 4 set yg=!yg!!lev! )&set lev=%lev%&goto :restart
:me10
endlocal&set yg=&set lev=1
for /l %%a in (1,1,52) do set yg=!yg!
goto :restart
:囧a9a ab8a ab4d2fba ab2a2b4a ab2a4b2a aba2b5a ab4c2b2a ab8a ab8a a9a
:囧a8g ab3ab2a abdbcdba a2ca2b2a ab2a2ca2 abdfb3a ab2ab3a a8
:囧a9a4 abdb2db2dbdba5 ab9b6a5 abdabda2badb9a aba2b2a9a2b3a abcbcb9b6a abcb3cbcba7b3a ab3cb2a4g5a5 a4bcba g3abfba g3a5
:囧ga4g5 gab2a a2dfa abdca6 abc2bcb2a2 abd2b4a2 a4b2a4 g3a4
:囧g5a4g a6b2a abcb2cb2a abab2daba2 ab2dbadfba a2cabdcb2a gab3a5 ga5
:囧g5a6g g5ab4a ga5ba2ba2 gabcb2cb2cba a2badada2dba abcb2cda2dba ab2d2bcfbca2 a8b2a g7a4
:囧a9g2 ab7a ab2cbcbca a2baca2ba gabd2bd2a2 ga2d2bd2ba g2aba2caba2 g2acbcbcb2a g2ab6fa g2a9
:囧a5g7 ab3a8 abfdbdbdbdba a2bababababa gabcbcbcbcba ga6b2a3 g6a4
:囧g4a4g a5b2a abcb3ca ab2dadba a2ba3ba2 gabdadb2a gacbfbcba gab2a5 ga4
:囧g2a8g a3b2fb3a ab3cbcb2a ab2cbcbcba a5ca5 g3a2bdbd2a g3ab2dab2a g3abdb3da g3a4b2a2 g6a4
:囧a9g ab2fb4a ac7a ad3ad3a ad7a ac3bc3a ab7a a9
:囧a9ag ab8a2 abcacacacfa adbdcd3cda adbdcd3cda abcacacaca2 ab8a a9a
:囧a2 a9a ab2ab2ad2a afbcbcbdba ab3cb2cba abababadba a9a
:囧g9g7a4g9g2 g5a5g3a4b2a a4gab3a6b4a9a ab2a3bab8ab9b2a abcd5ababcbabad2ab4c2aba ab2a2d3cb2abcabad2b2a2b3cba3 ab4ca2cabacbcbad2ab2a2cabcb2a abcacb3cb2abcb2ad2b3ab2cbcb2a a2b3a3cabad3a2d2ab2abcacb3a ga2ba2bab3ad2a3bdb3abcbcba3 a3bab2a9ab2ab2ab3a4 ab7a2b6ab2ab4a6 abcacacbab3cbcb2a9ab2a adcdb2cbab2cbcbcb8cb3ca ad3a2b2a5ca9b2dadba a4b3a6bdbd2ab3a2ba3ba2 g3ab2db2cbab2dab2adaca2bdadb2a g3a3d2bcbabdb3dab4acb3cba g3a3c2bcbaba2b2a2dacbab2a5 ga3bdcdbab3a6b3a2ba2 gab2cd3ca5g4adacab2a gab3a2dcbag6a2b5a2 ga6b3a囧@
:囧g6abdaca3 g6a5g6ab4a g9g8afba3 g9g8a4
:囧g9g7a4 g5a5g3a4b2a a4gab3a6b4a9a ab2a3bab8ab9b2a abcd5ababcbabad2ab4c2aba ab2a2d3cb2abcabad2b2a2b3cba3 ab4ca2cabacbcbad2ab2a2cabcb2a abcacb3cb2abcb2ad2b3ab2cbcb2a a2b3a3cabad3a2d2ab2abcacb3a ga2ba2bab3ad2a3bdb3abcbcba3 a3bab2a9ab2ab2ab3a4 ab7a2b6ab2ab4a6 abcacacbab3cbcb2a9ab2a adcdb2cbab2cbcbcb8cb3ca ad3a2b2a5ca9b2dadba a4b3a6bdbd2ab3a2ba3ba2 g3ab2db2cbab2dab2adaca2bdadb2a g3a3d2bcbabdb3dab4acb3cba g3a3c2bcbaba2b2a2dacbab2a5 ga3bdcdbab3a6b3a2ba2 gab2cd3ca5g4adacab2a gab3a2dcbag6a2b5a2 ga6b3ag6ab囧@
:囧daca3 g6a5g6ab4a g9g8afba3 g9g8aba2g9g9g9g9g3a7 g9g8ab2ag9g9g9g9g3adbdbda g9g8ab2ag9g9g9g9g3ab5a g9g8ab2ag9g9g9g9g3adbdbda g9g8ab2ag9g9g9g9g3ab5a g9g8ab2ag9g9g9g9g3adb4a g9g8ab2ag9g9g9g9g3a4ba2 g9g8ab2ag9g9g9g9g6aba g9g8ab2ag9g9g9g9g6aba g9g8ab2ag9g9g9g9g6aba g9g8ab2ag9g9g9g9g6aba g9g8ab2ag9g9g9g9g6aba g9g8ab2ag9g9g9g9g6aba g9g8ab2ag9g9g9g9g6aba g9g8ab2ag9g9g9g9g6aba g9g8ab2ag9g9g9g9g6aba g9g8ab2ag9g9g9g9g6aba g9g8ab2ag9g9g9g9g6aba g9g8ab2ag9g9g2a7g9g6aba g9g8ab2ag9g9g2ab5ag9g6aba g9g8ab2ag9g9g2囧@
:囧ab5ag9g6aba g9g8ab2ag9g9g2acbcbcag9g6aba g9g8ab2ag9g9g2ab5ag9g6aba g9g8ab2ag9g9g2acbcbcag9g6aba g9g8ab2a9a9a4b5a9a8ba g9g8ab4cb9b9b9b9b6a g9g8ab9b9b9b9b9b2a g9g8a9a9a9a9a9a4
[ Last edited by netbenton on 2010-3-22 at 00:19 ]
附件 1: txz.rar (2009-9-6 03:20, 3.67 K,下载次数: 147)
附件 2: txz增强版.rar (2010-3-22 20:19, 9.05 K,下载次数: 107)

作者: yishanju     时间: 2009-8-26 16:48
真高产
作者: netbenton     时间: 2009-8-27 08:21
进一步精简代码,主程序只有2K!!

下一步将把地图数据压缩,并放进主程序内。。。
@echo off
set c1=n-
set c2=m-
set c3=n+
set c4=m+
set lev=0
set r=0
set end=11
set ·=^^!r!n!.!m!^^!-·
set ☆=^^!r!n!.!m!^^!-☆
set ▓·=▓-·
set ▓☆=★-·
set ★·=▓-☆
set ★☆=★-☆

:restart
setlocal enabledelayedexpansion
if not exist level!lev!.txt echo 第%lev%关 不存在。。。&pause&goto :me9
for /f "delims=" %%a in (level!lev!.txt) do (set str=%%a
    if not defined a (set/a a=8180,c=0
         for /l %%a in (1,1,14) do ( set/a "b=(a-c)/2+c"
             for %%b in (!b!) do if "!str:~%%b,1!" equ "" (set/a a=b) else (set/a c=b)
    ))
    for /l %%b in (0,1,!a!) do (set r!r!.%%b=!str:~%%b,1!&set "ab!str:~%%b,1!=!r!.%%b"
        if "!str:~%%b,1!" equ "☆" set "ke=!ke!^!r!r!.%%b^!"
    )
    set /a r+=1
)
for /l %%a in (0,1,!a!) do (set "ech=!ech!^!rm.%%a^!")
set /a n=!ab大:.=,m=!
set 原=·
mode con: cols=40 lines=20
set ji=%ke%&set ji=!ji:☆=★!
:loop
cls&echo;&echo;&echo    批处理推箱子 第%lev%关
for /l %%a in (0,1,!r!) do for /f "delims=" %%b in ("!ech:m=%%a!") do echo;   %%~b
if "%ke%" equ "!ji!" echo 过关。。。&pause&goto me9
echo;
echo  wasd移动,b后退一步,r重新开始,
echo  f上一关,g下一关,q退出。
Choice /c:wasdbrqfg>nul
set/a in=!errorlevel!
if !in! gtr 4 goto :me%in%
set/a sm=m,sn=n,!c%in%!=1,bm=m,bn=n,!c%in%!=1
for /f "tokens=1,2" %%a in ("!r%bn%.%bm%! !r%bn%.%bm%!!r%n%.%m%!") do (
    for %%c in ("!%%a!!%%b!") do (
        for /f "tokens=1,2 delims=-" %%1 in (%%c) do (
            if "!%%b!" neq "" set save=r%sn%.%sm%=!r%sn%.%sm%!^&set r%bn%.%bm%=!r%bn%.%bm%!^&set r%n%.%m%=!r%n%.%m%!^&set 原=%原%^&set/a m=%sm%,n=%sn%
            set r%sn%.%sm%=!原!&set r%bn%.%bm%=大&set r%n%.%m%=%%1&set/a m=bm,n=bn&set 原=%%2
            goto :loop
        )
    set/a m=sm,n=sn
    )
)
goto :loop

:me5
if defined save (
    set r%n%.%m%=%原%
    set %save%
    set save=
)
goto :loop

:me6
endlocal&goto :restart

:me7
exit /b

:me8
set/a lev-=2
:me9
set/a lev+=1
if !lev! equ !end! set lev=1
endlocal&set lev=%lev%&goto :restart

作者: yishanju     时间: 2009-8-27 10:04
这水平高得只能让我拜服,呵呵
作者: netbenton     时间: 2009-8-28 15:39
好了,地图压缩并放入主程序中了,只有3.07K,包含了10关的地图
为了尽量缩小代码,变得没那么易读了
@echo off
set "a=c1=n-;c2=m-;c3=n+;c4=m+;·=^^!r!n!.!m!^^!-·;☆=^^!r!n!.!m!^^!-☆;▓·=▓-·;▓☆=★-·;★·=▓-☆;★☆=★-☆;原=·
set %a:;=&set %
pushd %~dp0
setlocal enabledelayedexpansion
for /f "tokens=2* delims=囧" %%a in (%~nx0) do (set lev!n!=%%a&set/a n+=1)
set a=lev=1;a=■;b=·;c=▓;d=☆;e=★;f=大;tc=abcdefg;tn=1234567890;g= ;/a end=n,z=8180,x=0,n=1,m=1
set %a:;=&set %
mode con: cols=40 lines=20

:restart
setlocal enabledelayedexpansion
set str=!lev%lev%!
for /l %%a in (1,1,14) do (set/a "y=(z-x)/2+x"
    for %%b in (!y!) do if "!str:~%%b,1!" equ "" (set/a z=y) else (set/a x=y)
)

for /l %%a in (0,1,!x!) do (set/a t=%%a+1
for %%b in (!t!) do (
    for /f "tokens=1-3 delims=-" %%1 in ("!str:~%%a,1!-!str:~%%b,1!-!n!") do (
        if "!tc:%%1=!" neq "!tc!" (
            if "!tn:%%2=!" neq "!tn!" (set k=%%2) else (set k=1)
            for /l %%k in (1,1,!k!) do (set r!n!.!m!=!%%1!&set rr!%%1!=!n!.!m!
             if "!%%1!" equ "☆" set "ke=!ke!^!r!n!.!m!^!"
             set "r%%3=!r%%3!^!r!n!.!m!^!"&set/a m+=1)
        ) else (if "%%1" equ " " set /a n+=1,m=1)
    )
))
set /a r=n,n=!rr大:.=,m=!
set ji=%ke%&set ji=!ji:☆=★!

:loop
cls&echo;&echo;&echo    批处理推箱子 第%lev%关

for /l %%a in (1,1,!r!) do for %%b in ("!r%%a!") do echo; %%~b

if "%ke%" equ "!ji!" echo 恭喜你过关了!&pause&goto me9
echo;&echo  wasd移动,b后退一步,r重新开始&echo  f上一关,g下一关,q退出。
Choice /c:wasdbrqfg>nul
set/a in=!errorlevel!
if !in! gtr 4 goto :me%in%
set/a sm=m,sn=n,!c%in%!=1,bm=m,bn=n,!c%in%!=1
for /f "tokens=1,2" %%a in ("!r%bn%.%bm%! !r%bn%.%bm%!!r%n%.%m%!") do (
    for %%c in ("!%%a!!%%b!") do (
        for /f "tokens=1,2 delims=-" %%1 in (%%c) do (
            if "!%%b!" neq "" set save=r%sn%.%sm%=!r%sn%.%sm%!^&set r%bn%.%bm%=!r%bn%.%bm%!^&set r%n%.%m%=!r%n%.%m%!^&set 原=%原%^&set/a m=%sm%,n=%sn%
            set r%sn%.%sm%=!原!&set r%bn%.%bm%=大&set r%n%.%m%=%%1&set/a m=bm,n=bn&set 原=%%2
            goto :loop
        )
    set/a m=sm,n=sn
    )
)
goto :loop

:me5
if defined save (
    set r%n%.%m%=%原%
    set %save%
    set save=
)
goto :loop

:me6
endlocal&goto :restart

:me7
exit /b

:me8
set/a lev-=2
:me9
set/a lev+=1
if !lev! equ !end! set lev=1
if !lev! equ 0 set/a lev=end-1
endlocal&set lev=%lev%&goto :restart

:囧a9a ab8a ab4d2fba ab2a2b4a ab2a4b2a aba2b5a ab4c2b2a ab8a ab8a a9a
:囧a8g ab3ab2a abdbcdba a2ca2b2a ab2a2ca2 abdfb3a ab2ab3a a8
:囧g5a4g a6b2a abcb2cb2a abab2daba2 ab2dbadfba a2cabdcb2a gab3a5 ga5
:囧ga4g5 gab2a a2dfa abdca6 abc2bcb2a2 abd2b4a2 a4b2a4 g3a4
:囧g5a6g g5ab4a ga5ba2ba2 gabcb2cb2cba a2badada2dba abcb2cda2dba ab2d2bcfbca2 a8b2a g7a4
:囧a9g2 ab7a ab2cbcbca a2baca2ba gabd2bd2a2 ga2d2bd2ba g2aba2caba2 g2acbcbcb2a g2ab6fa g2a9
:囧a5g7 ab3a8 abfdbdbdbdba a2bababababa gabcbcbcbcba ga6b2a3 g6a4
:囧g4a4g a5b2a abcb3ca ab2dadba a2ba3ba2 gabdadb2a gacbfbcba gab2a5 ga4
:囧g2a8g a3b2fb3a ab3cbcb2a ab2cbcbcba a5ca5 g3a2bdbd2a g3ab2dab2a g3abdb3da g3a4b2a2 g6a4
:囧a9g ab2fb4a ac7a ad3ad3a ad7a ac3bc3a ab7a a9
:囧a9ag ab8a2 abcacacacfa adbdcd3cda adbdcd3cda abcacacaca2 ab8a a9a
如果您想增加关级,用下面的代码压缩后,贴到主程序的最后就可以了。
地图源数据格式,可在一楼下载
@echo off&setlocal enabledelayedexpansion
set a=lev=;a=■;b=·;c=▓;d=☆;e=★;f=大;tc=abcdefg;tn=1234567890;g= 
set %a:;=&set %

(for /l %%a in (0,1,10) do (if exist level%%a.txt (
set de=
for /f "delims=" %%b in (level%%a.txt) do set str=%%b&call :sub
for %%b in (a-■;b-·;c-▓;d-☆;e-★;f-大;"g- ") do (for /f "tokens=1,2 delims=-" %%1 in ("%%~b") do (
set de=!de:%%2=%%1!
))
echo :囧!de:1=!
)))>ys.txt
goto :eof

:sub
if defined str (
if "!o!" equ "!str:~,1!" (set/a n+=1) else (set de=!de!!o!!n!&set o=!str:~,1!&set n=1)
if !n! gtr 9 set de=!de!!o!9&set/a n-=9
set str=!str:~1!
goto :sub
)
set de=!de!!o!!n! &set o=&set n=
经过这个批处理游戏的编写,我又学到了一个巧,
变量定义的紧凑格式:
set "a=c1=n-;c2=m-;c3=n+;c4=m+;·=^^!r!n!.!m!^^!-·;☆=^^!r!n!.!m!^^!-☆;▓·=▓-·;▓☆=★-·;★·=▓-☆;★☆=★-☆;原=·
set %a:;=&set %

作者: netbenton     时间: 2009-8-29 03:49
再次改进,摆脱了choice.exe的依赖,
一楼已更新
作者: starjaymy     时间: 2009-8-29 05:36
好难
作者: 523066680     时间: 2009-8-29 05:53
先看到凑合式那段, 加分。

主代码还没看

08-29,挺你啦  我很喜欢。

[ Last edited by 523066680 on 2009-8-29 at 06:13 ]
作者: 523066680     时间: 2009-8-29 06:27
有个优化选项:  记住玩过的关卡,这样的话下次可以接着玩。
作者: netbenton     时间: 2009-8-29 08:35
re 523066680
谢谢支持和提出意见,

已经在一楼更新:可以保存当前状态,记录已经通过的关,并且增加了一键清除记录
作者: netbenton     时间: 2009-8-30 10:21
2009-08-30 更新
连玩家记录也不用临时文件了。

已经在顶楼更新
作者: netbenton     时间: 2009-9-4 11:28
怎么那么少人喜欢玩“推箱子”。
本想有时间做它几十关的,
唉,看来算了。

[ Last edited by netbenton on 2009-9-4 at 09:30 ]
作者: 523066680     时间: 2009-9-4 21:34
别提了 我就到了第三关~
作者: ldr2zjj     时间: 2009-9-5 16:03
怎么个玩的呢~~
作者: 523066680     时间: 2009-9-5 22:05
楼主,我很喜欢你写的这套游戏,我玩到这三关就觉得好难的了
我觉得对待游戏不能太急,就没一直闯关了。

玩家的回复是游戏制作者最大的鼓励。
各位觉得好的话 要懂得回帖,懂得提出建议。
就算是来回帖灌水,也要有心意。

[ Last edited by 523066680 on 2009-9-5 at 22:06 ]
作者: netbenton     时间: 2009-9-5 23:51
回 exist:
你是说要从易到难,让玩家在不知不觉中就成了推箱子高手是吗?
做完善这些并不难,只不过是不知大家是否会认可这个游戏,完善后没有意义的话,就不会再做了。

其实做起来简单,完全都是体力活了:
1,难易先后顺序,只要把关级数据换个顺序就可以了;
2,增加关级,只要把地图做好,经附加的那个程序转换后,把关级数贴进去就可以了。
作者: 523066680     时间: 2009-9-6 01:24
哈哈 没想到这个建议的。
本来的难度跳跃很不错的。我是说玩智力休闲游戏,不能心急,
游戏是放松的,如果玩到某关卡住了,可以先休息一下,有空再来。

反正也是记录了关卡的嘛.


其他的话就没什么了,唯一的是很难改的刷屏闪。
我觉得批处理能够写出适合批处理的游戏是很好的。

应该是有一部分人挺喜欢这个。
更新的事情,空闲的时候弄也行的啊,灵感不能用硬抽的吧?
不过玩家的回馈仍然是编写者最大的动力……
作者: slore     时间: 2009-9-6 02:08
刚玩了下,很不错呵呵。

就是P处理的闪烁...不完美。。。
作者: netbenton     时间: 2009-9-6 03:24
谢谢楼上slore意见,已经消除了屏幕闪烁的问题。

欢迎大家的使用,和提出宝贵意见。
作者: 523066680     时间: 2009-9-6 03:50
我在cn-dos群里说回了你的帖子,他们说不知道,要我发链接。。。
看来是“推销”策略没做好……
谦虚的帅哥如果不推销的话,很多人就看不到了。
作者: wangfangjian     时间: 2009-9-6 09:12
你太厉害  佩服
作者: lotus516     时间: 2009-9-6 10:56
不兼容windows7 x64位,还有请吧第一次的代码放出,现在精简的实在难读!!
作者: 523066680     时间: 2009-9-6 10:57
楼上的前辈 我刚在精华帖看到你…… 你就出现了
http://www.cn-dos.net/forum/viewthread.php?tid=25517


netbenton如果不介意的话 整理个个模块化的上来咯,我等擦亮眼睛……
话说看官们如果真的想了解代码的话慢慢切也可以啊。

[ Last edited by 523066680 on 2009-9-6 at 11:00 ]
作者: lotus516     时间: 2009-9-6 12:02


  Quote:
Originally posted by 523066680 at 2009-9-6 10:57:
话说看官们如果真的想了解代码的话慢慢切也可以啊

现在是没有那个时间哪!
作者: 523066680     时间: 2009-9-6 12:07
这个代码估计让人感兴趣的地方很多吧
楼主要解释也不是一时半会儿可以的啊

告知下是哪个部分的,看楼主能不能讲一下。
(顺便广告。我有些作品有解释,在签名的索引里面。)
作者: 5566ljlj     时间: 2009-9-8 12:23
真厉害!
作者: ldr2zjj     时间: 2009-9-9 11:46
太强大了~~今天在后面加一张超强的图~~结果显示不了~~好郁闷~~哪个设置了显示的行数的~我想改一下~
作者: ldr2zjj     时间: 2009-9-9 12:53
谁帮我把这个图加进去~~~我改好了~但是加进去显示不了全部~~~~

:囧g9g7a4 g5a5g3a4b2a a4gab3a6b4a9a ab2a3bab8ab9b2a abcd5ababcbabad2ab4c2aba

ab2a2d3cb2abcabad2b2a2b3cba3 ab4ca2cabacbcbad2ab2a2cabcb2a abcacb3cb2abcb2ad2b3ab2cbcb2a

a2b3a3cabad3a2d2ab2abcacb3a ga2ba2bab3ad2a3bdb3abcbcba3 a3bab2a9ab2ab2ab3a4

ab7a2b6ab2ab4a6 abcacacbab3cbcb2a9ab2a adcdb2cbab2cbcbcb7bcb3ca ad3a2b2a5ca9b2dadba

a4b3a6bdbd2ab3a2ba3ba2 g3ab2db2cbab2dab2adaca2bdadb2a g3a3d2bcbabdb3dab4acb3cba

g3a3c22bcbaba2b2a2dacbab2a4a ga3bdcdbab3a6b3a2ba2 gab2cd3ca5g4adacab2a
gab3a2dcbag6a2b5a2 ga6b3ag6abdaca3 g6a5g6ab4a g9g8afba3 g9g8a4
作者: netbenton     时间: 2009-9-9 12:57
批处理推箱子源码解释:

1、数据定义的紧凑格式的使用
先把变量定义集放到变量:(要注意分隔符是唯一的,这里用“;”号)
set a=a=i75;b=i79;str=abc
这样变量a的值为:a=i75;b=i79;str=abc
利用预处理时变量值替换:
set %a:;=&set %
相当于以下语句被执行:
set a=i75&set b=i79&set str=abc
或者:
set a=i75
set b=i79
set str=abc
如果要定义的变量很多,综合从占用空间和可读性上看,此法有明显的优势。


2、”推箱子“程序实现算法
1). 读取关级数据放到数组:lev(n)
   改变n的值,即为改变关级,这里 n=%lev%
2). 把当前关地图数据还原并存到二维数组:r(n).(m),
   (一) 把值为坑“☆”的变量名r(n).(m),集放到变量ke,并把“☆”的个数存到变量ji,同时转为“★”;
   %ke%扩展后就是源值为坑“☆”的所有二维变量的实时的值了;只要%ke% 等于 !ji! 表明过关了
   (二) 按行把二维变量名存为数组:r(n)
   %r(n)%扩展后即为第n行的所有二维数组的实时值
  
3). 变量ebuf作为显示缓存,所有要显示的内容全部存到ebuf,一次性用echo !ebuf!全部显示完成。
   
   因为for 变更 %%a 在扩展后,会再次扩展!号变量,所以:
   for /l %%a in (1,1,!r!) do for %%b in ("!r%%a!") do set ebuf=!ebuf!   %%~b!cr!
   上面依次把:1到!r!行的变量名数组r(n)扩展后的值,全部存到显示缓存ebuf内,并且加上了换行符!cr!
4).首先定义好按上下左右所进行的操作:
   "c1=n-;c2=m-;c3=n+;c4=m+"
   这样就可以通过下面代码:
   set/a sm=m,sn=n,!c%in%!=1,bm=m,bn=n,!c%in%!=1
   分别取得按了 上/下/左/右 后,源点:sm.sn,步进一:bm.bn,步进二:m.n,三个坐标的值
   
   for /f "tokens=1,2" %%a in ("!r%bn%.%bm%! !r%bn%.%bm%!!r%n%.%m%!") do (
   取出三个坐标的值并摆开为:(步进一 => %%a) (步进一+步进二 =>%%b)  例如:%%a=▓ %%b=▓∷
   
   for %%c in ("!%%a!!%%b!") do (
   %%a %%b 经再扩展后,组后到%%c, 接上例:!▓! =>空, !▓∷! =>▓-∷
   则: ▓-∷ => %%c
   
   for /f "tokens=1,2 delims=-" %%1 in (%%c) do (
   摆开为:%%1=▓,%%2=∷
   接下来就 if 判断了,根据各种情况把三个点和一个“大”站的!源!点的值重新调整
   
   注意:有一点,如果%%c的值为空,如 %%b=▓■ 为时,则这个for将是空转,即连里面的if语句也不会被执行,
   使得后面的    set/a m=sm,n=sn   被执行了


3、关级数据压缩与还原
   1).压缩,因全角为双字节,用单字转换后可以少一半,如果 ▓=a,zf=▓,则:set zf=!%af%! 就可转过来了
   如果不只一个连续的则在字母后跟个数字表示个数,超过9则另起一组,如:a11,则拆为a9a2
   
   2).还原,引用:囧开头的好处,
   
   for /f "tokens=2* delims=囧" %%a in (%~nx0) do (set lev!n!=%%a&set/a n+=1)
   这样在读取时可以减去了对其它非数据行的读取,加快了速度
      同样的方法把字符转换回来,再把搂字作为for /l 计数重复即可全部转换
   if "!tn:%%2=!" neq "!tn!" (set k=%%2) else (set k=1)
            for /l %%k in (1,1,!k!) do (
   上面的!k!即为字符个数
   
   
4、摆脱choice.exe 和 刷屏不闪

   就是用debug.exe 来替了,但是这个是通常所有dos系统都会自带的,所以。。三方。。。
   debug <%~nx0>nul
   调用自身作为管道输入,第一行是出错的,真正有用的只有两行
   e 100 cd 16 86 c4 b4 02 cd 10 b4 4C CD 21   写入代码
   g                                           执行
   这里面进行了键读取,把当前光标位置设为第一行,第一列,并把按键数据作为返回码到:%errorlevel%
   定义:"a=i83=10;i1=7;i72=1;i80=3;i75=2;i77=4;i73=8;i81=9;i57=5;i79=6"
   执行:set in=!i%errorlevel%!
   就根据定义得到按键情况,如果示定义的则为空
   
   平时写批处理要回到第一行显示时,只有用cls,然后再显示,显然速度也很快,还是觉得有点闪。
   直接把光标重置到第一行,第一列,并没有清屏,再次显示时是在原来的基础上的,所以少了闪的感觉
   如果看汇编源码,很简单,把debug <%~nx0>nul后面的>nul去掉,再在e 行和g 行间加入一行u 就可以了
   

5、玩家记录保存,与读取
  这里是把记录存在批处理的第一行,
  
  1).读取
  set/p yg=< %~nx0 >nul
  取第一行到变量 yg
  set yg=!yg:~13,52!
  set lev=%yg:@=&rem %
  因为当前关记录和已过关的记录是以@为分隔的,这样可以只所@前面的给lev,@后面的被rem 掉了
  set yg= !yg:* =!
  只取已过关的数据,并且保持前后必须有空格
  这样已经所当前关,及已过经过了的关的数据全部读取到变量了
  2).保存
  
  set a=a 10d`db "!lev!@!yg! "``w`q
  (echo %a:`=&echo;%)|debug %~nx0 >nul
  经扩展为:
  (echo a 10d&echo;db "!lev!@!yg! "&echo;&echo;w&echo;q)|debug %~nx0 >nul
  实际上是把以下命令行递给debug 去执行:
  
  a 10d
  db "!lev!@!yg! "
  
  w
  q
  
  利用了debug 的a命令输入汇编指令时,可以用db 定义字符串,然后直接用W命令可以写打开的文件
  并且批处理程序在执行过程中,是可以修改自身的

[ Last edited by netbenton on 2009-9-9 at 10:58 ]
作者: netbenton     时间: 2009-9-9 13:08    标题: 回28楼

地图的第一行必须是最多字符的

我又调试了一下,确实是支持不起这个超大地图,还有是显示不了那么宽,
是程序的一个Bug,有空再改进了。

谢谢你的测试

[ Last edited by netbenton on 2009-9-9 at 11:49 ]
作者: netbenton     时间: 2009-9-10 12:37    标题: 2009-09-10 更新

1、增加到支持使用超大地图,指一屏以上的

2、增加压缩转换程序对地图的较验功能,出现地图以外的字符时提示

3、开发出地图编辑程序hdt.bat,    用这个程序可以快速的编辑出全角字符地图,用于走迷宫,推箱子等

**请看一楼附件增强版**

[ Last edited by netbenton on 2009-9-16 at 09:47 ]
作者: netbenton     时间: 2009-9-16 11:51
推箱子游戏增加12关(较容易的)
把下面代码增加到批处理推箱子程序后面的关级数据里面即可,
建议插入到关级数据的第三行中
:囧g4a7 g3a2b2abfa g3ab3ab2a g3acbcbcba g3abca2b2a ga3bcbaba2 gad5b2a ga9
:囧g3a6 ga3b4a a2dbca2ba2 ad2cbcb2fa ad2bcbcba2 a5b3a g4a5
:囧a6 abfb2a abcaba abcb2a abcba2 a3ba4 gab2ab2a gad3b2a gab5a ga7
:囧a9a3 ab9ba aba7bfa2 abab9a abab2cb3ab2a abc2ba5b2a a3b2agabd3a g2a4gab4a g7a6
:囧ga9 gab2a2b3a gab3cb3a gacba3bca gabad3aba a2bad3aba2 abcb2cb2cba ab5ab2fa a9a2
:囧g2a5 g2ab3a a3cdca5 ab3dbcb3a aba2ca2bfba ab3dba5 a3bdba g2ab3a g2a5
:囧ga4g2a5 a2b2ag2ab3a abcba4cb2a ab2cd4bcba a2b4abfba2 ga9a
:囧a9a ad2b6a ad2cb2ab2a ab2aca2ba2 abcb5a a5baba g2abcbfba g2ab5a g2a7
:囧a6ga5 ab4a3b3a abc2b5afa abcbad3b3a ab3a8 a5
:囧ga5 gab3a a2bcbag2a4 ab4a4b2a abcb6cda ab3a5cda a5g3abfa g8a4
:囧g7a5 g7adb2a g7adaba a8daba abfbcbcb2cba abababab2a3 ab8a a9a
:囧a5 ab3a4 abababda ab4cba3 a3bacdb2a ab3afb3a ababa6 ab3a a5

作者: zzybq     时间: 2009-9-17 00:13
好东西哦
作者: plp626     时间: 2009-9-19 12:40
很不错,对汇编很在行,学习了。。。
作者: netbenton     时间: 2009-9-30 00:24
原来已经发重了,算了,把一些错别字改改。。。

批处理推箱子源码解释:

1、数据定义的紧凑格式的使用
先把变量定义集放到变量:(要注意分隔符是唯一的,这里用“;”号)
set a=a=i75;b=i79;str=abc
这样变量a的值为:a=i75;b=i79;str=abc
利用预处理时变量值替换:
set %a:;=&set %
相当于以下语句被执行:
set a=i75&set b=i79&set str=abc
或者:
set a=i75
set b=i79
set str=abc
如果要定义的变量很多,综合从占用空间和可读性上看,此法有明显的优势。


2、推箱子程序实现算法
1). 读取关级数据放到数组:lev(n)
   改变n的值,即为改变关级,这里 n即%lev%
2). 把当前关地图数据还原并存到二维数组:r(n).(m),
   (一) 把值为坑“☆”的变量名r(n).(m),集放到变量ke,并把“☆”的个数存到变量ji,同时转为“★”;注意:ke保存的是变量名,不是变量值。
   %ke%扩展后就是源值为坑“☆”的所有二维变量的实时的值了;只要%ke% 等于 !ji! 表明过关了
   (二) 按行把二维变量名存为数组:r(n),注意:是变量名
   %r(n)%扩展后即为第n行的所有二维数组的实时值
  
3). 变量ebuf作为显示缓存,所有要显示的内容全部存到ebuf,一次性用echo !ebuf!全部显示完成。实现快速刷屏。
   
   因为for 变量 %%a 在扩展后,会再次扩展值中的!号变量,所以:
   for /l %%a in (1,1,!r!) do for %%b in ("!r%%a!") do set ebuf=!ebuf!   %%~b!cr!
   上面依次把:1到!r!行的变量名数组r(n)扩展后的值,全部存到显示缓存ebuf内,并且加上了换行符!cr!

4).首先定义好按上下左右所进行的操作:
   "c1=n-;c2=m-;c3=n+;c4=m+"
   这样就可以通过下面代码:
   set/a sm=m,sn=n,!c%in%!=1,bm=m,bn=n,!c%in%!=1
   分别取得按了 上/下/左/右 后,源点:sm.sn,步进一:bm.bn,步进二:m.n,三个坐标的值
   
   for /f "tokens=1,2" %%a in ("!r%bn%.%bm%! !r%bn%.%bm%!!r%n%.%m%!") do (
   取出三个坐标的值并摆开为:(步进一 => %%a) (步进一+步进二 =>%%b)  例如:%%a=▓ %%b=▓∷
   
   ***各种可移动的组合类型在前面已经为变量***
   ***未定义的测视为不能移动的组合***

   for %%c in ("!%%a!!%%b!") do (
   %%a %%b 经再扩展后,组后到%%c, 接上例:!▓! =>空, !▓∷! =>▓-∷
   则: ▓-∷ => %%c
   
   for /f "tokens=1,2 delims=-" %%1 in (%%c) do (
   摆开为:%%1=▓,%%2=∷
   接下来就 if 判断了,根据各种情况把三个点和一个“大”站的!源!点的值重新调整
   
   注意:有一点,如果%%c的值为空,如 %%b=▓■ 为时,则这个for将是空转,即连里面的if语句也不会被执行,
   使得后面的    set/a m=sm,n=sn   被执行了,还原了m,n,即不能动


3、关级数据压缩与还原
   1).压缩,因全角为双字节,用单字转换后可以少一半,如果 ▓=a,zf=▓,则:set zf=!%af%! 就可转过来了
   如果不只一个,有连续的则在字母后跟个数字表示个数,如:a4,超过9个则另起一组,如:a11,则拆为a9a2
   
   2).还原,引用:囧开头的好处,
   
   for /f "tokens=2* delims=囧" %%a in (%~nx0) do (set lev!n!=%%a&set/a n+=1)
   这样在读取时可以减去了对其它非数据行的读取,加快了速度
      同样的方法把字符转换回来,再把数字作为for /l 计数重复即可全部转换
   if "!tn:%%2=!" neq "!tn!" (set k=%%2) else (set k=1)
            for /l %%k in (1,1,!k!) do (
   上面的!k!即为连续字符的个数
   
   
4、摆脱choice.exe 和 刷屏不闪

   就是用debug.exe 来替了,但这个是通常系统都会自带的,所以。。三方。。。
   debug <%~nx0>nul
   调用自身作为管道输入,第一行是出错的,真正有用的只有两行
   e 100 cd 16 86 c4 b4 02 cd 10 b4 4C CD 21   写入代码
   g                                           执行
   这里面进行了键读取,把当前光标位置设为第一行,第一列,并把按键数据作为返回码到:%errorlevel%
   定义:"a=i83=10;i1=7;i72=1;i80=3;i75=2;i77=4;i73=8;i81=9;i57=5;i79=6"
   执行:set in=!i%errorlevel%!
   就可以根据定义得到相应按键,如果未定义的则为空
   
   平时写批处理要回到第一行显示时,只有用cls,然后再显示,显然速度也很快,还是觉得有点闪。
   直接把光标重置到第一行,第一列,并没有清屏,再次显示时是在原来的基础上的,所以少了闪的感觉
   如果要看汇编源码,很简单,把debug <%~nx0>nul后面的>nul去掉,再在e 行和g 行间加入一行u 就可以了
   

5、玩家记录保存,与读取
  这里是把记录存在批处理的第一行,
  
  1).读取
  set/p yg=< %~nx0 >nul
  取第一行到变量 yg
  set yg=!yg:~13,52!
  set lev=%yg:@=&rem %
  因为当前关记录和已过关的记录是以@为分隔的,这样可以只把@前面部分给lev,@后面的被rem 注释掉了
  set yg= !yg:* =!
  取已过关的数据,并且保持前后必须有空格
  这样就已经把当前关,及已经过了的关的数据全部读取到变量了

  2).保存
  set a=a 10d`db "!lev!@!yg! "``w`q
  (echo %a:`=&echo;%)|debug %~nx0 >nul
  经扩展为:
  (echo a 10d&echo;db "!lev!@!yg! "&echo;&echo;w&echo;q)|debug %~nx0 >nul
  实际上是把以下命令行递给debug 去执行:
  
  a 10d
  db "!lev!@!yg! "
  
  w
  q
  
  利用了debug 的a命令输入汇编指令时,可以用db 定义字符串,然后直接用W命令可以写打开的文件
  并且批处理程序在执行过程中,是可以修改自身的

[ Last edited by netbenton on 2009-10-5 at 15:46 ]
作者: sl543001     时间: 2009-10-1 17:17
强人强帖,小弟受教了!
脚本中有好多好东东可以学习,
例如choice一直是个大麻烦,居然被楼主搞定了!
谁把这些好东东来个总结,俺还在开楼主的代码,研究中!
作者: nerfg002     时间: 2009-10-1 20:59
牛牛的 没办法形容
作者: xdjxondaojune     时间: 2009-10-2 22:07
第二关是死关,过不了,第三关就是多,容易过。总的写的不错,佩服
作者: shenlong     时间: 2009-10-3 20:29
我靠,这水平也太高了...................
作者: livesweet     时间: 2009-10-5 12:27
我的天,批处理也能编出这么复杂的游戏!楼主厉害,我支持你!
作者: voiL     时间: 2009-10-10 07:27


  Quote:
Originally posted by xdjxondaojune at 2009-10-2 22:07:
第二关是死关,过不了,第三关就是多,容易过。总的写的不错,佩服

第二关不可能是死关,兄弟多考虑一下吧,我1分钟不到就到第三关了。
作者: 523066680     时间: 2009-10-10 08:29
41楼说的对。

话说那位同学怎么能轻易说那是死关……
作者: herohdl     时间: 2009-10-12 18:38
有意思!!
作者: RuiIsRui     时间: 2009-10-23 22:22
厉害,牛,好玩
作者: zhxy9804     时间: 2009-10-28 20:31
那个俄罗斯方块就很拽,这个更拽了,是所谓大师的著作
作者: sl543001     时间: 2009-11-19 13:20
深入学习中。。。
强人强帖啊,咋沉了呢!
作者: ddd010     时间: 2009-11-19 18:48
好猛~~~..感谢楼主。。。。。。
作者: BeeButterflyDos     时间: 2009-11-19 20:21
天人天书!牛
作者: sl543001     时间: 2010-1-20 13:50
貌似大家对游戏帖不太热情,虽然加了很多分,但这好贴居然沉底了!
作者: yx6070     时间: 2010-3-21 22:01
楼主,你太强了。
我就是冲着你的这个批处理来到这个论坛的。
虽说也懂一点点,看你的这个游戏批处理就像看天书一样。
想来学习学习。也提高一下自己。
作者: yiqingnan     时间: 2010-3-22 09:47
好玩吗
作者: abbsc     时间: 2010-6-20 21:17
下来看看
作者: martin0330     时间: 2010-6-21 14:05
游戏好强大,可惜本人能力太低,只突破到第四关,后面的一直过不了。。。
作者: MYS     时间: 2010-12-27 21:13
游戏不会玩,但确实大开了眼界
作者: 523066680     时间: 2010-12-28 00:47
元老都回帖了,不容易啊。
作者: acaigg     时间: 2010-12-30 10:06
很强大,学习一下。
作者: acaigg     时间: 2010-12-30 16:56
强贴,学习。
作者: jerry1aa     时间: 2010-12-31 14:42
牛B的无以复加了。
作者: ajian     时间: 2011-1-1 20:38
太牛了。
作者: a130569     时间: 2011-1-2 15:08
有趣,收藏了
作者: gudou     时间: 2011-1-4 11:30
何止是“有趣”……简直是“神作”!!!!!

五体投地中……
作者: gudou     时间: 2011-1-4 11:44
小小建议下,有时某关走错一步,想重来,只能是page up&page down重来,能否合并成一个其他键?(其实也没必要,哈哈)
作者: netbenton     时间: 2011-1-4 21:31
谢谢关注,^_^

本来就可以:回车重来,空格后退一步的
作者: 19900313     时间: 2011-1-5 18:19