|
netbenton
银牌会员
批处理编程迷
积分 1916
发帖 752
注册 2008-12-28 来自 广西
状态 离线
|
『楼 主』:
[原创]五子棋人机对战批处理游戏
这个批处理花了我两天时间,所以打上了原创。
我还在批处理之家发表有这个批处理,若还有与其它贴子雷同,纯属巧合。
欢迎大家指正,谢谢。
41楼
增加了背景音乐《春江花月夜》,如高山流水般的声音,听着下五棋子,太爽了,包含播放代码及音乐文件仅96K。
鼠标操作版
50楼
最新在60楼 2009.8.1
@echo off&setlocal enabledelayedexpansion
set li0=┌───────────────────┐
set li1=│┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐│1
for /l %%a in (2,1,18) do (set li%%a=│├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤│%%a)
set li19=│└┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘│19
set li20=└───────────────────┘
set li21= A B C D E F G H I J K L M N O P Q R S
for %%a in (%li21%) do (set/a .+=1,%%a=.&set z!.!=%%a)
set z0= &set z20= &set "z21= "
set li5=!li5! 五 棋 子 人 机 对 战
set li7=!li7! 批 处 理
set li9=!li9! 电 脑 水 平 中 等
set li12=!li12! 由 netbenton 编写完成
set li14=!li14! 棋盘设计参照了 batman
title 批处理五子棋
set str=###################
set .=0
for /l %%a in (1,1,19) do (
set he%%a=!str!&set sh%%a=!str!
for /l %%b in (1,1,19) do set [%%a.%%b=0
)
set .=33
for /l %%a in (5,1,19) do (
set pi%%a=!str:~,%%a!&set ni%%a=!str:~,%%a!
set pi!.!=!str:~,%%a!&set ni!.!=!str:~,%%a!
set/a .-=1
)
set ●=○&set a●=电脑
set ○=●&set a○=玩家
::设置电脑IQ
set idea=@@@@#1 #@@@@5 @#@@@4 @@@#@2 @@#@@3 $#$$$4 $$#$$3 $$$#$2 $$$$#1 #$$$$5 #$$#$#3 #$#$$#4 #@@@##2 ##@@@#5 #@@#@#3 #@#@@#4 #@@@#1
set idea=!idea! ##@@@4 @@@##2 ##$$$#5 #$$$##2 #$$$#1 ##@@#4 #@@##2 ##$$#4 #$$##2 #$#$#3 @@###3 ###@@3
set idea=!idea! ##@##2 ###@#3 #@###3 @####4 ####@2 ##############7 ###########6 ########4 #####3 ####2
set ttr=!idea:@=●!&set ttr=!ttr:$=○!
for %%a in (!ttr!) do (set var=%%a&set !var:~,-1!=!var:~-1!&set idea=!idea! !var:~,-1!)
set ttr=
::设置电脑IQ
:restart
for /l %%a in (0,1,21) do (echo !z%%a!!li%%a!)
setlocal enabledelayedexpansion
set li21=!li21! reboot重新开始,exit退出。
set /p var=选择谁先下[ W,玩家 D,电脑 Q,退出 ]:
if /i "!var!" equ "Q" goto :eof
if /i "!var!" equ "W" (set zhi=●) else (set zhi=○)
echo.
:loop
if %zhi% equ ● goto :men
set .=&set put1=
for %%a in (!idea!) do (
for %%b in (he sh) do (
for /l %%c in (1,1,19) do (
if "!%%b%%c:%%a=!" neq "!%%b%%c!" set/a .+=1&set put!.!=%%b %%c
) )
for %%b in (pi ni) do (
for /l %%c in (5,1,33) do (
if "!%%b%%c:%%a=!" neq "!%%b%%c!" set/a .+=1&set put!.!=%%b %%c
) )
if defined put1 set put=%%a&goto :get
)
echo. 已经和棋了
pause
goto :restart
:men
for /l %%a in (0,1,21) do (echo !z%%a!!li%%a!)
set /p user=[列前,行后]:
echo.
if "!user!" equ "reboot" endlocal&goto :restart
if "!user!" equ "exit" exit
set/a pos=!user:~0,1!,poh=!user:~1,2!,var=pos-1 2>nul
if not defined [!poh!.!pos! echo 输入点不存在&goto :men
if "!he%poh%:~%var%,1!" neq "#" echo 该点已经有子&goto men
goto :getok
:get
set /a .=!random!%%.+1
set put=!put%.%! !put!
::随机取最佳的走法
for /f "tokens=1-3" %%a in ("%put%") do (
set var=!%%a%%b:*%%c=!srqponmlkjihgfedcba0
set/a var=!var:~19,1!+%%c
if "%%a" equ "he" (set/a poh=%%b,pos=20-var)
if "%%a" equ "sh" (set/a poh=20-var,pos=%%b)
if %%b lss 19 (set/a var=%%b-var+1) else (set/a var=38-%%b-var+1)
if "%%a" equ "pi" (if %%b lss 19 (set/a pos=var,poh=%%b-var+1) else (set/a poh=20-var,pos=%%b-19+var))
if "%%a" equ "ni" (if %%b lss 19 (set/a pos=var,poh=19-%%b+var) else (set/a poh=var,pos=%%b-19+var))
)
echo 电脑最后下在:!z%pos%!!z%poh%!(%poh%)
:getok
set zhi=!%zhi%!&set win=!zhi!!zhi!!zhi!!zhi!!zhi!
set/a piph=poh+pos-1,lips=pos+1,niph=19+pos-poh
if !piph! lss 19 (set/a pips=pos) else (set/a pips=20-poh)
if !niph! lss 19 (set/a nips=pos) else (set/a nips=poh)
for %%a in ("li!poh! !lips!" "he!poh! !pos!" "sh!pos! !poh!" "pi!piph! !pips!" "ni!niph! !nips!") do (
for /f "tokens=1,2" %%b in (%%a) do (
if defined %%b (
set/a .=%%c-1
for %%d in (!.!) do (set %%b=!%%b:~0,%%d!%zhi%!%%b:~%%c!)
if "!%%b:%win%=!" neq "!%%b!" set win=y
)
)
)
set/a asc%zhi%+=1
if !win! neq y goto :loop
for /l %%a in (0,1,21) do (echo !z%%a!!li%%a!)
set/p= !a%zhi%! %zhi%子 第!asc%zhi%!手 胜出 <nul
pause
endlocal&goto :restart [ Last edited by netbenton on 2009-8-3 at 06:06 ]
此帖被 +77 点积分 点击查看详情 评分人:【 zh159 】 | 分数: +20 | 时间:2009-5-5 21:04 | 评分人:【 konkoo 】 | 分数: +2 | 时间:2009-5-6 04:33 | 评分人:【 jmz573515 】 | 分数: +15 | 时间:2009-5-6 08:53 | 评分人:【 everest79 】 | 分数: +15 | 时间:2009-5-7 04:48 | 评分人:【 wxcute 】 | 分数: +4 | 时间:2009-5-10 01:40 | 评分人:【 THENEWLIFE 】 | 分数: +2 | 时间:2009-6-2 22:51 | 评分人:【 523066680 】 | 分数: +15 | 时间:2009-6-3 05:39 | 评分人:【 clamber 】 | 分数: +2 | 时间:2010-1-19 21:52 | 评分人:【 sl543001 】 | 分数: +2 | 时间:2010-1-19 23:47 |
|
|
精简
[你的+我的+他的]=>[大家的] 个人网志 |
|
2009-5-5 12:41 |
|
|
sexfio
社区乞丐
积分 -27
发帖 45
注册 2006-5-16
状态 离线
|
『第
2 楼』:
太精彩了,要能写出vbs的就好了,因为批处理我看不大懂
提个建议,棋盘搞大点,棋子用红 黄色比较好,文字搞小点,还有列数数字和线没对齐
还有电脑第一步棋走的离谱,我下中间,他跑边上下了一个
[ Last edited by sexfio on 2009-5-5 at 12:49 ]
|
|
2009-5-5 12:47 |
|
|
netbenton
银牌会员
批处理编程迷
积分 1916
发帖 752
注册 2008-12-28 来自 广西
状态 离线
|
『第
3 楼』:
要做成红黄的话,得用到三方,将就一点吧!
如果是为了显示好看一点的话,正准备改进,如果还要增加行列的话,就不必了,19X19下完一盘(和棋)也要不少时间了。
五子棋吗,并非要走到一起的,只要能五个一串,就算赢了。才一个子,电脑没有必要马上就堵的。
看过了一些五子棋的资料,发现原来是我对五子棋子解得太少了,
这人批处理的棋术真的是太低了。
[ Last edited by netbenton on 2009-5-10 at 08:38 ]
|
精简
[你的+我的+他的]=>[大家的] 个人网志 |
|
2009-5-5 12:55 |
|
|
provem
初级用户
积分 92
发帖 82
注册 2007-11-13
状态 离线
|
『第
4 楼』:
建议使用第三方工具 cmos 支持鼠标
|
|
2009-5-5 22:05 |
|
|
jmz573515
银牌会员
积分 1212
发帖 464
注册 2006-12-13
状态 离线
|
|
2009-5-6 08:54 |
|
|
wishpopo
新手上路
积分 18
发帖 20
注册 2008-10-28
状态 离线
|
『第
6 楼』:
很不错 ,没想到 可以这样设计电脑的智商 学习了
|
|
2009-5-6 10:02 |
|
|
netbenton
银牌会员
批处理编程迷
积分 1916
发帖 752
注册 2008-12-28 来自 广西
状态 离线
|
『第
7 楼』:
应2楼的一点意见,已经把棋盘搞大一点了
同时增加了悔棋功能,增加了音效,
把系统提示放到了更合理的地方,
并增加了一点电脑方的棋艺,
增加了电脑方最后一步特别显示
5.10 修改:固定为黑子先手,第一手固定下在天元 JJ10 位置
5.17 修改:增强了电脑方的IQ
5.21 修改:完善了电脑方IQ,并在有多个等效位置下时,随机取位,可玩性提高了,也因为随机,所以玩家不一定能下赢电脑,电脑也不会必胜。
6.2 小修改。
@echo off&setlocal enabledelayedexpansion
mode con: lines=43 cols=110
set li39= A B C D E F G H I J K L M N O P Q R S
set li0= ┌─────────────────────────────────────┐
set li1=A│┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐│A
set var=1
for %%a in (!li39:~5^,-1!) do (set/a var+=2&set li!var!=%%a│├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤│%%a)
for /l %%a in (2,2,36) do (set li%%a= ││ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ││)
set li37=S│└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘│S
set li38= └─────────────────────────────────────┘
set str=a b c d e f g h i j k l m n o p q r s
for %%a in (%str%) do (set/a .+=1,%%a=.&set z!.!=%%a)
set li5=!li5! 五 棋 子 人 机 对 战
set li7=!li7! 批 处 理
set li10=!li10! 电 脑 水 平 中 等
set li31=!li31! 由 netbenton 编写完成
set li33=!li33! 棋盘设计参照了 batman
title 批处理五子棋
set str=###################
set .=0
for /l %%a in (1,1,19) do (
set he%%a=!str!&set sh%%a=!str!
for /l %%b in (1,1,19) do set [%%a.%%b=0
)
set .=33
for /l %%a in (5,1,19) do (
set pi%%a=!str:~,%%a!&set ni%%a=!str:~,%%a!
set pi!.!=!str:~,%%a!&set ni!.!=!str:~,%%a!
set/a .-=1
)
set ●=○&set ○=●
set zhi=●
set say=say
::设置电脑IQ
set idea=@@@@#.1 #@@@@.5 @#@@@.4 @@@#@.2 @@#@@.3 vs0 $$$$#.1 #$$$$.5 $$#$$.3 $#$$$.4 $$$#$.2 vs1 #@@@##.2 ##@@@#.5 #@@#@#.3 #@#@@#.4 vs2 #@##@@#.4-5 #@@##@#.4-3 #@#@@.3-5 @#@@#.4-1 #@@@##.2-W-1 ##@@@#.5-W-6 vs3
set idea=!idea! ##@@@.4-W-5 @@@##.2-W-1 @##@@#.4-5 #@##@@.3-4 #@#@#@.4-2 @#@#@#.3-5 vs4 #$$#$#.3-W-6-1 #$#$$#.4-W-1-6 ##$$$#.5-W-1-6 #$$$##.2-W-1-6 vs5 ##@@##.2-5-W-6-1 #@#@#.3-w-1-5 ##$$$.W-4-5 $$$##.W-2-1 $$##$.W-2-3 $##$$.W-3-4 $#$$#.W-4-1 $#$#$.W-4-2 #$$#$.W-2-5 ##$$#.W-4-W-1-5 #$$##.W-2-W-1-5 #$#$#.W-3-W-1-5 #$##$#.W-3-4
set idea=!idea! vs7 #$$$#.1-5 @@###.4-3 ###@@.3-4 ###@###.3-5-W-2-6-W-1-7 vs8 ###$###.3-5 vs9 @####.4 ####@.2 #$###.3 ###$#.3
set idea=!idea! ###@#.3 #@###.3 $####.3 ####$.3 $$###.3 ###$$.3 $#$##.2 ##$#$.4 #$##$.3 $##$#.3 $###$.3 vs10
set iqam=1000000000
:restart
(
setlocal enabledelayedexpansion
for /l %%a in (0,1,39) do (echo !li%%a!)
set li39=!li39! reboot重新开始,exit退出。
set li37=!li37! back 悔棋
set /p var=选择谁先下[ W,玩家 D,电脑 Q,退出 ]:
if /i "!var!" equ "Q" goto :quit
if /i "!var!" equ "D" (set onez=○&set towz=●&set hou=☆) else (set onez=●&set towz=○&set hou=★)
set a!onez!=电脑&set a!towz!=玩家
)
(
set ttr=!idea:@=%onez%!&set ttr=!ttr:$=%towz%!
set idea=
for %%a in (!ttr!) do (
for /f "tokens=1,2 delims=." %%b in ("%%a") do (set %%b=%%c&set idea=!idea! %%b)
)
set ttr=
set li27=!li27! !onez! !a%onez%!
set li25=!li25! !towz! !a%towz%!
set/a pos=10,poh=10&goto :getok
)
:loop
(if %zhi% equ %onez% goto :men
set .=
setlocal enabledelayedexpansion
for %%a in (!idea!) do (
set str=%%a
if "!str:~,2!" neq "vs" (
for %%b in (he sh) do (
set all=!%%b1!!%%b2!!%%b3!!%%b4!!%%b5!!%%b6!!%%b7!!%%b8!!%%b9!!%%b10!!%%b11!!%%b12!!%%b13!!%%b14!!%%b15!!%%b16!!%%b17!!%%b18!!%%b19!
if "!all:%%a=!" neq "!all!" (
for /l %%c in (1,1,19) do (
if "!%%b%%c:%%a=!" neq "!%%b%%c!" set/a .+=1&set put!.!=%%b %%c.%%a.!iqam!
)
) )
for %%b in (pi ni) do (
set all=!%%b5!!%%b6!!%%b7!!%%b8!!%%b9!!%%b10!!%%b11!!%%b12!!%%b13!!%%b14!!%%b15!!%%b16!!%%b17!!%%b18!!%%b19!!%%b20!!%%b21!!%%b22!!%%b23!!%%b24!!%%b25!!%%b26!!%%b27!!%%b28!!%%b29!!%%b30!!%%b31!!%%b32!!%%b33!
if "!all:%%a=!" neq "!all!" (
for /l %%c in (5,1,33) do (
if "!%%b%%c:%%a=!" neq "!%%b%%c!" set/a .+=1&set put!.!=%%b %%c.%%a.!iqam!
)
) )
) else (
set/a "iqam=(iqam+1)/8"
if %%a equ vs8 if defined . goto :get
if %%a equ vs9 if defined . goto :get
)
))
if defined . (goto :get)
echo. 已经和棋了
pause
endlocal&goto :restart
:men
(
set/a .=lips-1&for /f "tokens=1-3" %%b in ("li!liph! !lips! !.!") do (set %%b=!%%b:~0,%%d!%hou%!%%b:~%%c!)
set li38=!li38![%悔:~,24%]
cls
for /l %%a in (0,1,39) do (echo !li%%a!)
for /f "tokens=1-3" %%b in ("li!liph! !lips! !.!") do (set %%b=!%%b:~0,%%d!%zhi%!%%b:~%%c!)
set li38=%li38%
set /p user=!say:say=%error%! [列前,行后]:
if "!user!" equ "reboot" endlocal&goto :restart
if "!user!" equ "exit" goto :quit
if "!user!" equ "back" call :悔&goto :men
set/a pos=!user:~0,1!,poh=!user:~1,2!,var=pos-1 2>nul
if not defined [!poh!.!pos! set error=输入点不存在&goto :men
)
if "!he%poh%:~%var%,1!" neq "#" set error=该点已经有子&goto men
goto :getok
:get
set `=
::取最佳的走法
for /l %%z in (!.!,-1,1) do (
for /f "tokens=1,2,3 delims=." %%1 in ("!put%%z!") do (
for /f "tokens=1-4" %%a in ("%%1 %%2") do (
set iqm=%%3
set vara=!%%a%%b:*%%c=!srqponmlkjihgfedcba0
for %%4 in (!%%2:-^=;!) do (
if "%%4" equ "W" (set/a iqm=iqm/5*3) else (
set/a var=!vara:~19,1!+%%4
if "%%a" equ "he" (set/a poh=%%b,pos=20-var)
if "%%a" equ "sh" (set/a poh=20-var,pos=%%b)
if %%b lss 19 (set/a var=%%b-var+1) else (set/a var=38-%%b-var+1)
if "%%a" equ "pi" (if %%b lss 19 (set/a pos=var,poh=%%b-var+1) else (set/a poh=20-var,pos=%%b-19+var))
if "%%a" equ "ni" (if %%b lss 19 (set/a pos=var,poh=19-%%b+var) else (set/a poh=var,pos=%%b-19+var))
if not defined R!pos!R!poh!R set /a `+=1&set ram!`!=R!pos!R!poh!R
set/a R!pos!R!poh!R+=iqm
)
)
)
)
)
set rmk=0
for /l %%a in (1,1,!`!) do (
for %%b in (!ram%%a!) do (
for %%c in (!%%b!) do (
if %%c gtr !rmk! set/a rmk=%%c,.=0
if %%c equ !rmk! set rmz!.!=%%b&set/a .+=1
)
) )
set/a .=!random!%%.
for /f "tokens=1,2 delims=R" %%a in ("!rmz%.%!") do (set/a pos=%%a,poh=%%b)
rem start set r^&echo !.!^&pause^&exit
endlocal&set/a pos=%pos%,poh=%poh%
set say=say !z%pos%!!z%poh%!(%poh%)&set error=电脑最后下在:
:getok
set zhi=!%zhi%!&set win=!zhi!!zhi!!zhi!!zhi!!zhi!
(set/a piph=poh+pos-1,lips=pos*2+1,niph=19+pos-poh,liph=poh*2-1
if !piph! lss 19 (set/a pips=pos) else (set/a pips=20-poh)
if !niph! lss 19 (set/a nips=pos) else (set/a nips=poh)
for %%a in ("li!liph! !lips!" "he!poh! !pos!" "sh!pos! !poh!" "pi!piph! !pips!" "ni!niph! !nips!") do (
for /f "tokens=1,2" %%b in (%%a) do (
set/a .=%%c-1
for %%d in (!.!) do (set %%b=!%%b:~0,%%d!%zhi%!%%b:~%%c!)
if "!%%b:%win%=!" neq "!%%b!" set win=y
)
))
(set/a asc%zhi%+=1
set 悔= !z%pos%!!z%poh%!!悔!
if !win! neq y goto :loop)
for /l %%a in (0,1,39) do (echo !li%%a!)
set/p= !a%zhi%! %zhi%子 第!asc%zhi%!手 !z%pos%!!z%poh%!(%poh%) 胜出 <nul
pause
endlocal&goto :restart
:悔
if not defined 悔 goto :eof
if "!悔:~6,1!" equ "" goto :eof
for %%a in (!悔:~^,6!) do (set str=%%a
set/a poh=!str:~-1!,pos=!str:~,1!
set/a piph=poh+pos-1,niph=19+pos-poh,liph=poh*2-1,lips=pos*2+1
if !piph! lss 19 (set/a pips=pos) else (set/a pips=20-poh)
if !niph! lss 19 (set/a nips=pos) else (set/a nips=poh)
for %%a in ( "he!poh! !pos!" "sh!pos! !poh!" "pi!piph! !pips!" "ni!niph! !nips!") do (
for /f "tokens=1,2" %%b in (%%a) do (
set/a .=%%c-1
for %%d in (!.!) do (set %%b=!%%b:~0,%%d!#!%%b:~%%c!)
)
)
for /f "tokens=1,2" %%b in ("li!liph! !lips!") do (
set/a .=%%c-1
for %%d in (!.!) do (set %%b=!%%b:~0,%%d!┼!%%b:~%%c!)
))
set/a asc%zhi%-=1
set 悔=!悔:~6!
set error=你悔棋,耍赖皮!
if not defined 悔 goto :eof
set/a poh=!悔:~2,1!,pos=!悔:~1,1!,liph=poh*2-1,lips=pos*2+1
set say=say !z%pos%!!z%poh%!(%poh%)
goto :eof
:quit
taskkill /fi "WINDOWTITLE eq 批处理五子棋*" /im cmd.exe [ Last edited by netbenton on 2009-6-2 at 09:52 ]
此帖被 +67 点积分 点击查看详情 评分人:【 yishanju 】 | 分数: +15 | 时间:2009-5-6 16:59 | 评分人:【 moniuming 】 | 分数: +15 | 时间:2009-5-8 04:49 | 评分人:【 s11ss 】 | 分数: +15 | 时间:2009-5-8 05:57 | 评分人:【 zh159 】 | 分数: +20 | 时间:2009-5-8 12:20 | 评分人:【 516526966 】 | 分数: +2 | 时间:2009-5-18 03:01 |
|
|
精简
[你的+我的+他的]=>[大家的] 个人网志 |
|
2009-5-6 10:23 |
|
|
yishanju
银牌会员
[b]看你妹啊[/b]
积分 1488
发帖 1357
注册 2006-5-20
状态 离线
|
『第
8 楼』:
真的真的很漂亮,震撼了
|
有问题请发论坛或者自行搜索,再短消息问我的统统是SB |
|
2009-5-6 16:59 |
|
|
zh159
金牌会员
积分 3687
发帖 1467
注册 2005-8-8
状态 离线
|
『第
9 楼』:
建议把这算法转为VBS或JS,可以用在HTA里面,支持鼠标点击,界面也会更漂亮
|
|
|
2009-5-7 13:53 |
|
|
netbenton
银牌会员
批处理编程迷
积分 1916
发帖 752
注册 2008-12-28 来自 广西
状态 离线
|
『第
10 楼』:
re 9楼
我对vbs 没有深入了解,哪位有兴趣的就写一下。
其实做五子棋游戏并不难,用其它语言,早就有相当漂亮的五子棋了,只是在纯批下做时要一点技巧。可是有一点,无论做得如何好,是比不上真正的图形界面的。
re 4楼
也想过用三方来支持鼠标操作,但这个游戏只有几K,如果为了鼠标操作而用到一个几百K的三方,我认为不划算。如果可以用vbs,js,或其它系统自带的脚本语言来做的话,那还差不多。
用键盘有用键盘的好,可以在玩的过程中,无意识的在练习盲打。
|
精简
[你的+我的+他的]=>[大家的] 个人网志 |
|
2009-5-8 02:13 |
|
|
everest79
金牌会员
一叶枝头,万树皆春
积分 2564
发帖 1127
注册 2006-12-25
状态 离线
|
『第
11 楼』:
有空讲解下,我都看不懂
|
49206C6F766520796F752067757973 54656C3A3133383238343036373837 |
|
2009-5-8 12:00 |
|
|
zh159
金牌会员
积分 3687
发帖 1467
注册 2005-8-8
状态 离线
|
『第
12 楼』:
有空讲解下算法,看看如何转为VBS
|
|
|
2009-5-8 12:20 |
|
|
netbenton
银牌会员
批处理编程迷
积分 1916
发帖 752
注册 2008-12-28 来自 广西
状态 离线
|
『第
13 楼』:
::算法是利用了批处理的变量名可变,
::在定义变量和使用时,变量名也是数据的一部分,不知vbs可不可以这样
::已经在主要的地方加了注释了。
@echo off&setlocal enabledelayedexpansion
mode con: lines=43 cols=110
set li39= A B C D E F G H I J K L M N O P Q R S
set li0= ┌─────────────────────────────────────┐
set li1=A│┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐│A
set var=1
for %%a in (!li39:~5^,-1!) do (set/a var+=2&set li!var!=%%a│├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤│%%a)
for /l %%a in (2,2,36) do (set li%%a= ││ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ││)
set li37=S│└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘│S
set li38= └─────────────────────────────────────┘`
rem 前面定义棋盘布局数组li0~li39,相当于显示缓存
set str=a b c d e f g h i j k l m n o p q r s
for %%a in (%str%) do (set/a .+=1,%%a=.&set z!.!=%%a)
rem 定义字母与数值互换对等变量如:a=1 z1=a
rem 此处定义后面有多个地方用到
set li5=!li5! 五 棋 子 人 机 对 战
set li7=!li7! 批 处 理
set li10=!li10! 电 脑 水 平 中 等
set li31=!li31! 由 netbenton 编写完成
set li33=!li33! 棋盘设计参照了 batman
title 批处理五子棋
set str=###################
set .=0
for /l %%a in (1,1,19) do (
set he%%a=!str!&set sh%%a=!str!
for /l %%b in (1,1,19) do set [%%a.%%b=0
)
rem 定义横、竖向棋盘串原始数据,用来让电脑作对比判断
rem 其中横向还用来作用户下子是否占位判断
set .=33
for /l %%a in (5,1,19) do (
set pi%%a=!str:~,%%a!&set ni%%a=!str:~,%%a!
set pi!.!=!str:~,%%a!&set ni!.!=!str:~,%%a!
set/a .-=1
)
rem 定义撇、倷(即斜角)向棋盘串原始数据,用来让电脑作对比判断
set ●=○&set a●=电脑
set ○=●&set a○=玩家
rem 定义双方的乒乓对应转换关系
rem 设置电脑IQ,即赋予电脑的五子棋规则,每个字符串为一项,前面为棋子的排列方式,后的面的数字为电脑下棋点(是相对该字符串的)
rem 有从前到后的优先顺序,@$会分别替换为黑白棋子,在这里只是为了直观才用@$代替的
set idea=@@@@#1 #@@@@5 @#@@@4 @@@#@2 @@#@@3 $$$$#1 #$$$$5 $$#$$3 $#$$$4 $$$#$2 #@@@##2 ##@@@#5 #@@#@2 @@#@#3 #@#@@3 @#@@#4 #@@@#1
set idea=!idea! ##@@@4 @@@##2 #$$#$#3 #$#$$#4 ##$$$#5 #$$$##2 #$$$#1 @##@@#4 #@##@@3 ##@@#4 #@#@#@#3 #@@##2 #@#@#@4 @#@#@#3 #@#@#3 ##$$#4 #$$##2 #$#$#3 #$##$#3
set idea=!idea! @@###3 ###@@3 ##@##2 ###@#3 #@###3 @####4 ####@2 ##############7 ###########6 ########4 #####3 ####2
set idea=!idea! #$###3 $####3 ##$##2 ###$#3 ####$3 $$###3 ###$$3 $#$##2 ##$#$4 #$##$3 $##$#3 $###$3 $$$##2 #$$#$2 $$##$2 $#$$#4 $##$$3 ##$$$4
set ttr=!idea:@=●!&set ttr=!ttr:$=○!
for %%a in (!ttr!) do (set var=%%a&set !var:~,-1!=!var:~-1!&set idea=!idea! !var:~,-1!)
rem 对定义的idea进行分析,前面部分为变量名,后面的数值为变量值,同时去掉所有数字,只剩字符串集合
set ttr=
rem 设置电脑IQ
set say=say
:restart
for /l %%a in (0,1,39) do (echo !li%%a!)
rem 把显示缓存显示出来
setlocal enabledelayedexpansion
rem 环境压栈,以备从新开始时能恢复
set li39=!li39! reboot重新开始,exit退出。
set li37=!li37! back 悔棋
set /p var=选择谁先下[ W,玩家 D,电脑 Q,退出 ]:
if /i "!var!" equ "Q" goto :eof
if /i "!var!" equ "W" (set zhi=●) else (set zhi=○)
echo.
rem 完全由%zhi%这个变量来制轮到哪一方下子
:loop
(if %zhi% equ ● goto :men
set .=
for %%a in (!idea!) do (
for %%b in (he sh) do (
for /l %%c in (1,1,19) do (
if "!%%b%%c:%%a=!" neq "!%%b%%c!" set/a .+=1&set put!.!=%%b %%c
) )
for %%b in (pi ni) do (
for /l %%c in (5,1,33) do (
if "!%%b%%c:%%a=!" neq "!%%b%%c!" set/a .+=1&set put!.!=%%b %%c
) )
if defined . set put=%%a&goto :get
))
rem rem 根据前面定义的idea规则,搜索所有横竖撇倷串,取到最前的匹配后跳出,
rem rem 完全没有匹配的,说明已经和棋了
echo. 已经和棋了
pause
endlocal&goto :restart
:men
(
set/a .=lips-1&for /f "tokens=1-3" %%b in ("li!liph! !lips! !.!") do (set %%b=!%%b:~0,%%d!★!%%b:~%%c!)
set li38=!li38:`=[%悔:~,24%]!
cls
for /l %%a in (0,1,39) do (echo !li%%a!)
rem rem 把缓存显示到屏幕
set/a .=lips-1&for /f "tokens=1-3" %%b in ("li!liph! !lips! !.!") do (set %%b=!%%b:~0,%%d!%zhi%!%%b:~%%c!)
set li38=%li38%
set /p user=!say:say=%error%! [列前,行后]:
if "!user!" equ "reboot" endlocal&goto :restart
if "!user!" equ "exit" exit
if "!user!" equ "back" call :悔&goto :men
set/a pos=!user:~0,1!,poh=!user:~1,2!,var=pos-1 2>nul
if not defined [!poh!.!pos! set error=输入点不存在&goto :men
)
rem 因为前面定义了字母和数字的对应关系能及每个有效坐标为变量,所以判断速度很快
if "!he%poh%:~%var%,1!" neq "#" set error=该点已经有子&goto men
goto :getok
:get
set /a .=!random!%%.+1
set put=!put%.%! !put!
rem 如果有多角度匹配,则随机取最佳的走法,把匹配的串和方位串存到变量:put
rem 下面是根据匹配的方位串和规则串,计算出实际坐标。
rem 首先算出规则串在方位串中的位置,再精确到单个坐标,前面定义的字母与数的对应关系及相对规则串的下棋点位置,起来了很大作用,
for /f "tokens=1-3" %%a in ("%put%") do (
set var=!%%a%%b:*%%c=!srqponmlkjihgfedcba0
set/a var=!var:~19,1!+%%c
if "%%a" equ "he" (set/a poh=%%b,pos=20-var)
if "%%a" equ "sh" (set/a poh=20-var,pos=%%b)
if %%b lss 19 (set/a var=%%b-var+1) else (set/a var=38-%%b-var+1)
if "%%a" equ "pi" (if %%b lss 19 (set/a pos=var,poh=%%b-var+1) else (set/a poh=20-var,pos=%%b-19+var))
if "%%a" equ "ni" (if %%b lss 19 (set/a pos=var,poh=19-%%b+var) else (set/a poh=var,pos=%%b-19+var))
)
set say=say !z%pos%!!z%poh%!(%poh%)&set error=电脑最后下在:
:getok
rem 到这里是根据玩家及电脑给出的实际坐标,把下棋位置写到相应的四个方位串和显示缓存
rem 因为只改写各个方位相应的一个串而已,修改完后,马上判断是否有胜出,所以速度很快
set zhi=!%zhi%!&set win=!zhi!!zhi!!zhi!!zhi!!zhi!
(set/a piph=poh+pos-1,lips=pos*2+1,niph=19+pos-poh,liph=poh*2-1
if !piph! lss 19 (set/a pips=pos) else (set/a pips=20-poh)
if !niph! lss 19 (set/a nips=pos) else (set/a nips=poh)
for %%a in ("li!liph! !lips!" "he!poh! !pos!" "sh!pos! !poh!" "pi!piph! !pips!" "ni!niph! !nips!") do (
for /f "tokens=1,2" %%b in (%%a) do (
set/a .=%%c-1
for %%d in (!.!) do (set %%b=!%%b:~0,%%d!%zhi%!%%b:~%%c!)
if "!%%b:%win%=!" neq "!%%b!" set win=y
)
))
(set/a asc%zhi%+=1
set 悔= !z%pos%!!z%poh%!!悔!
if !win! neq y goto :loop)
for /l %%a in (0,1,39) do (echo !li%%a!)
set/p= !a%zhi%! %zhi%子 第!asc%zhi%!手 !z%pos%!!z%poh%!(%poh%) 胜出 <nul
pause
endlocal&goto :restart
:悔
if not defined 悔 goto :eof
if "!悔:~3,1!" equ "" goto :eof
for %%a in (!悔:~^,6!) do (set str=%%a
set/a poh=!str:~-1!,pos=!str:~,1!
set/a piph=poh+pos-1,niph=19+pos-poh,liph=poh*2-1,lips=pos*2+1
if !piph! lss 19 (set/a pips=pos) else (set/a pips=20-poh)
if !niph! lss 19 (set/a nips=pos) else (set/a nips=poh)
for %%a in ( "he!poh! !pos!" "sh!pos! !poh!" "pi!piph! !pips!" "ni!niph! !nips!") do (
for /f "tokens=1,2" %%b in (%%a) do (
set/a .=%%c-1
for %%d in (!.!) do (set %%b=!%%b:~0,%%d!#!%%b:~%%c!)
)
)
for /f "tokens=1,2" %%b in ("li!liph! !lips!") do (
set/a .=%%c-1
for %%d in (!.!) do (set %%b=!%%b:~0,%%d!┼!%%b:~%%c!)
))
set/a asc%zhi%-=1
set 悔=!悔:~6!
set error=你悔棋,耍赖皮!
if not defined 悔 goto :eof
set/a poh=!悔:~2,1!,pos=!悔:~1,1!,liph=poh*2-1,lips=pos*2+1
set say=say !z%pos%!!z%poh%!(%poh%)
goto :eof [ Last edited by netbenton on 2009-5-8 at 12:32 ]
|
精简
[你的+我的+他的]=>[大家的] 个人网志 |
|
2009-5-8 14:26 |
|
|
sady2009
初级用户
积分 58
发帖 60
注册 2009-2-18
状态 离线
|
『第
14 楼』:
太复杂了。死了几万个脑细胞,还没看懂:D
|
|
2009-5-8 22:32 |
|
|
zh159
金牌会员
积分 3687
发帖 1467
注册 2005-8-8
状态 离线
|
『第
15 楼』:
还没空搞清算法,先弄个HTA的界面出来先
<html>
<title>五子棋界面 - zh159</title>
<hrad>
<HTA:APPLICATION
ID="MyhyliApp"
APPLICATIONNAME="五子棋界面 - zh159"
BORDER="thin"
BORDERSTYLE=""
VERSION="1.0"
SCROLL="no"
ICON="C:\WINDOWS\System32\wuauclt.exe"
INNERBORDER="no"
CONTEXTMENU="no"
CAPTION="yes"
MAXIMIZEBUTTON="no"
MINIMIZEBUTTON="yes"
SHOWINTASKBAR="yes"
SINGLEINSTANCE="yes"
SYSMENU="yes"
WINDOWSTATE="normal"
NAVIGABLE="yes"
/>
</hrad>
<script language="javascript"></script>
<script language="VBScript"></script>
<style>
.GUIwh {width:24;height:24;cursor:hand;}
</style>
<body background="bg.gif" scroll="no" style="background: SteelBlue ;color:#ffffff;">
<table align="center" width="630" border="1" cellspacing="0" cellpadding="10" borderColor="#ffffff" style="font: 13px 宋体;border-collapse:collapse;">
<tr align="center">
<td width="450" height="450">
<table border="0" cellspacing="0" cellpadding="0" borderColor="#ffffff" style="font: 21px 宋体;border:2px solid #ffffff;">
<script language="VBScript">
str = "ABCDEFGHIJKLMNOPQRS"
For i = 1 To Len(str)
with document
.write "<tr align='center'>"
For n = 1 To Len(str)
stri = MID(str,i,1)
strn = MID(str,n,1)
tdstr = "<td id='GUI_" & strn & stri & "' class='GUIwh'><span onclick='Test(this)' onMouseOver='innerText=""●"";style.color=""blue""' onMouseOut='innerText=""┼"";style.color=""""'>┼</span></td>"
s = "┼"
If (stri = "A" and strn = "A") Then .write Replace(tdstr,s,"┌")
If stri = "A" Then If not (strn = "A" or strn = "S") Then .write Replace(tdstr,s,"┬")
If (stri = "A" and strn = "S") Then .write Replace(tdstr,s,"┐")
If not (stri = "A" or stri = "S") Then If strn = "A" Then .write Replace(tdstr,s,"├")
If not (stri = "A" or stri = "S" or strn = "A" or strn = "S") Then .write tdstr
If not (stri = "A" or stri = "S") Then If strn = "S" Then .write Replace(tdstr,s,"┤")
If (stri = "S" and strn = "A") Then .write Replace(tdstr,s,"└")
If stri = "S" Then If not (strn = "A" or strn = "S") Then .write Replace(tdstr,s,"┴")
If (stri = "S" and strn = "S") Then .write Replace(tdstr,s,"┘")
Next
.write "</tr>"
end with
Next
</script>
</table>
</td>
<td>
<span id="PC"><button>电脑先下</button><br><br>直接点击为玩家先下</span>
</td>
</tr>
</table>
</body>
<script language="VBScript">
width = 660
height = 550
window.resizeTo width, height
ileft=(window.screen.width-width)/2
itop=(window.screen.height-height)/2
window.moveTo ileft,itop
Sub Test(this)
this.parentNode.style.cursor = "default"
this.parentNode.innerHtml = "●"
PC.style.display = "none"
End Sub
Sub Title
Document.title = "五子棋 - zh159 - " & FormatDateTime(Now, 1) & " " & WeekdayName(WeekDay(now)) & " " & FormatDateTime(Now, 3)
End Sub
Title:setInterval "Title()",500
</script>
</html>
|
|
|
2009-5-9 13:27 |
|
|