批处理之家's Archiver

yangfengoo 发表于 2010-2-25 17:55

[分享]批处理游戏扫雷(纯p版)五子棋(人机对战)

申明:本来是想发在原创代码区的,但是进去之后发现那里好像没发帖功能。所以发在这了
    扫雷是看春晚是觉得无聊写的,五子棋是写完扫雷后继续无聊写的

1.扫雷 小静静_特别版
[code]
@echo off&setlocal enabledelayedexpansion
title  …扫雷(¤)…By-VBT6_村庄 #小静静_特别版
rem 于2010年春晚节目间开始构思制作,于2010#2#15晚完成1.0版。
:starts
color f0&mode con cols=70 lines=20
set zm=A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P
set lei=¤&set qi=♀&cls&call :sysm&echo.
echo.版本说明:
echo.。。输入兼容(如:A3;a3;3a;3A)均代表同一坐标点
echo.。。支持一次多个输入,以空格间隔(格式为:1a 2a 3a bj4d cx5f)。
echo.。。请按格式输入,错误输入可能造成未知错误。
echo.。。本版本为小静静特别制作。赢了有奖励哦!
echo.。。本版本未作严格测试,部分算法尚未完善,BUG在所难免,欢迎指正!
echo.。。最后您有任何意见或疑问可以向117609665@qq.com提出或咨询!
echo.                                   By-村庄,于2010#2#17晚。
:::::还有其他功能和便捷操作未作详述,当做小彩蛋自己发掘吧。:::::
echo.&set /p qijing=请选择难度(r:容易—9×9 y:困难—16×16 其他:默认-12×12)#
set hb=!qijing:~0,1!&set js=!qijing:~1!
set jslv=16&for /l %%a in (10 1 30) do if %%a==!js! set /a jslv=%%a
if !hb!==r (set nd_=9&set zm=!zm:~0,33!&mode con cols=45 lines=28&set kg=      ) else (
    if !hb!==y (set nd_=16&mode con cols=70 lines=40&set kg=                    ) else (
     set nd_=12&set zm=!zm:~0,45!&mode con cols=55 lines=32&set kg=         )
  )   
