[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
所需阅读权限 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发的附件已经删除)


还将继续完善,敬请留意。。。
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
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中的#和@来区别是否选择来进行显示的,对后面的开发很方便。
代码如下,欢迎测试。
  1. @echo off
  2. ::用于特效显示的数所初始化
  3. (set chu0=$
  4. set m1=1
  5. set m2=2
  6. set m3=3
  7. set m4=
  8. set a$#0=        &rem 定义尾巴
  9. set b$#0=—=—=╮
  10. set c$#0=      │
  11. set d$#0=      │
  12. set e$#0=      │
  13. set f$#0=批  §│
  14. set g$#0=  处  │
  15. set h$#0=§  理│
  16. set i$#0=━=━=╯
  17. set a$@0=—=—=╮
  18. set b$@0=      │
  19. set c$@0=      │
  20. set d$@0=      │
  21. set e$@0=批  §│
  22. set f$@0=  处  │
  23. set g$@0=§  理│
  24. set h$@0=━=━=╯
  25. set i$@0=
  26. set a$#1=—=╮
  27. set b$#1=—=┷=╮
  28. set c$#1=      │
  29. set d$#1=      │
  30. set e$#1=      │
  31. set f$#1=批  §│
  32. set g$#1=  处  │
  33. set h$#1=§  理│
  34. set i$#1=━=━=╯
  35. set a$@1=—=—=╮
  36. set b$@1=      │
  37. set c$@1=      │
  38. set d$@1=      │
  39. set e$@1=批  §│
  40. set f$@1=  处  │
  41. set g$@1=§  理│
  42. set h$@1=━=┯=╯
  43. set i$@1=━=╯
  44. set a$#2=╮
  45. set b$#2=┷=—=╮
  46. set c$#2=      │
  47. set d$#2=      │
  48. set e$#2=      │
  49. set f$#2=批  §│
  50. set g$#2=  处  │
  51. set h$#2=§  理│
  52. set i$#2=━=━=╯
  53. set a$@2=—=—=╮
  54. set b$@2=      │
  55. set c$@2=      │
  56. set d$@2=      │
  57. set e$@2=批  §│
  58. set f$@2=  处  │
  59. set g$@2=§  理│
  60. set h$@2=┯=━=╯
  61. set i$@2=╯
  62. set a@00$=╭=
  63. set b@00$=│!ob!
  64. set c@00$=│!oc!
  65. set d@00$=│
  66. set e@00$=│
  67. set f@00$=│
  68. set g@00$=│
  69. set h@00$=╰=
  70. set i@00$=   &rem 突出第一个,第一位
  71. set a@10=╭=
  72. set b@10=┥!ob!
  73. set c@10=┊!oc!
  74. set d@10=┊
  75. set e@10=┊
  76. set f@10=┊
  77. set g@10=┊
  78. set h@10=╰-
  79. set i@10=━=&rem 突出第N个,第N位,变换
  80. set a@12=╭=
  81. set b@12=┥!ob!
  82. set c@12=┊!oc!
  83. set d@12=┊
  84. set e@12=┊
  85. set f@12=┊
  86. set g@12=┊
  87. set h@12=╰-
  88. set i@12=━=&rem 突出第N个,第1,2位,变换
  89. set a@13=╭=
  90. set b@13=┥!ob!
  91. set c@13=┊!oc!
  92. set d@13=┊
  93. set e@13=┊
  94. set f@13=┊
  95. set g@13=┊
  96. set h@13=╰-
  97. set i@13=━=&rem 突出第N个,第3位,变换
  98. set a@0=╭=
  99. set b@0=┊!ob!
  100. set c@0=┊!oc!
  101. set d@0=┊
  102. set e@0=┊
  103. set f@0=┊
  104. set g@0=┊
  105. set h@0=╰=
  106. set i@0=   &rem 突出第N个,第N位
  107. set a@2=╭=
  108. set b@2=┊!ob!
  109. set c@2=┊!oc!
  110. set d@2=┊
  111. set e@2=┊
  112. set f@2=┊
  113. set g@2=┊
  114. set h@2=╰-
  115. set i@2=━=&rem 突出第N个,第2位
  116. set a@3=╭=
  117. set b@3=┊!ob!
  118. set c@3=┊!oc!
  119. set d@3=┊
  120. set e@3=┊
  121. set f@3=┊
  122. set g@3=┊
  123. set h@3=╰-
  124. set i@3=╯ &rem 突出第N个,第3位
  125. set a#00$=   &rem 不突第一个
  126. set b#00$=╭=
  127. set c#00$=│!ob!
  128. set d#00$=│!oc!
  129. set e#00$=│
  130. set f#00$=│
  131. set g#00$=│
  132. set h#00$=│
  133. set i#00$=╰=
  134. set a#10=—=&rem 不突第N个,第N位,变换
  135. set b#10=╭=
  136. set c#10=┊!ob!
  137. set d#10=┊!oc!
  138. set e#10=┊
  139. set f#10=┊
  140. set g#10=┊
  141. set h#10=┤
  142. set i#10=╰=
  143. set a#12=—=&rem 不突第N个,第1,2位,变换
  144. set b#12=╭=
  145. set c#12=┊!ob!
  146. set d#12=┊!oc!
  147. set e#12=┊
  148. set f#12=┊
  149. set g#12=┊
  150. set h#12=┤
  151. set i#12=╰=
  152. set a#13=—=&rem 不突第N个,第3位,变换
  153. set b#13=╭=
  154. set c#13=┊!ob!
  155. set d#13=┊!oc!
  156. set e#13=┊
  157. set f#13=┊
  158. set g#13=┊
  159. set h#13=┤
  160. set i#13=╰=
  161. set a#0=   &rem 不突第N个,第1位
  162. set b#0=╭=
  163. set c#0=┊!ob!
  164. set d#0=┊!oc!
  165. set e#0=┊
  166. set f#0=┊
  167. set g#0=┊
  168. set h#0=┊
  169. set i#0=╰=
  170. set a#2=—=&rem 不突第N个,第2位
  171. set b#2=╭=
  172. set c#2=┊!ob!
  173. set d#2=┊!oc!
  174. set e#2=┊
  175. set f#2=┊
  176. set g#2=┊
  177. set h#2=┊
  178. set i#2=╰=
  179. set a#3=╮ &rem 不突第N个,第3位
  180. set b#3=╭=
  181. set c#3=┊!ob!
  182. set d#3=┊!oc!
  183. set e#3=┊
  184. set f#3=┊
  185. set g#3=┊
  186. set h#3=┊
  187. set i#3=╰=
  188. )
  189. setlocal enabledelayedexpansion
  190. ::为了显示方便,用p代替10
  191. ::定义花色数据
  192. set a1=&set a2=&set a3=&set a4=&set a5=&set a6=
  193. (::定义显示缓存
  194. set ec1=  ┌──┐
  195. set ec2=  │ 17 │
  196. set ec3=  │    │  ┍=┑
  197. set ec4=  │ 张 │  │1│
  198. set ec5=  │    │  │!a6!│
  199. set ec6=  ╘≡≡╛  ┕=┙
  200. set ec7=
  201. set ec8=
  202. set ec9=                                                                                  ┌──┐
  203. set ec10=                                                                                  │ 12 │
  204. set ec11=                                                                      ┍=┑       │    │
  205. set ec12=                                                                      │2│       │ 张 │
  206. set ec13=                                                                      │!a5!│       │    │
  207. set ec14=                                                                      ┕=┙       ╘≡≡╛
  208. set ec15=
  209. set ec16=
  210. set ec17=
  211. set ec18=
  212. set ec19=
  213. set ec20=
  214. set ec21=
  215. set ec22=
  216. set ec23=     ┍=┑
  217. set ec24=     │8│
  218. set ec25=     │!a6!│
  219. set ec26=     ┕=┙
  220.     set ec36=       a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q
  221. )
  222. set n=0
  223. 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)
  224. ::随机排序54张牌(洗牌)
  225. 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))
  226. set #P!random!.w-!a1!=1
  227. set #P!random!.W-!a2!=1
  228. ::发牌,并留三张底
  229. set/a m=0,n=0
  230. for /f "tokens=2 delims==." %%a in ('set #p') do (
  231. set /a m=m%%3+1,n+=1
  232. if !n! leq 51 (
  233. for %%c in (!m!) do (
  234.   set he%%c=!he%%c! %%a
  235. )
  236. ) else (set di=!di! %%a)
  237. )
  238. set he&echo 显示三家牌
  239. echo.
  240. set di&echo 显示底牌
  241. echo.
  242. ::整理各家手上的牌
  243. for /l %%a in (1,1,3) do (
  244. setlocal enabledelayedexpansion
  245. for %%b in (!he%%a!) do (
  246.   for /f "tokens=1,2 delims=-" %%c in ("%%b") do (
  247.    set p.d%%c=!p.d%%c! %%c
  248.    set p.f%%c=!p.f%%c! %%d
  249.   )
  250. )
  251. for %%b in (3 4 5 6 7 8 9 p J Q K A 2 w) do (
  252.   set pai%%ad=!pai%%ad!!p.d%%b!
  253.   set pai%%af=!pai%%af!!p.f%%b!
  254. )
  255. for /f "tokens=1,2 delims=." %%b in ("!pai%%ad:* =!.!pai%%af:* =!") do (
  256.   endlocal
  257.   set pai%%ad=%%b
  258.   set pai%%af=%%c
  259. )
  260. )
  261. set pai&echo 显示整理好各家的牌
  262. echo.
  263. pause
  264. mode con: cols=100 lines=200
  265. echo.
  266. set pad=!pai1d: =!
  267. set paf=!pai1f: =!
  268. ::测试用,玩家选择的为:@,没选为:#
  269. set chu=#########################
  270. :loop
  271. set c#=@
  272. set c@=#
  273. set a1=
  274. set/a n=16,@=4,#=4
  275. set is@=$
  276. setlocal enabledelayedexpansion
  277. for /l %%a in (0,1,!n!) do (
  278.         for %%z in (!chu:~%%a^,1!) do (
  279.                 set hu=&set var=
  280.                 if %%z neq !is@! (
  281.                         set/a var=!is@!
  282.                         set/a hu=m!var!
  283.                         set is@=%%z&set %%z=1
  284.                         if %%a equ 0 set %%z=4
  285.                 ) else (set /a !is@!+=1)
  286.                 if !is@! equ @ (set/a n@#=m!@!) else (set/a n@#=m!#!)
  287.                 set var=!n@#!!hu!
  288.                 if !n@#!!hu! equ 11 set var=12
  289.         for /f "tokens=1-4" %%b in ("!pad:~%%a,1! !paf:~%%a,1! !var! !chu%%a!") do (
  290.                 set oc=%%c&set ob=%%b
  291. rem 测试用变量显示:echo b%%z%%d%%e        !@!-!#!        !b%%z%%d%%e!  !var!
  292.                 for %%i in (a b c d e f g h i) do (
  293.                         for %%j in ("!%%i%%z%%d%%e!") do (
  294.                                 set %%iN=!%%iN!%%~j
  295.                 )        )
  296.         ))
  297. )
  298. if !n@#! equ 3 set n@#=0
  299. for %%i in (a b c d e f g h i) do (
  300.         for %%j in ("%%i$!is@!!n@#!") do (
  301.                 set %%iN=!%%iN!!%%~j!
  302. )        )
  303. set "spac=     "
  304. endlocal&(set ec27=%spac%%an%
  305. set ec28=%spac%%bn%
  306. set ec29=%spac%%cn%
  307. set ec30=%spac%%dn%
  308. set ec31=%spac%%en%
  309. set ec32=%spac%%fn%
  310. set ec33=%spac%%gn%
  311. set ec34=%spac%%hn%
  312. set ec35=%spac%%in%)
  313. ::把玩家的牌处理结果送到显示缓存
  314. :error
  315. ::把显示缓存进行显示输出
  316. cls
  317. (for /l %%a in (1,1,36) do echo;!ec%%a!
  318. set /p input=选择要出牌:
  319. set chu=%chu%
  320. 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 !)
  321. for %%a in (!input!) do (
  322.         if %%a gtr 20 goto :error
  323.         if %%a lss 0 goto :error
  324.         set/a var=1+%%a
  325.         for /f "tokens=1,2" %%b in ("!chu:~%%a,1! !var!") do (
  326.                 set chu=!chu:~,%%a!!c%%b!!chu:~%%c!
  327.         )
  328. ))
  329. goto :loop
  330. echo !a1!  !a2!  !a3!  !a4!  !a5!  !a6!
  331. pause
复制代码

TOP

回复 2楼 的帖子

好贴!
Good!NIce!

TOP

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

TOP

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

TOP

发一个可以实现牌型判断的子功能
“3#3-2.1.1” 代表333444带两个单牌(飞机)
第一位为关键点数3,#3表示3个3,-2表示连继两组333444,
后面的.1.1表示带两个牌。
下面的代码可以把牌组(如:33344479)转换成上述规则串。
  1. @echo off&setlocal enabledelayedexpansion
  2. set kkk=3456789pJQKA2vw#
  3. set /a var=10-1
  4. set pad=33344479
  5. set paf=xyxyxyxyxyxyxyx
  6. for /l %%a in (0,1,!var!) do (
  7.         for %%b in ("!pad:~%%a,1!") do (
  8.                 set/a pd.%%~b+=1
  9.                 set pds.%%~b=!pds.%%~b!!pad:~%%a,1!
  10.                 set pfs.%%~b=!pfs.%%~b!!paf:~%%a,1!
  11.         )
  12. )
  13. for %%a in (3 4 5 6 7 8 9 p J Q K A 2 v w) do (
  14.         for %%b in (!pd.%%a!) do (
  15.                 set pd.#%%b=!pd.#%%b! %%a
  16.         )
  17. )
  18. for /l %%a in (4,-1,1) do (
  19.         set vkk=0!kkk!
  20.         set pstr=
  21.         set n=1
  22.         if defined pd.#%%a (
  23.                 for %%b in (!pd.#%%a!) do (
  24.                         if not defined ptop (
  25.                                 if "!vkk:~,1!" equ "%%b" (set /a n+=1) else (set pstr=!pstr!.!n!&set n=1)
  26.                                 set vkk=!vkk:*%%b=!
  27.                         ) else (set pstr=!pstr!.%%a)
  28.                 )
  29.                 if not defined ptop (set ptop=!pd.#%%a:~1,1!#%%a-!n!!pstr:~2!) else (set pstr1=!pstr1!.%%a!pstr:~2!)
  30.         )
  31. )
  32. set ppp=!ptop!!pstr1!                        
  33. set ppp
  34. set ps
  35. set pt
  36. set pd
  37. pause
