中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创]五子棋人机对战批处理游戏
« [1] [2] [3] [4] [5] »
作者:
标题: [原创]五子棋人机对战批处理游戏 上一主题 | 下一主题
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
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
sexfio
社区乞丐





积分 -27
发帖 45
注册 2006-5-16
状态 离线
『第 2 楼』:  

太精彩了,要能写出vbs的就好了,因为批处理我看不大懂

提个建议,棋盘搞大点,棋子用红 黄色比较好,文字搞小点,还有列数数字和线没对齐
还有电脑第一步棋走的离谱,我下中间,他跑边上下了一个

[ Last edited by sexfio on 2009-5-5 at 12:49 ]

   此帖被 +5 点积分      点击查看详情   
评分人:【 netbenton 分数: +5  时间:2009-5-12 08:37


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
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
provem
初级用户





积分 92
发帖 82
注册 2007-11-13
状态 离线
『第 4 楼』:  

建议使用第三方工具 cmos 支持鼠标

2009-5-5 22:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jmz573515
银牌会员




积分 1212
发帖 464
注册 2006-12-13
状态 离线
『第 5 楼』:  

太牛了!加分

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
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
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
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
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 ]

   此帖被 +15 点积分         点击查看详情   
评分人:【 everest79 分数: +15  时间:2009-5-9 08:23




精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-5-8 14:26
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
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>


   此帖被 +25 点积分        点击查看详情   
评分人:【 wxcute 分数: +4  时间:2009-5-10 01:39
评分人:【 everest79 分数: +15  时间:2009-5-10 07:43
评分人:【 netbenton 分数: +5  时间:2009-5-12 08:38
评分人:【 tslnyys 分数: +1  时间:2009-6-3 02:30




2009-5-9 13:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] [4] [5] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: