标题: [游戏娱乐] 批处理井字棋(三子棋) [打印本页]
作者: wxcute 时间: 2009-1-7 12:31 标题: 批处理井字棋(三子棋)
又称三子棋。当然玩法可能有多种多样。
搜索了一下,发现小竹兄已经发过一个了。再发个纯当娱乐。
玩法:下子位置对应小键盘。
子数不定,下满为止;
三子连一线取先为胜,横竖斜均可;
下满未有胜者为平局。
批处理简介:
人机对弈,随机选择谁先下;
下完自动进入新一局。
电脑水平一般,因此你可以找到胜的方法;
若选手下错位置电脑也可能赢。
刚发时系统自动把 “<nul” 截掉了,已修正。- ::又叫井字棋
- ::当然玩法上可能会有差别
- ::CODE BY wxcute AT BBS.bathome.net
- @echo off
- mode con lines=12 cols=37
- setlocal enabledelayedexpansion
- for /l %%s in (1,1,7) do set SP= !sp!
- title .%SP%三子棋
-
- goto :start
- ::变量说明
- argument是否显示为提示棋盘的指针
- fate下子总计数
- special是否进行总计数
- Turn更换选手指针
- sub_flag选手指针
- input输入
- record下子记录
- remain剩下的位置
- winflag胜利标记
-
- ::标签说明
- start进入
- newGame新游戏
- begin循环开始
- Machine电脑下子
- T_flash下子棋盘更新
-
- :start
- ::设置棋盘棋子
- set chs1=●
- set chs0=×
- set L7=┏━┳━┳━┓
- set L6=┃7┃8┃9┃
- set L5=┣━╋━╋━┫
- set L4=┃4┃5┃6┃
- set L3=┣━╋━╋━┫
- set L2=┃1┃2┃3┃
- set L1=┗━┻━┻━┛
-
- ::============================================================
- ::开始
- :newGame
- color 72
- setlocal
- set argument=1
- set/a whoFirst=%random%%%2
- set "remain= 1 2 3 4 5 6 7 8 9"
- ::----------------------------------------
- :begin
- cls
- call :show
- ::调用胜负判断
- if "%fate%" geq "5" call :judgeVic
- if defined winflag goto :end
- if "%fate%" geq "9" goto :end
- ::计算下子数与判断下子方
- if not defined special (
- set/a fate+=1,Turn="(whoFirst+fate+1)%%2"
- ) else set special=
- if %Turn% equ 0 goto :Machine
-
- ::下子
- set sub_flag=%Turn%
- set input=
- set/p input=%SP:~3%等待您的选择:
- if not defined input goto :judgeIn
- if %input% lss 1 goto :judgeIn
- if %input% gtr 9 goto :judgeIn
- if defined _%input% (
- :judgeIn
- call :err
- set special=1
- goto :begin
- )
- goto :T_flash
-
- ::电脑下子
- :Machine
- set sub_flag=%Turn%
- if %fate% gtr 1 call :PCI
- ::电脑随机下子
- :PCR
- set Rc=
- if defined bN (set/a Rc=%random%%%bN) else set/a Rc="%random%%%(9-fate)"
- if not defined Best set Best=%remain: =%
- set input=!Best:~%Rc%,1!
- set/p=%SP:~3%电脑正在思考 <nul
- set "cir=/-\|"
- set CN=&set cirN=
- :lp
- if "%cirN%" geq "4" set/a cirN=0,CN+=1
- set/p=!cir:~%cirN%,1!<nul
- set/a cirN+=1
- ping -n 1 127.1>nul
- if "%CN%" leq "3" goto :lp
-
- ::下子后棋盘更新
- :T_flash
- set _%input%=%sub_flag%
- set record=%record%%input%
- set remain=!remain:%input%=!
- set/a m=(input-1)/3+1,n=(input-1)%%3+1
- set/a m2=m*2,n2=n*2,ln=n2-1
- set LL=!L%m2%!
- set/a pie="(sub_flag+whoFirst)%%2"
- set L%m2%=!LL:~,%ln%!!chs%pie%!!LL:~%n2%!
- goto :begin
- ::----------------------------------------
-
- ::结果显示
- :end
- set player1=你&set color1=color 3a
- set player0=电脑&set color0=color 7e
- if defined winflag (echo.%SP:~1%!player%sub_flag%!赢了。&!color%sub_flag%!) else echo.%SP%平局。
- set/p=%sp:~3%按任意键重来……<nul
- pause>nul
- endlocal
- goto :newGame
- ::============================================================
-
- ::调用标签
- ::显示棋盘
- :show
- echo+
- for /l %%i in (7 -1 1) do echo %SP:~2%!L%%i!
- if defined argument (
- set argument=
- set L=%L2:~,1%
- set L2=!L! !L! !L! !L!
- set L4=!L2!
- set L6=!L2!
- )
- goto :eof
-
- ::错误
- :err
- echo 输入错误,或该位置上已有棋子。请重新输入……
- ping -n 2 127.1>nul
- goto :eof
-
- ::结束判断,胜负平
- ::最笨的列举法
- :judgeVic
- for %%i in (123 456 789 147 258 369 159 357) do (
- set had=%%i
- set had=!had:~,1! !had:~1,1! !had:~-1!
- for /f "tokens=1-3" %%j in ("!had!") do (
- if "!_%%j!!_%%k!!_%%l!"=="%sub_flag%%sub_flag%%sub_flag%" set winflag=%sub_flag%
- )
- )
- goto :eof
-
- ::电脑智能下子
- :PCI
- ::echo Remain%remain%
- set/a _subFlag=(sub_flag+1)%%2
- set bN=
- set ept=&set Epx=
- set Best=
- set input=
- set d_3flag=
- for %%c in (%remain%) do (
- set d1=&set d2=&set d3=
- set d_1=&set d_2=&set d_3=
- for %%i in ("1 2 3" "4 5 6" "7 8 9" "1 4 7" "2 5 8" "3 6 9" "1 5 9" "3 5 7") do (
- set isFlag=
- set noFlag=&set _noFlag=
- set/a baseN=1,_baseN=1
- for %%j in (%%~i) do (
- if "%%j"=="%%c" set isFlag=1
- if "!_%%j!"=="%_subFlag%" set/a noFlag=1,_baseN+=1
- if "!_%%j!"=="%sub_flag%" set/a baseN+=1,_noFlag=1
- )
- if defined isFlag (
- if not defined noFlag set/a d!baseN!+=1
- if not defined _noFlag set/a d_!_baseN!+=1
- )
- if defined d3 set Best=%%c&set bN=1&goto :eof
- if defined d_3 set d_3flag=%%c
- )
- set/a ept=baseN+d!baseN!+_baseN+d_!_baseN!
- if "!Epx!" equ "!ept!" set Best=%%c!Best!&set/a bN+=1
- if "!Epx!" lss "!ept!" set Epx=!ept!&set Best=%%c&set bN=1
- )
- if defined d_3flag set Best=%d_3flag%&set bN=1
- goto :eof
复制代码
作者: coolhui 时间: 2009-1-8 01:23
哇,代码好长啊,研究下,楼主辛苦了·~~
作者: 523066680 时间: 2009-1-14 08:22
我又上线了。。。
我的想法:
也想过写这个东西,已开始想的是利用 九宫格 判断输赢
因为九宫格是横竖斜 相加都=15 的 这个特性可以利用。剩下的就是细节部分
定义a1-a9 , 被下的那个去掉定义,
o第一步,用户下
x1 随机下,给用户一个“走两条路” 的机会
o2
x2 假如15-o1-o2=一个定义的an 说明o再下一个就一线了,....
若=一个没有意义的an 则x2走自己的路
......
暂时就是这些,我就不打算做了。我做了也没人看。倍感孤独,上网,仍感孤独。
建议这个跟def合作做一个 因为def做的五子棋不支持人机对战
这个虽然小型,但是也具有娱乐性,我很喜欢。
另外,我发现技术小组成员好像没搞过什么活动,是不是考虑什么时候找个主题
大家合力打造一个大大的batch? 觉得这个组织好像散散的。。。
另外,觉得def的鼠标.exe 可以做一个打地鼠的游戏。。。。。。
作者: Batcher 时间: 2009-1-14 11:43 标题: 回复 3楼 的帖子
等管理员出差回来以后,会指定一些措施,参考:
http://bbs.bathome.net/thread-2754-1-1.html
作者: wxcute 时间: 2009-1-14 12:13
代码智能下子部分故意留了个小漏洞
合作事宜困难重重。
作者: 523066680 时间: 2009-1-21 09:38
[管理员出差] 了?
真郁闷哟。。我可以上十几天网了。美好时光。。。。
作者: CrLf 时间: 2011-5-22 21:04
我从昨晚开始也在编写井字棋,前面都很简单,唯独到了ai部分没有了方向,若只是随机落子倒是简单,可是井字棋的特点是至少思考3层才不会忽略最优落子,但是我换了各种方法,可惜越写越乱,脑子已经成了浆糊
先把双人版的发上来,今天看到这个帖子才发现思路又和523066680兄撞车了(看来咱俩格外有缘...):- @echo off&setlocal enabledelayedexpansion
- set /a str=1492357816,xs=1,xs2=0
- set hh=^
-
-
- set $2=该位置已被使用!hh!
- set $3=输入的不是纯数字!hh!
- set .0=×
- set .1=●
- set other=1 2 3 4 5 6 7 8 9
- set b=1@2@3,4@5@6,7@8@9,1@4@7,2@5@8,3@6@9,1@5@9,3@5@7
- set all=┏━┳━┳━┓!hh!┃1 ┃2 ┃3 ┃!hh!┣━╋━╋━┫!hh!┃4 ┃5 ┃6 ┃!hh!┣━╋━╋━┫!hh!┃7 ┃8 ┃9 ┃!hh!┗━┻━┻━┛
- set th=
- setlocal
- for /l %%a in (1 1 31) do (
- for /f "tokens=1,2" %%b in ("!xs! !xs2!") do (
- call :again !errorlevel! !.%%b! !.%%c!
- )
- set /a "xs=^!xs*^!!errorlevel!+xs*!errorlevel!","xs2=^!xs"
- if !errorlevel!==99 (
- cls&echo !all!
- echo Game Over,!winner!获胜
- endlocal&setlocal
- pause
- )
- )
- :again
- cls&echo !all!
- echo;!$%1!!choice!
- set winner=%2
- set /p n=请输入方格位置
- if defined %2%n% (exit /b 2) else (
- if "!all!"=="!all:%n% = !" (exit /b 3) else (
- set "all=!all:%n% =%2!"
- set choice=%choice% %n%
- )
- set %2%n%=!str:~%n%,1!
- )
- :test
- for %%a in (!b:@^=+%2!) do (
- set /a "test+=(%2%%~a)/15"
- )
- if %test% gtr 0 exit /b 99
- exit /b 0
复制代码
作者: CrLf 时间: 2011-5-22 21:07
ai部分没能解决多层剪枝的问题,一直没有成功对3层之内最优解的搜索,快疯了,实在不想继续写了...就这么算了吧,话说这若放在出题区可真是一个好题目
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |