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

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

TOP

15# caruko
好,非常感谢!~
最近比较忙,头绪有点乱,等我做好主框架了,再亲自向你请教~~~
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

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

19# caruko
嗯,不错,很简明!~
出牌后没有其他反映呢?比如,升剩下几个牌,等。
发牌随机似乎不够!~
向您学习学习!~
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

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

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

TOP

难道ansi (这里指GB18030)字符集里面就没有扑克的符号吗,只知道unicode字符集里面有,真是郁闷... ...

TOP

22# wankoilz
看caroku的代码,我想起以前搞一些奇怪的代码出错时显示的就是这些符号!~谢谢!~
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

牌型分析与两幅牌比较大小
安静了好些天,今天来看看,做了一个比较上家牌和自家牌的程序。
将牌转换为可以对接的数据,使用一个数据接口!pkvar!。
以下可以分析两副牌的牌型、张数、最大的牌,可以用来比较两副牌的大小。
当然,问题还是有的,关键是把代码搞出来了——我的一贯作风,实用主义。
使用我的发牌方法,你可以用发牌机制来实现。下一步继续实现分析牌,先做单机的吧。
@echo off&setlocal enabledelayedexpansion
mode con cols=86 lines=45
title 批处理版斗地主游戏
:桌面牌分析
::分析过程使用最笨的方法:计算各个数据之间的数学关系。计算相邻五个数据的数学关系,得知对子的差值为0,顺子的差值为1
::可根据牌子的张数推断牌型,结合它们的数学关系推断纯粹的连对牌和顺子牌。
::计算较多,变量也较多,但过程很简单。
::似乎比原计划的要复杂多了,但为了更多可操作性,目前仅能如此了。
::可惜的是,最后找到了各种牌对比的接口“!pkvar!”。
:比较牌大小
::shangjia为对家牌3.txt,后处理为自家牌4.txt。
set chupai=3.txt
call :牌型分析
echo,----------------------------------------------------------------------
echo     上家的牌:
call :牌型分析结果
set pkshangjia=!pkvar!
set chupai=4.txt
call :牌型分析
echo,----------------------------------------------------------------------
echo     自家的牌:
call :牌型分析结果
echo,----------------------------------------------------------------------
echo,     
echo,    最后比较结果:
echo,
echo,
if "!pkshangjia:~0,2!" lss "!pkvar:~0,2!" (if "!pkshangjia:~2,3!"=="!pkvar:~2,3!" if "!pkshangjia:~5,2!" == "!pkvar:~5,2!" echo  你的牌大过对家) else (echo  你出的牌不符合规则)
echo,
echo,
echo,----------------------------------------------------------------------
pause
exit
:牌型分析结果
::将对家出的牌转换为一个简单的数字。最大的牌+牌的类型+牌的张数
echo,
for /f %%a in (%chupai%) do set /p pkstr=%%a <nul
if not "!pkvar!"=="" (echo ——分析结果:!pkvar!) else (echo ——分析结果:不符合规则的牌!)
echo pkvar:!pkvar!:!pkstr!  zs:!zs!  =  nb:!nb!  +  nb0:!nb0!  +  nb1:!nb1!
echo,
goto :eof
:牌型分析
set pk1=
set pk2=
set pk3=
set pk4=
set pk5=
set zs=0
set dc=
set dc1=
set dc2=
set dc3=
set dc4=
set nb=0
set nb0=0
set nb1=0
set tj=0
set tj1=0
set tj2=0
set pkstr=
set pkvar=
for /f %%a in (%chupai%) do if not "%%a"=="" set /a zs+=1
if !zs!==1 for /f %%a in (%chupai%) do set pkvar=%%a单张牌1&set pkvar=!pkvar:~2,8!&goto :eof
if "!zs!" gtr "1" for /f %%a in (%chupai%) do if not "%%a"=="" (
    set pk1=%%a
    if not "!pk2!"=="" if not "!pk1!"=="" set /a dc=!pk1:~2,2!-!pk2:~2,2!
    if not "!pk3!"=="" if not "!pk2!"=="" set /a dc1=!pk2:~2,2!-!pk3:~2,2!
    if not "!pk4!"=="" if not "!pk3!"=="" set /a dc2=!pk3:~2,2!-!pk4:~2,2!
    if not "!pk5!"=="" if not "!pk4!"=="" set /a dc3=!pk4:~2,2!-!pk5:~2,2!
    if not "!pk1!"=="" if not "!pk5!"=="" set /a dc4=!pk1:~2,2!-!pk5:~2,2!
    set pk5=!pk4!
    set pk4=!pk3!
    set pk3=!pk2!
    set pk2=!pk1!
    if "!dc!"=="0" if "!zs!"=="2" (if "!pk1:~2,2!"=="99" (set pkvar=99王炸弹2) else (set pkvar=%%a一对子2)&goto :eof) else (set tj1=!pk1:~2,2!)
    if "!dc!"=="0" if "!dc1!"=="0" (if "!zs!"=="3" (set pkvar=三个&goto :eof) else (set /a tj+=1&set tj2=!pk1:~2,2!))
    if "!zs!"=="4" if "!dc!"=="0" if "!dc1!"=="0" if "!dc2!"=="0" set pkvar=!pk1:~2,2!小炸弹4
    if "!zs!"=="4" if "!dc!"=="0" if "!dc1!"=="0" if not "!dc2!"=="0" set pkvar=!pk2:~2,2!三带一4
    if "!zs!"=="4" if not "!dc!"=="0" if "!dc1!"=="0" if "!dc2!"=="0" set pkvar=!pk2:~2,2!三带一4
    if "!zs!"=="5" if "!dc!"=="0" if not "!dc1!"=="0" if "!dc2!"=="0" if "!dc3!"=="0" set pkvar=!pk4:~2,2!三带对5
    if "!zs!"=="5" if "!dc!"=="0" if "!dc1!"=="0" if not "!dc2!"=="0" if "!dc3!"=="0" set pkvar=!pk4:~2,2!三带对5
    if "!zs!"=="5" if "!dc!"=="0" if not "!dc1!"=="0" if "!dc2!"=="0" if !dc3!==0 if not !dc4!==0 set pkvar=!pk4:~2,2!四带一5
    if "!zs!"=="5" if "!dc!"=="0" if  "!dc1!"=="0" if "!dc2!"=="0" if not !dc3!==0 if not !dc4!==0 set pkvar=!pk4:~2,2!四带一5
    if "!zs!"=="6" if "!dc!"=="0" if not "!dc1!"=="0" if "!dc2!"=="0" if !dc3!==0 if not !dc4!==0 set pkvar=!pk4:~2,2!四带对6
    if "!zs!"=="6" if "!dc!"=="0" if  "!dc1!"=="0" if "!dc2!"=="0" if not !dc3!==0 if not !dc4!==0 set pkvar=!pk4:~2,2!四带对6
    if !zs! gtr 7  if !dc!==0 if !dc1!==0 if !dc2!==1 if !dc3!==0  if !dc4!==1 set pkvar=!pk1:~2,2!飞机带!zs!
    if !zs! gtr 7  if !dc!==0 if !dc1!==1 if !dc2!==0 if !dc3!==0  if !dc4!==1 set pkvar=!pk1:~2,2!飞机带!zs!
    if !zs! geq 5 if !dc!==1  if !dc1!==1  if !dc2!==1  if !dc3!==1  if !dc4!==4 set pkvar=!pk1:~2,2!长顺子!zs!
    if !zs! gtr 5 if "!dc!"=="0" if "!dc1!"=="1" if "!dc2!"=="0" if "!dc3!"=="1" if !dc4!==2 set pkvar=!pk1:~2,2!连对顺!zs!
    if not "!dc!"=="" if not !dc!==0 if not !dc!==1 set /a nb+=1
    if not "!dc!"=="" if !dc!==1 set /a nb1+=1
    if not "!dc!"=="" if !dc!==0 set /a nb0+=1
)
)>nul 2>nul
echo,
if "!pkvar!"=="长顺子" if !nb1! == 11 if !nb! == 0 (if !nb0! == 0 (set pkvar=!pkvar!!zs!) else (set pkvar=)) else (set pkvar=)
if "!pkvar!"=="连对顺" (
    set /a jd=!nb0!*2
    if !jd!==!zs! (if !nb! == 0 (set pkvar=!pkvar!!zs!) else (set pkvar=)) else (set pkvar=)
)
set dd=
::此处有冲突,会覆盖上面的结果。
if !tj! gtr 0 for /l %%a in (2,1,20) do if !tj!==%%a (
    set /a dd=%%a*3
    if !dd!==!zs! set pkvar=三顺子!zs!
)
if "!pkvar!"=="四带一" (
    if !nb0! == 4 (set pkvar=!pkvar!!zs!) else (set pkvar=)
)
if "!pkvar!"=="四带对" (
    if !nb0! == 5 (set pkvar=!pkvar!!zs!) else (set pkvar=)
)
rem if !zs! gtr 7  (
    if "!zs!"=="8"  if !tj!==2 (if !nb0! equ 2 (if !nb1! equ 1 (set pkvar=!pkvar!!zs!) else (set pkvar=)) else (set pkvar=))
    if "!zs!"=="10" if !tj!==2 (if !nb0! geq 4 (if !nb1! geq 1 (set pkvar=!pkvar!!zs!) else (set pkvar=)) else (set pkvar=))
    if "!zs!"=="12" if !tj!==3 (if !nb0! geq 3 (if !nb1! geq 2 (set pkvar=!pkvar!!zs!) else (set pkvar=)) else (set pkvar=))
    if "!zs!"=="15" if !tj!==3 (if !nb0! geq 9 (if !nb1! geq 2 (set pkvar=!pkvar!!zs!) else (set pkvar=)) else (set pkvar=))
    if "!zs!"=="16" if !tj!==4 (if !nb0! geq 4 (if !nb1! geq 3 (set pkvar=!pkvar!!zs!) else (set pkvar=)) else (set pkvar=))
    if "!zs!"=="20" if !tj!==4 (if !nb0! geq 12 (if !nb1! geq 3 (set pkvar=!pkvar!!zs!) else (set pkvar=)) else (set pkvar=))
)
goto :eof
::if "!pkvar!"=="三顺" if !nb0! == 4 (if !nb1! == 1 (set pkvar=!pkvar!!zs!) else (set pkvar=)) else (set pkvar=)
1116
1216
1316
1317
1318
1119
1320
if "!dc!"=="0" if "!dc1!"=="0" if not "!dc2!"=="0" if "!dc3!"=="0" COPY
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

楼上是说曾经有代码出错的时候显示出扑克符号?我是真想知道如何在ANSI里显示这些符号啊

TOP

回头找了一下,原来发过帖的,结果的第一个就是红心

批处理乱码——猜猜我的QQ密码:http://www.bathome.net/viewthread.php?tid=5558

êμó?1¤???áo?ê1ó?£?ò?±?í?ê±×??ˉ?ˉDí?à???tμ?±êU

用Ctrl+字母的方式也能调出一些来!~
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

那些是unicode字符集里面的符号

TOP

为什么批处理里面不能用鼠标点呢?
真是郁闷 1!

TOP

我觉得应该使用第三方命令来美化界面
ConsExt就很不错!!

TOP

感觉我的机器似乎出了一些问题呢,同样的批处理,开始的时候可能正常运行,现在就麻烦不断,真上火啊。

TOP

返回列表