复制代码
如此一为,可以把所的斗地主牌型规则进行如下定义:
  1. (rem 牌型定义
  2. set #3-1.1=三带一
  3. set #3-1.2=三带二
  4. set #3-2.1.1=飞机
  5. set #3-2.2=飞机
  6. set #3-2.2.2=飞机
  7. set #3-3=三顺
  8. set #3-3.1.1.1=三顺拖
  9. set #3-3.2.2.2=三顺拖
  10. set #4-1.1.1=四带二
  11. set #4-1.2.2=四带二
  12. set #2-3=连对
  13. set #2-4=连对
  14. set #2-5=连对
  15. set #2-6=连对
  16. set #2-7=连对
  17. set #2-8=连对
  18. set #2-9=连对
  19. set #2-10=连对
  20. set #1-5=顺子
  21. set #1-6=顺子
  22. set #1-7=顺子
  23. set #1-8=顺子
  24. set #1-9=顺子
  25. set #1-10=顺子
  26. set #1-11=顺子
  27. set #1-12=顺子
  28. set #1-1=n
  29. set #2-1=一对n
  30. set #3-1=三个n
  31. set #4-1=炸弹
  32. set v#1-2=王炸)
复制代码
欢迎感兴趣的人一起来讨论!

[ 本帖最后由 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

返回列表