标题: [其他] [分享]批处理游戏扫雷(纯p版)五子棋(人机对战) [打印本页]
作者: yangfengoo 时间: 2010-2-25 17:55 标题: [分享]批处理游戏扫雷(纯p版)五子棋(人机对战)
申明:本来是想发在原创代码区的,但是进去之后发现那里好像没发帖功能。所以发在这了
扫雷是看春晚是觉得无聊写的,五子棋是写完扫雷后继续无聊写的
1.扫雷 小静静_特别版- @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
复制代码
链接: https://pan.baidu.com/s/1WyCB9epM3VWfGBfducvL7w?pwd=x7rw
作者: yangfengoo 时间: 2010-2-25 17:56 标题: 五子棋(人机对战测试版)
2.五子棋(人机对战测试版)::刚刚搜了下发现写这个的人有几个。欢迎拍砖- @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
复制代码
链接: https://pan.baidu.com/s/1SYR_LKQZ0LPkPWJz_gv5vA?pwd=ati4
作者: 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
太太太太厉害了!
坛长小号一样的存在
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |