中国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] »
作者:
标题: [原创]五子棋人机对战批处理游戏 上一主题 | 下一主题
huchaolan
新手上路





积分 15
发帖 6
注册 2007-4-12
状态 离线
『第 16 楼』:  

这个牛哈
看不懂,但玩的有意思

2009-5-9 20:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 17 楼』:  

我抄袭一下zh159
If Not (IsObject(Navigator)) Then
    Dim Ie
    Set Ie=WScript.CreateObject("InternetExplorer.Application","Event_")
    'Msgbox "WSH"
    MainF()
Else
    'Msgbox "IEE"
End IF


Sub MainF()

Path="file://" & WScript.ScriptFullName


With Ie
.Navigate       ("about:blank")
.Document.Write ("<Script Language=VBScript Src=""" & Path & """></Script><Script Langage=JavaScript></Script>")   '需要写入的内容
.Document.Write ("<style>.GUIwh{width:24;height:24;cursor:hand;}</style><Body></Body>")


'窗口大小\位置
.Width          = 660               '宽
.Height         = 550               '高
.Resizable      = 0                 '不允许用户改变窗口大小'
.Left           = Fix((.Document.ParentWindow.Screen.AvailWidth-.Width)/2)      '水平居中
.Top            = Fix((.Document.ParentWindow.Screen.AvailHeight-.Height)/2)    '垂直居中


.Document.Title                         = " "                                               '标题
.Document.Body.Scroll                   = "no"                                              '关闭滚动条
.Document.Body.OnconTextMenu            = GetRef("Disabled")                                '禁止右键
.Document.Body.OnSelectStart            = GetRef("Disabled")                                '禁止选取
.Document.Body.Style.CssText            = "background: SteelBlue ;color:#ffffff;"
.Document.Body.InnerHtml                = "<table id=aT><tr><td><TABLE id=bT></TABLE></td><td id=sD></td></tr></table>"
.Document.ParentWindow.ExecScript         "build(19)","VBScript"
    With.Document.Body.All
        .aT.Align                       = "Center"
        .aT.Width                       = "630"
        .aT.Border                      = "1"
        .aT.BorderColor                 = "#ffffff"
        .aT.CellSpacing                 = "0"
        .aT.CellPadding                 = "10"
        .aT.Style.CssText               = "font: 13px 宋体;border-collapse:collapse;"

        .aT.Rows(0).Align               = "Center"
        .aT.Rows(0).Cells(0).Width      = "450"
        .aT.Rows(0).Cells(0).Height     = "450"

        .bT.Align                       = "Center"
        .bT.Border                      = "0"
        .bT.BorderColor                 = "#ffffff"
        .bT.CellSpacing                 = "0"
        .bT.CellPadding                 = "0"
        .bT.Style.CssText               =  "font: 21px 宋体;border:2px solid #ffffff;"
    End With


'窗体
'.FullScreen=1
.MenuBar        = 0                 '取消菜单栏'
.AddressBar     = 0                 '取消地址栏'
.ToolBar        = 0                 '取消工具栏'
.StatusBar      = 0                 '取消状态栏'
.Visible        = 1                 '显示IE页面'
Set window=.Document.ParentWindow
End With
'.Document.OnClick = GetRef("Test1")
'window.ExecScript "fun()","VBScript"
'Ie.Document.ParentWindow.ExecScript  "build(19)","VBScript"


Do
    WScript.Sleep 200
Loop

End Sub


Function Test1()
    'msgbox "event_boundElements"
End Function

Function Disabled()
    Disabled=True
End Function

Function Event_OnQuit()
    WScript.Quit
End Function


Function Build(N)
PS=N-1
While (S < N)
    If S <= 1 Then charA=chr(43440):charB=chr(43472):charC=chr(43444)
    If S >= 1 Then charA=chr(43456):charB=chr(43488):charC=chr(43464)
    If S = PS Then charA=chr(43448):charB=chr(43480):charC=chr(43452)
    Document.All.bT.insertrow(S)   
    For j = 0 To PS
        If ((S*N+j) Mod PS) = (S Mod PS) Then
            Char=charA:charA=charC
        Else
            Char=charB
        End If
        
        Document.All.bT.Rows(S).insertcell(j)
        Document.All.bT.Rows(S).Cells(j).ID = S*N+j
        Document.All.bT.Rows(S).Cells(j).CLASSName = "GUIwh"
        Document.All.bT.Rows(S).Cells(j).InnerHtml = "<span onclick=Ts(this) onMouseOver='innerText=""" &chr(41457)& """;style.color=""blue""' onMouseOut='innerText=""" &chr(43488)& """;style.color=""""'>" &char& "</span>"
        'Document.All.bT.Rows(S).Cells(j).InnerHtml = "<span id=mm onclick='Ts(this)' onMouseOver='innerText=X' onMouseOut='innerText=Y'>+</span>"
    Next
    S=S+1
Wend
End Function

Function Ts(this)

    msgbox this.ParentNode.ID

    this.parentNode.style.cursor = "default"
    this.parentNode.innerHtml = chr(41457)
    'PC.style.display = "none"
   
End Function


Function fun()
    Msgbox "this is fun!"
End Function
哈哈



49206C6F766520796F752067757973 54656C3A3133383238343036373837
2009-5-10 07:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 18 楼』:  

LS的代码只能用在IE浏览器为默认时,且有个bug:鼠标在边缘棋盘格移开后,并不是恢复边缘棋盘格的样子,而是变成中间棋盘格的样子



2009-5-10 13:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 19 楼』:  

re 17楼
存为什么扩展名呀?我运行不了呀,
.vbs .js .html .bat
都试了不行呢?



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-5-10 13:56
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 20 楼』:  Re 17楼

系统:XP SP2 EN
默认浏览器:IE 6

附件 1: 2009-05-11_100903.png (2009-5-10 23:19, 5.66 K)




2009-5-10 23:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 21 楼』:  



  Quote:
Originally posted by zh159 at 2009-5-10 01:50 PM:
LS的代码只能用在IE浏览器为默认时,且有个bug:鼠标在边缘棋盘格移开后,并不是恢复边缘棋盘格的样子,而是变成中间棋盘格的样子

抄错了,哈哈
mouseout事件的文本应是char,我没看你后边替换的代码,直接填成+了
这个脚本我改了默认浏览器也是正常的呀



49206C6F766520796F752067757973 54656C3A3133383238343036373837
2009-5-11 02:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 22 楼』:  

就是vbs,嘿嘿



49206C6F766520796F752067757973 54656C3A3133383238343036373837
2009-5-11 02:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 23 楼』:  

这个错误我也碰到,原来是脚本中几个双字节符号造成的,我改成了cha(ascii)才解决掉,可能是你系统是英文版的原因吧



49206C6F766520796F752067757973 54656C3A3133383238343036373837
2009-5-11 02:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 24 楼』:  Re 23楼

能否改改代码让它同时兼容中英文系统呢?



2009-5-11 08:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 25 楼』:  

这些字符我也不熟,你可以换成英文字母先试试
只需要把chr(?????)换成chr(65)-chr(75)就可以了



49206C6F766520796F752067757973 54656C3A3133383238343036373837
2009-5-11 10:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 26 楼』:  

弄了半天,写了下边这个代码,主要用来得到五子棋落子坐标的横竖撇捺行
我的思路是电脑不去对比整个棋盘,而是紧跟对手的落子判断落子四行是否有五子的风险
只写到提取四行数组
用的是一维数组,像棋盘要是二维的话可以使用 行数*总列(19)+列数 转成一维的
因为一维数组识别四行比较方便,横行步进1,竖行是19,撇是18,捺是20

有关坐标的关系可以使用以下代码观察
显示二维坐标
@echo off
setlocal enabledelayedexpansion
mode con: lines=100 cols=100
for /l %%i in (0,1,18) do (
for /l %%j in (0,1,18) do (
        if %%i LSS 10  set x=0
        if %%j LSS 10  set y=0
        set/p=!x!%%i!y!%%j <nul
        set x=&set y=       
)
echo.
)

pause
显示一维坐标
@echo off
setlocal enabledelayedexpansion
for /l %%i in (0,1,18) do (
for /l %%j in (0,1,18) do (
        set /a f=%%i*19+%%j
        if !f! LSS 10  set f=0!f!
        if !f! Lss 100 set f=0!f!
        call set /p =%%f%% <nul
)
echo.
)

pause

Const N     = 19
Const msg   = 1
If Ucase(Right(WScript.FullName,11)) = "WSCRIPT.EXE" Then
    CreateObject("WScript.Shell").Run "Cmd.exe /K Cscript """ & Wscript.ScriptFullName & """"
    WScript.Quit
End If

ReDim arry(N*N-1)


For i =0 To N*N-1
arry(i)=i
Next

Function PriArry()
For i = 0 To 18
    For j = 0 To 18
        k="00"
        If i*N+j >  9  Then k="0"
        If i*N+j > 99  Then k=""
        s=s &  k & arry(i*N+j) & " "
    Next
    p s
    s=""
Next
End Function


While True
PriArry
p xypn(gcon)
Wend

Function xypn(a)
M=N-1                                                       '自定义坐标   标准x_ord*总列数+标准y_ord
x_ord           = a\N                                       '横向标准坐标 自定义坐标/总列数
y_ord           = a Mod N                                   '竖行标准坐标 自定义坐标/总列数的余数
x_base_value    = x_ord*N                                   '坐标所在行的 行首坐标值 (行数*总列数)
y_base_value    = a-x_base_value                            '坐标所在列的 列首坐标值 (坐标值-行首坐标值)

For i = 0 To N-1
hen=hen & x_base_value+i    & " "                           '横行=行首坐标值(x_base_value)以1递加至行尾
shu=shu & y_base_value+i*N  & " "                           '竖行=列首坐标值(y_base_value)以N递加至列尾
Next
str = "横:" & hen & vbCrLf & "竖:" & shu & vcCrLf

px_ord          = (Abs(x_ord+y_ord-M)+(x_ord+y_ord-M))\2    '撇行首标准坐标x   ((标准x+y) > 18)?(px_ord=(x+y) mod 18):(0)
py_ord          = x_ord+y_ord-px_ord                        '撇行首标准坐标y   ((标准x+y) > 18)?(x+y-px_ord):(x+y)
p_base_value    = px_ord*N+py_ord                           '撇行首自定义坐标值 标准x_ord*总列数+标准y_ord

For i = 0 To py_ord-px_ord                                  '撇行长度为 py_ord-px_ord
pie=pie & p_base_value+i*(N-1) & " "                        '撇行自增量为 N-1
Next
str = str & vbCrLf & "撇:" & pie & vbCrLf

nx_ord = (Abs(x_ord-y_ord)+(x_ord-y_ord))\2                 '捺行首标准坐标x   nx_ord=((x_ord-y_ord) > 0)?(x_ord-y_ord):(0)
ny_ord = (x_ord-y_ord)*(Sgn(x_ord-y_ord)-1)\2               '捺行首标准坐标y   ny_ord=((x_ord-y_ord) < 0)?(x_ord-y_ord):(0)
n_base_value = nx_ord*N+ny_ord                              '捺行首自定义坐标值 标准x_ord*总列数+标准y_ord

For i = 0 To 18-nx_ord-ny_ord                               '捺行长度为 18-(nx_ord+ny_ord)
na = na & n_base_value+i*(N+1) & " "                        '捺行自增量为 N+1
Next
str = str & "捺:" & na
xypn=str
End Function

Function p(str)
    If msg Then WScript.Echo str Else InputBox "","",str
End Function

Function gcon()
gcon=WScript.StdIn.ReadLine
End Function




49206C6F766520796F752067757973 54656C3A3133383238343036373837
2009-5-11 11:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 27 楼』:  

不管是用二维坐标法,还是一维跨标法,最后还是要进行组串,然后才与规则串匹配
因为在进行规则串匹配时,是按串进行的。其实应该把:显示缓存、横、坚、撇、捺分别定义为数组串较好一点,不必要去进行多次组串操作。

电脑方是根据匹配到的最优规则串进行下子的,根据匹配到的是在哪个数组(横/坚/撇/捺)第几串的第几个字符,即可转换为实际坐标

因为定义了五个数组,所以只要下一个子,就要分别对这五个数组的相应位置进行替换,每个数组仅替换一行的一个字符即可

以行为单元显示肯定要比以字符为单元显示要快好多,因为用了显存串方式,所以可以直接以行为单元显示。



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-5-11 12:17
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 28 楼』:  Re 26楼



  Quote:
我的思路是电脑不去对比整个棋盘,而是紧跟对手的落子判断落子四行是否有五子的风险

这样的话电脑的棋力是否太弱了?通常的五子棋算法都是对下一步双方可能出现的情况(四三、双三等等)进行优先级排序,然后选择优先级最高的落点吧。



2009-5-11 12:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复
rubble
初级用户





积分 23
发帖 15
注册 2009-5-6
状态 离线
『第 29 楼』:  算法还没弄懂

太牛了,批处理也有这么强的功能!

2009-5-12 08:09
查看资料  发送邮件  发短消息 网志  OICQ (363217010)  编辑帖子  回复  引用回复
SNSB
初级用户





积分 31
发帖 16
注册 2009-5-6
状态 离线
『第 30 楼』:  



  Quote:
Originally posted by rubble at 2009-5-12 08:09:
太牛了,批处理也有这么强的功能!

真想不到能搞出这一个东西出来,不过代码我就很难懂了。



SNSB is Not Simply a Biologist!
2009-5-12 08:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] [4] [5] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: