Board logo

标题: 批处理扫雷游戏 [打印本页]

作者: netbenton     时间: 2009-6-7 21:04    标题: 批处理扫雷游戏

纯批处理制作
在游戏过程中,输入benton可以看清所有地雷

玩法参照windows自带的扫雷游戏。

此批处理最先发在批处理之家。
最后修改 2009.6.11 00:26
改为润眼之色,加以注释,缩减代码
输入已经打开的点为数字时可以帮你智能分析,并把可以打开的自动打开,或自动插旗,也可以人工插旗取旗(在输入坐标后再跟任意字符即表示要进行插取旗操作),对已经插了旗的点是不能打开的,要先把旗取掉后才可以再次打开。
@echo off
title 批处理扫地雷 之 越战清道夫   Made by netbenton from http://bbs.bathome.cn
set `=!
::注意哦,这个变量很关键,

set #for1=for /f "tokens=1-6" %%c in ("!u! !m! !d! !l! !n! !r!") do (
set #for2=for %%k in (%%c.%%f %%c.%%g %%c.%%h %%d.%%f %%d.%%h %%e.%%f %%e.%%g %%e.%%h!) do (
::这个定义是为了缩减代码和提速

setlocal enabledelayedexpansion
set "ec-1= ABCDEFGHIJKLMNOP "
for /l %%a in (0,1,17) do (set M%%a=!ec-1:~%%a,1!)
set ec18= !ec-1! 后面还有其它字符表示[插旗]或[取旗]
set ec-1= !ec-1!
set ec0=┌────────────────┐  还有!`!dilei!`!个雷,!`!tudi!`!亩地
set ec17=└────────────────┘  !`!over!`!!`!say!`!
set str= abcdefghijklmnop
for /l %%a in (1,1,16) do set com!str:~%%a,1!=%%a
set ∷=今天运气不错哦。。。
set ①=生死由命,就放心踩吧
set ②=这里都不敢动,劝你回家种田吧!
set ③=团长,要看清想好呀。
set ④=这里要动的话,就只有半条命了!
set ⑤=探到不少雷呀,最好不要赌了
set ⑥=小心呀!团长,想好呀
set ⑦=危局险啊!最好别动了!
set ⑧=这里全是雷呀!别动!!!
set n=0
for %%a in (① ② ③ ④ ⑤ ⑥ ⑦ ⑧) do (set/a n+=1&set s#=!s#!★&set !s#!=%%a&set n%%a=!n!)
set over=
set bj=@
set bj1=-1
set bj@1=1

set say=一个艰巨的任务开始了。。。
for /l %%a in (0,1,17) do (set r0.%%a=#&set r17.%%a=#&set r%%a.0=#&set r%%a.17=#)

:begin 重新开始
color 2f
setlocal enabledelayedexpansion
for /l %%a in (1,1,40) do (
  set/a ran=!random!%%16+1
  set true=
for /l %%b in (1,1,16) do (
  set/a ram=!random!%%16+1
  if not defined true (
   if not defined L!ran!.!ram! set L!ran!.!ram!=★&set true=y&set/a dilei+=1
  )
)
)
set/a tudi=16*16-dilei
for /l %%a in (1,1,16) do (
set/a u=%%a-1,d=%%a+1
for /l %%b in (1,1,16) do (
  if not defined L%%a.%%b (
   set/a l=%%b-1,r=%%b+1
   for /f "tokens=1-6" %%c in ("!u! %%a !d! !l! %%b !r!") do (
for %%z in ("!L%%c.%%f!!L%%c.%%g!!L%%c.%%h!!L%%d.%%f!!L%%d.%%h!!L%%e.%%f!!L%%e.%%g!!L%%e.%%h!") do (set r%%a.%%b=!%%~z!)
   )
  )
)
)
for /l %%a in (1,1,16) do (
for /l %%b in (1,1,16) do (
  if not defined r%%a.%%b set "r%%a.%%b=∷"
  if not defined L%%a.%%b set L%%a.%%b=!r%%a.%%b!
  set r%%a.%%b=
)
)
set benton=set "str=!`!str!`!□"

:loop 主循环
for /l %%a in (1,1,16) do (
set str=
for /l %%b in (1,1,16) do (
  if defined r%%a.%%b (
     if !r%%a.%%b! equ @ (set "str=!str!▼") else (set "str=!str!!`!L%%a.%%b!`!")
  ) else (
     %benton%
  )
)
set ec%%a=│!str!│
)
set benton=set "str=!`!str!`!□"

:error 出错循环
cls
for /l %%a in (-2,1,18) do (for %%b in ("!ec%%a!") do echo;     !M%%a!%%~b!M%%a!)
if defined over echo 游戏结束&color 1d&pause&endlocal&goto :begin
if !tudi! leq 0 echo 恭喜你过关了&color 1e&pause&endlocal&goto :begin
set /p in=输入打开点[行前,列后]:
if "!in!" equ "benton" set benton=set "str=!`!str!`!!`!L%%a.%%b!`!"&goto :loop
set/a ver=0,m=com!in:~0,1!,n=com!in:~1,1!,ver=m*n
if !ver! equ 0 goto :error
set back=:loop

:zhilp 主动或自动打开地,均使用这个子过程, 与:zhisub子过程和:auto子过程有联合循环动作,即有重入。
if "!in:~2,1!" neq "" (
        if "!r%m%.%n%:@=!" neq "!r%m%.%n%!" (
                for %%a in (bj!r%m%.%n%!) do (
                        set r%m%.%n%=!%%a!
                        set/a dilei+=%%a1
                )
                goto %back%
        ) else (
                goto :error
        )
)
if defined r%m%.%n% if "!r%m%.%n%!" equ "#" (goto :zhisub) else (goto :error)
set r%m%.%n%=#
set/a tudi-=1
if "!L%m%.%n%!" equ "★" set over=  光荣牺牲了
if "!L%m%.%n%!" equ "∷" call :auto
set say=!L%m%.%n%!
set say=!%say%!
goto %back% 依靠变量来控制程序走向

:zhisub 选择点为已经打开的数字时,自动插旗或打开地 的 子过程
set back=:eof
set in=
set/a u=m-1,d=m+1,l=n-1,r=n+1,zh=n!l%m%.%n%!,zh@=0,zhi=0,zh#=0
%#for1%
%#for2%
                if defined r%%k (set/a zh!r%%k!+=1) else (set/a zhi+=1)
        )
)
set/a zh#=zh@+zhi
if !zh! equ !zh@! set in=12
if !zh! equ !zh#! set in=123
if not defined in goto :error
%#for1%
%#for2%
                for /f "tokens=1,2 delims=." %%1 in ("%%k") do (set/a m=%%1,n=%%2)
                if not defined r%%k call :zhilp 循环调用减少代码,增强自动化
        )
)
goto :loop

:auto  打开的为空地时自动打开地 的 子过程
set/a u=m-1,d=m+1,l=n-1,r=n+1
%#for1%
%#for2%
  if not defined r%%k (
   set r%%k=#
   set/a tudi-=1
   if "!L%%k!" equ "∷" (
    for /f "tokens=1,2 delims=." %%1 in ("%%k") do (set/a m=%%1,n=%%2)
    call :auto 循环调用减少代码,增强自动化
   )
  )
)
)
goto :eof
[ Last edited by netbenton on 2009-6-10 at 12:16 ]
作者: 523066680     时间: 2009-6-7 21:31
我顶
作者: qzwqzw     时间: 2009-6-7 23:39

:: qzwqzw hack - 20090608 - 加入插旗功能,更换几个显示符号
@echo off
title 批处理扫地雷 之 越战清道夫   Made by netbenton from http://bbs.bathome.cn
set `=!
::⊙¤☆12345678□
setlocal enabledelayedexpansion
set "ec-1= ABCDEFGHIJKLMNOP "
for /l %%a in (0,1,17) do (set M%%a=!ec-1:~%%a,1!)
set ec18= !ec-1!
set ec-1= !ec-1!
set ec0=┌────────────────┐还有!`!dilei!`!个雷,!`!tudi!`!亩地
set ec17=└────────────────┘!`!over!`!!`!say!`!
set str= abcdefghijklmnop
for /l %%a in (1,1,16) do set com!str:~%%a,1!=%%a
set  =今天运气不错哦。。。
set 1=生死由命,就放心踩吧
set 2=这里都不敢动,劝你回家种田吧!
set 3=团长,要看清想好呀。
set 4=这里要动的话,就只有半条命了!
set 5=探到不少雷呀,最好不要赌了
set 6=小心呀!团长,想好呀
set 7=危局险啊!最好别动了!
set 8=这里全是雷呀!别动!!!
for %%a in (1 2 3 4 5 6 7 8) do (set s#=!s#!¤&set !s#!=%%a)
set over=
set say=一个艰巨的任务开始了。。。
for /l %%a in (0,1,17) do (set r0.%%a=#&set r17.%%a=#&set r%%a.0=#&set r%%a.17=#)
:begin
setlocal enabledelayedexpansion
for /l %%a in (1,1,40) do (
    set/a ran=!random!%%16+1
    set true=
    for /l %%b in (1,1,16) do (
        set/a ram=!random!%%16+1
        if not defined true (
            if not defined L!ran!.!ram! set L!ran!.!ram!=¤&set true=y&set/a dilei+=1
        )
    )
)
set/a tudi=16*16-dilei
for /l %%a in (1,1,16) do (
    set/a u=%%a-1,d=%%a+1
    for /l %%b in (1,1,16) do (
        if not defined L%%a.%%b (
            set/a l=%%b-1,r=%%b+1
            for /f "tokens=1-6" %%c in ("!u! %%a !d! !l! %%b !r!") do (
                for %%z in ("!L%%c.%%f!!L%%c.%%g!!L%%c.%%h!!L%%d.%%f!!L%%d.%%h!!L%%e.%%f!!L%%e.%%g!!L%%e.%%h!") do (set r%%a.%%b=!%%~z!)
            )
        )
    )
)
for /l %%a in (1,1,16) do (
    for /l %%b in (1,1,16) do (
      if not defined r%%a.%%b set "r%%a.%%b= "
      if not defined L%%a.%%b set L%%a.%%b=!r%%a.%%b!
      set r%%a.%%b=
    )
)
set benton=set "str=!`!str!`!□"
:loop
for /l %%a in (1,1,16) do (
    set str=
    for /l %%b in (1,1,16) do (
        rem :: qzwqzw hack begin - 加入插旗功能
        if not defined r%%a.%%b (
            %benton%
        ) else if "!r%%a.%%b!"=="/" (
            set "str=!str!P"
        ) else (
            set "str=!str!!`!L%%a.%%b!`!"
        )
        rem :: qzwqzw hack end - 加入插旗功能
    )
    set ec%%a=│!str!│
)
set benton=set "str=!`!str!`!□"
:error
cls
for /l %%a in (-2,1,18) do (for %%b in ("!ec%%a!") do echo;     !M%%a!%%~b!M%%a!)
if defined over echo 游戏结束&pause&endlocal&goto :begin
if !tudi! lss 0 echo 恭喜你过关了&pause&endlocal&goto :begin
set /p in=输入打开点[行前,列后]:
if "!in!" equ "benton" set benton=set "str=!`!str!`!!`!L%%a.%%b!`!"&goto :loop
set/a ver=0,m=com!in:~0,1!,n=com!in:~1,1!,ver=m*n
if !ver! equ 0 goto :error
:: qzwqzw hack begin - 加入插旗功能
if "!in:~2,1!"=="/" (
    if not defined r%m%.%n% (
        set "r%m%.%n%=/"
        set /a dilei-=1
    )
) else (
    if not "!r%m%.%n%!"=="#" (
        if "!r%m%.%n%!"=="/" set /a dilei+=1
:: qzwqzw hack end - 加入插旗功能
        set r%m%.%n%=#
        set/a tudi-=1
        if "!L%m%.%n%!" equ "¤" set over=  光荣牺牲了
        if "!L%m%.%n%!" equ " " call :auto
        set say=!L%m%.%n%!
        set say=!%say%!
    )
)
goto :loop
pause
goto :eof
:auto
set/a u=m-1,d=m+1,l=n-1,r=n+1
for /f "tokens=1-6" %%c in ("!u! !m! !d! !l! !n! !r!") do (
    for %%k in (%%c.%%f %%c.%%g %%c.%%h %%d.%%f %%d.%%h %%e.%%f %%e.%%g %%e.%%h!) do (
        if not defined r%%k (
            set r%%k=#
            set/a tudi-=1
            if "!L%%k!" equ " " (
                for /f "tokens=1,2 delims=." %%1 in ("%%k") do (set/a m=%%1,n=%%2)
                call :auto
            )
        )
    )
)
[ Last edited by qzwqzw on 2009-6-8 at 00:05 ]
作者: 523066680     时间: 2009-6-7 23:49
只注意到这句话:这里都不敢动,劝你回家种田吧!
                        ……
作者: tireless     时间: 2009-6-8 02:14
怎么插旗?
作者: netbenton     时间: 2009-6-8 03:03
输入时在后面加#号,支持插旗、取旗了,
@echo off
title 批处理扫地雷 之 越战清道夫   Made by netbenton from http://bbs.bathome.cn
set `=!
::⊙★☆①②③④⑤⑥⑦⑧¤
setlocal enabledelayedexpansion
set "ec-1= ABCDEFGHIJKLMNOP "
for /l %%a in (0,1,17) do (set M%%a=!ec-1:~%%a,1!)
set ec18= !ec-1! 后面加#号表示[插旗]或[取旗]
set ec-1= !ec-1!
set ec0=┌────────────────┐  还有!`!dilei!`!个雷,!`!tudi!`!亩地
set ec17=└────────────────┘  !`!over!`!!`!say!`!
set str= abcdefghijklmnop
for /l %%a in (1,1,16) do set com!str:~%%a,1!=%%a
set ╳=今天运气不错哦。。。
set ①=生死由命,就放心踩吧
set ②=这里都不敢动,劝你回家种田吧!
set ③=团长,要看清想好呀。
set ④=这里要动的话,就只有半条命了!
set ⑤=探到不少雷呀,最好不要赌了
set ⑥=小心呀!团长,想好呀
set ⑦=危局险啊!最好别动了!
set ⑧=这里全是雷呀!别动!!!
for %%a in (① ② ③ ④ ⑤ ⑥ ⑦ ⑧) do (set s#=!s#!★&set !s#!=%%a)
set over=
set bj=@
set bj1=-1
set bj@1=1
set say=一个艰巨的任务开始了。。。
for /l %%a in (0,1,17) do (set r0.%%a=#&set r17.%%a=#&set r%%a.0=#&set r%%a.17=#)
:begin
setlocal enabledelayedexpansion
for /l %%a in (1,1,40) do (
  set/a ran=!random!%%16+1
  set true=
for /l %%b in (1,1,16) do (
  set/a ram=!random!%%16+1
  if not defined true (
   if not defined L!ran!.!ram! set L!ran!.!ram!=★&set true=y&set/a dilei+=1
  )
)
)
set/a tudi=16*16-dilei
for /l %%a in (1,1,16) do (
set/a u=%%a-1,d=%%a+1
for /l %%b in (1,1,16) do (
  if not defined L%%a.%%b (
   set/a l=%%b-1,r=%%b+1
   for /f "tokens=1-6" %%c in ("!u! %%a !d! !l! %%b !r!") do (
for %%z in ("!L%%c.%%f!!L%%c.%%g!!L%%c.%%h!!L%%d.%%f!!L%%d.%%h!!L%%e.%%f!!L%%e.%%g!!L%%e.%%h!") do (set r%%a.%%b=!%%~z!)
   )
  )
)
)
for /l %%a in (1,1,16) do (
for /l %%b in (1,1,16) do (
  if not defined r%%a.%%b set "r%%a.%%b=╳"
  if not defined L%%a.%%b set L%%a.%%b=!r%%a.%%b!
  set r%%a.%%b=
)
)
set benton=set "str=!`!str!`!¤"
:loop
for /l %%a in (1,1,16) do (
set str=
for /l %%b in (1,1,16) do (
  if defined r%%a.%%b (
     if !r%%a.%%b! equ @ (set "str=!str!ψ") else (set "str=!str!!`!L%%a.%%b!`!")
  ) else (
     %benton%
  )
)
set ec%%a=│!str!│
)
set benton=set "str=!`!str!`!¤"
:error
cls
for /l %%a in (-2,1,18) do (for %%b in ("!ec%%a!") do echo;     !M%%a!%%~b!M%%a!)
if defined over echo 游戏结束&pause&endlocal&goto :begin
if !tudi! lss 0 echo 恭喜你过关了&pause&endlocal&goto :begin
set /p in=输入打开点[行前,列后]:
if "!in!" equ "benton" set benton=set "str=!`!str!`!!`!L%%a.%%b!`!"&goto :loop
set/a ver=0,m=com!in:~0,1!,n=com!in:~1,1!,ver=m*n
if !ver! equ 0 goto :error

if "!in:#=!" neq "!in!" (
        echo "!r%m%.%n%:@=!"
        if "!r%m%.%n%:@=!" neq "!r%m%.%n%!" (
                for %%a in (bj!r%m%.%n%!) do (
                        set r%m%.%n%=!%%a!
                        set/a dilei+=%%a1
                )
                goto :loop
        ) else (
                goto :error
        )
)

if defined r%m%.%n% goto :error
set r%m%.%n%=#
set/a tudi-=1
if "!L%m%.%n%!" equ "★" set over=  光荣牺牲了
if "!L%m%.%n%!" equ "╳" call :auto
set say=!L%m%.%n%!
set say=!%say%!
goto :loop
pause
goto :eof
:auto
set/a u=m-1,d=m+1,l=n-1,r=n+1
for /f "tokens=1-6" %%c in ("!u! !m! !d! !l! !n! !r!") do (
for %%k in (%%c.%%f %%c.%%g %%c.%%h %%d.%%f %%d.%%h %%e.%%f %%e.%%g %%e.%%h!) do (
  if not defined r%%k (
   set r%%k=#
   set/a tudi-=1
   if "!L%%k!" equ "╳" (
    for /f "tokens=1,2 delims=." %%1 in ("%%k") do (set/a m=%%1,n=%%2)
    call :auto
   )
  )
)
)

作者: qzwqzw     时间: 2009-6-8 03:52
从用户界面上提几点建议吧

显示方面:
1、因为¤更形似地雷炸开的样子,用作炸开的地雷会比较好些;
2、对于空地,全角空白字符会更容易让人接受;
3、对于未探测地,□可能更好一些;
4、至于旗子,随你吧

操作方面:
1、坐标系除了直角坐标系之外,可以考虑极坐标系,即使用方向+距离定位某块地;
    方向可以从数字小键盘取,比如2表示向下移动,9表示向右上移动,距离用数字表示,省略时表示移动一格;
2、插旗和开地都可以针对九宫格进行;
    比如一块已打开的地周围有三颗地雷,且都已被插旗,那么再打开这块地,会打开周围8块地中剩下的未插旗的地块;
    同时,如果一块已打开的地周围有三颗地雷,且已打开五块地,那么再对这块地插旗,会在剩下的地上都插上旗;
作者: zh159     时间: 2009-6-8 06:34
痛苦啊,还是喜欢鼠标点击啊...
作者: qzwqzw     时间: 2009-6-8 07:48

:: qzwqzw hack - 20090608
:: - 更换几个显示符号
:: - 加入插旗功能,手动插旗可以在坐标值加一/(不需要按shift键哦)
:: - 加入数字键形式的极坐标系控制,即以当前地为中心,向上(8)下(2)左(4)右(6)移动指定的格数再翻地
:: - 加入自动翻开和自动插旗,就是在已翻开的地上再翻,会自动根据情况选择插旗或者翻地
@echo off & setlocal
title 批处理扫地雷 之 越战清道夫   Made by netbenton from http://bbs.bathome.cn
set `=!
::⊙¤☆12345678□
setlocal enabledelayedexpansion
set "ec-1= ABCDEFGHIJKLMNOP "
for /l %%a in (0,1,17) do (set M%%a=!ec-1:~%%a,1!)
set ec18= !ec-1!
set ec-1= !ec-1!
set ec0=┌────────────────┐还有!`!dilei!`!个雷,!`!tudi!`!亩地
set ec17=└────────────────┘!`!over!`!!`!say!`!
set str= abcdefghijklmnop
for /l %%a in (1,1,16) do set com!str:~%%a,1!=%%a
set  =今天运气不错哦。。。
set 1=生死由命,就放心踩吧
set 2=这里都不敢动,劝你回家种田吧!
set 3=团长,要看清想好呀。
set 4=这里要动的话,就只有半条命了!
set 5=探到不少雷呀,最好不要赌了
set 6=小心呀!团长,想好呀
set 7=危局险啊!最好别动了!
set 8=这里全是雷呀!别动!!!
for %%a in (1 2 3 4 5 6 7 8) do (set s#=!s#!¤&set !s#!=%%a)
set over=
set say=一个艰巨的任务开始了。。。
for /l %%a in (0,1,17) do (set r0.%%a=#&set r17.%%a=#&set r%%a.0=#&set r%%a.17=#)
:begin
setlocal enabledelayedexpansion
for /l %%a in (1,1,40) do (
    set/a ran=!random!%%16+1
    set true=
    for /l %%b in (1,1,16) do (
        set/a ram=!random!%%16+1
        if not defined true (
            if not defined L!ran!.!ram! set L!ran!.!ram!=¤&set true=y&set/a dilei+=1
        )
    )
)
set/a tudi=16*16-dilei
for /l %%a in (1,1,16) do (
    set/a u=%%a-1,d=%%a+1
    for /l %%b in (1,1,16) do (
        if not defined L%%a.%%b (
            set/a l=%%b-1,r=%%b+1
            for /f "tokens=1-6" %%c in ("!u! %%a !d! !l! %%b !r!") do (
                for %%z in ("!L%%c.%%f!!L%%c.%%g!!L%%c.%%h!!L%%d.%%f!!L%%d.%%h!!L%%e.%%f!!L%%e.%%g!!L%%e.%%h!") do (set r%%a.%%b=!%%~z!)
            )
        )
    )
)
for /l %%a in (1,1,16) do (
    for /l %%b in (1,1,16) do (
      if not defined r%%a.%%b set "r%%a.%%b= "
      if not defined L%%a.%%b set L%%a.%%b=!r%%a.%%b!
      set r%%a.%%b=
    )
)
set benton=set "str=!`!str!`!□"
:loop
for /l %%a in (1,1,16) do (
    set str=
    for /l %%b in (1,1,16) do (
        rem :: qzwqzw hack begin - 加入插旗功能
        if not defined r%%a.%%b (
            %benton%
        ) else if "!r%%a.%%b!"=="/" (
            set "str=!str!●"
        ) else (
            set "str=!str!!`!L%%a.%%b!`!"
        )
        rem :: qzwqzw hack end - 加入插旗功能
    )
    set ec%%a=│!str!│
)
set benton=set "str=!`!str!`!□"
:error
cls
for /l %%a in (-2,1,18) do (for %%b in ("!ec%%a!") do echo;     !M%%a!%%~b!M%%a!)
if defined over echo 游戏结束&pause&endlocal&goto :begin
if !tudi! lss 0 echo 恭喜你过关了&pause&endlocal&goto :begin
set /p in=输入打开点[行前,列后]:
if "!in!" equ "benton" set benton=set "str=!`!str!`!!`!L%%a.%%b!`!"&goto :loop

:: qzwqzw hack begin - 加入插旗,极坐标控制,自动翻地,自动插旗功能
if "!in!" geq "11" if "!in!" leq "99" (
    :: 以下是极坐标控制代码
    if "!in:~0,1!" equ "1" set /a m+=!in:~1,1!,n-=!in:~1,1!
    if "!in:~0,1!" equ "2" set /a m+=!in:~1,1!
    if "!in:~0,1!" equ "3" set /a m+=!in:~1,1!,n+=!in:~1,1!
    if "!in:~0,1!" equ "4" set /a n-=!in:~1,1!
    if "!in:~0,1!" equ "6" set /a n+=!in:~1,1!
    if "!in:~0,1!" equ "7" set /a m-=!in:~1,1!,n-=!in:~1,1!
    if "!in:~0,1!" equ "8" set /a m-=!in:~1,1!
    if "!in:~0,1!" equ "9" set /a m-=!in:~1,1!,n+=!in:~1,1!

    if !m! gtr 16 set /a m=16
    if !m! lss 1 set /a m=1
    if !n! gtr 16 set /a n=16
    if !n! lss 1 set /a n=1
) else (
    set/a ver=0,m=com!in:~0,1!,n=com!in:~1,1!,ver=m*n
    if !ver! equ 0 goto :error
)
set /a ms1=m-1,ma1=m+1,ns1=n-1,na1=n+1
set jiugong=%ms1%.%ns1% %ms1%.%n% %ms1%.%na1% %m%.%ns1% %m%.%na1% %ma1%.%ns1% %ma1%.%n% %ma1%.%na1%

if "!in:~2,1!"=="/" (
    if not defined r%m%.%n% (
        set "r%m%.%n%=/"
        set /a dilei-=1
    )
) else (
    if "!r%m%.%n%!"=="#" (
        if "!L%m%.%n%!" geq "1" if "!L%m%.%n%!" leq "8" (
            set nums= 12345678
            for /l %%n in (1,1,8) do if "!L%m%.%n%!"=="!nums:~%%n,1!" set Lmn=%%n
            set /a Cmn=0,Dmn=0,Emn=0
            for %%m in (%jiugong%) do if "!r%%m!"=="/" set /a Cmn+=1
            for %%m in (%jiugong%) do if "!r%%m!"=="#" set /a Dmn+=1
            set /a Emn=8-Dmn
            rem 符合条件自动翻地
            if !Cmn! equ !Lmn! (
                for %%m in (%jiugong%) do if "!r%%m!"=="" (
                    set r%%m=#
                    set/a tudi-=1
                    if "!L%%m!" equ "¤" set over=  光荣牺牲了
                    if "!L%%m!" equ " " call :auto
                )
            ) else if !Emn! equ !Lmn! (
            rem 符合条件自动插旗
                for %%m in (%jiugong%) do if "!r%%m!"=="" (
                    set r%%m=/
                    set /a dilei-=1
                )
            )
        )
    ) else (
        if "!r%m%.%n%!"=="/" set /a dilei+=1
:: qzwqzw hack end - 加入插旗,极坐标控制,自动翻地,自动插旗功能
        set r%m%.%n%=#
        set/a tudi-=1
        if "!L%m%.%n%!" equ "¤" set over=  光荣牺牲了
        if "!L%m%.%n%!" equ " " call :auto
        set say=!L%m%.%n%!
        set say=!%say%!
    )
)
goto :loop

:auto
set/a u=m-1,d=m+1,l=n-1,r=n+1
for /f "tokens=1-6" %%c in ("!u! !m! !d! !l! !n! !r!") do (
    for %%k in (%%c.%%f %%c.%%g %%c.%%h %%d.%%f %%d.%%h %%e.%%f %%e.%%g %%e.%%h!) do (
        if not defined r%%k (
            set r%%k=#
            set/a tudi-=1
            if "!L%%k!" equ " " (
                for /f "tokens=1,2 delims=." %%1 in ("%%k") do (set/a m=%%1,n=%%2)
                call :auto
            )
        )
    )
)

作者: netbenton     时间: 2009-6-8 09:51
楼上增强得不错,
只是空白处,我认为还是用X比较好
还有那一个排if 要是能变少一点就好了。
作者: qzwqzw     时间: 2009-6-8 10:22
是指极坐标控制那一排if吧
8行可以简化成5行
if "!in:~0,1!" leq "3" set /a m+=!in:~1,1!
if "!in:~0,1!" geq "7" set /a m-=!in:~1,1!
set /a mod=!in:~0,1!%%3
if !mod! equ "1" set /a n-=!in:~1,1!
if !mod! equ "0" set /a n+=!in:~1,1!

至于空白地
我是这样考虑的
空白地是不需要玩家关心的地方
它如果用非空白字符
会让玩家白白消耗掉一部分注意力
而且长时间盯着满篇的字符更容易产生疲劳感
所以需要一定的空白增加可视性

另外,我将地雷旗帜由空心的P改为实心的●
也是考虑用户应该对地雷有足够的关注度
而空心字符很容易淹没在一堆数字和空格中而让人忽视

这些也应该是Windows排雷的设计理念

现在正在考虑如何突出显示当前翻开的地块
让玩家在游戏时不容易失去关注的焦点
作者: qzwqzw     时间: 2009-6-8 11:55
终于通关了
基本上是依赖极坐标定位来操作的
可惜没有任何通关效果
附件 1: spx-9.gif (2009-6-8 11:55, 11.4 K, 下载附件所需积分 1点 ,下载次数: 1)



作者: qzwqzw     时间: 2009-6-8 23:38
加入欢迎界面
加入当前格突出显示,可惜显示效率因此降低了
:: qzwqzw hack - 20090608
:: - 更换几个显示符号
:: - 加入插旗功能,手动插旗可以在坐标值后加一/(不需要按shift键哦)
:: - 加入数字键形式的极坐标系控制,即以当前地为中心,向上(8)下(2)左(4)右(6)移动指定的格数再翻地
:: - 加入自动翻开和自动插旗,就是在已翻开的地上再翻,会自动根据情况选择插旗或者翻地
:: - 即时显示地图,以便可以用红色背景色突出显示当前位置
@echo off & setlocal
title qzwqzw 批处理扫地雷 之 越战清道夫
set `=!
mode 48,25
echo.
echo.            批处理扫地雷 之 越战清道夫
echo.
echo. Made by netbenton from http://bbs.bathome.cn
echo. Hack by qzwqzw - 20090608
echo.
echo. 玩法:显示完地图后,可以在指定的地上翻地或插旗
echo.       地翻开后可能会显示空,表示周围没有一颗雷
echo.       可能是一个数字,表示这块地周围有地雷
echo.       数字是几,就代表有周围几块地有地雷
echo.       还可能是一个爆炸的地雷,此时就 Game Over^!
echo.       请结合数字和旗子的提示决定是翻地或者插旗
echo.
echo. 翻地:指定位置后回车
echo. 插旗:指定位置再添加一"/"后回车
echo.
echo. 指定位置方式1:行坐标+列坐标,比如:HF
echo. 指定位置方式2:相对当前位置的方向与距离
echo.     方向:请参考数字小键盘的方向
echo.     距离:向指定方向移动的格子数
echo.     示例:从当前点向右上移动3格为 "93"
echo      注意:此方式需将NumLock键开启
echo.
pause
::⊙¤☆12345678□
setlocal enabledelayedexpansion
set "ecp= ABCDEFGHIJKLMNOP "
for /l %%a in (0,1,17) do (set M%%a=!ec-1:~%%a,1!)
set str= abcdefghijklmnop
for /l %%a in (1,1,16) do set com!str:~%%a,1!=%%a
set say¤=祖国和人民会怀念你的~~~
set say =今天真是撞到狗屎运了###
set say1=富贵在天,就放心踩吧
set say2=这里都不敢动,劝你回家种田吧!
set say3=团长,要看清想好呀。
set say4=这里要动的话,就只有半条命了!
set say5=探到不少雷呀,最好不要赌了
set say6=小心呀!团长,想好呀
set say7=危险啊!不动明王咒,我念念念!
set say8=这里全是雷呀!别动!!!
for %%a in (1 2 3 4 5 6 7 8) do (set s#=!s#!¤&set !s#!=%%a)
set over=
set say=一个艰巨的任务开始了。。。
for /l %%a in (0,1,17) do (set r0.%%a=#&set r17.%%a=#&set r%%a.0=#&set r%%a.17=#)
:begin
setlocal enabledelayedexpansion
for /l %%a in (1,1,50) do (
    set/a ran=!random!%%16+1
    set true=
    for /l %%b in (1,1,16) do (
        set/a ram=!random!%%16+1
        if not defined true (
            if not defined L!ran!.!ram! set L!ran!.!ram!=¤&set true=y&set/a dilei+=1
        )
    )
)
set/a tudi=16*16-dilei
for /l %%a in (1,1,16) do (
    set/a u=%%a-1,d=%%a+1
    for /l %%b in (1,1,16) do (
        if not defined L%%a.%%b (
            set/a l=%%b-1,r=%%b+1
            for /f "tokens=1-6" %%c in ("!u! %%a !d! !l! %%b !r!") do (
                for %%z in ("!L%%c.%%f!!L%%c.%%g!!L%%c.%%h!!L%%d.%%f!!L%%d.%%h!!L%%e.%%f!!L%%e.%%g!!L%%e.%%h!") do (set r%%a.%%b=!%%~z!)
            )
        )
    )
)
for /l %%a in (1,1,16) do (
    for /l %%b in (1,1,16) do (
      if not defined r%%a.%%b set "r%%a.%%b= "
      if not defined L%%a.%%b set L%%a.%%b=!r%%a.%%b!
      set r%%a.%%b=
    )
)
:drawmap
:: qzwqzw hack begin - 即时显示地图,以便可以用红色背景色突出显示当前位置
cls
title §排雷§  地数:%tudi%  地雷:%dilei%
echo.
echo.   %ecp%
echo.   ┌────────────────┐
for /l %%a in (1,1,16) do (
    set/p=  !ecp:~%%a,1!│<nul
    for /l %%b in (1,1,16) do (
        if not defined r%%a.%%b (
            set unit=□
        ) else if "!r%%a.%%b!"=="/" (
            set unit=●
        ) else (
            set unit=!L%%a.%%b!
        )
        if "%benton%"=="true" set unit=!L%%a.%%b!
        if "%%a.%%b"=="%m%.%n%" (
            set/p= <nul>"!unit!" 2>nul
            findstr /a:47 .* "!unit!?" 2>nul 3>&2
        ) else (
            set/p=!unit!<nul
        )
    )
    set/p=│!ecp:~%%a,1!<nul
    echo.
)
echo.   └────────────────┘
echo.   %ecp%
echo.
:: qzwqzw hack end - 即时显示地图,以便可以用红色背景色突出显示当前位置

:command
echo.          %say%
echo.
if defined end goto :end
set /p in=      请输入您的指令:
if "!in!" equ "benton" (
    set "benton=true"
    set "end=后门"
    set "say=怎么,没招了吗?这是全部地图"
    goto :drawmap
)

:: qzwqzw hack begin - 加入插旗,极坐标控制,自动翻地,自动插旗功能
if "!in!" geq "11" if "!in!" leq "99" (
    :: 以下是极坐标控制代码
    set /a θ1=!in:~0,1!,θ2=!in:~0,1!%%3,ρ=!in:~1,1!,
    if "!θ1!" leq "3" set /a m+=ρ
    if "!θ1!" geq "7" set /a m-=ρ
    if "!θ2!" equ "1" set /a n-=ρ
    if "!θ2!" equ "0" set /a n+=ρ

    if !m! gtr 16 set /a m=16
    if !m! lss 1 set /a m=1
    if !n! gtr 16 set /a n=16
    if !n! lss 1 set /a n=1
) else (
    :: 以下是直角坐标控制代码
    set/a ver=0,m=com!in:~0,1!,n=com!in:~1,1!,ver=m*n
    if !ver! equ 0 goto :drawmap
)
set /a ms1=m-1,ma1=m+1,ns1=n-1,na1=n+1
set zhouwei=%ms1%.%ns1% %ms1%.%n% %ms1%.%na1% %m%.%ns1% %m%.%na1% %ma1%.%ns1% %ma1%.%n% %ma1%.%na1%

if "!in:~2,1!"=="/" (
    if not defined r%m%.%n% (
        set "r%m%.%n%=/"
        set /a dilei-=1
        set say=给这块地插上旗子了
    )
) else (
    if "!r%m%.%n%!"=="#" (
        if "!L%m%.%n%!" geq "1" if "!L%m%.%n%!" leq "8" (
            set nums= 12345678
            for /l %%n in (1,1,8) do if "!L%m%.%n%!"=="!nums:~%%n,1!" set Lmn=%%n
            set /a Cmn=0,Dmn=0,Emn=0
            for %%m in (%zhouwei%) do if "!r%%m!"=="/" set /a Cmn+=1
            for %%m in (%zhouwei%) do if "!r%%m!"=="#" set /a Dmn+=1
            set /a Emn=8-Dmn
            rem 符合条件自动翻地
            if !Cmn! equ !Lmn! (
                for %%m in (%zhouwei%) do if "!r%%m!"=="" (
                    set r%%m=#
                    set/a tudi-=1
                    if "!L%%m!" equ " " call :auto
                    set say=!L%m%.%n%!
                    call set say=%%say!say!%%
                    if "!L%%m!" equ "¤" set "end=爆炸" & goto :drawmap
                )
                set say=自动翻开周围所有的空地
                if !tudi! leq 0 set "say=顺利过关" & set "end=过关"
            ) else if !Emn! equ !Lmn! (
            rem 符合条件自动插旗
                for %%m in (%zhouwei%) do if "!r%%m!"=="" (
                    set r%%m=/
                    set /a dilei-=1
                )
                set say=自动插上周围地上所有的旗
            )
        )
    ) else (
        if "!r%m%.%n%!"=="/" set /a dilei+=1
:: qzwqzw hack end - 加入插旗,极坐标控制,自动翻地,自动插旗功能
        set r%m%.%n%=#
        set/a tudi-=1
        if "!L%m%.%n%!" equ " " call :auto
        set say=!L%m%.%n%!
        call set say=%%say!say!%%
        if !tudi! leq 0 set "say=顺利过关" & set "end=过关"
        if "!L%m%.%n%!" equ "¤" set end=爆炸
    )
)
goto :drawmap

:end
pause
endlocal
goto :begin

:auto
set/a u=m-1,d=m+1,l=n-1,r=n+1
for /f "tokens=1-6" %%c in ("!u! !m! !d! !l! !n! !r!") do (
    for %%k in (%%c.%%f %%c.%%g %%c.%%h %%d.%%f %%d.%%h %%e.%%f %%e.%%g %%e.%%h!) do (
        if not defined r%%k (
            set r%%k=#
            set/a tudi-=1
            if "!L%%k!" equ " " (
                for /f "tokens=1,2 delims=." %%1 in ("%%k") do (set/a m=%%1,n=%%2)
                call :auto
            )
        )
    )
)

作者: qzwqzw     时间: 2009-6-9 01:17

:: qzwqzw hack - 20090609
:: - 更换几个显示符号
:: - 加入插旗功能,手动插旗可以在坐标值后加一/(不需要按shift键哦)
:: 2009-6-8 - 加入数字键形式的极坐标系控制,即以当前地为中心,向上(8)下(2)左(4)右(6)移动指定的格数再翻地
:: 2009-6-8 - 加入自动翻开和自动插旗,就是在已翻开的地上再翻,会自动根据情况选择插旗或者翻地
:: 2009-6-8 - 即时显示地图,以便可以用红色背景色突出显示当前位置
:: 2009-6-9 - 再次修改地图显示方式为半即时方式以提高显示效率
:: 2009-6-9 - 加入简单的过关与失败效果
@echo off & setlocal
title qzwqzw 批处理扫地雷 之 越战清道夫
set `=!
mode 48,26
echo.
echo.            批处理扫地雷 之 越战清道夫
echo.
echo. Made by netbenton from http://bbs.bathome.cn
echo. Hack by qzwqzw - 20090608
echo.
echo. 玩法:显示完地图后,可以在指定的地上翻地或插旗
echo.       地翻开后可能会显示空,表示周围没有一颗雷
echo.       可能是一个数字,表示这块地周围有地雷
echo.       数字是几,就代表有周围几块地有地雷
echo.       还可能是一个爆炸的地雷,此时就 Game Over^!
echo.       请结合数字和旗子的提示决定是翻地或者插旗
echo.
echo. 翻地:指定位置后回车
echo. 插旗:指定位置再添加一"/"后回车
echo.
echo. 指定位置方式1:行坐标+列坐标,比如:HF
echo. 指定位置方式2:相对当前位置的方向与距离
echo.     方向:请参考数字小键盘的方向
echo.     距离:向指定方向移动的格子数
echo.     示例:从当前点向右上移动3格为 "93"
echo      注意:此方式需将NumLock键开启
echo.
pause
::⊙¤☆12345678□
setlocal enabledelayedexpansion
set "ecp= ABCDEFGHIJKLMNOP "
for /l %%a in (0,1,17) do (set M%%a=!ec-1:~%%a,1!)
set str= abcdefghijklmnop
for /l %%a in (1,1,16) do set com!str:~%%a,1!=%%a
set say¤=祖国和人民会怀念你的~~~
set say =今天真是撞到狗屎运了###
set say1=富贵在天,就放心踩吧
set say2=这里都不敢动,劝你回家种田吧!
set say3=团长,要看清想好呀。
set say4=这里要动的话,就只有半条命了!
set say5=探到不少雷呀,最好不要赌了
set say6=小心呀!团长,想好呀
set say7=危险啊!不动明王咒,我念念念!
set say8=这里全是雷呀!别动!!!
for %%a in (1 2 3 4 5 6 7 8) do (set s#=!s#!¤&set !s#!=%%a)
set over=
set say=一个艰巨的任务开始了。。。
for /l %%a in (0,1,17) do (set r0.%%a=#&set r17.%%a=#&set r%%a.0=#&set r%%a.17=#)
:begin
setlocal enabledelayedexpansion
for /l %%a in (1,1,50) do (
    set/a ran=!random!%%16+1
    set true=
    for /l %%b in (1,1,16) do (
        set/a ram=!random!%%16+1
        if not defined true (
            if not defined L!ran!.!ram! set L!ran!.!ram!=¤&set true=y&set/a dilei+=1
        )
    )
)
set/a tudi=16*16-dilei
for /l %%a in (1,1,16) do (
    set/a u=%%a-1,d=%%a+1
    for /l %%b in (1,1,16) do (
        if not defined L%%a.%%b (
            set/a l=%%b-1,r=%%b+1
            for /f "tokens=1-6" %%c in ("!u! %%a !d! !l! %%b !r!") do (
                for %%z in ("!L%%c.%%f!!L%%c.%%g!!L%%c.%%h!!L%%d.%%f!!L%%d.%%h!!L%%e.%%f!!L%%e.%%g!!L%%e.%%h!") do (set r%%a.%%b=!%%~z!)
            )
        )
    )
)
for /l %%a in (1,1,16) do (
    for /l %%b in (1,1,16) do (
      if not defined r%%a.%%b set "r%%a.%%b= "
      if not defined L%%a.%%b set L%%a.%%b=!r%%a.%%b!
      set r%%a.%%b=
    )
)
:drawmap
:: qzwqzw hack begin - 即时显示地图,以便可以用红色背景色突出显示当前位置
if "%end%"=="过关" color 01
if "%end%"=="爆炸" color 87
if "%end%"=="" color 07
cls
set /a cur_a=%n%+3, cur_b=%n%+4
title §排雷§  地数:%tudi%  地雷:%dilei%
echo.
echo.   %ecp%
echo.   ┌────────────────┐
for /l %%a in (1,1,16) do (
    set line=  !ecp:~%%a,1!│
    for /l %%b in (1,1,16) do (
        if "%benton%"=="true" (
            set line=!line!!L%%a.%%b!
        ) else if not defined r%%a.%%b (
            set line=!line!□
        ) else if "!r%%a.%%b!"=="/" (
            set line=!line!●
        ) else if "!r%%a.%%b!"=="#" (
            set line=!line!!L%%a.%%b!
        )
    )
    set line=!line!│!ecp:~%%a,1!

    if "%%a"=="%m%" (
        set/p=!line:~0,%cur_a%!<nul
        set cur=!line:~%cur_a%,1!
        set/p= <nul>"!cur!" 2>nul
        findstr /a:47 .* "!cur!?" 2>nul 3>&2
        del "!cur!"
        set/p=!line:~%cur_b%!<nul
        echo.
    ) else (
        echo.!line!
    )
)
echo.   └────────────────┘
echo.   %ecp%
echo.
:: qzwqzw hack end - 即时显示地图,以便可以用红色背景色突出显示当前位置

:command
echo.          %say%
echo.
if defined end goto :end
set /p in=      请输入您的指令:
if "!in!" equ "benton" (
    set "benton=true"
    set "end=后门"
    set "say=怎么,没招了吗?这是全部地图"
    goto :drawmap
)

:: qzwqzw hack begin - 加入插旗,极坐标控制,自动翻地,自动插旗功能
if "!in!" geq "11" if "!in!" leq "99" (
    :: 以下是极坐标控制代码
    set /a θ1=!in:~0,1!,θ2=!in:~0,1!%%3,ρ=!in:~1,1!,
    if "!θ1!" leq "3" set /a m+=ρ
    if "!θ1!" geq "7" set /a m-=ρ
    if "!θ2!" equ "1" set /a n-=ρ
    if "!θ2!" equ "0" set /a n+=ρ

    if !m! gtr 16 set /a m=16
    if !m! lss 1 set /a m=1
    if !n! gtr 16 set /a n=16
    if !n! lss 1 set /a n=1
) else (
    :: 以下是直角坐标控制代码
    set/a ver=0,m=com!in:~0,1!,n=com!in:~1,1!,ver=m*n
    if !ver! equ 0 goto :drawmap
)
set /a ms1=m-1,ma1=m+1,ns1=n-1,na1=n+1
set zhouwei=%ms1%.%ns1% %ms1%.%n% %ms1%.%na1% %m%.%ns1% %m%.%na1% %ma1%.%ns1% %ma1%.%n% %ma1%.%na1%

if "!in:~2,1!"=="/" (
    if not defined r%m%.%n% (
        set "r%m%.%n%=/"
        set /a dilei-=1
        set say=给这块地插上旗子了
    )
) else (
    if "!r%m%.%n%!"=="#" (
        if "!L%m%.%n%!" geq "1" if "!L%m%.%n%!" leq "8" (
            set nums= 12345678
            for /l %%n in (1,1,8) do if "!L%m%.%n%!"=="!nums:~%%n,1!" set Lmn=%%n
            set /a Cmn=0,Dmn=0,Emn=0
            for %%m in (%zhouwei%) do if "!r%%m!"=="/" set /a Cmn+=1
            for %%m in (%zhouwei%) do if "!r%%m!"=="#" set /a Dmn+=1
            set /a Emn=8-Dmn
            rem 符合条件自动翻地
            if !Cmn! equ !Lmn! (
                for %%m in (%zhouwei%) do if "!r%%m!"=="" (
                    set r%%m=#
                    set/a tudi-=1
                    if "!L%%m!" equ " " call :auto
                    set say=!L%m%.%n%!
                    call set say=%%say!say!%%
                    if "!L%%m!" equ "¤" set "end=爆炸" & goto :drawmap
                )
                set say=自动翻开周围所有的空地
                if !tudi! leq 0 set "say=顺利过关" & set "end=过关"
            ) else if !Emn! equ !Lmn! (
            rem 符合条件自动插旗
                for %%m in (%zhouwei%) do if "!r%%m!"=="" (
                    set r%%m=/
                    set /a dilei-=1
                )
                set say=自动插上周围地上所有的旗
            )
        )
    ) else (
        if "!r%m%.%n%!"=="/" set /a dilei+=1
:: qzwqzw hack end - 加入插旗,极坐标控制,自动翻地,自动插旗功能
        set r%m%.%n%=#
        set/a tudi-=1
        if "!L%m%.%n%!" equ " " call :auto
        set say=!L%m%.%n%!
        call set say=%%say!say!%%
        if !tudi! leq 0 set "say=顺利过关" & set "end=过关"
        if "!L%m%.%n%!" equ "¤" set end=爆炸
    )
)
goto :drawmap

:end
pause
endlocal
goto :begin

:auto
set/a u=m-1,d=m+1,l=n-1,r=n+1
for /f "tokens=1-6" %%c in ("!u! !m! !d! !l! !n! !r!") do (
    for %%k in (%%c.%%f %%c.%%g %%c.%%h %%d.%%f %%d.%%h %%e.%%f %%e.%%g %%e.%%h!) do (
        if not defined r%%k (
            set r%%k=#
            set/a tudi-=1
            if "!L%%k!" equ " " (
                for /f "tokens=1,2 delims=." %%1 in ("%%k") do (set/a m=%%1,n=%%2)
                call :auto
            )
        )
    )
)

作者: qzwqzw     时间: 2009-6-9 08:23

:: qzwqzw hack - 20090609
:: - 更换几个显示符号
:: - 加入插旗功能,手动插旗可以在坐标值后加一/(不需要按shift键哦)
:: 2009-6-8 - 加入数字键形式的极坐标系控制,即以当前地为中心,向上(8)下(2)左(4)右(6)移动指定的格数再翻地
:: 2009-6-8 - 加入自动翻开和自动插旗,就是在已翻开的地上再翻,会自动根据情况选择插旗或者翻地
:: 2009-6-8 - 即时显示地图,以便可以用红色背景色突出显示当前位置
:: 2009-6-9 - 再次修改地图显示方式为半即时方式以提高显示效率
:: 2009-6-9 - 加入简单的过关与失败效果
:: 2009-6-9 - 加入中途退出与新开局功能
:: 2009-6-9 - 加入计时功能
@echo off & setlocal
title qzwqzw 批处理扫地雷 之 越战清道夫
set `=!
mode 48,27
echo.
echo.            批处理扫地雷 之 越战清道夫
echo.
echo. Made by netbenton from http://bbs.bathome.cn
echo. Hack by qzwqzw - 20090608
echo.
echo. 玩法:显示完地图后,可以在指定的地上翻地或插旗
echo.       地翻开后可能会显示空,表示周围没有一颗雷
echo.       可能是一个数字,表示这块地周围有地雷
echo.       数字是几,就代表有周围几块地有地雷
echo.       还可能是一个爆炸的地雷,此时就 Game Over^!
echo.       请结合数字和旗子的提示决定是翻地或者插旗
echo.
echo. 翻地:指定位置后回车
echo. 插旗:指定位置再添加一"/"后回车
echo.
echo. 指定位置方式1:行坐标+列坐标,比如:HF
echo. 指定位置方式2:相对当前位置的方向与距离
echo.     方向:请参考数字小键盘的方向
echo.     距离:向指定方向移动的格子数
echo.     示例:从当前点向右上移动3格为 "93"
echo      注意:此方式需将NumLock键开启
echo.
pause
::⊙¤☆12345678□
setlocal enabledelayedexpansion
set "ecp= ABCDEFGHIJKLMNOP "
for /l %%a in (0,1,17) do (set M%%a=!ec-1:~%%a,1!)
set str= abcdefghijklmnop
for /l %%a in (1,1,16) do set com!str:~%%a,1!=%%a
set say¤=祖国和人民会怀念你的~~~
set say =今天真是撞到狗屎运了###
set say1=富贵在天,就放心踩吧
set say2=这里都不敢动,劝你回家种田吧!
set say3=团长,要看清想好呀。
set say4=这里要动的话,就只有半条命了!
set say5=探到不少雷呀,最好不要赌了
set say6=小心呀!团长,想好呀
set say7=危险啊!不动明王咒,我念念念!
set say8=这里全是雷呀!别动!!!
for %%a in (1 2 3 4 5 6 7 8) do (set s#=!s#!¤&set !s#!=%%a)
set over=
set say=一个艰巨的任务开始了。。。
for /l %%a in (0,1,17) do (set r0.%%a=#&set r17.%%a=#&set r%%a.0=#&set r%%a.17=#)
:begin
setlocal enabledelayedexpansion
for /l %%a in (1,1,50) do (
    set/a ran=!random!%%16+1
    set true=
    for /l %%b in (1,1,16) do (
        set/a ram=!random!%%16+1
        if not defined true (
            if not defined L!ran!.!ram! set L!ran!.!ram!=¤&set true=y&set/a dilei+=1
        )
    )
)
set/a tudi=16*16-dilei
for /l %%a in (1,1,16) do (
    set/a u=%%a-1,d=%%a+1
    for /l %%b in (1,1,16) do (
        if not defined L%%a.%%b (
            set/a l=%%b-1,r=%%b+1
            for /f "tokens=1-6" %%c in ("!u! %%a !d! !l! %%b !r!") do (
                for %%z in ("!L%%c.%%f!!L%%c.%%g!!L%%c.%%h!!L%%d.%%f!!L%%d.%%h!!L%%e.%%f!!L%%e.%%g!!L%%e.%%h!") do (set r%%a.%%b=!%%~z!)
            )
        )
    )
)
for /l %%a in (1,1,16) do (
    for /l %%b in (1,1,16) do (
      if not defined r%%a.%%b set "r%%a.%%b= "
      if not defined L%%a.%%b set L%%a.%%b=!r%%a.%%b!
      set r%%a.%%b=
    )
)
for /f "tokens=1-3 delims=:." %%a in ("%time%") do set /a time_begin=((%%a*60)+%%b)*60+%%c

:drawmap
:: qzwqzw hack begin - 即时显示地图,以便可以用红色背景色突出显示当前位置
if "%end%"=="过关" color 1e
if "%end%"=="爆炸" color 4f
if "%end%"=="" color 07
set /a cur_a=%n%+3, cur_b=%n%+4
for /f "tokens=1-3 delims=:." %%a in ("%time%") do set /a time_now=((%%a*60)+%%b)*60+%%c
if 1%time_begin% gtr 1%time_now% set /a time_now+=86400
set /a time_pass=time_now - time_begin
cls
title §排雷§  空地:%tudi%  地雷:%dilei%  时间:%time_pass% 秒
echo.
echo.   %ecp%
echo.   ┌────────────────┐
for /l %%a in (1,1,16) do (
    set line=  !ecp:~%%a,1!│
    for /l %%b in (1,1,16) do (
        if "%benton%"=="true" (
            set line=!line!!L%%a.%%b!
        ) else if not defined r%%a.%%b (
            set line=!line!□
        ) else if "!r%%a.%%b!"=="/" (
            set line=!line!●
        ) else if "!r%%a.%%b!"=="#" (
            set line=!line!!L%%a.%%b!
        )
    )
    set line=!line!│!ecp:~%%a,1!

    if "%%a"=="%m%" (
        set/p=!line:~0,%cur_a%!<nul
        set cur=!line:~%cur_a%,1!
        set/p= <nul>"!cur!" 2>nul
        findstr /a:47 .* "!cur!?" 2>nul 3>&2
        del "!cur!"
        set/p=!line:~%cur_b%!<nul
        echo.
    ) else (
        echo.!line!
    )
)
echo.   └────────────────┘
echo.   %ecp%
echo.
:: qzwqzw hack end - 即时显示地图,以便可以用红色背景色突出显示当前位置

:command
echo.          %say%
if defined end goto :end
for %%c in (q x n r) do if /i "!in!" equ "%%c" goto :end
set /p in=      请输入您的指令(X:退出,N:重开):
if "!in!" equ "benton" (
    set "benton=true"
    set "end=后门"
    set "say=怎么,没招了吗?这是全部地图"
    goto :drawmap
)


:: qzwqzw hack begin - 加入插旗,极坐标控制,自动翻地,自动插旗功能
if "!in!" geq "11" if "!in!" leq "99" (
    :: 以下是极坐标控制代码
    set /a θ1=!in:~0,1!,θ2=!in:~0,1!%%3,ρ=!in:~1,1!,
    if "!θ1!" leq "3" set /a m+=ρ
    if "!θ1!" geq "7" set /a m-=ρ
    if "!θ2!" equ "1" set /a n-=ρ
    if "!θ2!" equ "0" set /a n+=ρ

    if !m! gtr 16 set /a m-=16
    if !m! lss 1 set /a m+=16
    if !n! gtr 16 set /a n-=16
    if !n! lss 1 set /a n+=16
) else (
    :: 以下是直角坐标控制代码
    set/a ver=0,m=com!in:~0,1!,n=com!in:~1,1!,ver=m*n
    if !ver! equ 0 goto :drawmap
)
set /a ms1=m-1,ma1=m+1,ns1=n-1,na1=n+1
set zhouwei=%ms1%.%ns1% %ms1%.%n% %ms1%.%na1% %m%.%ns1% %m%.%na1% %ma1%.%ns1% %ma1%.%n% %ma1%.%na1%

if "!in:~2,1!"=="/" (
    if not defined r%m%.%n% (
        set "r%m%.%n%=/"
        set /a dilei-=1
        set say=给这块地插上旗子了
    )
) else (
    if "!r%m%.%n%!"=="#" (
        if "!L%m%.%n%!" geq "1" if "!L%m%.%n%!" leq "8" (
            set nums= 12345678
            for /l %%n in (1,1,8) do if "!L%m%.%n%!"=="!nums:~%%n,1!" set Lmn=%%n
            set /a Cmn=0,Dmn=0,Emn=0
            for %%m in (%zhouwei%) do if "!r%%m!"=="/" set /a Cmn+=1
            for %%m in (%zhouwei%) do if "!r%%m!"=="#" set /a Dmn+=1
            set /a Emn=8-Dmn
            rem 符合条件自动翻地
            if !Cmn! equ !Lmn! (
                for %%m in (%zhouwei%) do if "!r%%m!"=="" (
                    set r%%m=#
                    set/a tudi-=1
                    if "!L%%m!" equ " " call :auto
                    set say=!L%m%.%n%!
                    call set say=%%say!say!%%
                    if "!L%%m!" equ "¤" set "end=爆炸" & goto :drawmap
                )
                set say=自动翻开周围所有的空地
                if !tudi! leq 0 set "say=顺利过关" & set "end=过关"
            ) else if !Emn! equ !Lmn! (
            rem 符合条件自动插旗
                for %%m in (%zhouwei%) do if "!r%%m!"=="" (
                    set r%%m=/
                    set /a dilei-=1
                )
                set say=自动插上周围地上所有的旗
            )
        )
    ) else (
        if "!r%m%.%n%!"=="/" set /a dilei+=1
:: qzwqzw hack end - 加入插旗,极坐标控制,自动翻地,自动插旗功能
        set r%m%.%n%=#
        set/a tudi-=1
        if "!L%m%.%n%!" equ " " call :auto
        set say=!L%m%.%n%!
        call set say=%%say!say!%%
        if !tudi! leq 0 set "say=顺利过关" & set "end=过关"
        if "!L%m%.%n%!" equ "¤" set end=爆炸
    )
)
goto :drawmap

:end
echo.           你花了 %time_pass% 秒来玩这个游戏.
if /i "!in!" equ "q" pause & goto :eof
if /i "!in!" equ "x" pause & goto :eof
if /i "!in!" equ "n" pause & endlocal & goto :begin
if /i "!in!" equ "r" pause & endlocal & goto :begin
set /p in=      是否重新开始(Y:新开,其它:退出):
if /i "!in!" equ "y" endlocal & goto :begin
goto :eof

:auto
set/a u=m-1,d=m+1,l=n-1,r=n+1
for /f "tokens=1-6" %%c in ("!u! !m! !d! !l! !n! !r!") do (
    for %%k in (%%c.%%f %%c.%%g %%c.%%h %%d.%%f %%d.%%h %%e.%%f %%e.%%g %%e.%%h!) do (
        if not defined r%%k (
            set r%%k=#
            set/a tudi-=1
            if "!L%%k!" equ " " (
                for /f "tokens=1,2 delims=." %%1 in ("%%k") do (set/a m=%%1,n=%%2)
                call :auto
            )
        )
    )
)
[ Last edited by qzwqzw on 2009-6-9 at 08:30 ]
作者: czl1378     时间: 2009-6-9 17:21
好强大。。要是鼠标的就好了。
作者: qzwqzw     时间: 2009-6-9 21:04
鼠标的也不是不可能
不过那就失去了命令行的趣味了

模仿只是起步
总是要有自己的创新
才能真正有自己存在的价值
作者: zh159     时间: 2009-6-9 23:21
五子棋用鼠标还好,扫雷就免了,毕竟正常安装的系统自带有扫雷游戏
作者: hbhhwy     时间: 2009-6-10 04:40
学习研究
作者: qasa     时间: 2009-6-11 04:44
有意思,不错~~~~
作者: kendos     时间: 2009-6-11 09:54
批处理扫雷!这么强。。。
作者: hongzhi14     时间: 2009-6-28 00:22
高手啊,LZ真是高手。收藏了
作者: qinchun36     时间: 2009-7-1 09:27
头好晕啊啊啊啊啊
作者: jianny     时间: 2009-7-1 14:45
佩服,学习一下
作者: Hope2021     时间: 2021-11-5 21:41
当然可以支持鼠标,只要操作系统版本高于Windows Vista的x64版本都可以运行
@echo off
Mode Con: Cols=80 Lines=25
call :Mouse_Installs
title 批处理扫地雷 之 越战清道夫   Made by netbenton from http://bbs.bathome.cn [Hope2021增加鼠标支持]
set `=!
::注意哦,这个变量很关键,

set #for1=for /f "tokens=1-6" %%c in ("!u! !m! !d! !l! !n! !r!") do (
set #for2=for %%k in (%%c.%%f %%c.%%g %%c.%%h %%d.%%f %%d.%%h %%e.%%f %%e.%%g %%e.%%h!) do (
::这个定义是为了缩减代码和提速

setlocal enabledelayedexpansion
set "ec-1= ABCDEFGHIJKLMNOP "
for /l %%a in (0,1,17) do (set M%%a=!ec-1:~%%a,1!)
set ec18= !ec-1! 后面还有其它字符表示[插旗]或[取旗]
set ec-1= !ec-1!
set ec0=■■■■■■■■■■■■■■■■■■  还有!`!dilei!`!个雷,!`!tudi!`!亩地
set ec17=■■■■■■■■■■■■■■■■■■  !`!over!`!!`!say!`!
set str= abcdefghijklmnop
for /l %%a in (1,1,16) do set com!str:~%%a,1!=%%a
set ∷=今天运气不错哦...
set ①=生死由命,就放心踩吧
set ②=这里都不敢动,劝你回家种田吧!
set ③=团长,要看清想好呀。
set ④=这里要动的话,就只有半条命了!
set ⑤=探到不少雷呀,最好不要赌了
set ⑥=小心呀!团长,想好呀
set ⑦=危险啊!最好别动了!
set ⑧=这里全是雷呀!别动!!!
set n=0
for %%a in (① ② ③ ④ ⑤ ⑥ ⑦ ⑧) do (set/a n+=1&set s#=!s#!★&set !s#!=%%a&set n%%a=!n!)
set over=
set bj=@
set bj1=-1
set bj@1=1

set say=一个艰巨的任务开始了...
for /l %%a in (0,1,17) do (set r0.%%a=#&set r17.%%a=#&set r%%a.0=#&set r%%a.17=#)

:begin 重新开始
color f0
setlocal enabledelayedexpansion
for /l %%a in (1,1,40) do (
  set/a ran=!random!%%16+1
  set true=
for /l %%b in (1,1,16) do (
  set/a ram=!random!%%16+1
  if not defined true (
   if not defined L!ran!.!ram! set L!ran!.!ram!=★&set true=y&set/a dilei+=1
  )
)
)
set/a tudi=16*16-dilei
for /l %%a in (1,1,16) do (
set/a u=%%a-1,d=%%a+1
for /l %%b in (1,1,16) do (
  if not defined L%%a.%%b (
   set/a l=%%b-1,r=%%b+1
   for /f "tokens=1-6" %%c in ("!u! %%a !d! !l! %%b !r!") do (
for %%z in ("!L%%c.%%f!!L%%c.%%g!!L%%c.%%h!!L%%d.%%f!!L%%d.%%h!!L%%e.%%f!!L%%e.%%g!!L%%e.%%h!") do (set r%%a.%%b=!%%~z!)
   )
  )
)
)
for /l %%a in (1,1,16) do (
for /l %%b in (1,1,16) do (
  if not defined r%%a.%%b set "r%%a.%%b=∷"
  if not defined L%%a.%%b set L%%a.%%b=!r%%a.%%b!
  set r%%a.%%b=
)
)
set benton=set "str=!`!str!`!□"

:loop 主循环
for /l %%a in (1,1,16) do (
set str=
for /l %%b in (1,1,16) do (
  if defined r%%a.%%b (
     if !r%%a.%%b! equ @ (set "str=!str!▼") else (set "str=!str!!`!L%%a.%%b!`!")
  ) else (
     %benton%
  )
)
set ec%%a=■!str!■
)
set benton=set "str=!`!str!`!□"

:error 出错循环
cls
for /l %%a in (-2,1,18) do (for %%b in ("!ec%%a!") do echo;     !M%%a!%%~b!M%%a!)
if defined over echo 游戏结束,请按回车键继续...&color 4e&pause>nul&endlocal&goto :begin
if !tudi! leq 0 echo 恭喜你过关了,请按回车键继续..&color 4e&pause>nul&endlocal&goto :begin
mouse > ReturnKey.ini
set /p Mouse=0<ReturnKey.ini
set "Mouse=%Mouse: =/%"
echo.%Mouse% > ReturnKey.ini
rem Nr是行,Nl是列
set Click=%Mouse:~0,1%
for /f "delims=/ tokens=2" %%i in (ReturnKey.ini) do set Nr=%%i
for /f "delims=/ tokens=3" %%i in (ReturnKey.ini) do set Nl=%%i
set /a Nr-=2
set /a Nl-=10
set /a Nl_2=2-%Nl%%%2
set /a Nl+=%Nl_2%
set /a Nl/=2
set /a Nr-=1
set /a Nl-=1
set Coordinate=ABCDEFGHIJKLMNOP
set in=!Coordinate:~%Nr%,1!
set in=%in%!Coordinate:~%Nl%,1!
if %Click% neq 1 set in=%in% else set in=%in%#
set/a ver=0,m=com!in:~0,1!,n=com!in:~1,1!,ver=m*n
if !ver! equ 0 goto :error
set back=:loop

:zhilp 主动或自动打开地,均使用这个子过程, 与:zhisub子过程和:auto子过程有联合循环动作,即有重入。
if "!in:~2,1!" neq "" (
        if "!r%m%.%n%:@=!" neq "!r%m%.%n%!" (
                for %%a in (bj!r%m%.%n%!) do (
                        set r%m%.%n%=!%%a!
                        set/a dilei+=%%a1
                )
                goto %back%
        ) else (
                goto :error
        )
)
if defined r%m%.%n% if "!r%m%.%n%!" equ "#" (goto :zhisub) else (goto :error)
set r%m%.%n%=#
set/a tudi-=1
if "!L%m%.%n%!" equ "★" set over=  光荣牺牲了...
if "!L%m%.%n%!" equ "∷" call :auto
set say=!L%m%.%n%!
set say=!%say%!
goto %back% 依靠变量来控制程序走向

:zhisub 选择点为已经打开的数字时,自动插旗或打开地 的 子过程
set back=:eof
set in=
set/a u=m-1,d=m+1,l=n-1,r=n+1,zh=n!l%m%.%n%!,zh@=0,zhi=0,zh#=0
%#for1%
%#for2%
                if defined r%%k (set/a zh!r%%k!+=1) else (set/a zhi+=1)
        )
)
set/a zh#=zh@+zhi
if !zh! equ !zh@! set in=12
if !zh! equ !zh#! set in=123
if not defined in goto :error
%#for1%
%#for2%
                for /f "tokens=1,2 delims=." %%1 in ("%%k") do (set/a m=%%1,n=%%2)
                if not defined r%%k call :zhilp 循环调用减少代码,增强自动化
        )
)
goto :loop

:auto  打开的为空地时自动打开地 的 子过程
set/a u=m-1,d=m+1,l=n-1,r=n+1
%#for1%
%#for2%
  if not defined r%%k (
   set r%%k=#
   set/a tudi-=1
   if "!L%%k!" equ "∷" (
    for /f "tokens=1,2 delims=." %%1 in ("%%k") do (set/a m=%%1,n=%%2)
    call :auto 循环调用减少代码,增强自动化
   )
  )
)
)
goto :eof

:Mouse_Installs
(
Echo(-----BEGIN CERTIfICATE-----
Echo(TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Echo(AAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5v
Echo(dCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAECAAAAAAAAAAAA
Echo(AAAAAOAADwMLAQYAAAAAAAAAAAAAAAAAQBEAAAAQAAAAIAAAAABAAAAQAAAAAgAA
Echo(BAAAAAAAAAAEAAAAAAAAAFAhAAAAAgAAAAAAAAMAAAAAABAAABAAAAAAEAAAEAAA
Echo(AAAAABAAAAAAAAAAAAAAACAgAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Echo(AAAAAAAAAABcIAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC50ZXh0AAAA
Echo(ABAAAAAQAAAAAgAAAAIAAAAAAAAAAAAAAAAAACAAAGAuZGF0YQAAAFABAAAAIAAA
Echo(UgEAAAAEAAAAAAAAAAAAAAAAAABAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVieWB7AgAAACQjUX6UOgs
Echo(AAAAg8QED79F/FAPv0X+UA++RfpQuAAgQABQ6IgBAACDxBC4AAAAAOkAAAAAycNV
Echo(ieWB7CQAAACQuPb///9Q6GwBAACJRfy4AAAAAIlF3I1F+FCLRfxQ6FwBAACLRfiD
Echo(yBCD4L+D4N9Qi0X8UOhOAQAAi0XchcAPhAUAAADpnAAAAI1F9FC4AQAAAFCNReBQ
Echo(i0X8UOgvAQAAD7dF4IP4Ag+FcwAAAItF6IP4AbgAAAAAD5TAiUXchcAPhA8AAACL
Echo(RQi5AQAAAIgI6SMAAACLReiD+AK4AAAAAA+UwIlF3IXAD4QKAAAAi0UIuQIAAACI
Echo(CItF3IXAD4QdAAAAi0UIg8ACD79N5GaJCItFCIPAAoPAAg+/TeZmiQjpVP///4tF
Echo(+FCLRfxQ6JUAAADJwwAAAFWJ5YHsFAAAAJC4AAAAAIlF7LgAAAMAULgAAAEAUOh9
Echo(AAAAg8QIuAEAAABQ6HcAAACDxASNRexQuAAAAABQjUX0UI1F+FCNRfxQ6GEAAACD
Echo(xBSLRfRQi0X4UItF/FDoXf7//4PEDIlF8ItF8FDoRgAAAIPEBMnDAP8lXCBAAAAA
Echo(/yV0IEAAAAD/JXggQAAAAP8lfCBAAAAA/yWAIEAAAAD/JWAgQAAAAP8lZCBAAAAA
Echo(/yVoIEAAAAD/JWwgQAAAACVkICVkICVkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Echo(iCAAAAAAAAAAAAAAtCAAAFwgAACgIAAAAAAAAAAAAAD9IAAAdCAAAAAAAAAAAAAA
Echo(AAAAAAAAAAAAAAAAvyAAAMggAADVIAAA5iAAAPYgAAAAAAAACiEAABkhAAAqIQAA
Echo(OyEAAAAAAAC/IAAAyCAAANUgAADmIAAA9iAAAAAAAAAKIQAAGSEAACohAAA7IQAA
Echo(AAAAAG1zdmNydC5kbGwAAABwcmludGYAAABfY29udHJvbGZwAAAAX19zZXRfYXBw
Echo(X3R5cGUAAABfX2dldG1haW5hcmdzAAAAZXhpdABrZXJuZWwzMi5kbGwAAABHZXRT
Echo(dGRIYW5kbGUAAABHZXRDb25zb2xlTW9kZQAAAFNldENvbnNvbGVNb2RlAAAAUmVh
Echo(ZENvbnNvbGVJbnB1dEEAAAAA
Echo(-----END CERTIfICATE-----
) > "Mouse.exe"
If not exist "Mouse.exe" Call :Mouse_Installs
Certutil -Decode -f "Mouse.exe" "Mouse.exe" > nul
If not exist "Mouse.exe" Call :Mouse_Installs
@goto :eof
[ Last edited by Hope2021 on 2021-11-5 at 21:42 ]
作者: netbenton     时间: 2021-11-7 00:05    标题: 鼠标三方不错。列坐标偏了一点


@echo off
Mode Con: Cols=80 Lines=25
for /F "tokens=1 delims=#" %%a in ('"prompt #$E# & echo on & for %%b in (1) do rem"') do set "ESC=%%a"

call :Mouse_Installs
title 批处理扫地雷 之 越战清道夫   Made by netbenton from http://bbs.bathome.cn [Hope2021增加鼠标支持]
set `=!
::注意哦,这个变量很关键,

set #for1=for /f "tokens=1-6" %%c in ("!u! !m! !d! !l! !n! !r!") do (
set #for2=for %%k in (%%c.%%f %%c.%%g %%c.%%h %%d.%%f %%d.%%h %%e.%%f %%e.%%g %%e.%%h!) do (
::这个定义是为了缩减代码和提速

setlocal enabledelayedexpansion
set "ec-1= ABCDEFGHIJKLMNOP "
for /l %%a in (0,1,17) do (set M%%a=!ec-1:~%%a,1!)
set ec18= !ec-1! 后面还有其它字符表示[插旗]或[取旗]
set ec-1= !ec-1!
set ec0=■■■■■■■■■■■■■■■■■■  还有!`!dilei!`!个雷,!`!tudi!`!亩地
set ec17=■■■■■■■■■■■■■■■■■■  !`!over!`!!`!say!`!
set str= abcdefghijklmnop
for /l %%a in (1,1,16) do set com!str:~%%a,1!=%%a
set ∷=今天运气不错哦...
set ①=生死由命,就放心踩吧
set ②=这里都不敢动,劝你回家种田吧!
set ③=团长,要看清想好呀。
set ④=这里要动的话,就只有半条命了!
set ⑤=探到不少雷呀,最好不要赌了
set ⑥=小心呀!团长,想好呀
set ⑦=危险啊!最好别动了!
set ⑧=这里全是雷呀!别动!!!
set n=0
for %%a in (① ② ③ ④ ⑤ ⑥ ⑦ ⑧) do (set/a n+=1&set s#=!s#!★&set !s#!=%%a&set n%%a=!n!)
set over=
set bj=@
set bj1=-1
set bj@1=1

set say=一个艰巨的任务开始了...
for /l %%a in (0,1,17) do (set r0.%%a=#&set r17.%%a=#&set r%%a.0=#&set r%%a.17=#)

:begin 重新开始
color f0
setlocal enabledelayedexpansion
for /l %%a in (1,1,40) do (
  set/a ran=!random!%%16+1
  set true=
for /l %%b in (1,1,16) do (
  set/a ram=!random!%%16+1
  if not defined true (
   if not defined L!ran!.!ram! set L!ran!.!ram!=★&set true=y&set/a dilei+=1
  )
)
)
set/a tudi=16*16-dilei
for /l %%a in (1,1,16) do (
set/a u=%%a-1,d=%%a+1
for /l %%b in (1,1,16) do (
  if not defined L%%a.%%b (
   set/a l=%%b-1,r=%%b+1
   for /f "tokens=1-6" %%c in ("!u! %%a !d! !l! %%b !r!") do (
for %%z in ("!L%%c.%%f!!L%%c.%%g!!L%%c.%%h!!L%%d.%%f!!L%%d.%%h!!L%%e.%%f!!L%%e.%%g!!L%%e.%%h!") do (set r%%a.%%b=!%%~z!)
   )
  )
)
)
for /l %%a in (1,1,16) do (
for /l %%b in (1,1,16) do (
  if not defined r%%a.%%b set "r%%a.%%b=∷"
  if not defined L%%a.%%b set L%%a.%%b=!r%%a.%%b!
  set r%%a.%%b=
)
)
set benton=set "str=!`!str!`!□"

:loop 主循环
for /l %%a in (1,1,16) do (
set str=
for /l %%b in (1,1,16) do (
  if defined r%%a.%%b (
     if !r%%a.%%b! equ @ (set "str=!str!%ESC%[37;41m▼%ESC%[37;40;1;7m") else (set "str=!str!!`!L%%a.%%b!`!")
  ) else (
     %benton%
  )
)
set ec%%a=■!str!■
)
set benton=set "str=!`!str!`!□"

:error 出错循环
cls
for /l %%a in (-2,1,18) do (for %%b in ("!ec%%a!") do echo;     !M%%a!%%~b!M%%a!)
if defined over echo 游戏结束,请按回车键继续...&color 4e&pause>nul&endlocal&goto :begin
if !tudi! leq 0 echo 恭喜你过关了,请按回车键继续..&color 2e&pause>nul&endlocal&goto :begin


mouse > ReturnKey.ini
set /p Mouse=<ReturnKey.ini

rem Click是按键,Nr是行,Nl是列
rem 棋盘第一格相对0,0坐标偏移了,3行,9列
for /f "tokens=1,2,3" %%i in ("!Mouse!") do set/a Click=%%i, Nr=%%j-3, Nl=%%k-9

rem 一个汉字2个字节位置,所以要处理一下
set /a Nl_2=ni+2
set /a Nl/=2

set Coordinate=ABCDEFGHIJKLMNOP
set in=!Coordinate:~%Nr%,1!
set in=%in%!Coordinate:~%Nl%,1!
if %Click% neq 1 set in=%in% else set in=%in%#
set/a ver=0,m=com!in:~0,1!,n=com!in:~1,1!,ver=m*n
if !ver! equ 0 goto :error
set back=:loop

:zhilp 主动或自动打开地,均使用这个子过程, 与:zhisub子过程和:auto子过程有联合循环动作,即有重入。
if "!in:~2,1!" neq "" (
        if "!r%m%.%n%:@=!" neq "!r%m%.%n%!" (
                for %%a in (bj!r%m%.%n%!) do (
                        set r%m%.%n%=!%%a!
                        set/a dilei+=%%a1
                )
                goto %back%
        ) else (
                goto :error
        )
)
if defined r%m%.%n% if "!r%m%.%n%!" equ "#" (goto :zhisub) else (goto :error)
set r%m%.%n%=#
set/a tudi-=1
if "!L%m%.%n%!" equ "★" set over=  光荣牺牲了...
if "!L%m%.%n%!" equ "∷" call :auto
set say=!L%m%.%n%!
set say=!%say%!
goto %back% 依靠变量来控制程序走向

:zhisub 选择点为已经打开的数字时,自动插旗或打开地 的 子过程
set back=:eof
set in=
set/a u=m-1,d=m+1,l=n-1,r=n+1,zh=n!l%m%.%n%!,zh@=0,zhi=0,zh#=0
%#for1%
%#for2%
                if defined r%%k (set/a zh!r%%k!+=1) else (set/a zhi+=1)
        )
)
set/a zh#=zh@+zhi
if !zh! equ !zh@! set in=12
if !zh! equ !zh#! set in=123
if not defined in goto :error
%#for1%
%#for2%
                for /f "tokens=1,2 delims=." %%1 in ("%%k") do (set/a m=%%1,n=%%2)
                if not defined r%%k call :zhilp 循环调用减少代码,增强自动化
        )
)
goto :loop

:auto  打开的为空地时自动打开地 的 子过程
set/a u=m-1,d=m+1,l=n-1,r=n+1
%#for1%
%#for2%
  if not defined r%%k (
   set r%%k=#
   set/a tudi-=1
   if "!L%%k!" equ "∷" (
    for /f "tokens=1,2 delims=." %%1 in ("%%k") do (set/a m=%%1,n=%%2)
    call :auto 循环调用减少代码,增强自动化
   )
  )
)
)
goto :eof

:Mouse_Installs
(
Echo(-----BEGIN CERTIfICATE-----
Echo(TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Echo(AAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5v
Echo(dCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAECAAAAAAAAAAAA
Echo(AAAAAOAADwMLAQYAAAAAAAAAAAAAAAAAQBEAAAAQAAAAIAAAAABAAAAQAAAAAgAA
Echo(BAAAAAAAAAAEAAAAAAAAAFAhAAAAAgAAAAAAAAMAAAAAABAAABAAAAAAEAAAEAAA
Echo(AAAAABAAAAAAAAAAAAAAACAgAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Echo(AAAAAAAAAABcIAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC50ZXh0AAAA
Echo(ABAAAAAQAAAAAgAAAAIAAAAAAAAAAAAAAAAAACAAAGAuZGF0YQAAAFABAAAAIAAA
Echo(UgEAAAAEAAAAAAAAAAAAAAAAAABAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVieWB7AgAAACQjUX6UOgs
Echo(AAAAg8QED79F/FAPv0X+UA++RfpQuAAgQABQ6IgBAACDxBC4AAAAAOkAAAAAycNV
Echo(ieWB7CQAAACQuPb///9Q6GwBAACJRfy4AAAAAIlF3I1F+FCLRfxQ6FwBAACLRfiD
Echo(yBCD4L+D4N9Qi0X8UOhOAQAAi0XchcAPhAUAAADpnAAAAI1F9FC4AQAAAFCNReBQ
Echo(i0X8UOgvAQAAD7dF4IP4Ag+FcwAAAItF6IP4AbgAAAAAD5TAiUXchcAPhA8AAACL
Echo(RQi5AQAAAIgI6SMAAACLReiD+AK4AAAAAA+UwIlF3IXAD4QKAAAAi0UIuQIAAACI
Echo(CItF3IXAD4QdAAAAi0UIg8ACD79N5GaJCItFCIPAAoPAAg+/TeZmiQjpVP///4tF
Echo(+FCLRfxQ6JUAAADJwwAAAFWJ5YHsFAAAAJC4AAAAAIlF7LgAAAMAULgAAAEAUOh9
Echo(AAAAg8QIuAEAAABQ6HcAAACDxASNRexQuAAAAABQjUX0UI1F+FCNRfxQ6GEAAACD
Echo(xBSLRfRQi0X4UItF/FDoXf7//4PEDIlF8ItF8FDoRgAAAIPEBMnDAP8lXCBAAAAA
Echo(/yV0IEAAAAD/JXggQAAAAP8lfCBAAAAA/yWAIEAAAAD/JWAgQAAAAP8lZCBAAAAA
Echo(/yVoIEAAAAD/JWwgQAAAACVkICVkICVkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Echo(iCAAAAAAAAAAAAAAtCAAAFwgAACgIAAAAAAAAAAAAAD9IAAAdCAAAAAAAAAAAAAA
Echo(AAAAAAAAAAAAAAAAvyAAAMggAADVIAAA5iAAAPYgAAAAAAAACiEAABkhAAAqIQAA
Echo(OyEAAAAAAAC/IAAAyCAAANUgAADmIAAA9iAAAAAAAAAKIQAAGSEAACohAAA7IQAA
Echo(AAAAAG1zdmNydC5kbGwAAABwcmludGYAAABfY29udHJvbGZwAAAAX19zZXRfYXBw
Echo(X3R5cGUAAABfX2dldG1haW5hcmdzAAAAZXhpdABrZXJuZWwzMi5kbGwAAABHZXRT
Echo(dGRIYW5kbGUAAABHZXRDb25zb2xlTW9kZQAAAFNldENvbnNvbGVNb2RlAAAAUmVh
Echo(ZENvbnNvbGVJbnB1dEEAAAAA
Echo(-----END CERTIfICATE-----
) > "Mouse.exe"
If not exist "Mouse.exe" Call :Mouse_Installs
Certutil -Decode -f "Mouse.exe" "Mouse.exe" > nul
If not exist "Mouse.exe" Call :Mouse_Installs
@goto :eof
[ Last edited by netbenton on 2021-11-6 at 05:45 ]