斗地主游戏玩多了,心痒痒的也想用批处理写一个。见有人写批处理版的斗地主游戏,但都没见完工的。自己整理了下思路,有兴趣的朋友一起来共同开放吧!~以下是思路:
说明、进度等在三楼,主程序代码在二楼。
成功一半:代码在二楼2011年6月26日
这两天有空瞎整了一下,终于完成了自家牌分析——看自己有什么牌(还需完善),以及吃牌分析——看对家出的是什么牌。现在可以发牌开始玩游戏,不过还是自己在玩。电脑要稍微改进一下才能人机对战,不过也只能是初级的,因为分析牌型很费劲。
下一步:初级人机对战好高兴!~
-----------------------------------------------------------------------------------------------------------------初次整合,初见雏形
使用方法,进入游戏,输入代号出牌。比如,想出 三个6带一个K ,则输入“1116 1216 1416 1323”并回车。复制代码
- @echo off&setlocal enabledelayedexpansion
- ::mode con cols=86 lines=45
- title 批处理版斗地主扑克牌游戏
- ::本程序尝试整合发牌、叫地主、出牌、吃牌等功能。
- ::需要进一步优化各个子函数代码。
- ::优化接口:set var=path,!pkvar!
- ::优化标签。
- ::!pkvar!有误!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ::---------------------------★代码分割线:主菜单和总台★---------------------------
- :ZongTai
- ::总台
- cls
- echo;
- echo; 批处理版斗地主-单机试验版
- echo;
- echo;
- echo; 1、开始游戏
- echo; 2、游戏规则展示
- echo; 3、退出
- echo;
- echo;
- echo;
- set input=
- set /p input= 请选择:
- if "%input%"=="" goto ZongTai
- if %input%==1 goto Play
- if %input%==2 call :YSStart
- if %input%==3 exit
- goto ZongTai
- :Play
- cls
- ::开始游戏
- call :Fapai
- ::呼叫发牌
- call :排序
- ::呼叫排序
- :Playing
- ::开始出牌。打牌的过程。
- :Play1
- echo;
- echo,--------------------------地主:%DiZhu%-----------------------------
- echo;
- set "MyPoker=%~dp0DDZTemp\%DiZhu%"
- set "PerPoker=%~dp0DDZTemp\%DiZhu%"
- call :Pkhuase "%MyPoker%"
- call :自家牌分析 %PerPoker%
- call :Chupai %MyPoker%
- :Play2
- echo;
- echo,--------------------------农民:%NongM1%-----------------------------
- echo;
- set "MyPoker=%~dp0DDZTemp\%NongM1%"
- set "PerPoker=%~dp0DDZTemp\%NongM1%"
- call :Pkhuase "%MyPoker%"
- call :自家牌分析 %PerPoker%
- call :Chupai %MyPoker%
- :Play3
- echo;
- echo,--------------------------农民:%NongM2%-----------------------------
- echo;
- set "MyPoker=%~dp0DDZTemp\%NongM2%"
- set "PerPoker=%~dp0DDZTemp\%NongM2%"
- call :Pkhuase "%MyPoker%"
- call :自家牌分析 %PerPoker%
- call :Chupai %MyPoker%
- goto Playing
- pause
- exit
- ::建立一个循环,假设玩家A\B\C,循环于三者,直至有一个玩家先出完牌。
- ::这个循环包括:地主出牌——下家分析桌面牌(上家牌)——分析自家牌(是否有可打的牌)——出牌——下家分析桌面牌……
- ::三家出牌,最大的区别是,玩家是通过输入控制过程,而电脑自动出牌。
- ::---------------------------★代码分割线:出牌机制★---------------------------
- ::改造该段代码,使之能通用,优化代码,减少临时文件。
- :Chupai
- ::出牌机制,首先对自家牌进行分析,找出有规律的牌。
- echo;
- echo; 轮到 【%1】 出牌。
- echo; 返回【Q】排序【P】不出【N】
- echo; 输入要出的牌的序号,回车出牌。多个牌用空格隔开。
- echo;
- set input=
- set /p input= 输入出牌:
- if "%input%"=="" goto Chupai
- if /i "%input%"=="Q" goto ZongTai
- if /i "%input%"=="N" goto :eof
- if /i "%input%"=="P" (
- call :Pkhuase "%1"
- goto Chupai
- )
- cd.>"%~dp0DDZTemp\DDZPlay0"
- cd.>"%1ed"
- cd.>"%1tmp"
- set a=0
- set b=0
- set c=
- ::判断输入的是否为自己手中的牌
- for %%i in (!input!) do (
- set /a a+=1
- for /f "usebackq tokens=*" %%a in ("%1") do (
- if "%%a"=="" (echo;&echo Game over&echo;&pause&goto :eof)
- if %%i==%%a (
- echo;%%i>>"%1ed"
- set /a b+=1
- )
- )&&set c=1
- )
- if "%c%"=="" (echo;&echo 游戏结束&echo;&pause&goto ZongTai)
- if not !a!==!b! (echo !a!=/=!b!,数据有误,重新输入!&goto Chupai) else (echo; !a!==!b!,数据重合,输入正确!)
- call :比较结果
- echo;上家的牌:!PkShangJia!
- ::上家的牌
- ::剩下的牌
- findstr /v /g:"%1ed" "%1">>"%1tmp"
- cd.>"%1"
- type "%1tmp">>"%1"
- echo;
- echo; 【%1】打出的牌:
- ::type "%1ed">>"%~dp0DDZTemp\DDZPlay0"
- set PerPoker="%1ed"
- call :牌型分析 %PerPoker%&call :牌型分析结果
- echo;
- echo; 【%1】剩下的牌:
- call :Pkhuase "%1"
- echo;
- goto :eof
- ::---------------------------★代码分割线:机器出牌★---------------------------
- ::试图将处理地主的模式转换为电脑自动处理。只是在调用文件上和出牌上有所区别。
- :机器出牌
- goto :eof
- ::---------------------------★代码分割线:发牌机制★---------------------------
- ::发牌后,得到发到三个玩家手中的牌,并确定谁是地主、谁是农民。
- :Fapai
- ::准备工作
- echo;
- echo 正在发牌,请稍候……
- echo;
- if exist "%~dp0\DDZTemp" (del /q "%~dp0DDZTemp\*.*") else (md "%~dp0\DDZTemp")
- ::将54张扑克牌分成54行,每行一个数据输入到一个文本中,然后对该文本进行随机排序,并将牌按照顺序发到三个玩家手中。
- :Fapai1
- ::产生一副扑克牌
- echo 2899>"%~dp0DDZTemp\DDZFapai"
- for %%m in (2999 2130 2230 2330 2430) do echo;%%m>>"%~dp0DDZTemp\DDZFapai"
- for /l %%a in (3,1,14) do (
- set pkp=%%a
- set /a Pkfp=%%a+1110
- set /a Pkmh=%%a+1210
- set /a Pkhx=%%a+1310
- set /a Pkht=%%a+1410
- echo;!Pkfp!&echo;!Pkmh!&echo;!Pkhx!&echo;!Pkht!
- )>>"%~dp0DDZTemp\DDZFapai"
- call :Suijpx
- ::随机排序,"%~dp0DDZTemp\DDZFpsj"为随机牌。
- :Fapai2
- ::将牌发到三个玩家手中
- cd.>"%~dp0DDZTemp\DDZPlay1"&cd.>"%~dp0DDZTemp\DDZPlay2"&cd.>"%~dp0DDZTemp\DDZPlay3"
- set Pkfp=0
- for /f "usebackq tokens=*" %%a in ("%~dp0DDZTemp\DDZFpsj") do (
- set /a Pkfp+=1
- for /l %%i in (0,3,50) do (
- set /a Pkff=!Pkfp!-%%i
- if !Pkff!==1 echo;%%a>>"%~dp0DDZTemp\DDZPlay1"
- if !Pkff!==2 echo;%%a>>"%~dp0DDZTemp\DDZPlay2"
- if !Pkff!==3 echo;%%a>>"%~dp0DDZTemp\DDZPlay3"
- if !Pkfp!==52 set pkdp1=%%a
- if !Pkfp!==53 set pkdp2=%%a
- if !Pkfp!==54 set pkdp3=%%a
- )
- )
- :Fapai3
- ::发到每个玩家手中的牌
- ::此处进行重新排序。[`sort /+3 "%~dp0DDZTemp\DDZchupai"`]
- for /l %%i in (1,1,3) do (
- echo,
- echo, 玩家 %%i 的牌:
- set pkp=
- echo,
- call :Pkhuase "%~dp0DDZTemp\DDZPlay%%i"
- )
- echo,
- :JiaoDiZhu
- ::此处增加叫地主与积分翻倍计算。
- ::采用随机地主形式。玩家DDZPlay1为操作者,其余两个为电脑。
- ::但在后面的操作中,玩家为随机的一个,剩下的两个为电脑。
- set tm=
- set DiZhu=
- set "tm=%time:~10,1%"
- if %tm% geq 0 if %tm% leq 3 set DiZhu=DDZPlay1&set NongM1=DDZPlay2&set NongM2=DDZPlay3
- if %tm% geq 4 if %tm% leq 6 set DiZhu=DDZPlay2&set NongM1=DDZPlay1&set NongM2=DDZPlay3
- if %tm% geq 7 if %tm% leq 9 set DiZhu=DDZPlay3&set NongM1=DDZPlay1&set NongM2=DDZPlay2
- :Fapai4
- ::底牌
- echo;!pkdp1!>>"%~dp0DDZTemp\%DiZhu%"
- echo;!pkdp2!>>"%~dp0DDZTemp\%DiZhu%"
- echo;!pkdp3!>>"%~dp0DDZTemp\%DiZhu%"
- echo,
- echo, %DiZhu% 是地主
- echo,
- if /i not %DiZhu% == DDZPlay1 echo, DDZPlay1 是农民
- if /i not %DiZhu% == DDZPlay2 echo, DDZPlay2 是农民
- if /i not %DiZhu% == DDZPlay3 echo, DDZPlay3 是农民
- echo,
- echo 底牌是:
- echo,
- for /l %%i in (1,1,3) do (
- set pkp=!pkdp%%i!
- call :HuaSe
- if "!pkp:~2,1!"=="0" (echo !Pkp1! !Pkp2! !pkp:~3,1! !pkdp%%i!) else (echo !Pkp1! !Pkp2! !pkp:~2,2! !pkdp%%i!)
- )
- echo,
- ::处理临时文件
- cd.>"%~dp0DDZTemp\DDZFpsjx"&cd.>"%~dp0DDZTemp\DDZFpsj"&cd.>"%~dp0DDZTemp\DDZFapai"
- goto :eof
- ::---------------------------★代码分割线:排序★---------------------------
- :排序
- ::已设定为三个玩家排序,直接调用即可。
- ::对三个玩家的牌进行排序,排序是必须的。
- for /l %%i in (1,1,3) do (
- cd.>"%~dp0DDZTemp\DDZPx"
- sort /+3 "%~dp0DDZTemp\DDZPlay%%i">>"%~dp0DDZTemp\DDZPx"
- cd.>"%~dp0DDZTemp\DDZPlay%%i"
- type "%~dp0DDZTemp\DDZPx">>"%~dp0DDZTemp\DDZPlay%%i"
- )
- cd.>"%~dp0DDZTemp\DDZPx"
- echo,
- goto :eof
- :Suijpx
- ::随机排序——或许要减少临时文件、提高速度,可优化以下项目:
- ::set ddd=for——去掉一个临时文件
- ::call :Suijipx——去掉外部处理
- ::优化为调用模式。
- set sjpx=
- cd.>"%~dp0DDZTemp\DDZFpsjx"&cd.>"%~dp0DDZTemp\DDZFpsj"
- for /f "tokens=1,* delims=:" %%a in ('findstr /n .* "%~dp0DDZTemp\DDZFapai"') do (
- if not "%%a"=="" set sjxh=%%a
- call :Suijipx
- echo;!sjpx!:%%b>>"%~dp0DDZTemp\DDZFpsjx"
- )>nul 2>nul
- for /f "tokens=1,* delims=:" %%a in ('sort "%~dp0DDZTemp\DDZFpsjx"') do echo;%%b>>"%~dp0DDZTemp\DDZFpsj"
- goto :eof
- :Suijipx
- set /a sjpx=!sjxh!+%random:~-2,2%
- goto :eof
- ::---------------------------★代码分割线:自家牌分析★---------------------------
- ::分析自己的牌,看自己有什么牌
- ::牌的关系只有两种,要么相等——等差等于0,要么相差——等差等于1。
- ::调用:call :自家牌分析 "%~dp0DDZTemp\%DiZhu%"
- ::获得分析结果:!pkvar!
- :自家牌分析
- echo;
- echo 【%MyPoker%】自家牌分析
- echo;
- set pkvar=
- set pkvar1=
- set pkvar0=
- set pkvar2=
- set pkvar3=
- set pk1=
- set pk2=
- set pk3=
- set pk4=
- set pk5=
- set dc=0
- set nb=0
- set nb1=0
- set nb0=0
- for /f "usebackq" %%a in (%1) do if not "%%a"=="" (
- set pk1=%%a
- set /a dc=!pk1:~2,2!-!pk2:~2,2!
- if !dc!==0 (
- set /a nb0+=1
- set pkvar0=!pk2! !pk1!
- set pkvar2=!pk3! !pk2! !pk1!
- set pkvar3=!pk4! !pk3! !pk2! !pk1!
- if !nb0! == 1 if not "!pk2!"=="" set pkvar=!pk1:~2,2!一对子2&echo !pkvar! 一对 pkvar0=!pkvar0!
- if !nb0! == 2 if not "!pk3!"=="" set pkvar=!pk1:~2,2!三张牌3&echo !pkvar! 三个 pkvar2=!pkvar2!
- if !nb0! == 3 if not "!pk4!"=="" set pkvar=!pk1:~2,2!小炸弹4&echo !pkvar! 炸弹 pkvar3=!pkvar3!
- )
- if !dc!==1 (
- set /a nb1+=1
- set nb0=0
- set pkvar1=!pk1! !pkvar1!
- if !nb1! geq 5 set pkvar=!pk1:~2,2!长顺子!nb1!&echo !pkvar! 顺子 pkvar1=!pkvar1!
- )
- if not !dc!==0 if not !dc!==1 (set nb1=0&set nb0=0&set pkvar1=&set pkvar0=)
- rem echo %%a : !pk1! !pk2! !pk3! !pk4! !pk5!$$ pkvar=!pkvar! ##!nb0!=!nb1!##&pause
- set pk5=!pk4!
- set pk4=!pk3!
- set pk3=!pk2!
- set pk2=!pk1!
- )
- goto :eof
- ::---------------------------★代码分割线:牌面转换★---------------------------
- ::调用方法 set HuaSe="%~dp0DDZTemp\%DiZhu%"&call :Pkhuase
- ::`sort /+3 %HuaSe%`
- :Pkhuase
- for /f "usebackq tokens=*" %%a in (%1) do (
- set pkp=%%a
- call :HuaSe
- if "!pkp:~2,1!"=="0" (echo !Pkp1! !Pkp2! !pkp:~3,1! %%a) else (echo !Pkp1! !Pkp2! !pkp:~2,2! %%a)
- )
- ::牌面转换。将代码转换为牌面花色,可以在处理完所有数据后再转换。
- goto :eof
- :HuaSe
- set Pkp2=
- set Pkp1=
- if "!pkp:~0,1!"=="1" set Pkp1=副牌
- if "!pkp:~0,1!"=="2" set Pkp1=主牌
- if "!pkp:~1,1!"=="1" set Pkp2=方片
- if "!pkp:~1,1!"=="2" set Pkp2=草花
- if "!pkp:~1,1!"=="3" set Pkp2=红桃
- if "!pkp:~1,1!"=="4" set Pkp2=黑桃
- if not "!pkp:~0,2!"=="28" (
- if not "!pkp:~0,2!"=="29" (set /a pkp=!pkp!-10) else (set pkp=大王大王)
- ) else (set pkp=小王小王)
- if "!pkp:~2,2!"=="11" set pkp=JJJ
- if "!pkp:~2,2!"=="12" set pkp=QQQ
- if "!pkp:~2,2!"=="13" set pkp=KKK
- if "!pkp:~2,2!"=="14" set pkp=AAA
- if "!pkp:~2,2!"=="20" set pkp=222
- goto :eof
- ::---------------------------★代码分割线:桌面牌分析★---------------------------
- ::分析上家打出的牌,分析自己打出的牌,看看两者哪个大,下家出牌是否合乎规则。稍微复杂了点,需要改进。
- ::可喜的是,最后找到了各种牌对比的接口“!pkvar!”。
- ::与自家牌分析有所差距,自家牌分析不受牌的张数影响,而桌面牌分析则考虑牌的张数。
- ::普通调用示例:
- :: set PerPoker="%~dp0DDZTemp\%DiZhu%ed"
- :: call :牌型分析&call :牌型分析结果
- :牌型分析
- ::用于分析桌面上的牌(包括自家和对家的)的牌型,需要确定牌的张数和顺序,区别于自家牌分析。
- 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 "usebackq" %%a in (%1) do if not "%%a"=="" set /a zs+=1
- if !zs!==1 for /f "usebackq" %%a in (%1) do set pkvar=%%a单张牌1&set pkvar=!pkvar:~2,8!&goto :eof
- if "!zs!" gtr "1" for /f "usebackq" %%a in (%1) 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=!pk1:~2,2!一对子2)&goto :eof) else (set tj1=!pk1:~2,2!)
- if "!dc!"=="0" if "!dc1!"=="0" (if "!zs!"=="3" (set pkvar=!pk1:~2,2!三张牌!zs!&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=!pk2:~2,2!三顺子!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
- :牌型分析结果
- ::将对家出的牌转换为一个简单的数字——!pkvar!。最大的牌+牌的类型+牌的张数
- ::set PkShangJia=
- for /f "usebackq" %%a in (%PerPoker%) do set /p pkstr=%%a <nul
- if not "!pkvar!"=="" (echo ——分析结果:【!pkvar:~2,3!】&set PkShangJia=!pkvar!) else (echo ——分析结果:【不符合规则的牌!】&goto Chupai)
- echo pkvar:!pkvar!:!pkstr! zs:!zs! = nb:!nb! + nb0:!nb0! + nb1:!nb1!
- echo,
- goto :eof
- :比较结果
- ::出牌与吃牌分析结果
- ::分析上家的牌型和自家的牌型,然后比较两者是否相同牌型,自家是否比上家牌大。
- echo,
- echo, (最后比较结果:【!PkShangJia!】 == 【!pkvar!】 【"!PkShangJia:~0,2!" lss "!pkvar:~0,2!"】)
- 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 你出的牌不符合规则&goto Chupai)
- echo,
- goto :eof
- ::---------------------------★代码分割线:规则演示★---------------------------
- :YSStart
- ::总台
- cls
- call :Fupai
- call :Zhupai
- call :Wangpai
- pause
- cls
- call :Paixing
- pause
- goto :eof
- :Fupai
- ::展示副牌大小顺序
- ::副牌从3到10,用11代替J,12代替Q,13代替K,14代替A,列出大小顺序。
- ::加四位数1110、1210、1310、1410等转换为四位代号。四位代号更具编辑性。
- echo,
- echo, 一、展示副牌大小顺序
- echo,
- echo 方片(代号) 梅花(代号) 红心(代号) 黑桃(代号)
- echo;================================================================
- for /l %%a in (3,1,14) do (
- set Pks=%%a
- if %%a==11 set Pks=J
- if %%a==12 set Pks=Q
- if %%a==13 set Pks=K
- if %%a==14 set Pks=A
- set /a Pkfp=%%a+1110
- set /a Pkmh=%%a+1210
- set /a Pkhx=%%a+1310
- set /a Pkht=%%a+1410
- echo !Pks!(!Pkfp!) !Pks!(!Pkmh!) !Pks!(!Pkhx!) !Pks!(!Pkht!)
- )
- echo;================================================================
- goto :eof
- :Zhupai
- ::展示主牌大小顺序
- echo,
- echo, 二、展示主牌大小顺序
- echo,
- echo 方片(代号) 梅花(代号) 红心(代号) 黑桃(代号)
- echo;================================================================
- echo 2 2130 2 2230 2 2330 2 2430
- goto :eof
- :Wangpai
- ::展示王牌大小顺序
- echo,
- echo, 三、展示王牌大小顺序
- echo,
- echo;================================================================
- echo 小王 2899 大王 2999
- echo;================================================================
- echo,
- goto :eof
- :Paixing
- ::牌型
- echo,
- echo, 四、展示牌型和大小规则
- echo,
- echo;================================================================
- echo (1) 单张:大小顺序从3(最小)到大王(最大);
- echo (2) 一对:两张大小相同的牌,从3(最小)到2(最大);
- echo (3) 三张:三张大小相同的牌,例如9-9-9;
- echo (4) 三带一:根据三张的大小来比较,例如9-9-9-3盖过8-8-8-A;
- echo (5) 三带对:根据三张的大小来比较,例如Q-Q-Q-6-6盖过10-10-10-K-K;
- echo (6) 顺子:至少5张连续大小的牌,例如8-9-10-J-Q;
- echo (7) 连对:至少3个连续大小的对子,例如10-10-J-J-Q-Q-K-K;
- echo (8) 飞机:至少2个连续大小的三张,例如4-4-4-5-5-5;
- echo (9) 飞机带翅膀:例如7-7-7-8-8-8-3-6,例如8-8-8-9-9-9-4-4-J-J;
- echo (10) 四带二:例如6-6-6-6-8-9,例如J-J-J-J-9-9-Q-Q。
- echo (11) 炸弹:四张大小相同的牌,比王炸小,比其他牌大;A-A-A-A;
- echo (12) 王炸:一对王,这是最大的组合,能够盖过包括炸弹在内的任何牌型;
- echo (13) 除三带一、四带一外,王牌不能和副牌混用。2不能和副牌组成顺子和连对。
- echo (14) 什么类型的牌用什么类型的牌打,但炸弹能够打任何牌。
- echo;================================================================
- goto :eof
2、地主选择、发牌顺序等。——期待
三、牌面分析
主要考虑出牌的速度和牌子的强度,包括进攻和防守,列出最优方案和替代方案。这个思路决定程序的智能程度和厉害程度。
1、分析牌子中是否存在炸弹,主要包括王炸和四张牌炸——已完成。
2、分析牌子中是否存在顺子,多少个顺子,顺子后散牌多少——进行中。
3、分析牌子中三带一、三带二的情形,统计数量并考虑散牌——已完成
4、分析牌子中的对牌,统计数量并比较大小——进行中
5、分析牌子中的散牌,统计数量并比较大小——进行中
6、比较顺子、三带一、对牌、单牌等之间的最优方案——进行中
7、做出最优出牌方案和替补出牌方案——进行中
(时间:2011年5月30日;接单人:cjiabing;状态:进行中)
--------------------------------------进度线-------------------------------------
三、出牌机制
1、制定出牌顺序——同上
2、如何分析对方的牌?——完成
3、如何根据对方的牌出牌?——进行中
4、如何对剩下的牌进行分析?——进行中
5、如何对已经出过的牌和未出过的牌进行分析?——进行中
(时间:2011年6月1日;接单人:cjiabing;状态:进行中)
--------------------------------------进度线-------------------------------------
四、过程分析
1、如何进攻和防守?
2、如果是农民,如何配合搭档?
3、游戏即将结束时,如何进行合理攻防?
五、分值计算
六、单机和联机,通信
七、其他问题
1、玩家的牌临时存储(不一定必要,但如必要请使用类似以下的文件名):第二章 创作要求和代码规范
既然是共同开发,那就要有共同的规范和语言,制定共同的要求和原则。
一、代码规范可读
首先要求可读性,也就是便于他人阅读。因为是大家共同开发的,太深奥的代码不容易理解,不方便他人继续开发。1、标签名
头字母大写,其它相应小写。按中文拼音或者英文均可,但不可太长或者太短,方便理解最好。
如果苦于标签名命名,可根据代码功能起个稍微简短的标签名,然后将相关、相邻的代码用序号标明。
格式如:功能+序号,如发牌:Fapai1 。或:功能_序号,如:Fapai_1第三章 扑克牌规则演示
参考楼上代码
复制代码
- ::函数说明,该通信程序包含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 :eof
复制代码
- @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
- )
复制代码
- @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"
复制代码
- @echo off&SETLOCAL ENABLEDELAYEDEXPANSION&(CHCP 437 &GRAFTABL 936)>NUL
- mode con cols=80 lines=25 >nul
- ::斗地主 一个鼠标操控的脚本游戏,用来演示和测试SYBC的鼠标支持
- ::开发:SYBN QQ:354324773 E-mail:sybnwork@Gmail.com
- ::SVN/HTTP下载地址:http://syxq.googlecode.com/svn/trunk/SYXQ/DDZ/ddz.cmd
- ::支持:此脚本已于2010年2月开发结束,未发现显见BUG,未搭载自动更新模块
- ::变量初始化
- ::玩家1-3 的牌统一使用P1XXX-p3XXX变量 P4XXX保留 玩家出的牌统一使用P5XXX-P6XXX P7XXX保留 P0XXX 用于临时需要
- ::与扑克有关的变量牌统一使用PKXXX
- :: PKSXX代表各个点数的牌与字符的对应值 pks11=J pks12=Q
- :: PKHX代表各个花色的数字与字符的对应值 pkh1= (红桃) pkh0=T (王)
- :: PKYX代表各个颜色的数字与字符的对应值 扑克只有红黑2色 pky0=c (红) pky1=0 (黑) (同color命令)
- set a=s1=A;s2=2;s3=3;s4=4;s5=5;s6=6;s7=7;s8=8;s9=9;s10=0;s11=J;s12=Q;s13=K;s14=A;s15=2;s16=N;s17=N;h1=;h2=;h3=;h4=;h0=T;y0=c;y1=0;BK=$7f;BK2=$f7;BK3=$37;BK4=$73;NB=$f1;p=1
- set pk%a:;=&set pk%
- ::载入/生成sybc 变量SYBCOM保存SYBC的16进制数据 V保存DEBUG代码 最后通过管道交由DEBUG执行
- SET SYBCOM=A100``80BE BA00 0 88AC ACC4 88AC 80C3 FC`3674 FC80 BEFF 82 4B75 2CBE AC00 C488`86AC 50C4 BE1F 0 3CAC 7553 ACFB 593C`F675 3CAC 7542 ACF1 433C EC75 3CAC 7553`ACE7 3D3C E275 1DEB 1B3 8EE9 B300 E902`89 3CAC 743A 3C0E 740D 3C5B 7400 8357`1EE 83E9 AC00 313C 1874 4A3C DA74 4B3C`DB74 4D3C 4474 6A3C CE74 6B3C CF74 6D3C`3874 D6E8 E800 F0 183C 2A7F C688 CAE8`E800 E4 4F3C 1E7F C288 2B0 E2F6 B050`F6A0 5FE6 C701 AC57 243C 374 EE83 E801`74 D188 38EB 4CB4 21CD B8 CD00 B833`1 33CD 5B8 CD00 A933 3 F174 3B8`CD00 8933 B3C8 F608 EBF3 B0DB CD00 8016`2FB D274 E088 CEEB 815F A0C7 5700 B850`B800 750 295A 88F5 ACCA 243C B174 3B3C`1174 D3C 5174 3C 4D74 233C 875 D783`EB01 E904 FF3C 80AA FA 574 D088 EBAA`83D8 1D7 D3EB 32E8 3C00 7523 8008 23FB`375 B2 38C3 74D8 87F9 3CC3 7E39 402`8009 39FB 37E C380 2409 800F FE3 10B2`E2F6 D800 C288 B4C3 CD4C AC21 203C FB74`D3C F374 3C EF74 C388 3CAC 7420 3CEC`740D 3CE4 7400 C3E0 C387 302C EB80 B430`F60A E4 C3D8``
- SET XQCOM=A100``580E 5 8E10 5D0 1000 33A3 EB01 B02A`B1E6 BABE A3C5 56BA 7265 3120 302E 4300`646F 2065 7962 4E20 7465 6562 746E 6E6F`0 0 0 0 BF00 81 3CE8 1E01`8F26 3106 5701 D231 8A26 4725 FC80 750A`EB02 8021 DFC 275 1AEB FC80 7500 EB02`8013 20FC 474 C2FE DEEB FA80 7500 8305`2C4 D1EB FA80 7500 B404 CD4C 2621 3E89`135 515F D189 B6E8 E800 C9 3C80 7400`E803 8 8B26 353E 5901 A9EB 3CAC 7530`E815 7B C688 76E8 8800 52C2 3B4 10CD`B45A CD02 C310 313C 1E75 6806 B800 E807`3F E850 59 C189 E358 470B E2AA 80FC`3C 274 E9EB C307 323C 1C75 6806 B800`E807 1D C488 3CAC 7509 EB02 3CF4 7500`EB02 AB03 F0EB C307 333C 75 343C 75`E8C3 1B C688 16E8 8800 B0C2 F602 88E2`B0C2 F6A0 B6E6 100 89D0 E8C7 1 52C3`3153 ACDB 303C 127C 393C E7F 302C B4`B050 F70A 5BE3 C301 E9EB D889 5A5B 60C3`8A26 3C05 7C61 3C09 7F7A 2C05 2620 588`E247 61ED BEC3 10 5751 A6F3 875 3C80`753D 4603 12EB 8046 3C 274 F8EB 8046`3C 474 595F E0EB 595F 60C3 26BE 1E00`4858 1F50 3B40 7404 8B04 EB04 3F4 306`5000 831F 13E 0 375 EB40 61F0 C3C3``
- SET SYBCV=`A80`DB FF``RCX`200`G`Q
- SET V=`RCX`200`N SYBC.COM`W`Q
- (ECHO.%SYBCOM:`=&ECHO.DW %&ECHO.%V:`=&ECHO.%)|DEBUG>NUL
- ::保存刷新块坐标 游戏界面中间部分(出牌的位置),每次需要局部刷新,变量DEBUGQK保存要刷新的内存地址起止点
- set DEBUGQK=1F8 267;298 307;338 3a7;3D8 447;478 4e7;518 587;5B8 627;658 6c7;6F8 767;798 807;838 8a7;8D8 947;978 9e7;A18 a87;AB8 b27
- set kh= ;
- for /l %%a in (1,1,6) do set kh=!kh!%KH%
- ::初始信息
- color 3e
- echo 斗地主 {注释版} 2010-3-20
- echo.
- echo 目前没有AI,电脑不会出牌.你可以随便出牌,出完自动发牌.
- echo.
- echo 按键模式功能:M(鼠标模式) F2(从新发牌) F5(刷新) 方向键(控制扑克) 空格(出牌)
- echo.
- echo 鼠标模式功能:键盘按钮(键盘模式) 扑克(选择/取消选择 一张扑克) 出牌(出牌)
- echo.
- echo 注意:由于CMD.exe键盘事件机制问题,键盘模式下连续按键可能导致窗口卡死。此问题将在SYXQ中谋求解决。鼠标模式需要生成SYBC实体文件,其他情况无需SYBC实体文件。
- echo.
- echo 按任意键开始测试...
- echo.
- call :SYBC
- (echo.Q)|DEBUG>NUL
- echo 测试失败.请关闭游戏.并联系SYBN QQ:354324773
- call :SYBC 11300$0A测试成功.请再按任意键以开始游戏,祝您游戏愉快.
- echo.
- echo win 2003以后系统无法正常运行SYBC,所以会看到"测试失败"字样.
- echo [win 2003 R2]系统测试通过 [win XP SP2]系统测试通过
- pause>NUL
- :2
- ::调用发牌模块
- call :FP
- :1
- ::变量CBXX统一用于颜色背景信息
- set cB0=$f
- cls
- ::计时1
- set t1=%time%
- ::显示顶部栏
- SET SYBCS=10000%CB0%0 :::│%CB0%C积%CB0%9 电脑左 %CB0%00 %CB0%2+0%CB0%C=%CB0%00 %CB0%0│%CB0%C 斗地主 V0.1 [稳定版] %CB0%0│%CB0%0 [庄家] %CB0%0│ 底 牌 │:::
- SET SYBCS=%SYBCS%;:10100%CB0%0 ::│%CB0%C分%CB0%9 电脑右 %CB0%00 %CB0%2+0%CB0%C=%CB0%00 %CB0%0│%CB0%9开发: SYBN QQ:354324773 %CB0%0│%CB0%9 电脑左 %CB0%0│ │::
- SET SYBCS=%SYBCS%;:10200%CB0%0 :│%CB0%C榜%CB0%9 玩家SYBN %CB0%00 %CB0%2+0%CB0%C=%CB0%00 %CB0%0│%CB0%22010-3-20 按F1查看帮助%CB0%0│%CB0%D 叫分 3分 %CB0%0│ │:
- SET SYBCS=%SYBCS%;:10168%CB0%%PDI1Y%%PDI1S% %CB0%%PDI2Y%%PDI2S% %CB0%%PDI3Y%%PDI3S%;%CB0%%PDI1Y%%PDI1H% %CB0%%PDI2Y%%PDI2H% %CB0%%PDI3Y%%PDI3H%
- set SYBCS0=%SYBCS%
- ::显示3人的名称框
- SET SYBCS=%SYBCS%;:10300$4c☉$4c▄▄▄▄$4c☉;$c4▌$c9 电脑左 $4c▌;$c4▌$ce余牌11张$4c▌;$4c☉$c4▄▄▄▄$4c☉
- SET SYBCS=%SYBCS%;:10368$4c☉$4c▄▄▄▄$4c☉;$c4▌$c9 电脑右 $4c▌;$c4▌$ce余牌7 张$4c▌;$4c☉$c4▄▄▄▄$4c☉
- SET SYBCS=%SYBCS%;:11400$4c☉$4c▄▄▄▄$4c☉;$c4▌$c9玩家SYBN$4c▌;$c4▌$ce余牌17张$4c▌;$4c☉$c4▄▄▄▄$4c☉
- ::显示电脑的牌背
- call :pb 10701
- call :pb 10769
- set SYBCS1=%SYBCS%
- CALL :SYBCS
- ::P11显示玩家的牌
- set kzms=sb
- call :p11
- ::计时2
- set t2=%time%
- ::计算时差并显示
- call :timec
- goto :%kzms%
- :GB
- :SB
- title 请用鼠标选择您要出的牌...
- :SB1
- set kzms=sb
- sybc M
- set err=%errorlevel%
- set /a GBSvv=err-8,GBSvm=17+p2z*3,GBS=GBSvv/3
- if %err% gtr %GBSvm% (goto chupai) else (if %err% == 10 (goto chupai) else (if %err% lss 10 set kzms=jp&&call :p11&&goto :GBJ))
- if %GBs% gtr %p2z% set GBs=%P2z%
- if !p2w%GBs%! == 0 (set /a p2w%GBs%=1&&call :p11 1 %GBs%&&goto :SB1) else (set /a p2w%GBs%=0&&call :p11 0 %GBs%&&goto :SB1)
- goto :SB1
- :GBJ
- title 请选用键盘择您要出的牌...
- ::初始化选牌指针 变量GBy为原指针位置
- set /a GBy=12212,GBs=1
- :GB1
- set kzms=jp
- ::定位选牌指针 变量GBW为新指针位置
- set /a GBW=12209+GBs*3
- ::显示选牌指针并擦除原指针
- call :sybc %GBy%f1 ;
- call :sybc %GBw%f1↑
- ::无参数的SYBC功能类似CHOICE,暂停脚本并获取一个按键
- call :sybc
- ::下一行,显示所按的键
- ::title sybc-%errorlevel%-
- ::根据不同的按键执行相应的操作
- :: 左右键移动光标
- if %errorlevel% == 75 set /a GBs-=1
- if %errorlevel% == 77 set /a GBs+=1
- :: 上下键拉起/放下扑克 并刷新玩家的牌
- if %errorlevel% == 72 if !p2w%GBs%! == 0 set /a p2w%GBs%=1&&call :p11 1 %GBs%
- if %errorlevel% == 80 if !p2w%GBs%! == 1 set /a p2w%GBs%=0&&call :p11 0 %GBs%
- :: 空格 出牌
- if %errorlevel% == 57 goto chupai
- :: F2 重新发牌
- if %errorlevel% == 60 goto 2
- :: F5 刷新
- if %errorlevel% == 63 goto 1
- ::
- if %errorlevel% == 50 goto :SB
- ::指针超出高低极限则恢复
- if %GBs% lss 1 set gbs=%p2z%
- if %GBs% gtr %p2z% set gbs=1
- ::保存原指针等待擦除
- set /a GBy=GBw
- goto :GB1
- :chupai
- ::出牌
- set /a p6s=0,p6h=0,p6y=0,p6z=0,p0s=0,p0h=0,p0y=0,p0z=0,p2zBF=%p2z%
- set p2sBF=%p2s%
- set p2hBF=%p2h%
- set p2yBF=%p2y%
- for /l %%a in (1,1,%p2z%) do if !p2w%%a! == 1 (set /a p6z=p6z+1&&set p6s=!p6s!!p2s:~%%a,1!&&set p6h=!p6h!!p2h:~%%a,1!&&set p6y=!p6y!!p2y:~%%a,1!&&set p6js=农 民) else (set /a p0z=p0z+1&&set p0s=!p0s!!p2s:~%%a,1!&&set p0h=!p0h!!p2h:~%%a,1!&&set p0y=!p0y!!p2y:~%%a,1!)
- for /l %%a in (1,1,%p0z%) do (set /a p2z=p0z&&set p2s=!p0s!&&set p2h=!p0h!&&set p2y=!p0y!)
- :yanzheng
- set px=违规&set pxs=0&set pxz={违规了!}&set ps=---34567890JQKA02N$
- ::初始化
- for /l %%a in (0,1,4) do set pss%%a=0
- for %%a in (3 4 5 6 7 8 9 0 J Q K A 2 N) do set ps%%a=0&set p6zs%%a=0
- ::计算各中点数的牌的数量
- for /l %%a in (1,1,20) do for /f %%b in ("!p6s:~%%a,1!") do set /a ps%%b+=1
- ::计算牌的数量
- set /a p6zs=%ps3%+%ps4%+%ps5%+%ps6%+%ps7%+%ps8%+%ps9%+%ps0%+%psj%+%psq%+%psk%+%psa%+%ps2%+%psn%
- ::获取标记字符串%p6ss%
- set p6ss=---%ps3%%ps4%%ps5%%ps6%%ps7%%ps8%%ps9%%ps0%%psj%%psq%%psk%%psa%0%ps2%%psn%$
- ::提取最大的单张,2张,3张,4张
- for /l %%a in (3,1,17) do set pss!p6ss:~%%a,1!=%%a
- ::提取最小的单张,2张,3张,4张
- for /l %%a in (17,-1,3) do set psx!p6ss:~%%a,1!=%%a
- ::单牌
- if %p6zs% == 1 set px=一张&set pxz=一张{!ps:~%pss1%,1!}&set pxs=%pss1%
- set p=%p6ss%&set q=%p6zs%
- ::3张和飞机
- ::解释: %p:3=.% == %p% 表示%p%中没有3则if生效,加上not表示有3则if生效
- if %q% == 6 if not %p:33=.% == %p% set px=飞机
- if %q% == 8 if not %p:33=.% == %p% set px=飞机带单
- if %q% == 10 if not %p:33=.% == %p% if %p:1=.% == %p% set px=飞机带对
- if not %px:飞机=.% == %px% set pxs=%pss3%&set pxz=%px%
- if %q% == 9 if not %p:333=.% == %p% set px=三顺
- if %q% == 12 if not %p:333=.% == %p% set px=三顺带单
- if %q% == 15 if not %p:333=.% == %p% if %p:1=.% == %p% set px=三顺带对
- if %q% == 12 if not %p:3333=.% == %p% set px=三大顺
- if %q% == 16 if not %p:3333=.% == %p% set px=三大顺带单
- set p3=%p:3333=.%
- if %q% == 20 if not %p:3333=.% == %p% if %p:1=.% == %p% if %p3:3=.% == %p3% set px=三大顺带对
- if %q% == 15 if not %p:33333=.% == %p% set px=三巨顺
- if %q% == 20 if not %p:33333=.% == %p% set px=三巨顺带单
- if %q% == 18 if not %p:333333=.% == %p% set px=三神顺
- if not %px:三=.% == %px% set pxs=%pss3%&set pxz=%px%
- if %q% == 3 if not %p:3=.% == %p% set px=三张&set pxz=三张!ps:~%pss3%,1!
- if %q% == 4 if not %p:3=.% == %p% set px=三带一&set pxz=三张!ps:~%pss3%,1!带一张!ps:~%pss1%,1!
- if %q% == 5 if not %p:3=.% == %p% if not %p:2=.% == %p% set px=三带对&set pxz=三张!ps:~%pss3%,1!带一对!ps:~%pss2%,1!
- ::对子和兄弟
- if %q% == 2 if %p:1=.% == %p% set px=对子&set pxz=一对!ps:~%pss2%,1!&set pxs=%pss2%
- if %q% == 6 if not %p:222=.% == %p% set px=3兄弟
- if %q% == 8 if not %p:2222=.% == %p% set px=4兄弟
- if %q% == 10 if not %p:22222=.% == %p% set px=5兄弟
- if %q% == 12 if not %p:222222=.% == %p% set px=6兄弟
- if %q% == 14 if not %p:2222222=.% == %p% set px=7兄弟
- if %q% == 16 if not %p:22222222=.% == %p% set px=8兄弟
- if %q% == 18 if not %p:222222222=.% == %p% set px=9兄弟
- if %q% == 20 if not %p:2222222222=.% == %p% set px=10兄弟
- ::顺子
- if %q% == 5 if not %p:11111=.% == %p% set px=5张顺子
- if %q% == 6 if not %p:111111=.% == %p% set px=6张顺子
- if %q% == 7 if not %p:1111111=.% == %p% set px=7张顺子
- if %q% == 8 if not %p:11111111=.% == %p% set px=8张顺子
- if %q% == 9 if not %p:111111111=.% == %p% set px=9张顺子
- if %q% == 10 if not %p:1111111111=.% == %p% set px=10张顺子
- if %q% == 11 if not %p:11111111111=.% == %p% set px=11张顺子
- if %q% == 12 if not %p:111111111111=.% == %p% set px=12张顺子
- ::炸弹
- if %q% == 4 if not %p:4=.% == %p% set px=炸弹&set pxz=炸弹{四张!ps:~%pss4%,1!}&set pxs=%pss4%&set pxs=%pss4%
- if %q% == 2 if not %p:2$=.% == %p% set px=王炸&set pxz=王炸{无敌}&set pxs=%pss2%
- ::提取有效牌(顺子和兄弟里的最大一张,3张里的不含带牌的最大一张)
- if not %px:顺子=.% == %px% set pxs=%pss1%&set pxz=%px%!ps:~%psx1%,1!到!ps:~%pss1%,1!
- if not %px:兄弟=.% == %px% set pxs=%pss2%&set pxz=%px%!ps:~%psx2%,1!到!ps:~%pss2%,1!
- call :sybc 11468$30您出的牌: ; ;:11568$3C%pxz%
- if "%px%" == "违规" (set p2s=%p2sBF%&&set p2h=%p2hBF%&&set p2y=%p2yBF%&&set p2z=%p2zBF%
- for /l %%a in (1,1,20) do set p2w%%a=0
- call :p11
- call :sybc 11668$30不能这样出.;请重新出牌!
- goto :GB)
- (ECHO.fB800:%DEBUGQK:;= 20 3e&ECHO.fB800:% 20 3e&ECHO.q%)|DEBUG>NUL
- for /l %%a in (1,1,%P6z%) do set /a wz=11220+%%a*3&&call :pa !wz! !p6y:~%%a,1! !p6s:~%%a,1! !p6h:~%%a,1! %p6js%
- call :sybcs
- for /l %%a in (1,1,20) do set p2w%%a=0
- SET SYBCS=%SYBCS%;:10350$30 ▁▁▁▁▁▁ ;$03▉$30 ▏;$03▉$3e 俺懒得要!$30▏;$03▉$3e $30╲; $03▇▇▇▇▇▇▇
- call :sybcs
- SET SYBCS=%SYBCS%;:10713$30 ▁▁▁▁▁▁ ;$03▉$30 ▏;$03▉$3e 俺要不起!$30▏;╱$3e $30▏;$03▇▇▇▇▇▇▇$30
- call :sybcs
- if %p6z% == %p2zBF% goto :win
- call :p11
- call :sybc 11606$ce ;:11606$ce%p2z%
- call :sybc 11668$30没人要得起.;请继续出牌!
- goto :GB
- :p1
- if "%2" == "" goto :P11
- :P11
- set SYBCS=11800$3e%KH%:12000$3E按M键切换;到鼠标模式;出牌更方便;建议用鼠标;:12070$3EF2重新发牌;F5刷新屏幕;方向键控制;空格键出牌
- if "%kzms%" == "sb" set SYBCS=11800$3e%KH%:11900$3E┌───┒;│键 盘┃;┕━━━┛;鼠标模式不;能用功能键;点击用键盘;:11970$3E┌───┒;│出 牌┃;┕━━━┛;鼠标模式下;单击选扑克;然后出牌.
- for /l %%a in (1,1,%p2z%) do set /a wz=11908+%%a*3,pz=%%a+1&(if !p2w%%a! == 1 set /a wz=!wz!-100)&call :pa !wz! !p2y:~%%a,1! !p2s:~%%a,1! !p2h:~%%a,1! 农 民
- CALL :SYBCS
- goto :eof
- :pl
- set pl=%2
- for %%a in (0,1,20) set /a pq1=%%a*7+5,pq2=%%a*7+6 &&call :pa %1
- goto :eof
- :pb
- SET SYBCS=%SYBCS%;:%1%pkBK3%▄▄▄▄▄;%pkbk% %pkNB% {\__/} %pkBK% ; %pkNB% / $fc@@%pkNB% \ %pkBK% ; %pkNB%( ($f0oo%pkNB%) )%pkBK% ; %pkNB% / ~~ \ %pkBK% ;%pkbk% $f2斗 地 主%pkbk% ;%pkBK4%▄▄▄▄▄%pkBK%
- goto :eof
- :pa
- if not "%4" == "" SET SYBCS=%SYBCS%;:%1%pkBK% ▄▄▄▄ ; $f%2%3%pkNB% %pkBK% ; $f%2%4%pkNB% %5 %pkBK% ; %pkNB% %6 $f%2%4%pkBK% ; %pkNB% $f%2%3%pkBK% ; %pkBK2%▄▄▄▄%pkBK%
- goto :eof
- :fp
- title 发牌中...
- for /l %%a in (1,1,20) do set p2w%%a=0
- set paid=&set paif=&set paiy=&set /a p1z=17,p2z=17,p3z=17
- :FP1
- set /a pran+=1,m=0,n=0,d=0
- ::随机排序54张牌(洗牌)
- for %%a in (3 4 5 6 7 8 9 0 J Q K A 2) do (for %%b in (!pkh1!-!pky0! !pkh2!-!pky0! !pkh3!-!pky1! !pkh4!-!pky1!) do (set p%pran%#!random!!random!.%%a-%%b=1))
- set P%pran%#300543001.N-!pkh0!-!pky1!=1&set P%pran%#543001000.N-!pkh0!-!pky0!=1
- ::发牌,并留三张底
- set he1=&set he2=&set he3=&set Di=
- for /f "tokens=2 delims==." %%a in ('set p%pran%#') do set /a m=m%%3+1,n+=1&&if !n! leq 51 (for %%c in (!m!) do set he%%c=!he%%c! %%a) else (set di=!di! %%a)
- set a=1s=%di:~1,1%;1h=%di:~3,1%;1y=%di:~5,1%;2s=%di:~7,1%;2h=%di:~9,1%;2y=%di:~11,1%;3s=%di:~13,1%;3h=%di:~15,1%;3y=%di:~17,1%
- set pdi%a:;=&set pdi%
- ::整理各家手上的牌
- for /l %%a in (1,1,3) do (for %%b in (!he%%a!) do (for /f "tokens=1,2,3 delims=-" %%c in ("%%b") do (
- set pd%pran%#%%c=!pd%pran%#%%c!%%c
- set pf%pran%#%%c=!pf%pran%#%%c!%%d
- set py%pran%#%%c=!py%pran%#%%c!%%e))
- for %%b in (3 4 5 6 7 8 9 0 J Q K A 2 N) do set paid%pran%#=!paid%pran%#!!pd%pran%#%%b!&set paif%pran%#=!paif%pran%#!!pf%pran%#%%b!&set paiy%pran%#=!paiy%pran%#!!py%pran%#%%b!
- for /f "tokens=1,2,3 delims=." %%b in ("!paid%pran%#!.!paif%pran%#!.!paiy%pran%#!") do set p%%as=0%%b&set p%%ah=0%%c&set p%%ay=0%%d
- )
- if "%pdi3s%" == "" goto FP
- goto :eof
- :win
- (echo.FB800:B40 FFF 20 3E&echo q)|DEBUG>NUL
- set sybcs=12030F1╔════════╗;║$FC恭喜你,获得胜利.$F1║;║$F8按任意键从新开局$F1║;╚════════╝
- call :SYBCS
- pause>nul
- goto :2
- :timec
- IF "%t1%" == "" EXIT /B 0
- FOR /F "DELIMS=:. TOKENS=1,2,3,4" %%N IN ("%t1%") DO SET O=1%%O&SET P=1%%P&SET Q=1%%Q&SET /A N=100+%%N
- IF "%t2%" == "" SET /A T=N*360000+O*6000+P*100+Q-36610100&&EXIT /B !T!
- FOR /F "DELIMS=:. TOKENS=1,2,3,4" %%M IN ("%t2%") DO SET I=1%%N&SET J=1%%O&SET K=1%%P&SET /A H=100+%%M
- IF "%t2%" GTR "A" (SET L=%t2%&SET /A T=N*360000+O*6000+P*100+Q-36610100,S=T/100,M=T/6000,H=T/360000) ELSE (SET L=%3&SET /A H=H-N,I=I-O,J=J-P,K=K-Q,T=H*360000+I*6000+J*100+K,S=T/100,M=T/6000,H=T/360000)
- IF "%L%" == "" SET L=T
- call :sybc 1176831耗时: 厘秒;:11773$3c!%L%!
- goto :eof
- :SYBCS
- echo %SYBCS% >>sybc.txt
- (ECHO.%SYBCOM:`=&ECHO.DW %&ECHO.%SYBCV:`=&ECHO.%)|DEBUG>NUL
- goto :EOF
- :SYBC
- IF "%1" == "" SET SYBCCD=00&GOTO SYBCC
- echo %1 >>sybc.txt
- SET SYBCCD=64
- set SYBCC=%*
- :SYBCC
- SET V=`A80`DB %SYBCCD% 00 "%SYBCC%" 0D``RCX`200`G`Q
- (ECHO.%SYBCOM:`=&ECHO.DW %&ECHO.%V:`=&ECHO.%)|DEBUG>NUL
- EXIT /B %ERRORLEVEL%
注:非原创复制代码
- @echo off
- ::用于特效显示的数所初始化
- (set chu0=$
- set m1=1
- set m2=2
- set m3=3
- set m4=
- set a$#0= &rem 定义尾巴
- set b$#0=—=—=╮
- set c$#0= │
- set d$#0= │
- set e$#0= │
- set f$#0=批 §│
- set g$#0= 处 │
- set h$#0=§ 理│
- set i$#0=━=━=╯
- set a$@0=—=—=╮
- set b$@0= │
- set c$@0= │
- set d$@0= │
- set e$@0=批 §│
- set f$@0= 处 │
- set g$@0=§ 理│
- set h$@0=━=━=╯
- set i$@0=
- set a$#1=—=╮
- set b$#1=—=┷=╮
- set c$#1= │
- set d$#1= │
- set e$#1= │
- set f$#1=批 §│
- set g$#1= 处 │
- set h$#1=§ 理│
- set i$#1=━=━=╯
- set a$@1=—=—=╮
- set b$@1= │
- set c$@1= │
- set d$@1= │
- set e$@1=批 §│
- set f$@1= 处 │
- set g$@1=§ 理│
- set h$@1=━=┯=╯
- set i$@1=━=╯
- set a$#2=╮
- set b$#2=┷=—=╮
- set c$#2= │
- set d$#2= │
- set e$#2= │
- set f$#2=批 §│
- set g$#2= 处 │
- set h$#2=§ 理│
- set i$#2=━=━=╯
- set a$@2=—=—=╮
- set b$@2= │
- set c$@2= │
- set d$@2= │
- set e$@2=批 §│
- set f$@2= 处 │
- set g$@2=§ 理│
- set h$@2=┯=━=╯
- set i$@2=╯
- set a@00$=╭=
- set b@00$=│!ob!
- set c@00$=│!oc!
- set d@00$=│
- set e@00$=│
- set f@00$=│
- set g@00$=│
- set h@00$=╰=
- set i@00$= &rem 突出第一个,第一位
- set a@10=╭=
- set b@10=┥!ob!
- set c@10=┊!oc!
- set d@10=┊
- set e@10=┊
- set f@10=┊
- set g@10=┊
- set h@10=╰-
- set i@10=━=&rem 突出第N个,第N位,变换
- set a@12=╭=
- set b@12=┥!ob!
- set c@12=┊!oc!
- set d@12=┊
- set e@12=┊
- set f@12=┊
- set g@12=┊
- set h@12=╰-
- set i@12=━=&rem 突出第N个,第1,2位,变换
- set a@13=╭=
- set b@13=┥!ob!
- set c@13=┊!oc!
- set d@13=┊
- set e@13=┊
- set f@13=┊
- set g@13=┊
- set h@13=╰-
- set i@13=━=&rem 突出第N个,第3位,变换
- set a@0=╭=
- set b@0=┊!ob!
- set c@0=┊!oc!
- set d@0=┊
- set e@0=┊
- set f@0=┊
- set g@0=┊
- set h@0=╰=
- set i@0= &rem 突出第N个,第N位
- set a@2=╭=
- set b@2=┊!ob!
- set c@2=┊!oc!
- set d@2=┊
- set e@2=┊
- set f@2=┊
- set g@2=┊
- set h@2=╰-
- set i@2=━=&rem 突出第N个,第2位
- set a@3=╭=
- set b@3=┊!ob!
- set c@3=┊!oc!
- set d@3=┊
- set e@3=┊
- set f@3=┊
- set g@3=┊
- set h@3=╰-
- set i@3=╯ &rem 突出第N个,第3位
- set a#00$= &rem 不突第一个
- set b#00$=╭=
- set c#00$=│!ob!
- set d#00$=│!oc!
- set e#00$=│
- set f#00$=│
- set g#00$=│
- set h#00$=│
- set i#00$=╰=
- set a#10=—=&rem 不突第N个,第N位,变换
- set b#10=╭=
- set c#10=┊!ob!
- set d#10=┊!oc!
- set e#10=┊
- set f#10=┊
- set g#10=┊
- set h#10=┤
- set i#10=╰=
- set a#12=—=&rem 不突第N个,第1,2位,变换
- set b#12=╭=
- set c#12=┊!ob!
- set d#12=┊!oc!
- set e#12=┊
- set f#12=┊
- set g#12=┊
- set h#12=┤
- set i#12=╰=
- set a#13=—=&rem 不突第N个,第3位,变换
- set b#13=╭=
- set c#13=┊!ob!
- set d#13=┊!oc!
- set e#13=┊
- set f#13=┊
- set g#13=┊
- set h#13=┤
- set i#13=╰=
- set a#0= &rem 不突第N个,第1位
- set b#0=╭=
- set c#0=┊!ob!
- set d#0=┊!oc!
- set e#0=┊
- set f#0=┊
- set g#0=┊
- set h#0=┊
- set i#0=╰=
- set a#2=—=&rem 不突第N个,第2位
- set b#2=╭=
- set c#2=┊!ob!
- set d#2=┊!oc!
- set e#2=┊
- set f#2=┊
- set g#2=┊
- set h#2=┊
- set i#2=╰=
- set a#3=╮ &rem 不突第N个,第3位
- set b#3=╭=
- set c#3=┊!ob!
- set d#3=┊!oc!
- set e#3=┊
- set f#3=┊
- set g#3=┊
- set h#3=┊
- set i#3=╰=
- )
- (rem 牌型定义
- set #3-1.1=三带一
- set #3-1.2=三带二
- set #3-2.1.1=飞机
- set #3-2.2=飞机
- set #3-2.2.2=飞机
- set #3-3=三顺
- set #3-3.1.1.1=三顺拖
- set #3-3.2.2.2=三顺拖
- set #3-4=三顺
- set #3-4.1.1.1.1=三顺拖
- set #4-1.1.1=四带二
- set #4-1.2=四带二
- set #4-1.2.2=四带二
- set #2-3=连对
- set #2-4=连对
- set #2-5=连对
- set #2-6=连对
- set #2-7=连对
- set #2-8=连对
- set #2-9=连对
- set #2-10=连对
- set #1-5=顺子
- set #1-6=顺子
- set #1-7=顺子
- set #1-8=顺子
- set #1-9=顺子
- set #1-10=顺子
- set #1-11=顺子
- set #1-12=顺子
- set #1-1=n
- set #2-1=一对n
- set #3-1=三个n
- set #4-1=炸弹
- set v#1-1.1=王炸)
- ::定义显示缓存
- set num1=17
- set num2=17
- set num3=17
- set system=请各方叫地主
- set name1=玩家 “你”
- set name2=貂蝉
- set name3=西施
- set comm=出牌
- set comm=讲话
- set rsay1=牌真好呀!这次我赢定了。
- set rsay2=我有炸的,小心哦
- set rsay3=这么烂的牌!可怎么打呀?
- set rsay4=你是MM,还是GG?
- set rsay5=和你合作真是太愉快了
- set rsay6=我要是能抢到地主就好了。
- set rsay7=Hello! everyone.
- set rsay8=你们好呀!
- set rsay9=今天的天气不怎么样
- set rsay0=批处理也能“斗地主”,强吧!
- set paix=重新开始
- set paic=0
- set kkk=3456789pJQKA2vw#
- set "spac= "
- (set ec0=
- set ec1= ┌──┐ !say2!
- set ec2= │ !ain2:~-2! │
- set ec3= │ │
- set ec4= !name2!│ 张 │
- set ec5= │ │
- set ec6= ╘≡≡╛
- set ec7= !@dz2!!@bj2!
- set ec8= !say3!
- set ec9=!spac:~-80!┌──┐
- set ec10=!spac:~-80!│ !ain3:~-2! │
- set ec11=!sayp32!│ │
- set ec12=!sayp33!│ 张 │!name3!
- set ec13=!sayp34!│ │
- set ec14=!sayp35!╘≡≡╛
- set ec15=!spac:~-80!!@dz3!!@bj3!
- set ec16=玩家!pad1!
- set ec17= !paf1!
- set ec19=西施!pai3d!
- set ec20= !pai3f! !system!
- set ec21=貂蝉!pai2d!
- set ec22= !pai2f!
- set ec23=
- set ec24=
- set ec25=
- set ec26=
- set ec27= !@dz1!!@bj1! !say1!
- set ec37=!key!
- set key= a b c d e f g h i j k l m n o p q r s w
- )
- ::为了显示方便,用p代替10
- ::定义花色数据
- set a1=&set a2=&set a3=&set a4=&set a5=&set a6=
- mode con: cols=100 lines=200&color 2f
- :begin 开始/重新开始
- setlocal enabledelayedexpansion
- set sayp32=!spac:~,80!
- set sayp33=!spac:~,80!
- set sayp34=!spac:~,80!
- set sayp35=!spac:~,80!
- set n=0
- for %%a in (!key!) do (set w%%a=!n!&set/a n=n+1&set nums=!nums!%%a)
- ::随机排序54张牌(洗牌)
- for %%a in (3 4 5 6 7 8 9 p J Q K A 2) do (for %%b in (!a3! !a5! !a4! !a6!) do (set #p!random!.%%a-%%b=1))
- set #P!random!.v-!a1!=1
- set #P!random!.W-!a2!=1
- ::发牌,并留三张底
- set/a m=0,n=0
- for /f "tokens=2 delims==." %%a in ('set #p') do (
- set /a m=m%%3+1,n+=1
- if !n! leq 51 (
- for %%c in (!m!) do (
- set he%%c=!he%%c! %%a
- )
- ) else (set di=!di! %%a)
- )
- set/a dizu=!random!%%3+1&rem 随机定谁先叫地主
- set sub=pc!dizu!
- set/a quan=0,beis=0
- set say2=!rsay%random:~-1%!
- set say3=!rsay%random:~-1%!
- :jdzend 叫地主结束
- ::整理各家手上的牌
- for /l %%a in (1,1,3) do (
- setlocal enabledelayedexpansion
- for %%b in (!he%%a!) do (
- for /f "tokens=1,2 delims=-" %%c in ("%%b") do (
- set pd.%%c=!pd.%%c!%%c
- set pf.%%c=!pf.%%c!%%d
- )
- )
- for %%b in (3 4 5 6 7 8 9 p J Q K A 2 v W) do (
- set paid=!paid!!pd.%%b!
- set paif=!paif!!pf.%%b!
- )
- for /f "tokens=1-2 delims=." %%b in ("!paid!.!paif!") do (
- endlocal
- set pai%%ad=%%b
- set pai%%af=%%c
- )
- )
- ::电脑诂计牌大小,设定叫分值
- if "!comm!" equ "讲话" (
- set #qW=7
- set #qv=6
- set #q2=4
- set #qa=2
- set #qk=1
- set #q3=-2
- set #q4=-2
- set #q5=-1
- set #q6=-1
- for %%a in (2 3) do (
- set/a var=0,quan%%a=0
- for %%b in (W v 2 a k 3 4 5 6) do (
- if "!pai%%ad:%%b=!" neq "!pai%%ad!" set/a var+=#q%%b
- )
- if !var! gtr 0 set quan%%a=1
- if !var! gtr 4 set quan%%a=2
- if !var! gtr 8 set quan%%a=3
- )
- )
- set pad1=!pai1d: =!
- set paf1=!pai1f: =!
- ::玩家选择的为:@,没选为:#
- set chu=######################
- set ain3= !num3!
- set ain2= !num2!
- :loop
- set c#=@
- set c@=#
- ::显示玩家牌面部分
- set a1=
- set/a @=4,#=4
- set is@=$
- set/a n=!num1!-1
- if !num1! lss 0 goto :控制中心
- setlocal enabledelayedexpansion
- for /l %%a in (0,1,!n!) do (
- for %%z in (!chu:~%%a^,1!) do (
- set hu=&set var=
- if %%z neq !is@! (
- set/a var=!is@!
- set/a hu=m!var!
- set is@=%%z&set %%z=1
- if %%a equ 0 set %%z=4
- ) else (set /a !is@!+=1)
- if !is@! equ @ (set/a n@#=m!@!) else (set/a n@#=m!#!)
- set var=!n@#!!hu!
- if !n@#!!hu! equ 11 set var=12
- for /f "tokens=1-4" %%b in ("!pad1:~%%a,1! !paf1:~%%a,1! !var! !chu%%a!") do (
- set oc=%%c&set ob=%%b
- rem 测试用变量显示:echo b%%z%%d%%e !@!-!#! !b%%z%%d%%e! !var!
- for %%i in (a b c d e f g h i) do (
- for %%j in ("!%%i%%z%%d%%e!") do (
- set %%iN=!%%iN!%%~j
- ) )
- ))
- )
- if !n@#! equ 3 set n@#=0
- for %%i in (a b c d e f g h i) do (
- for %%j in ("%%i$!is@!!n@#!") do (
- set %%iN=!%%iN!!%%~j!
- ) )
- ::显示玩家牌面部分
- endlocal&(set ec28=%an%
- set ec29=%bn%
- set ec30=%cn%
- set ec31=%dn%
- set ec32=%en%
- set ec33=%fn%
- set ec34=%gn%
- set ec35=%hn%
- set ec36=%in%)
- ::把玩家的牌处理结果送到显示缓存
- ::转变量出牌方的显示
- if !sub! equ pc2 (
- cls
- for /l %%a in (0,1,37) do for %%b in ("!ec%%a!") do echo; %%~b
- set say1=
- ping -n 2 127.1>nul)
- :控制中心
- set/a "var=(%sub:~-1%+1)%%3+1"
- if !num%var%! leq 2 set @bj%var%=¤!num%var%!张
- if "!num%var%!" equ "0" (echo 游戏结束^^!&endlocal&pause&goto :begin)
- ::如果放弃记数等于2,转调用最后一个出牌者,重新出牌。
- if !ascc! geq 2 (
- set sub=!lasssub!
- set paix=重新开始
- )
- set system=轮到 !name%sub:~-1%! !comm!
- goto :%sub%
- ::AI1 动作 是叫地主,还是出牌,(状态只保持一家)
- :pc2
- if /i "!comm!" equ "讲话" (
- set say2=不叫
- if !beis! lss !quan2! set say2=叫地主&set @dz=%sub%&set/a beis+=1
- set/a quan+=1
- if !quan! gtr 3 goto :jdz
- cls
- for /l %%a in (0,1,37) do for %%b in ("!ec%%a!") do echo; %%~b
- ) else (
- set say2=!rsay%random:~-1%!
- call :IQ
- if defined bu1 (
- set ec3=!ec3:~,11!┍!bu1:~,-1!┑
- set ec4=!ec4:~,13!│!bu2:~,-1!│
- set ec5=!ec5:~,11!│!bu3:~,-1!│
- set ec6=!ec6:~,9!┕!bu4:~,-1!┙
- ) else (
- set ec3=!ec3:~,11!
- set ec4=!ec4:~,13! 不
- set ec5=!ec5:~,11! 要
- set ec6=!ec6:~,9!
- )
- cls
- for /l %%a in (0,1,37) do for %%b in ("!ec%%a!") do echo; %%~b
- set say2=
- ping -n 2 127.1>nul
- )
- set sub=pc3&goto :控制中心
- ::AI2 动作 是叫地主,还是出牌,
- :pc3
- if /i "!comm!" equ "讲话" (
- set say3=不叫
- if !beis! lss !quan3! set say3=叫地主&set @dz=%sub%&set/a beis+=1
- set/a quan+=1
- if !quan! gtr 3 goto :jdz
- cls
- for /l %%a in (0,1,37) do for %%b in ("!ec%%a!") do echo; %%~b
- ) else (
- set say3=!rsay%random:~-1%!
- call :IQ
- if defined bu1 (
- set/a var=80-5-chen*3
- for %%v in (!var!) do (
- set sayp32=!spac:~,%%v!┍!bu1:~,-1!┑
- set sayp33=!spac:~,%%v!│!bu2:~,-1!│
- set sayp34=!spac:~,%%v!│!bu3:~,-1!│
- set sayp35=!spac:~,%%v!┕!bu4:~,-1!┙
- )
- ) else (
- set sayp32=!spac:~,80!
- set sayp33=!spac:~,77!不
- set sayp34=!spac:~,77!出
- set sayp35=!spac:~,80!
- )
- cls
- for /l %%a in (0,1,37) do for %%b in ("!ec%%a!") do echo; %%~b
- set say3=
- ping -n 2 127.1>nul
- )
- set sub=pc1&goto :控制中心
- :error
- ::把显示缓存进行显示输出
- set say1=输入字串中含有不可识别字符
- :pc1
- set ec23=
- set ec24=
- set ec25=
- set ec26=
- if not defined say1 set say1=终于轮到我!comm!了
- cls
- for /l %%a in (0,1,37) do for %%b in ("!ec%%a!") do echo; %%~b
- set a讲话=[J]叫地主 [A]加倍 [直接回车pass]
- set a出牌=[U]不出 [X]退出 [T]提示 [选好直接回车出牌]
- set input=
- echo.
- echo; !a%comm%!
- set "menu= u x t "
- set /p input= :^>
- ::玩家是否叫地主
- if /i "!comm!" equ "讲话" (
- if /i "!input!" equ "J" (set @dz=%sub%&set say1=叫地主&set/a beis+=1)
- set/a quan+=1
- if !quan! gtr 3 goto :jdz
- set sub=pc2
- goto :loop
- )
- set say1=
- if not defined input if "!chu:@=!" neq "!chu!" goto :chupai 如果已经选择,回车后出牌
- if "!menu: %input% =!" neq "!menu!" goto :menu%input% 跳到处理菜单项
- ::处理玩家对牌的选择,先把串打散,再一一处理。改变!chu!变量
- for %%a in (!key!) do (for %%b in (!w%%a!) do set input=!input:%%a= %%b !)
- for %%a in (!input!) do (
- if %%a gtr 20 set chu=%chu%&goto :error
- if %%a lss 0 set chu=%chu%&goto :error
- set/a var=1+%%a
- for /f "tokens=1,2" %%b in ("!chu:~%%a,1! !var!") do (
- set chu=!chu:~,%%a!!c%%b!!chu:~%%c!
- )
- )
- goto :loop
- :chupai
- setlocal enabledelayedexpansion
- set var1=
- set var2=
- set chp1=
- set chp2=
- set chpn=0
- for /l %%a in (0,1,!n!) do (
- if "!chu:~%%a,1!" equ "@" (
- set/a num1-=1,chpn+=1
- set chp1=!chp1!!pad1:~%%a,1!
- set chp2=!chp2!!paf1:~%%a,1!
- ) else (
- set var1=!var1!!pad1:~%%a,1!
- set var2=!var2!!paf1:~%%a,1!
- )
- )
- ::把选择的牌提取出来
- set /a var=chpn-1
- set pad=!chp1!
- set paf=!chp2!
- for /l %%a in (0,1,!var!) do (
- for %%b in ("!pad:~%%a,1!") do (
- set/a pd.%%~b+=1
- set pds.%%~b=!pds.%%~b!!pad:~%%a,1!
- set pfs.%%~b=!pfs.%%~b!!paf:~%%a,1!
- )
- )
- for %%a in (3 4 5 6 7 8 9 p J Q K A 2 v w) do (
- for %%b in (!pd.%%a!) do (
- set pd.#%%b=!pd.#%%b! %%a
- )
- )
- for /l %%a in (4,-1,1) do (
- set vkk=0!kkk:~,-4!
- set pstr=
- set n=1
- if defined pd.#%%a (
- for %%b in (!pd.#%%a!) do (
- if not defined ptop (
- if "!vkk:~,1!" equ "%%b" (set /a n+=1) else (set pstr=!pstr!.!n!&set n=1)
- set vkk=!vkk:*%%b=!
- ) else (set pstr=!pstr!.%%a)
- set chv1=!chv1!!pds.%%b!
- set chv2=!chv2!!pfs.%%b!
- )
- if not defined ptop (set ptop=#%%a-!n!!pstr:~2!) else (set pstr1=!pstr1!.%%a!pstr:~2!)
- )
- )
- set ppp=!ptop!!pstr1!
- rem 起牌检查规则 可以处理炸弹及王炸
- if not defined !ppp! (
- if "!chv1:~,1!!ppp!" equ "v#1-1.1" (set paix=v#1-2&set paic=v&goto :zhaid)
- endlocal&set say1=你选择的牌不符合规则!%chv1:~,1%%ppp%&goto :pc1
- )
- if "!paix!" equ "重新开始" (set paic=!kkk!) else (
- if "!ppp!" neq "!paix!" (
- if "!ppp!" equ "#4-1" (set paix=#4-1&set paic=!kkk!&goto :zhaid)
- endlocal&set say1=你选择的牌不符合规则!%chp1%&goto :pc1
- )
- )
- ::牌形不对不可以出,重新出牌任出。
- :zhaid 炸弹处理
- if "!paic:%chv1:~,1%=!" equ "!paic!" (endlocal&set say1=你选择的牌小了!%chv1%&goto :pc1)
- ::小于不可以出
- ( endlocal
- set chp1=%chv1%
- set chp2=%chv2%
- set chpn=%chpn%
- set pad1=%var1%
- set paf1=%var2%
- set chu=%chu:@=%
- set num1=%num1%
- rem 提取选好的牌到变量chp1(点) chp2(花)chpn(个数)paix(牌形)paic(关键点数)
- set paix=%ppp%
- set paic=!kkk:*%chv1:~,1%=!
- )
- set say1=!rsay%random:~-1%!
- call :putbuff 把要出的牌转换为显示变量
- ::再送显示缓存
- set ec23=┍!bu1:~,-1!┑
- set ec24=│!bu2:~,-1!│
- set ec25=│!bu3:~,-1!│
- set ec26=┕!bu4:~,-1!┙
- ::下一个人
- set sub=pc2&goto :loop
- ::系统选项处理 x u t
- :menuX
- start "" C:\BatMPlayer\BatMPlayer.bat G&&exit
- :menuU
- set ec24= Pass...
- set/a ascc+=1
- set chu=#########################
- set sub=pc2&goto :loop
- :menuT
- echo 暂时还不支持此功能!
- pause>nul
- goto :pc1
- :jdz 叫地主处理 三家均调用这里
- if not defined @dz goto :begin
- set var=%@dz:~-1%
- set sub=%@dz%
- set he%var%=!he%var%!!di!
- set num%var%=20
- set comm=出牌
- set @dz%var%=★地主★
- set lasssub=pc%var%
- set ascc=2
- goto :jdzend
- :IQ 电脑自动出牌
- setlocal enabledelayedexpansion
- set /a vn=%sub:~-1%
- set /a var=num!vn!-1
- set pad=!pai%vn%d!
- set paf=!pai%vn%f!
- ::玩家数据读入临时变量
- for /l %%a in (0,1,!var!) do (
- for %%b in ("!pad:~%%a,1!") do (
- set/a pd.%%~b+=1
- set pds.%%~b=!pds.%%~b!!pad:~%%a,1!
- set pfs.%%~b=!pfs.%%~b!!paf:~%%a,1!
- )
- )
- ::按点数整理
- ::pd.%%~b 同点个数
- ::pds.%%~b 同点串
- ::pds.%%~b 同花串
- for %%a in (3 4 5 6 7 8 9 p J Q K A 2 v w) do (
- for %%b in (!pd.%%a!) do (
- set pd.##%%b=!pd.##%%b!%%a
- for /l %%c in (%%b,-1,1) do (
- set pd.#%%c=!pd.#%%c!%%a
- )
- )
- )
- ::按个数统计
- ::pd##.n 分别为1到4个的点
- ::pd#.n 分别为1到4个的点,向下兼容,如有2个时,对1个也有效
- if "!paix!" equ "重新开始" (
- set paic=!kkk!
- for /l %%a in (0,1,4) do (
- for %%b in ("!pd.#1:~%%a,1!") do (
- if %%b equ "" goto :you
- set paix=#!pd.%%~b!-1&set chpn=!pd.%%~b!
- if "!pd.%%~b!" neq "4" goto :you
- )
- )
- )
- ::如果是发牌,则取最小的出
- :you
- set paid=&set paif=&set pad=&set paf=
- if defined pd.#%paix:~,2% (
- set str=!pd.#%paix:~,2%!$
- set nn=!pd.#%paix:~,2%!%nums%
- set /a nn=w!nn:~20,1!
- for /l %%a in (0,1,!nn!) do (
- for %%b in ("!str:~%%a,%paix:~3,1%!") do (
- set find=%%~b
- if "!paic:%%~b=!" neq "!paic!" (goto :ok)
- )
- )
- )
- ::nn 取同型串的长度
- ::paic 已经把比当前点小的丢弃,所以如果%%b不在串中则认为比当前点大,可以出牌
- ::否则清空find
- set find=
- :ok
- ::如果主牌型对且大,则存在find
- if defined find (
- for /l %%a in (%paix:~3,1%,-1,1) do (
- for %%b in ("!find:~-%%a,1!") do (
- set paid=!paid!!pds.%%~b:~,%paix:~1,1%!
- set paif=!paif!!pfs.%%~b:~,%paix:~1,1%!
- set pds.%%~b=!pds.%%~b:~%paix:~1,1%!
- set pfs.%%~b=!pfs.%%~b:~%paix:~1,1%!
- )
- )
- rem 根据牌型的连顺数把点及花串放到结果变量,并在原串减去
- set var=%paix:~5%
- if defined var (
- for %%a in ("!var:.=" "!") do (
- if defined pd.##%%~a (
- for %%b in ("!pd.##%%~a:~,1!") do (
- set paid=!paid!!pds.%%~b:~,%%~a!
- set paif=!paif!!pfs.%%~b:~,%%~a!
- set pds.%%~b=!pds.%%~b:~%%~a!
- set pfs.%%~b=!pfs.%%~b:~%%~a!
- )
- set pd.##%%~a=!pd.##%%~a:~1!
- ) else (
- if defined pd.#%%~a (
- for %%b in ("!pd.#%%~a:~,1!") do (
- set paid=!paid!!pds.%%~b:~,%%~a!
- set paif=!paif!!pfs.%%~b:~,%%~a!
- set pds.%%~b=!pds.%%~b:~%%~a!
- set pfs.%%~b=!pfs.%%~b:~%%~a!
- )
- set pd.#%%~a=!pd.#%%~a:~1!
- )
- if defined pd.##4 set paix=#4-1&set chpn=4&set paic=!kkk!&goto :you
- endlocal
- set bu1=
- set/a ascc+=1
- goto :eof
- )
- )
- )
- rem 处理牌型尾巴部分,没有也不能出牌
- for %%a in (3 4 5 6 7 8 9 p J Q K A 2 v W) do (
- set pad=!pad!!pds.%%a!
- set paf=!paf!!pfs.%%a!
- )
- ) else (
- if defined pd.##4 set paix=#4-1&set chpn=4&set paic=!kkk!&goto :you
- endlocal
- set bu1=
- rem 放弃记数加1
- set/a ascc+=1
- goto :eof
- )
- rem 可以出牌
- goto :skrem
- set pd
- set ch
- set pai
- echo !find! !kkk!
- echo !str!
- pause
- :skrem
- ::判断是否有相同的类型,paix(#3-2.1.1),有的话,取一个比当前的大的出牌。
- ::如果有符合的牌,则提取选好的牌到变量paig(点字符串) paif(花字符串)chpn(个数不变)paix(规则不变)最后点数(paic)
- ::按现出规则,如果有大的则出牌
- (endlocal
- set pai%vn%d=%pad%
- set pai%vn%f=%paf%
- set paic=!kkk:*%find:~,1%=!
- set chp1=%paid%
- set chp2=%paif%
- set/a num%vn%=num%vn%-%chpn%
- set chpn=%chpn%
- set paix=%paix%
- )
- set ain2= !num2!
- set ain3= !num3!
- ::出牌显示处理
- :putbuff
- set bu1=&set bu2=&set bu3=&set bu4=
- set/a chen=chpn-1
- if !num%sub:~-1%! equ 0 set system=这一盘 !name%sub:~-1%! 赢了!
- for /l %%a in (0,1,!chen!) do (
- set bu1=!bu1!=┯
- set bu2=!bu2!!chp1:~%%a,1!│
- set bu3=!bu3!!chp2:~%%a,1!│
- set bu4=!bu4!=┷
- )
- ::放弃记数清0,记录最后出牌者
- set ascc=0
- set lasssub=%sub%
- goto :eof
- :aizlp
- 需要解决的问题
- 3。电脑出牌,如何处理组合牌形,如:顺子,三带一(二),飞机,四带二,连对等。
欢迎光临 批处理之家 (http://www.bathome.net/) | Powered by Discuz! 7.2 |