cls&set /a nd#=!nd_!*!nd_!
::初始表
set h1=┳━&set h2=╋━&set h3=┻━
set a1=&set a2=&set a3=&set hb=&set js=0
for /l %%a in (1,1,3) do for /l %%i in (2,1,!nd_!) do set a%%a=!a%%a!!h%%a!
for /l %%a in (1,1,!nd_!) do set hb=!hb!┃▓
for /l %%a in (1 1 !nd#!) do set bj%%a=▓&set bj_%%a=
::布雷,默认16%
for /l %%i in (2,1,!nd#!) do (set /a s=!random!%%100&if !s! lss !jslv! set bj_%%i=¤)
::标准数据
set js_lei=0
for /l %%a in (1 1 !nd#!) do if !bj_%%a!==¤ (set /a js_lei+=1) else (set pp=0&call :sjk %%a
    for /l %%b in (!_1!,1,!_2!) do if !x%%b! gtr 0 if !x%%b! leq !nd#! for %%c in (!x%%b!) do if !bj_%%c!==¤ set /a pp+=1
    set "bj_%%a=!pp! ")
::查看标准数据可以使用cd.>bjsj.txt&for /l %%a in (1 1 !nd#!) do echo bj_%%a=!bj_%%a!>>bjsj.txt
call :huabiao xx 画初始表
::游戏开始
:yxks
echo.上次输入#!qijing! #%1 %2
set /p qijing=请输入坐标(如:3a;标记旗bj3a;撤销标记旗cx3a)  #
for %%a in (!qijing!) do set sr=%%a&call :zbcl
goto yxks
::游戏输入数据处理中心
:zbcl
if /i !sr!==xx (goto starts) else (if /i !sr!==qj (cls&goto qj) else (if /i !sr!==sm cls&call :sysm&call :qj))
if /i "!sr:~0,2!"=="bj" (set sr=!sr:~2!&call :chuli 11) else (
      if /i "!sr:~0,2!"=="cx" (set sr=!sr:~2!&call :chuli 22) else call :chuli)
goto :eof   
:chuli
call :zb
for %%a in (!shu!) do (
   if "%1"=="" (if "!bj%%a!"=="♀" set /a sx_lei+=1
      set bj%%a=!bj_%%a!&set s=!bj_%%a!
   if "!bj_%%a!"=="0 " set hh=&set js_=0&call :sjk %%a&call :fdg)
   if "%1"=="11" if "!bj%%a!"=="▓" set bj%%a=♀&set /a sx_lei-=1
   if "%1"=="22" if "!bj%%a!"=="♀" set bj%%a=▓&set /a sx_lei+=1
   )
call :huabiao yy
if !sx_lei!==0 call :_ying
if !s!==¤ call :_shu 触雷了
if !sx_lei! lss 0 call :_shu 雷不能为负
goto :eof
:zb
::下面屏蔽部分错误输入,增强兼容性
if not "!sr:~3!"=="" set sr=17z
if "!sr:~0,1!" gtr "9" set sr=!sr:~1!!sr:~0,1!
if !sr:~-1! lss 9 (set sr=17z) else (if !sr:~-1! gtr !zm:~-1! set sr=17z)
set x=!sr:~0,-1!&if !x! gtr !nd_! (set sr=17z) else (if !x! lss 0 set sr=17z)
if !sr!==17z call :yxks 输入中出现错误 请重新输入
::得到坐标对应的数值
set /a shu=(!sr:~0,-1!-1)*!nd_!
for %%a in (!zm!) do set /a shu+=1&if /i "%%a"=="!sr:~-1!" goto :eof
::数据库
:sjk
set /a x2=%1-1&set /a x1=!x2!-!nd_!&set /a x3=!x2!+!nd_!
set /a x7=%1+1&set /a x6=!x7!-!nd_!&set /a x8=!x7!+!nd_!
set /a x4=%1-!nd_!&set /a x5=%1+!nd_!&set /a ww=!x5!%%!nd_!
if !ww!==0 (set _1=1&set _2=5) else (if !ww!==1 (set _1=4&set _2=8) else (set _1=1&set _2=8))
goto :eof
::如果打开的坐标值为“0”,则打开其附近8个坐标.这里最好用递归算法,但本人能力所限不能完成
::写了下面“fdg”;“fangdigui”两个标签基本实现一定条件下仿递归功能
:fdg
if "%1"=="qbbj" set /a js#+=1
for /l %%b in (!_1!,1,!_2!) do if !x%%b! gtr 0 if !x%%b! leq !nd#! for %%c in (!x%%b!) do if "!bj%%c!"=="▓" (
     set bj%%c=!bj_%%c!&if "!bj%%c!"=="0 " set hh=!hh!%%c &set /a js_+=1)
if "!js#!"=="!js_#!" if not "!hh!"=="" call :fangdigui
goto :eof
:fangdigui
set js#=0&set h3=!hh!&set hh=&set js_#=!js_!&set js_=0
for %%a in (!h3!) do call :sjk %%a&call :fdg qbbj
goto :eof
::输
:_shu
msg %username% "#%1#你输了!被小静静打屁屁!js_lei!下"
set /p qijing=你输了!要再来一盘吗?(Y_确定/S_显示答案/其他_退出):
if /i !qijing!==y (goto starts) else (
   if /i !qijing!==s (cls&echo.答案:&echo.
    for /l %%a in (1 1 !nd#!) do set bj%%a=!bj_%%a!
       call :huabiao xx&set/p=按任意键重新开始&goto starts
    ) else exit)
::赢
:_ying
for /l %%a in (1 1 !nd#!) do if "!bj%%a!"=="▓" goto :eof
set js=0&for /l %%a in (1 1 !nd#!) do if !bj%%a!==♀ if !bj_%%a!==¤ set /a js+=1
if !js!==!js_lei! msg %username% " 恭喜你赢了!得到小静静香吻!js_lei!个 "&goto starts
goto :eof
::画表
:huabiao
cls&set _n=1&set _nn=!nd_!&if %1==xx set sx_lei=!js_lei!
echo.!kg!还有$!sx_lei!$雷 ######共有$!js_lei!$雷
echo.###输入:xx重新开始;sm显示使用帮助###
echo     !zm!
echo   ┏━!a1!┓
for /l %%i in (1,1,!nd_!) do (
   if %%i lss 10 (set hs= %%i) else set hs=%%i
   set hb=&for /l %%a in (!_n!,1,!_nn!) do set hb=!hb!┃!bj%%a!
   set /a _n+=!nd_!&set /a _nn+=!nd_!
   echo !hs!!hb!┃
   if not %%i==!nd_! echo   ┣━!a2!┫
)  
echo   ┗━!a3!┛
goto :eof
:: 小静静
:qj
echo.&echo.
echo       _____                 ^&^&^&^&_^) ^)
echo     \/,---^<                ^&^&^&^&\ \
echo     ( )c~c~~@~@            )- - ^&^&\ \     !
echo     C   ^>/                 \^<   ^|^&/     静
echo       \_O/  #哇塞美女!    _`^*-'_/ /   静
echo     ,- ^>o^<-.              / ____ _/   小
echo    /   \/   \            / /\  _)_)  是
echo   / /^|  ^| ^|\ \          / /  )   ^| #我
echo   \ \^|  ^| ^|/ /          \ \ /    ^|
echo    /_/`___^|_\            /_/\____^|
echo      ^|  ^| ^|                  ^\  \^|
echo      ^|  ^| ^|                   `. )
echo      ^|  ^| ^|                   / /
echo      ^|__^|_^|_                 /_/^|
echo      (____)_)                ^|^\_\_
echo. &set/p=按任意键返回&cls&call :huabiao _re&goto yxks
:: 使用说明数据
:sysm
echo.使用说明:
echo....输入坐标打开对应方块(如:3a或a3)
echo....输入标记旗在坐标前加“bj”前缀(如:bj3a或bja3)
echo....撤销标记旗在坐标前加“cx”前缀(如:cx3a或cxa3)
echo....输入“xx”重新开始
goto :eof[/code]

yangfengoo 发表于 2010-2-25 17:56

五子棋(人机对战测试版)

2.五子棋(人机对战测试版)::刚刚搜了下发现写这个的人有几个。欢迎拍砖[code]@echo off&setlocal enabledelayedexpansion
title  …By-VBT6_村庄 #测试版#
:starts
color f0&mode con cols=68 lines=14
set zm=A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P
set hz=●&set bz=◎&set hb=&set szj=╋&set ai=0&set shu=0&set "kg=      "
cls&call :sysm&echo.&set /p sr=默认为选手先手,是否交换(Y/N)#
::初始表
color f0&mode con cols=68 lines=40
for /l %%a in (1,1,16) do set "hb=!hb!┃  "
for /l %%a in (1,1,256) do set "bj_%%a=!szj!"
if /i "!sr!"=="Y" set bj_120=!bz!
call :huabiao

::游戏开始
:yxks
echo.选手上次输入#!sr! #%1   ::   电脑上次输入#!dn_l!!dn_h! #!bz!
shift&shift&set /p sr=请输入坐标(如:3a;a3;A3;3A)#
if /i !sr!==xx (goto starts) else (call :zb)
for /l %%a in (9 -1 1) do set /a s=%%a-1&for %%b in (!s!) do if %%b==0 (set xs%%a=!shu!) else (set xs%%a=!xs%%b!)
set lz=!hz!&call :luozi&call :pdsy
::电脑算法
echo.&echo.!kg!!kg!!kg!电脑正在思考!请稍等…………
set /a x1=1,x2=16,x3=15,x4=17
if "!ai!"=="0" set /a shu=!zb!+1&goto :dnlz
::AI思考过程
for %%x in (1 4 5 6) do (for /l %%a in (1 1 %%x) do if !ai%%a! gtr 0 call :cpu !bz! lp%%x !ai%%a!
for /l %%a in (1 1 %%x) do call :cpu !hz! lp%%x !xs%%a!)
::不符合AI条件,随机在附近落子
:sjlz  
for %%b in (!x1! -!x1! !x2! -!x2! !x3! -!x3! !x4! -!x4!) do (set /a lsbl=!zb!+%%b
   for %%a in (!lsbl!) do if "!bj_%%a!"=="!szj!" set shu=!lsbl!&goto :dnlz)
set /a x1+=1,x2+=16,x3+=15,x4+=17
goto :sjlz
:dnlz
for /l %%a in (9 -1 1) do set /a s=%%a-1&for %%b in (!s!) do if %%b==0 (set ai%%a=!ai!) else (set ai%%a=!ai%%b!)
set lz=!bz!&call :luozi
if !xx!==4 call :pdsy
set /a dn_h=!ai!/16&set /a dn_l=!ai!-(dn_h*16)&set /a dn_h+=1
set s=0&for %%a in (!zm!) do (set /a s+=1&if !s!==!dn_l! set dn_l=%%a)
goto :yxks

::电脑算法
:cpu
for %%a in (4 3 2 1) do (set shu=%3&set js_b=0&set js_h=0&set js_=0&call :_%%a
  for /l %%x in (1 1 5) do (
    if !h1! gtr 0 if !shu! leq 256 for %%b in (!h1! !h2! !h3! !h4! !shu!) do (
if "!bj_%%b!"=="!bz!" (set /a js_b+=1) else (if "!bj_%%b!"=="!hz!" (set /a js_h+=1) else (set /a js_+=1)))
set xx=&call :%2
set js_b=0&set js_h=0&set js_=0&set /a shu+=!bc!&call :_%%a)
)
goto :eof
:lp6
for %%a in (h b) do if !js_%%a!==3 set "xx=3"
if !xx!==3 for %%b in (!h4! !h3! !h2! !h1!) do if "!bj_%%b!"=="!szj!" set shu=%%b&goto :dnlz
for %%a in (h b) do if !js_%%a!==2 set "xx=2"
if !xx!==2 for %%b in (!h3! !h2! !h4!) do if "!bj_%%b!"=="!szj!" set shu=%%b&goto :dnlz
goto :eof
:lp5
for %%a in (h b) do if !js_%%a!==3 set "xx=3"
if !xx!==3 if !js_!==2 (for %%b in (!h1!) do if "!bj_%%b!"=="!szj!" for %%c in (!h4! !h3! !h2!) do if "!bj_%%c!"=="!szj!" set shu=%%c&goto :dnlz
for %%b in (!h3! !h2!) do if "!bj_%%b!"=="!szj!" set shu=%%c&goto :dnlz)
for %%a in (h b) do if !js_%%a!==2 set "xx=2"
if !xx!==2 if !js_!==3 for %%b in (!h3! !h4! !h2!) do if "!bj_%%b!"=="!szj!" set shu=%%b&goto :dnlz
goto :eof
:lp4
for %%a in (h b) do if !js_%%a!==3 set "xx=3"
if !xx!==3 if !js_!==2 for %%b in (!h1!) do if "!bj_%%b!"=="!szj!" for %%c in (!shu!) do if "!bj_%%c!"=="!szj!" set shu=%%c&goto :dnlz
goto :eof
:lp1
for %%a in (h b) do if !js_%%a!==4 set "xx=4"
if !xx!==4 if !js_!==1 for %%b in (!h1! !h2! !h3! !h4! !shu!) do if "!bj_%%b!"=="!szj!" set shu=%%b&goto :dnlz
goto :eof

::落子
:luozi
if !lz!==!bz! set ai=!shu!
for %%a in (!shu!) do if "!bj_%%a!"=="!szj!" (set bj_%%a=!lz!) else (call :yxks 此处已有子)
call :huabiao&goto :eof

:pdsy
set lp=&set zb=!shu!
for %%a in (4 3 2 1) do (set shu=!zb!&set js=0&call :_%%a
for /l %%x in (1 1 5) do (
    for %%b in (!h1! !h2! !h3! !h4! !shu!) do if "!bj_%%b!"=="!lz!" set /a js+=1
    if !js!==5 (set hw=0&for %%b in (!h1! !h2! !h3! !h4! !shu!) do set /a xx=%%b%%16&if !xx! lss 2 set /a hw+=1
       if not !hw!==2 set lp=OK) else (set js=0&set /a shu+=!bc!&call :_%%a))
if !lp!==OK goto _ying
)
goto :eof
:_1
set bc=1&set /a h1=!shu!-4&set /a h2=!h1!+1&set /a h3=!h2!+1&set /a h4=!h3!+1&goto :eof
:_2
set bc=17&set /a h1=!shu!-68&set /a h2=!h1!+17&set /a h3=!h2!+17&set /a h4=!h3!+17&goto :eof
:_3
set bc=15&set /a h1=!shu!-60&set /a h2=!h1!+15&set /a h3=!h2!+15&set /a h4=!h3!+15&goto :eof
:_4
set bc=16&set /a h1=!shu!-64&set /a h2=!h1!+16&set /a h3=!h2!+16&set /a h4=!h3!+16&goto :eof

::判断输赢模块
:_ying
set hw=0&for /l %%a in (1,1,256) do if !bj_%%a!==!lz! set /a hw+=1
if !lz!==!hz! (msg %username% " ###恭喜!你在第"!hw!"手赢了###") else (
  set /a hw+=1&msg %username% " ###小样!你在第"!hw!"手输了###")
set/p=&goto starts

:zb
::下面屏蔽部分错误输入,增强兼容性
set "shu="&if not "!sr:~3!"=="" set shu=-1
if "!sr:~0,1!" gtr "9" set sr=!sr:~1!!sr:~0,1!
if !sr:~-1! lss 9 (set shu=-1) else (if /i !sr:~-1! gtr p set shu=-1)
set x=!sr:~0,-1!&if !x! gtr 16 (set shu=-1) else (if !x! lss 0 set shu=-1)
if !shu! lss 0 (call :huabiao&call :yxks 输入错误)
::正确输入数据坐标
set lie=0&set /a hang=(!sr:~0,-1!-1)*16&set /a hw=!hang!+16
for %%a in (!zm!) do set /a lie+=1&if /i "%%a"=="!sr:~-1!" set /a shu=!hang!+!lie!&goto :eof

::画表模块
:huabiao
cls&set _n=1&set _nn=16
echo.!kg!!kg!     $$$$$选手执黑!hz! 电脑执白:!bz!$$$$$
echo.&echo     !zm!
for /l %%i in (1,1,16) do (
   if %%i lss 10 (set hs= %%i) else set hs=%%i
   set hb#=&for /l %%a in (!_n!,1,!_nn!) do set "hb#=!hb#!!bj_%%a!━"
   set hb#=!hb#:~0,-1!&set /a _n+=16&set /a _nn+=16
   echo !hs! !hb#!
   if %%i lss 16 echo    !hb!)  
goto :eof

::使用说明数据
:sysm
echo.使用说明:
echo....默认为电脑“执白”,选手“执黑”
echo....输入坐标打开对应方块(如:a3)
echo....输入兼容(如:A3;3a;3A;a3)均代表同一坐标点
echo....输入“xx”重新开始
echo....补充说明——考虑到效率,AI只初步对比前3-6个落子情况,并据此作出判断,即使这样反应也有些慢
goto :eof[/code]

523066680 发表于 2010-2-25 21:07

顶,第一个代码图形,梦幻麻将馆的身影……

yangfengoo 发表于 2010-2-25 21:47

梦幻麻将馆没见过,在搜狗输入法你搞出来的

batman 发表于 2010-2-26 09:38

小静静。。。楼主莫非是女孩子?

如果真是女孩子能有如此批处理功底,实在是少见。。。

排处理是不太适合用来写游戏的,建议楼主将精力和能力发挥在解决实际问题上。。。

yangfengoo 发表于 2010-2-26 10:15

回复 5楼 的帖子

汗!我 只是想看美女罢了。
  我只是在家无聊,练手。

chenyulzhh 发表于 2010-2-26 12:28

顶一个。。。都是强人啊。。

asdfghjkl;' 发表于 2020-1-12 16:57

太太太太厉害了!
坛长小号一样的存在

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.