返回列表 发帖
所需阅读权限 1

[游戏娱乐] 批处理做扑克“斗地主”

“斗地主的艰苦岁月”:
6.10 以前:

界面,洗牌,发牌,整理牌面,选牌,出牌等基本框架已经完成,就差电脑方如何出牌了。

6.13 更新:
做好了叫地主功能,好做了各方随机说话功能。
做好了各方出牌演示,只是还不能正常打牌,是乱出的。

6.14 更新:
1、做到了各方只能根据规则从小到大出牌,但是只能做到单式出牌(单个,双,三个,四个),还“不懂”什么是“三带一”。
2、可以判断赢牌方。

7.3 更新:
批处理“斗地主”的雏形出来了!!!!激动啊。。。
不过还在存很多bug,电脑方没有智能,只懂规则(已经很难搞了)

9.29 更新:
*改正了开始玩家可以不出的问题
*增加了ai对4炸的“认识”
*ai出牌从原来的单到双,改为从小出牌,
*增加了少于两长牌时警告提示
*增加了ai打三带1或三带2时的灵活性。
*对于玩家出牌的功能,已经基本善。

目前歉缺:
ai不分敌友,
ai先出牌时没有技巧可言,“不懂”发组合牌型
无计分功能
无音效,(准备用QQ游戏斗地主的声音)




有时间还将陆续更新。。。

(由于文件太大,只能用上传附件了。为了节约空间,6.16发的附件已经删除)


还将继续完善,敬请留意。。。

链接: https://pan.baidu.com/s/1aiBeVaTSj1R-FZn1-yo-IA?pwd=fvzc
2

评分人数

    • Seter: 非常好玩...PB + 10
    • foxJL: 虽不实用但批本身很有意义PB + 10

1.我在网吧上线
发现批处理pause后 在上面点击  会出现光标,这个光标能不能利用来传递信息?

2.因为我对其详细规则并不了解
   找到一点资料,先贴上来:
斗地主—游戏规则



该游戏由三人玩一副牌,地主为一方,其余两家为另一方,双方对战,先出完的一方胜。出牌规则类似"争上游"。
牌型:
1、火箭:即双王(双鬼牌),什么牌型都可打,是最大的牌。
2、炸弹:四张同点牌。如四个5。除火箭和比自己大的炸弹外,什么牌型都可打。
一般牌型:
3、单牌:单个牌。
4、对牌:两个点数相同的牌。
5、三张牌:三张点数相同的牌。
6、三带一:三张同点牌 + 一张单牌。例如:三张3+单4
7、三带二:三张同点牌 + 一对牌。例如:三张3+对4
8、单顺:五张或更多连续的单牌。例如:单3+单4+单5+单6+单7。不包括2点和双王。
9、双顺:三对或更多连续的对牌。例如:对3+对4+对5。不包括2点和双王。
10、三顺:二个或更多连续的三张牌。例如:三张3+三张4+三张5。不包括2点和双王。也叫飞机不带翅膀。
11、飞机带翅膀。三顺+同数量的单牌(或同数量的对牌)。
例如:三张3+三张4+对5+对6 或 三张3+三张4+三张5+单6+单7+单8
12、四带二:四张牌+任意两张单牌(或任意两对牌)例如:四张5+单3+单8或 四张4+对5+对7
.....................................................
牌型的大小:
火箭是最大的牌。
炸弹,除火箭和比自己大的炸弹外,比其它牌型都大。
对一般牌型而言,只有当牌型相同和总张数相同的牌,才可比较大小。
其中像三带一、三带二、飞机带翅膀等组合牌型,只要比较其牌数最多牌值就行。只有比当前出的牌(场牌)大的牌才能出。
.....................................................
发牌:
一副牌,留三张底牌,其他发给三家
.....................................................
叫牌:
首先系统翻出一张明牌,获得明牌的人开始先叫牌,每人只能叫一次,叫牌可以"1分"、"2分"、 "3分"或不叫,叫完后叫的最大的为地主。
.....................................................
出牌:
首先将三张底牌交给地主,三张底牌所有人都能看到。由地主开牌,然后按逆时针顺序依次出牌,论到你跟牌时,你可选择PASS或按规则出牌。直至某一方牌出完就结束此局。
当一家的牌剩下一张或两张时,将进行警告(显示一个地雷)。
  

[ 本帖最后由 PakTC 于 2009-5-19 17:28 编辑 ]
Press Any Key To Continue...

TOP

我有意加入制作,但是上机条件有限,感觉很遗憾。

[ 本帖最后由 PakTC 于 2009-5-20 17:00 编辑 ]
Press Any Key To Continue...

TOP

回复 3楼 的帖子

谢谢,握手,相信我们可以完成的。

目前还要解决这几个问题:
1,如何显示玩家选择牌时,牌的凸出效果
已然采用了显示缓存方式,只要修改缓存中相应的变量即可,我已经有方案,主要是效率问题

2,如何让电脑方“明白”他有什么牌,选择什么出牌方案
先得匹配出电脑方的各种符合规则的牌,然后再选择,在打牌过程中还要根据已出牌面出牌。

TOP

一些零散:
    在分配好牌后,就如人玩的时候一样,为了方便组牌:将牌从小到大排列,这样过程中牌号重复的牌会叠在一起。
    建立一个临时区域(常量或者是文本文件),用来记录这个牌组的不同类型组合
比如:第一行,不能成对的独立的牌
      第二行,一对一对的牌
      第三行,三张一样的牌
      第四行,四张一样的牌
        
另一个区间:用来记录可以组成一套5张的牌。
            与第一区间有关,但性质不同。如果需要,组合按大小,分类排好。

     在玩的过程中这两个区间动态更新(如果是文本,是一个麻烦事)
这样也只是纸上谈兵,细节上还会出现很多问题。真正打的时候,很可能要拆掉其中一些组合。
还要判断对方的牌型,判断自己应该出怎样的招数,攻为主?防为主?/
关系到人工智能。

---------------------
以上是没有实践过的想法,目前就想到这些。
我觉得应该先从简单的扑克游戏起手,锻炼好信心,技术以后再挑战这个游戏。
比如:抽乌龟。

另外,我觉得用批处理做扫雷游戏还是可行的,谁个发帖挑战下。

更新:
建立函数或者是模型,当对方出牌的时候,调用函数或者对比模型,判断出对方出牌的类型。
这个函数或者模型,包含特别信息,或者特别语句,可以配合判断。

[ 本帖最后由 PakTC 于 2009-5-24 09:49 编辑 ]
Press Any Key To Continue...

TOP

特效(玩家选择的凸出效果)做出来了,效率很高,大家可以接着做其它部分。
是根据变量chu中的#和@来区别是否选择来进行显示的,对后面的开发很方便。
代码如下,欢迎测试。
@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=╰=
)
setlocal enabledelayedexpansion
::为了显示方便,用p代替10
::定义花色数据
set a1=&set a2=&set a3=&set a4=&set a5=&set a6=
(::定义显示缓存
set ec1=  ┌──┐
set ec2=  │ 17
set ec3=  │    │  ┍=┑
set ec4=  │ 张 │  │1
set ec5=  │    │  │!a6!
set ec6=  ╘≡≡╛  ┕=┙
set ec7=
set ec8=
set ec9=                                                                                  ┌──┐
set ec10=                                                                                  │ 12
set ec11=                                                                      ┍=┑       │    │
set ec12=                                                                      │2│       │ 张 │
set ec13=                                                                      │!a5!│       │    │
set ec14=                                                                      ┕=┙       ╘≡≡╛
set ec15=
set ec16=
set ec17=
set ec18=
set ec19=
set ec20=
set ec21=
set ec22=
set ec23=     ┍=┑
set ec24=     │8
set ec25=     │!a6!
set ec26=     ┕=┙
    set ec36=       a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q
)
set n=0
for %%a in (a b c d e f g h i j k l m n o p q) do (set w%%a=!n!&set/a n=n+1)
::随机排序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!.w-!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 he&echo 显示三家牌
echo.
set di&echo 显示底牌
echo.
::整理各家手上的牌
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 p.d%%c=!p.d%%c! %%c
   set p.f%%c=!p.f%%c! %%d
  )
)
for %%b in (3 4 5 6 7 8 9 p J Q K A 2 w) do (
  set pai%%ad=!pai%%ad!!p.d%%b!
  set pai%%af=!pai%%af!!p.f%%b!
)
for /f "tokens=1,2 delims=." %%b in ("!pai%%ad:* =!.!pai%%af:* =!") do (
  endlocal
  set pai%%ad=%%b
  set pai%%af=%%c
)
)
set pai&echo 显示整理好各家的牌
echo.
pause
mode con: cols=100 lines=200
echo.
set pad=!pai1d: =!
set paf=!pai1f: =!
::测试用,玩家选择的为:@,没选为:#
set chu=#########################
:loop
set c#=@
set c@=#
set a1=
set/a n=16,@=4,#=4
set is@=$
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 ("!pad:~%%a,1! !paf:~%%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!
)        )
set "spac=     "
endlocal&(set ec27=%spac%%an%
set ec28=%spac%%bn%
set ec29=%spac%%cn%
set ec30=%spac%%dn%
set ec31=%spac%%en%
set ec32=%spac%%fn%
set ec33=%spac%%gn%
set ec34=%spac%%hn%
set ec35=%spac%%in%)
::把玩家的牌处理结果送到显示缓存
:error
::把显示缓存进行显示输出
cls
(for /l %%a in (1,1,36) do echo;!ec%%a!
set /p input=选择要出牌:
set chu=%chu%
for %%a in (a b c d e f g h i j k l m n o p q) do (for %%b in (!w%%a!) do set input=!input:%%a= %%b !)
for %%a in (!input!) do (
        if %%a gtr 20 goto :error
        if %%a lss 0 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
echo !a1!  !a2!  !a3!  !a4!  !a5!  !a6!
pauseCOPY

TOP

回复 2楼 的帖子

好贴!
Good!NIce!

TOP

真的还是假的bat能做斗地主呀

TOP

批处理能做的事还真不少啊,呵呵。

TOP

发一个可以实现牌型判断的子功能
“3#3-2.1.1” 代表333444带两个单牌(飞机)
第一位为关键点数3,#3表示3个3,-2表示连继两组333444,
后面的.1.1表示带两个牌。
下面的代码可以把牌组(如:33344479)转换成上述规则串。
@echo off&setlocal enabledelayedexpansion
set kkk=3456789pJQKA2vw#
set /a var=10-1
set pad=33344479
set paf=xyxyxyxyxyxyxyx
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!
        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)
                )
                if not defined ptop (set ptop=!pd.#%%a:~1,1!#%%a-!n!!pstr:~2!) else (set pstr1=!pstr1!.%%a!pstr:~2!)
        )
)
set ppp=!ptop!!pstr1!                        
set ppp
set ps
set pt
set pd
pauseCOPY
如此一为,可以把所的斗地主牌型规则进行如下定义:
(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 #4-1.1.1=四带二
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-2=王炸)COPY
欢迎感兴趣的人一起来讨论!

[ 本帖最后由 netbenton 于 2009-6-18 20:57 编辑 ]

TOP

等时机成熟了 能加改成鼠标操作那该有多酷啊  等待中。。。

还有界面优化成:

上                    下
家                    家

           玩家


该多好啊



楼主加油

[ 本帖最后由 yourmane56 于 2009-7-25 15:29 编辑 ]

TOP

那个 我觉得出牌应该用asd之类的 用abc太麻烦

TOP

谢谢提出意见。

我明白你的意思,可是一行字母不够用呀?!最多时可是有20张牌哦!

我觉得好像不是很麻烦,选错了再改过就是了,因为是可以多次选,重选(乒乓),并且不用按顺序的
如:
akbc = abck
abcdab  = cd


最后更新请注意一楼的附件

[ 本帖最后由 netbenton 于 2009-8-2 22:12 编辑 ]

TOP

回复 1楼 的帖子

我先下来看看哈。学习中……

TOP

楼主你太有才了,出牌的时候还加入了自动说话功能。

TOP

返回列表