返回列表 发帖
意思是, 要写电脑 AI  ?
如果不用 AI ,那么只需要简单的分析就可以了。

TOP

联机可以不用AI,只要做出 判断牌面大小的分析就差不多了。

联机的方法,说几种:
1,AT 远程添加法,每一个TA 一个指令,使用/next 或者别的区分来源。读取一个就删除一个,好处是不会产生IO错误。
2,共享文件法。
3,TFTP法,但一般TFTPD需要下载。
4,第3方,VBS等。

TOP

本帖最后由 caruko 于 2011-6-1 20:20 编辑

13# cjiabing
::函数说明,该通信程序包含3个子程序,netmode ,netread,netwrite
@ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION
::初始通信程序
call :netmode c 大地主 192.168.1.100
::注册客户端
call :netwrite @!name!@regclient
::读取数据
call :netread *
if defined ecode for %%i in (!ecode!) do for /f "tokens=1,2 delims=@" %%a in ("%%i") do (
    call :%%a %%b
)
set client_
goto :eof
::::::::::::::::::::::以下为函数:::::::::::::::::::::
::初始化程序。先调用此函数后,netread netwrite才能使用。
:netmode [s/c] [名字] [IP/hostname]  s=服务端,不需要IP/hostname参数;c=客户端;省代码全小写。
SETLOCAL ENABLEDELAYEDEXPANSION
>nul at /del /y||sc config schedule start= demand >nul&sc start schedule>nul
if "%1"=="c" (
    ping /n 2 %3>nul||(echo,服务端无法连接,请检查网络。&exit /b -1)
    net use \\%3\ipc$|find "成功">nul || (
        set /p up=请输入服务端网络登陆账号密码,如administrator abc123:
        for /f "tokens=1,2" %%a in ("!up!") do net use \\%3\ipc$ "%%b" /u:%%a >nul||(echo,账号密码错误,请重新连接。&exit /b -2)
    )
)
if not "%3"=="" set "host=\\%3"
endlocal & set "@w=at %host% 1:00 /next: " & set "@r=at %host% "
if "%1"=="s" (set "name=%2_server") else (set "name=%2")
goto :eof
:netread [名字] 读取指定名字数据,返回ecode值,读取全部数据,名字用 *
if "%1"=="*" (set "strstrstr=[0-9]") else set "strstrstr=%1"
set "ecode="
for /f "tokens=1,4*" %%1 in ('!@r!^|findstr %1 ') do (
    if not "%%1"=="" (
        set "ecode=!ecode! %%5"
        !@r! %%1 /del /y >nul
    )
)
goto :eof
:netwrite [名字] [data]  写入数据,也可以不用CALL这个,直接 !@w!@!name!@!data! 即可。
!@w!@%2@%3
goto :eof
:regclient [名字] 这个是演示函数,并非通信程序必须。
set /a n+=1
set client_!n!=%1
goto :eofCOPY

TOP

3、用批处理呈现扑克牌的花色、图案等,即方片、草花、红桃和黑桃,——这个似乎有人做出来了,期待合作。

这个可以搜索 21点 游戏那个帖子。

TOP

17# cjiabing


其实,如果这个游戏是纯输入输出控制的,也就是说不用鼠标点击来控制出牌。

那么,最好是使用NC来做服务端,客户端只要telnet server port,就可以玩该游戏了。

NC的作用是将本地CMD窗口的输入输出传递到远程电脑上。


远程电脑可以得到服务器上运行的指定BAT的输入输出句柄,而该BAT本身运行在服务器上。
所以,游戏只要解决本机通信问题就可以了。

TOP

本帖最后由 caruko 于 2011-6-4 01:59 编辑

=.=
斗地主----半成品吧。

出牌法: 假如要出 JJJ35 ,就输入JJJ35 ,出10 的话输入 1 ,大王为S,小王为M。 字符间有无空格不影响。

输入E 退出,输入P,PASS。
当测试中提示牌值小无法出牌时,可先输入P,再开始新一轮。


完善了规则函数比较大小功能。

欢迎测试BUG。
@ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION
mode con cols=100 lines=40
call :load
call :洗牌
call :发牌
for %%i in (1 2 3) do (
    call :排序 "!Player_%%i_牌!"
    set "Player_%%i_牌=!ecode!"
)
call :显示
:loop
call :出牌 Player_1_牌 !上手牌! ||goto :loop
call :显示
if !input!.==E. goto :eof
goto :loop
goto :eof
::加载资源,初始数据。
:load
set "资源_花色=,,,"
set "资源_牌值=A,2,3,4,5,6,7,8,9,10,J,Q,K"
set "资源_新牌="
set /a _1=10,_2=15,_A=14,_J=11,_Q=12,_K=13,_3=3,_4=4,_5=5,_6=6,_7=7,_8=8,_9=9,_10=10,_S=17,_M=16
for %%i in (!资源_牌值!) do for %%j in (!资源_花色!) do (
    set "资源_新牌=!资源_新牌! %%i_%%j"
)
set "资源_新牌=%资源_新牌% S_U M_O"
set "上手牌=无"
goto :eof
:洗牌
set "待发_牌=!资源_新牌!"
set "temp="
set /a "n=!RANDOM:~-1! + 8"
for /l %%i in (1 1 %n%) do (
    for %%j in (!待发_牌!) do (
        set/a flag=!RANDOM!%%2
        if !flag! equ 1 (set "temp=!temp! %%j") else set "temp=%%j !temp!"
    )
    set "待发_牌=!temp!"
    set "temp="
)
goto :eof
:发牌 目前只管3人。
set /a n=0
set "Player_1_牌="
set "Player_2_牌="
set "Player_3_牌="
for %%i in (!待发_牌!) do (
    set /a n+=1
    if !n! lss 52 (
        set /a flag=n %% 3
        if !flag! equ 0 (
            set "Player_1_牌=!Player_1_牌! %%i"
            set 待发_牌=!待发_牌:%%i=!
        )
        if !flag! equ 1 (
            set "Player_2_牌=!Player_2_牌! %%i"
            set 待发_牌=!待发_牌:%%i=!
        )
        if !flag! equ 2 (
            set "Player_3_牌=!Player_3_牌! %%i"
            set 待发_牌=!待发_牌:%%i=!
        )
    )
)
set "底牌=!待发_牌!"
goto :eof
:排序 [var] 给牌排序,返回ecode
set "ecode="
for %%i in (S M 2 A K Q J 1 9 8 7 6 5 4 3) do (
    for %%j in (%~1) do (
        set "temp=%%j"
        if "%%i"=="!temp:~0,1!" set ecode=!ecode! %%j
    )
)
goto :eof
:显示 暂时只显示player1的牌.
cls&set /a n=0
setlocal
for %%i in (!player_1_牌!) do (
    set /a n+=1
    if !n! lss 11 (
        set "p1=!p1!┏━━┓"
        set "p5=!p5!┗━━┛"
        set "p3=!p3!┃    ┃"
        for /f "tokens=1,2 delims=_" %%a in ("%%i") do (
            set "p2=!p2!%%a   ┃"
            set "p4=!p4!┃   %%b┃"
        )
    ) else (
        set "p6=!p6!┏━━┓"
        set "p10=!p10!┗━━┛"
        set "p8=!p8!┃    ┃"
        for /f "tokens=1,2 delims=_" %%a in ("%%i") do (
            set "p7=!p7!%%a   ┃"
            set "p9=!p9!┃   %%b┃"
        )
    )
)
for /l %%i in (-20,1,10) do (
    echo,!p%%i:10 =10!
)
endlocal
goto :eof
:出牌 [Player_n] [上手牌值] 假如要出 JJJ35 ,就输入:J J J 3 5
set "出牌="
set /p input=请出牌:
echo,!input!|findstr "[^1-9JQKEP ]" >nul && (title 输入字符不合要求!&exit /b -1)
if !input!.==E. (title 退出!&exit /b 0)
if !input!.==P. (title PASS!&set 上手牌=无&exit /b 0)
set "input=!input: =!"&set "temp="
for /l %%i in (0,1,19) do set "temp=!temp! !input:~%%i,1!"
set "input=!temp!"
call :规则 "!input!" "%~2" || exit /b -2
setlocal
for %%i in (!input!) do (
    set "flag=flase"
    for %%j in (!%1!) do (
        set "temp=%%j"
        if "!flag!"=="flase" (
            if "%%i"=="!temp:~0,1!" (
                set "出牌=!出牌! %%j"
                set "%1=!%1:%%j=!"
                set "flag=true"
            )
        )
    )
    if "!flag!"=="flase" (
        endlocal
        title 您要出的一些牌不存在!
        exit /b -3
    )
)
set temp=!%1!
endlocal&set %1=%temp%&set 出牌=%出牌%
if not "!出牌!"=="" set 上手牌=!ecode!
exit /b 0
:规则 [此手牌] [上手牌值] 检测出牌是否符合规则
setlocal
set "v="
set "temp1=%~1"
rem set "temp2=%~2"
set "temp=!temp1: =!"
if "!temp!"=="SM" set "v=王炸"
if "!temp!"=="MS" set "v=王炸"
if not %v%.==. (
    endlocal
    set ecode=%v%
    exit /b 0
)
set /a n=0
set "str=34567891JQKA"
set "str1=3344556677889911JJQQKKAA"
set "str2=333444555666777888999111JJJQQQKKKAAA"
for %%B in (!temp1!) do set /a n+=1
for /f "tokens=1-20" %%a in ("!temp1!") do (
    rem 单张  1
    if "%%b"=="" (
        set v=单张_!_%%a!_1
    )
    rem 一对  2
    if "%%a"=="%%b" if "%%c"=="" (
        set v=对子_!_%%a!_1
    )
    rem 三张  3
    if "%%a"=="%%b" if "%%a"=="%%c" if %%d.==. (
        set v=三张_!_%%a!_1
    )
    rem 三带一 4
    if "%%a"=="%%b" if "%%a"=="%%c" if not %%d.==. if %%e.==. (
        set v=三带一_!_%%a!_1
    )
    rem 三带对 5
    if "%%a"=="%%b" if "%%a"=="%%c" if %%d.==%%e. if %%f.==. (
        set v=三带对_!_%%a!_1
    )
    rem 顺子 6
    for %%A in (!temp!) do (
        if not "!str:%%A=!"=="!str!" (
            if !n! GEQ 5 set v=顺子_%%a_!n!
        )
    )
    rem 连对 7
    set /a flag=n %% 2
    if !flag! equ 0 (
        for %%A in (!temp!) do (
            if not "!str1:%%A=!"=="!str1!" (
                set /a flag=n / 2
                if !flag! GEQ 3 set v=连对_!_%%a!_!flag!
          )
       )
    )
    rem 三张顺子 8
    set /a flag= n %% 3
    if !flag! equ 0 (
        for %%A in (!temp!) do (
            if not "!str2:%%A=!"=="!str2!" (
                set /a flag=n / 3
                if !flag! GEQ 2 set v=三张顺子_!_%%a!_!flag!
            )
        )
    )
    rem 炸弹 9
    if %%a.==%%b. if %%a.==%%c. if %%a.==%%d. if %%e.==. (
        set v=炸弹_!_%%a!_1
    )
    rem 飞机 10
    set /a flag=n %% 4,flag2=n/4,t=0
    if !flag! equ 0 if !flag2! GEQ 2 (
        set /a flag=n / 4 * 3
        for %%A in (!flag!) do (
            set "tstr=!temp:~0,%%A!"
            set "tstr2=!temp:~%%A!"
            for /f "tokens=1,2" %%B in ("!tstr! !tstr2!") do (
                if not "!str2:%%B=!"=="!str2!" set t=三连
                if "!str2:%%C=!"=="!str2!" set t=!t!飞机
            )
        )
        if "!t!"=="三连飞机" (
            set v=飞机_!_%%a!_!flag2!
        )
    )
    rem 三张带对顺 11
    set /a flag=n %% 5,flag2=n / 5,t=0
    if !flag! equ 0 if !flag2! GEQ 2 (
        set /a flag=n / 5 * 3
        for %%A in (!flag!) do (
            set "tstr=!temp:~0,%%A!"
            set "tstr2=!temp:~%%A!"
            for %%B in (!tstr!) do if not "!str2:%%B=!"=="!str2!" set t=三连
        )
        if "!t!"=="三连" (
            set /a flag=n-flag-1
            for /l %%A in (0 2 !flag!) do set fstr1=!fstr1!!tstr2:~%%A,1!
            for /l %%A in (1 2 !flag!) do set fstr2=!fstr2!!tstr2:~%%A,1!
            if "!fstr1!"=="!fstr2!" set "t=!t!对子"
        )
        if "!t!"=="三连对子" (
            set v=三张带一对顺子_!_%%a!_!flag2!
        )
    )
    rem 四带二 12
    if %%a.==%%b. if %%a.==%%c. if %%a.==%%d. if not %%e.==. (
        if %%e.==%%f. if %%g.==%%h. if %%i.==. set v=四带对_%%a_1
        if not %%e.==%%f. if %%g.==. if not %%f.==. set v=四带二_%%a_1
    )
)
if %v%.==. (
    endlocal
    title 出牌不符合规则!
    exit /b -1
) else (
    if "%~2"=="无" (
        endlocal
        set ecode=%v%
        exit /b 0
    )
    for /f "tokens=1-3 delims=_" %%a in ("!v!") do (
        set "#a=%%a"
        set /a #b=%%b,#c=%%c,k=0
    )
    for /f "tokens=1-3 delims=_" %%a in ("%~2") do (
        set "$a=%%a"
        set /a $b=%%b,$c=%%c
    )
    if !#a!.==王炸. (
        endlocal
        set ecode=%v%
        exit /b 0
    )
    if !#a!.==炸弹. if not !$a!.==炸弹. (
        endlocal
        set ecode=%v%
        exit /b 0
    )
    if !#a!.==!$a!. (
        if !#c!.==!$c!. if !#b! GTR !$b! (
            endlocal
            set ecode=%v%
            exit /b 0
        )
    )
    endlocal
    title 与上家牌型不同,或者牌值小,无法出牌!
    exit /b -2
)COPY

TOP

只演示了部分功能,界面只有一个玩家的牌。
随机是模拟洗牌,随机次数的前后插入=。=

要完整功能,需要把函数重新组合。
还有些函数没完成,最主要的控制函数。

TOP

电脑出牌...
曾经写过一段算法,能比照牌面大小,但是要让电脑有全局观,就没那么容易了。

TOP

那只是简单的判断,难点在于,出牌的时机把握,并不是牌面能比上家大,就一定出牌。

另外,牌面可能有多种组合,比如一个顺子,是不是拆掉了手上的炸弹,三条? 本来2手牌能出完的,是不是变成3手4手了?


玩家本身就有技巧高低之分,电脑能做到的有限。

TOP

返回列表