返回列表 发帖

欢迎大家一起来开发【批处理版斗地主】

本帖最后由 cjiabing 于 2011-9-2 20:13 编辑

      斗地主游戏玩多了,心痒痒的也想用批处理写一个。见有人写批处理版的斗地主游戏,但都没见完工的。自己整理了下思路,有兴趣的朋友一起来共同开放吧!~以下是思路:

说明、进度等在三楼,主程序代码在二楼。

成功一半:代码在二楼2011年6月26日

这两天有空瞎整了一下,终于完成了自家牌分析——看自己有什么牌(还需完善),以及吃牌分析——看对家出的是什么牌。现在可以发牌开始玩游戏,不过还是自己在玩。电脑要稍微改进一下才能人机对战,不过也只能是初级的,因为分析牌型很费劲。

下一步:初级人机对战好高兴!~

-----------------------------------------------------------------------------------------------------------------


    一、我一楼二楼说得不够爽朗,我这里说一下电脑怎么出牌。

    首先要用到一个“接口”。什么是接口,就是几个玩家之间相互通信、相互理解、相互交流的一个变量。
    比如,我们把这个接口变量命名为“%JieKou%”。现在有三个玩家,上家出的牌是34567,这是一个顺子,那么,上家提供给另外两个玩家的接口是:JieKou=07顺子5
    下一家获得该接口变量,则分析这个牌是什么类型——顺子,最大的牌是什么——07,牌子有多少张——5张。
    下一家继续分析,自己有没有顺子牌——分析自己的牌型,看看自己有什么牌——这个我可以做出来——然后看看自己这副牌的接口是什么——我们假定为56789,接口是:MyJieKou=09顺子5
    然后比较下上家的接口和自家的接口,看自家的牌是否比上家大,如果大过继续判断时分是搭档(农民),如果不是,就可以出牌了,如果没有大过,则Pass。
    第三方同样获得第一家出牌的接口,并获得上一家牌的接口,如果上一家Pass了,就可以直接对比第一家,如果上一家出牌了,就分析自己的牌,并与上家的接口%MyJieKou% 比较大小。
    这样,三方通过接口变量,获得了比较的途径,也就获得了电脑出牌的途径。
    从以上看,需要做的主要有:1、分析上一家或下一家的牌,也就是分析其他人出的牌是什么牌;2、分析自己的牌,看自己的牌有什么类型的牌。
    其他需要考虑的功能:1、比较牌的大小;2、分析是否搭档(农民还是地主);3、如何中止吃牌,并决定谁可以出牌;如何获得分数……
    其实,以上我都基本上做完了,但由于一个小地方出错,心烦,找不到原因就此停下来了。回头检查,发现漏洞百出,想整合全部功能,都不好整合。我认为,还是要从以上提到的主要问题着手,解决了这两个问题,后面整合就容易了。

    二、顺便谈谈牌型分析——一个数学问题。

    主要的两个问题,第一个是知道对家出的是什么牌,第二个是知道自己有什么牌。这两个问题的关键就是进行牌型分析。斗地主的牌型很简单,他们之中包含着一定的数学关系,下面做简单分析。(注意,等差是指两个牌之间的差,即两个数相减的结果)

    牌  型          排除           张  数         等  差                 举例      
——————————————————————————————————————————————
    单张牌                          1                 0                     5
    一对牌        王炸弹          2                 0                     22
    三个牌                          3                 00                    333
    四个牌        三带一          4            001、100          9999、5551、4777
    五张牌      顺子、三代二   5            1111、0020       45678、99944
    六张牌      顺子、连对      6           11111、01010     346789、334455
    …………
    有可能计算各种牌型之间的等差关系、张数等等就可以区别去是那种牌了,甚至可以从一堆牌里面找出对牌、顺子、炸弹等,前提是这些牌必须排好顺序。
    我数学是最差的,但我偏偏遇到这种问题,希望各位数学学得好的,批处理也好的,能够解决以上这些问题。
    前面说到的牌型与接口的问题,就是这个接口变量的格式:决定牌大小的最大一张牌+牌型+张数
    好比飞机 46667778 ,它决定这副牌大小的最大的一张牌应该是7,它的牌型是飞机带单翅膀,牌的张数是8张,所以,它的接口变量应该是这样写的:JieKou=07飞单08
    07表示最大的一张牌,用两位数表示,因为J、Q、K可能超过10;飞单表示飞机带单翅膀,也可以用其他字母表示;张数最好也用两位数,因为有时候张数超过十张。

    分析牌型是个比较细致的工作,容易出错,可能一两天找不到原因都有。最近也忙点,这个工作暂时就停下来了,一旦有空会继续完成的。谢谢大家关注!~
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

39L原著是作者是谁

TOP

批处理有点意思

TOP

有點雜亂,要是加個方框就好多了

TOP

回复 39# dengyuli


    谢谢!这个游戏当初也是一时冲动去做的,然后断断续续的持续了一两年都没开发得,前面的问题搞清楚了,结果后面的问题又来了,现在卡在轮流出牌这里,但不想动了,因为太复杂了,单靠一个人的能力有限啊!如果能够成立一个开发小组,大家统一思路,分工合作,应该是可以很快实现的。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

@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个,第12位,变换
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个,第12位,变换
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 分别为14个的点
::pd#.n 分别为14个的点,向下兼容,如有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。电脑出牌,如何处理组合牌形,如:顺子,三带一(二),飞机,四带二,连对等。 COPY
注:非原创

TOP

回复 31# qc5111


    为什么不继续设计下去了,我还等有iq版的呢

TOP

多人游戏服务器可以用百度开发人员中心(话说那是带有自由上传功能的)只是不知copy命令能不能把文件上传到网络

TOP

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

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


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

TOP

回复 34# caruko


    仍然是可以解决的,就是细节太多了,弄得心烦去,时间不多,暂停一段时间再说。

    我一楼二楼说得不够爽朗,我这里说一下电脑怎么出牌。

    首先要用到一个“接口”。什么是接口,就是几个玩家之间相互通信、相互理解、相互交流的一个变量。
    比如,我们把这个接口变量命名为“%JieKou%”。现在有三个玩家,上家出的牌是34567,这是一个顺子,那么,上家提供给另外两个玩家的接口是:JieKou=07顺子5
    下一家获得该接口变量,则分析这个牌是什么类型——顺子,最大的牌是什么——07,牌子有多少张——5张。
    下一家继续分析,自己有没有顺子牌——分析自己的牌型,看看自己有什么牌——这个我可以做出来——然后看看自己这副牌的接口是什么——我们假定为56789,接口是:MyJieKou=09顺子5
    然后比较下上家的接口和自家的接口,看自家的牌是否比上家大,如果大过继续判断时分是搭档(农民),如果不是,就可以出牌了,如果没有大过,则Pass。
    第三方同样获得第一家出牌的接口,并获得上一家牌的接口,如果上一家Pass了,就可以直接对比第一家,如果上一家出牌了,就分析自己的牌,并与上家的接口%MyJieKou% 比较大小。
    这样,三方通过接口变量,获得了比较的途径,也就获得了电脑出牌的途径。
    从以上看,需要做的主要有:1、分析上一家或下一家的牌,也就是分析其他人出的牌是什么牌;2、分析自己的牌,看自己的牌有什么类型的牌。
    其他需要考虑的功能:1、比较牌的大小;2、分析是否搭档(农民还是地主);3、如何中止吃牌,并决定谁可以出牌;如何获得分数……
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

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

TOP

看到SYBN我就知道是谁弄的了,不会是你吧@~
这个界面确实漂亮,不过cpu老高。
整体做得差不多了,就差电脑自己出牌,比我的好多了,希望sl543001继续完善!~
http://bbs.bathome.net/thread-7375-1-2.html
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

怎么没人,那么好的代码

TOP

LZ你太好笑了,你斗地主让人输牌,我无语……,给你看看这个可以直接点的斗地主,就是逻辑基本没写,电脑不会出牌:
@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
::支持:此脚本已于20102月开发结束,未发现显见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%中没有3if生效,加上not表示有3if生效
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%COPY

TOP

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

TOP

返回列表