[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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

  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. (rem 牌型定义
  190. set #3-1.1=三带一
  191. set #3-1.2=三带二
  192. set #3-2.1.1=飞机
  193. set #3-2.2=飞机
  194. set #3-2.2.2=飞机
  195. set #3-3=三顺
  196. set #3-3.1.1.1=三顺拖
  197. set #3-3.2.2.2=三顺拖
  198. set #3-4=三顺
  199. set #3-4.1.1.1.1=三顺拖
  200. set #4-1.1.1=四带二
  201. set #4-1.2=四带二
  202. set #4-1.2.2=四带二
  203. set #2-3=连对
  204. set #2-4=连对
  205. set #2-5=连对
  206. set #2-6=连对
  207. set #2-7=连对
  208. set #2-8=连对
  209. set #2-9=连对
  210. set #2-10=连对
  211. set #1-5=顺子
  212. set #1-6=顺子
  213. set #1-7=顺子
  214. set #1-8=顺子
  215. set #1-9=顺子
  216. set #1-10=顺子
  217. set #1-11=顺子
  218. set #1-12=顺子
  219. set #1-1=n
  220. set #2-1=一对n
  221. set #3-1=三个n
  222. set #4-1=炸弹
  223. set v#1-1.1=王炸)
  224. ::定义显示缓存
  225. set num1=17
  226. set num2=17
  227. set num3=17
  228. set system=请各方叫地主
  229. set name1=玩家 “你”
  230. set name2=貂蝉
  231. set name3=西施
  232. set comm=出牌
  233. set comm=讲话
  234. set rsay1=牌真好呀!这次我赢定了。
  235. set rsay2=我有炸的,小心哦
  236. set rsay3=这么烂的牌!可怎么打呀?
  237. set rsay4=你是MM,还是GG?
  238. set rsay5=和你合作真是太愉快了
  239. set rsay6=我要是能抢到地主就好了。
  240. set rsay7=Hello! everyone.
  241. set rsay8=你们好呀!
  242. set rsay9=今天的天气不怎么样
  243. set rsay0=批处理也能“斗地主”,强吧!
  244. set paix=重新开始
  245. set paic=0
  246. set kkk=3456789pJQKA2vw#
  247. set "spac=                                                                                  "
  248. (set ec0=
  249. set ec1=     ┌──┐  !say2!
  250. set ec2=     │ !ain2:~-2! │
  251. set ec3=     │    │
  252. set ec4= !name2!│ 张 │
  253. set ec5=     │    │
  254. set ec6=     ╘≡≡╛
  255. set ec7=     !@dz2!!@bj2!
  256. set ec8= !say3!
  257. set ec9=!spac:~-80!┌──┐
  258. set ec10=!spac:~-80!│ !ain3:~-2! │
  259. set ec11=!sayp32!│    │
  260. set ec12=!sayp33!│ 张 │!name3!
  261. set ec13=!sayp34!│    │
  262. set ec14=!sayp35!╘≡≡╛
  263. set ec15=!spac:~-80!!@dz3!!@bj3!
  264. set ec16=玩家!pad1!
  265. set ec17=    !paf1!
  266. set ec19=西施!pai3d!
  267. set ec20=    !pai3f!   !system!
  268. set ec21=貂蝉!pai2d!
  269. set ec22=    !pai2f!
  270. set ec23=
  271. set ec24=
  272. set ec25=
  273. set ec26=
  274. set ec27= !@dz1!!@bj1!     !say1!
  275. set ec37=!key!
  276. set key=  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  w
  277. )
  278. ::为了显示方便,用p代替10
  279. ::定义花色数据
  280. set a1=&set a2=&set a3=&set a4=&set a5=&set a6=
  281. mode con: cols=100 lines=200&color 2f
  282. :begin 开始/重新开始
  283. setlocal enabledelayedexpansion
  284. set sayp32=!spac:~,80!
  285. set sayp33=!spac:~,80!
  286. set sayp34=!spac:~,80!
  287. set sayp35=!spac:~,80!
  288. set n=0
  289. for %%a in (!key!) do (set w%%a=!n!&set/a n=n+1&set nums=!nums!%%a)
  290. ::随机排序54张牌(洗牌)
  291. 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))
  292. set #P!random!.v-!a1!=1
  293. set #P!random!.W-!a2!=1
  294. ::发牌,并留三张底
  295. set/a m=0,n=0
  296. for /f "tokens=2 delims==." %%a in ('set #p') do (
  297. set /a m=m%%3+1,n+=1
  298. if !n! leq 51 (
  299. for %%c in (!m!) do (
  300. set he%%c=!he%%c! %%a
  301. )
  302. ) else (set di=!di! %%a)
  303. )
  304. set/a dizu=!random!%%3+1&rem 随机定谁先叫地主
  305. set sub=pc!dizu!
  306. set/a quan=0,beis=0
  307. set say2=!rsay%random:~-1%!
  308. set say3=!rsay%random:~-1%!
  309. :jdzend 叫地主结束
  310. ::整理各家手上的牌
  311. for /l %%a in (1,1,3) do (
  312. setlocal enabledelayedexpansion
  313. for %%b in (!he%%a!) do (
  314. for /f "tokens=1,2 delims=-" %%c in ("%%b") do (
  315. set pd.%%c=!pd.%%c!%%c
  316. set pf.%%c=!pf.%%c!%%d
  317. )
  318. )
  319. for %%b in (3 4 5 6 7 8 9 p J Q K A 2 v W) do (
  320. set paid=!paid!!pd.%%b!
  321. set paif=!paif!!pf.%%b!
  322. )
  323. for /f "tokens=1-2 delims=." %%b in ("!paid!.!paif!") do (
  324. endlocal
  325. set pai%%ad=%%b
  326. set pai%%af=%%c
  327. )
  328. )
  329. ::电脑诂计牌大小,设定叫分值
  330. if "!comm!" equ "讲话" (
  331. set #qW=7
  332. set #qv=6
  333. set #q2=4
  334. set #qa=2
  335. set #qk=1
  336. set #q3=-2
  337. set #q4=-2
  338. set #q5=-1
  339. set #q6=-1
  340. for %%a in (2 3) do (
  341. set/a var=0,quan%%a=0
  342. for %%b in (W v 2 a k 3 4 5 6) do (
  343. if "!pai%%ad:%%b=!" neq "!pai%%ad!" set/a var+=#q%%b
  344. )
  345. if !var! gtr 0 set quan%%a=1
  346. if !var! gtr 4 set quan%%a=2
  347. if !var! gtr 8 set quan%%a=3
  348. )
  349. )
  350. set pad1=!pai1d: =!
  351. set paf1=!pai1f: =!
  352. ::玩家选择的为:@,没选为:#
  353. set chu=######################
  354. set ain3= !num3!
  355. set ain2= !num2!
  356. :loop
  357. set c#=@
  358. set c@=#
  359. ::显示玩家牌面部分
  360. set a1=
  361. set/a @=4,#=4
  362. set is@=$
  363. set/a n=!num1!-1
  364. if !num1! lss 0 goto :控制中心
  365. setlocal enabledelayedexpansion
  366. for /l %%a in (0,1,!n!) do (
  367. for %%z in (!chu:~%%a^,1!) do (
  368. set hu=&set var=
  369. if %%z neq !is@! (
  370. set/a var=!is@!
  371. set/a hu=m!var!
  372. set is@=%%z&set %%z=1
  373. if %%a equ 0 set %%z=4
  374. ) else (set /a !is@!+=1)
  375. if !is@! equ @ (set/a n@#=m!@!) else (set/a n@#=m!#!)
  376. set var=!n@#!!hu!
  377. if !n@#!!hu! equ 11 set var=12
  378. for /f "tokens=1-4" %%b in ("!pad1:~%%a,1! !paf1:~%%a,1! !var! !chu%%a!") do (
  379. set oc=%%c&set ob=%%b
  380. rem 测试用变量显示:echo b%%z%%d%%e !@!-!#! !b%%z%%d%%e!  !var!
  381. for %%i in (a b c d e f g h i) do (
  382. for %%j in ("!%%i%%z%%d%%e!") do (
  383. set %%iN=!%%iN!%%~j
  384. ) )
  385. ))
  386. )
  387. if !n@#! equ 3 set n@#=0
  388. for %%i in (a b c d e f g h i) do (
  389. for %%j in ("%%i$!is@!!n@#!") do (
  390. set %%iN=!%%iN!!%%~j!
  391. ) )
  392. ::显示玩家牌面部分
  393. endlocal&(set ec28=%an%
  394. set ec29=%bn%
  395. set ec30=%cn%
  396. set ec31=%dn%
  397. set ec32=%en%
  398. set ec33=%fn%
  399. set ec34=%gn%
  400. set ec35=%hn%
  401. set ec36=%in%)
  402. ::把玩家的牌处理结果送到显示缓存
  403. ::转变量出牌方的显示
  404. if !sub! equ pc2 (
  405. cls
  406. for /l %%a in (0,1,37) do for %%b in ("!ec%%a!") do echo;     %%~b
  407. set say1=
  408. ping -n 2 127.1>nul)
  409. :控制中心
  410. set/a "var=(%sub:~-1%+1)%%3+1"
  411. if !num%var%! leq 2  set @bj%var%=¤!num%var%!张
  412. if "!num%var%!" equ "0" (echo 游戏结束^^!&endlocal&pause&goto :begin)
  413. ::如果放弃记数等于2,转调用最后一个出牌者,重新出牌。
  414. if !ascc! geq 2 (
  415. set sub=!lasssub!
  416. set paix=重新开始
  417. )
  418. set system=轮到 !name%sub:~-1%! !comm!
  419. goto :%sub%
  420. ::AI1 动作 是叫地主,还是出牌,(状态只保持一家)
  421. :pc2
  422. if /i "!comm!" equ "讲话" (
  423. set say2=不叫
  424. if !beis! lss !quan2! set say2=叫地主&set @dz=%sub%&set/a beis+=1
  425. set/a quan+=1
  426. if !quan! gtr 3 goto :jdz
  427. cls
  428. for /l %%a in (0,1,37) do for %%b in ("!ec%%a!") do echo;     %%~b
  429. ) else (
  430. set say2=!rsay%random:~-1%!
  431. call :IQ
  432. if defined bu1 (
  433. set ec3=!ec3:~,11!┍!bu1:~,-1!┑
  434. set ec4=!ec4:~,13!│!bu2:~,-1!│
  435. set ec5=!ec5:~,11!│!bu3:~,-1!│
  436. set ec6=!ec6:~,9!┕!bu4:~,-1!┙
  437. ) else (
  438. set ec3=!ec3:~,11!
  439. set ec4=!ec4:~,13! 不
  440. set ec5=!ec5:~,11! 要
  441. set ec6=!ec6:~,9!
  442. )
  443. cls
  444. for /l %%a in (0,1,37) do for %%b in ("!ec%%a!") do echo;     %%~b
  445. set say2=
  446. ping -n 2 127.1>nul
  447. )
  448. set sub=pc3&goto :控制中心
  449. ::AI2 动作 是叫地主,还是出牌,
  450. :pc3
  451. if /i "!comm!" equ "讲话" (
  452. set say3=不叫
  453. if !beis! lss !quan3! set say3=叫地主&set @dz=%sub%&set/a beis+=1
  454. set/a quan+=1
  455. if !quan! gtr 3 goto :jdz
  456. cls
  457. for /l %%a in (0,1,37) do for %%b in ("!ec%%a!") do echo;     %%~b
  458. ) else (
  459. set say3=!rsay%random:~-1%!
  460. call :IQ
  461. if defined bu1 (
  462. set/a var=80-5-chen*3
  463. for %%v in (!var!) do (
  464. set sayp32=!spac:~,%%v!┍!bu1:~,-1!┑
  465. set sayp33=!spac:~,%%v!│!bu2:~,-1!│
  466. set sayp34=!spac:~,%%v!│!bu3:~,-1!│
  467. set sayp35=!spac:~,%%v!┕!bu4:~,-1!┙
  468. )
  469. ) else (
  470. set sayp32=!spac:~,80!
  471. set sayp33=!spac:~,77!不
  472. set sayp34=!spac:~,77!出
  473. set sayp35=!spac:~,80!
  474. )
  475. cls
  476. for /l %%a in (0,1,37) do for %%b in ("!ec%%a!") do echo;     %%~b
  477. set say3=
  478. ping -n 2 127.1>nul
  479. )
  480. set sub=pc1&goto :控制中心
  481. :error
  482. ::把显示缓存进行显示输出
  483. set say1=输入字串中含有不可识别字符
  484. :pc1
  485. set ec23=
  486. set ec24=
  487. set ec25=
  488. set ec26=
  489. if not defined say1 set say1=终于轮到我!comm!了
  490. cls
  491. for /l %%a in (0,1,37) do for %%b in ("!ec%%a!") do echo;     %%~b
  492. set a讲话=[J]叫地主  [A]加倍   [直接回车pass]
  493. set a出牌=[U]不出   [X]退出   [T]提示   [选好直接回车出牌]
  494. set input=
  495. echo.
  496. echo; !a%comm%!
  497. set "menu= u x t "
  498. set /p input= :^>
  499. ::玩家是否叫地主
  500. if /i "!comm!" equ "讲话" (
  501. if /i "!input!" equ "J" (set @dz=%sub%&set say1=叫地主&set/a beis+=1)
  502. set/a quan+=1
  503. if !quan! gtr 3 goto :jdz
  504. set sub=pc2
  505. goto :loop
  506. )
  507. set say1=
  508. if not defined input if "!chu:@=!" neq "!chu!" goto :chupai 如果已经选择,回车后出牌
  509. if "!menu: %input% =!" neq "!menu!" goto :menu%input% 跳到处理菜单项
  510. ::处理玩家对牌的选择,先把串打散,再一一处理。改变!chu!变量
  511. for %%a in (!key!) do (for %%b in (!w%%a!) do set input=!input:%%a= %%b !)
  512. for %%a in (!input!) do (
  513. if %%a gtr 20 set chu=%chu%&goto :error
  514. if %%a lss 0 set chu=%chu%&goto :error
  515. set/a var=1+%%a
  516. for /f "tokens=1,2" %%b in ("!chu:~%%a,1! !var!") do (
  517. set chu=!chu:~,%%a!!c%%b!!chu:~%%c!
  518. )
  519. )
  520. goto :loop
  521. :chupai
  522. setlocal enabledelayedexpansion
  523. set var1=
  524. set var2=
  525. set chp1=
  526. set chp2=
  527. set chpn=0
  528. for /l %%a in (0,1,!n!) do (
  529. if "!chu:~%%a,1!" equ "@" (
  530. set/a num1-=1,chpn+=1
  531. set chp1=!chp1!!pad1:~%%a,1!
  532. set chp2=!chp2!!paf1:~%%a,1!
  533. ) else (
  534. set var1=!var1!!pad1:~%%a,1!
  535. set var2=!var2!!paf1:~%%a,1!
  536. )
  537. )
  538. ::把选择的牌提取出来
  539. set /a var=chpn-1
  540. set pad=!chp1!
  541. set paf=!chp2!
  542. for /l %%a in (0,1,!var!) do (
  543. for %%b in ("!pad:~%%a,1!") do (
  544. set/a pd.%%~b+=1
  545. set pds.%%~b=!pds.%%~b!!pad:~%%a,1!
  546. set pfs.%%~b=!pfs.%%~b!!paf:~%%a,1!
  547. )
  548. )
  549. for %%a in (3 4 5 6 7 8 9 p J Q K A 2 v w) do (
  550. for %%b in (!pd.%%a!) do (
  551. set pd.#%%b=!pd.#%%b! %%a
  552. )
  553. )
  554. for /l %%a in (4,-1,1) do (
  555. set vkk=0!kkk:~,-4!
  556. set pstr=
  557. set n=1
  558. if defined pd.#%%a (
  559. for %%b in (!pd.#%%a!) do (
  560. if not defined ptop (
  561. if "!vkk:~,1!" equ "%%b" (set /a n+=1) else (set pstr=!pstr!.!n!&set n=1)
  562. set vkk=!vkk:*%%b=!
  563. ) else (set pstr=!pstr!.%%a)
  564. set chv1=!chv1!!pds.%%b!
  565. set chv2=!chv2!!pfs.%%b!
  566. )
  567. if not defined ptop (set ptop=#%%a-!n!!pstr:~2!) else (set pstr1=!pstr1!.%%a!pstr:~2!)
  568. )
  569. )
  570. set ppp=!ptop!!pstr1!
  571. rem 起牌检查规则 可以处理炸弹及王炸
  572. if not defined !ppp! (
  573. if "!chv1:~,1!!ppp!" equ "v#1-1.1" (set paix=v#1-2&set paic=v&goto :zhaid)
  574. endlocal&set say1=你选择的牌不符合规则!%chv1:~,1%%ppp%&goto :pc1
  575. )
  576. if "!paix!" equ "重新开始" (set paic=!kkk!) else (
  577. if "!ppp!" neq "!paix!" (
  578. if "!ppp!" equ "#4-1" (set paix=#4-1&set paic=!kkk!&goto :zhaid)
  579. endlocal&set say1=你选择的牌不符合规则!%chp1%&goto :pc1
  580. )
  581. )
  582. ::牌形不对不可以出,重新出牌任出。
  583. :zhaid 炸弹处理
  584. if "!paic:%chv1:~,1%=!" equ "!paic!" (endlocal&set say1=你选择的牌小了!%chv1%&goto :pc1)
  585. ::小于不可以出
  586. ( endlocal
  587. set chp1=%chv1%
  588. set chp2=%chv2%
  589. set chpn=%chpn%
  590. set pad1=%var1%
  591. set paf1=%var2%
  592. set chu=%chu:@=%
  593. set num1=%num1%
  594. rem 提取选好的牌到变量chp1(点) chp2(花)chpn(个数)paix(牌形)paic(关键点数)
  595. set paix=%ppp%
  596. set paic=!kkk:*%chv1:~,1%=!
  597. )
  598. set say1=!rsay%random:~-1%!
  599. call :putbuff 把要出的牌转换为显示变量
  600. ::再送显示缓存
  601. set ec23=┍!bu1:~,-1!┑
  602. set ec24=│!bu2:~,-1!│
  603. set ec25=│!bu3:~,-1!│
  604. set ec26=┕!bu4:~,-1!┙
  605. ::下一个人
  606. set sub=pc2&goto :loop
  607. ::系统选项处理 x u t
  608. :menuX
  609. start "" C:\BatMPlayer\BatMPlayer.bat G&&exit
  610. :menuU
  611. set ec24= Pass...
  612. set/a ascc+=1
  613. set chu=#########################
  614. set sub=pc2&goto :loop
  615. :menuT
  616. echo 暂时还不支持此功能!
  617. pause>nul
  618. goto :pc1
  619. :jdz 叫地主处理 三家均调用这里
  620. if not defined @dz goto :begin
  621. set var=%@dz:~-1%
  622. set sub=%@dz%
  623. set he%var%=!he%var%!!di!
  624. set num%var%=20
  625. set comm=出牌
  626. set @dz%var%=★地主★
  627. set lasssub=pc%var%
  628. set ascc=2
  629. goto :jdzend
  630. :IQ 电脑自动出牌
  631. setlocal enabledelayedexpansion
  632. set /a vn=%sub:~-1%
  633. set /a var=num!vn!-1
  634. set pad=!pai%vn%d!
  635. set paf=!pai%vn%f!
  636. ::玩家数据读入临时变量
  637. for /l %%a in (0,1,!var!) do (
  638. for %%b in ("!pad:~%%a,1!") do (
  639. set/a pd.%%~b+=1
  640. set pds.%%~b=!pds.%%~b!!pad:~%%a,1!
  641. set pfs.%%~b=!pfs.%%~b!!paf:~%%a,1!
  642. )
  643. )
  644. ::按点数整理
  645. ::pd.%%~b 同点个数
  646. ::pds.%%~b 同点串
  647. ::pds.%%~b 同花串
  648. for %%a in (3 4 5 6 7 8 9 p J Q K A 2 v w) do (
  649. for %%b in (!pd.%%a!) do (
  650. set pd.##%%b=!pd.##%%b!%%a
  651. for /l %%c in (%%b,-1,1) do (
  652. set pd.#%%c=!pd.#%%c!%%a
  653. )
  654. )
  655. )
  656. ::按个数统计
  657. ::pd##.n 分别为1到4个的点
  658. ::pd#.n 分别为1到4个的点,向下兼容,如有2个时,对1个也有效
  659. if "!paix!" equ "重新开始" (
  660. set paic=!kkk!
  661. for /l %%a in (0,1,4) do (
  662. for %%b in ("!pd.#1:~%%a,1!") do (
  663. if %%b equ "" goto :you
  664. set paix=#!pd.%%~b!-1&set chpn=!pd.%%~b!
  665. if "!pd.%%~b!" neq "4" goto :you
  666. )
  667. )
  668. )
  669. ::如果是发牌,则取最小的出
  670. :you
  671. set paid=&set paif=&set pad=&set paf=
  672. if defined pd.#%paix:~,2% (
  673. set str=!pd.#%paix:~,2%!$
  674. set nn=!pd.#%paix:~,2%!%nums%
  675. set /a nn=w!nn:~20,1!
  676. for /l %%a in (0,1,!nn!) do (
  677. for %%b in ("!str:~%%a,%paix:~3,1%!") do (
  678. set find=%%~b
  679. if "!paic:%%~b=!" neq "!paic!" (goto :ok)
  680. )
  681. )
  682. )
  683. ::nn 取同型串的长度
  684. ::paic 已经把比当前点小的丢弃,所以如果%%b不在串中则认为比当前点大,可以出牌
  685. ::否则清空find
  686. set find=
  687. :ok
  688. ::如果主牌型对且大,则存在find
  689. if defined find (
  690. for /l %%a in (%paix:~3,1%,-1,1) do (
  691. for %%b in ("!find:~-%%a,1!") do (
  692. set paid=!paid!!pds.%%~b:~,%paix:~1,1%!
  693. set paif=!paif!!pfs.%%~b:~,%paix:~1,1%!
  694. set pds.%%~b=!pds.%%~b:~%paix:~1,1%!
  695. set pfs.%%~b=!pfs.%%~b:~%paix:~1,1%!
  696. )
  697. )
  698. rem 根据牌型的连顺数把点及花串放到结果变量,并在原串减去
  699. set var=%paix:~5%
  700. if defined var (
  701. for %%a in ("!var:.=" "!") do (
  702. if defined pd.##%%~a (
  703. for %%b in ("!pd.##%%~a:~,1!") do (
  704. set paid=!paid!!pds.%%~b:~,%%~a!
  705. set paif=!paif!!pfs.%%~b:~,%%~a!
  706. set pds.%%~b=!pds.%%~b:~%%~a!
  707. set pfs.%%~b=!pfs.%%~b:~%%~a!
  708. )
  709. set pd.##%%~a=!pd.##%%~a:~1!
  710. ) else (
  711. if defined pd.#%%~a (
  712. for %%b in ("!pd.#%%~a:~,1!") do (
  713. set paid=!paid!!pds.%%~b:~,%%~a!
  714. set paif=!paif!!pfs.%%~b:~,%%~a!
  715. set pds.%%~b=!pds.%%~b:~%%~a!
  716. set pfs.%%~b=!pfs.%%~b:~%%~a!
  717. )
  718. set pd.#%%~a=!pd.#%%~a:~1!
  719. )
  720. if defined pd.##4 set paix=#4-1&set chpn=4&set paic=!kkk!&goto :you
  721. endlocal
  722. set bu1=
  723. set/a ascc+=1
  724. goto :eof
  725. )
  726. )
  727. )
  728. rem 处理牌型尾巴部分,没有也不能出牌
  729. for %%a in (3 4 5 6 7 8 9 p J Q K A 2 v W) do (
  730. set pad=!pad!!pds.%%a!
  731. set paf=!paf!!pfs.%%a!
  732. )
  733. ) else (
  734. if defined pd.##4 set paix=#4-1&set chpn=4&set paic=!kkk!&goto :you
  735. endlocal
  736. set bu1=
  737. rem 放弃记数加1
  738. set/a ascc+=1
  739. goto :eof
  740. )
  741. rem 可以出牌
  742. goto :skrem
  743. set pd
  744. set ch
  745. set pai
  746. echo !find!  !kkk!
  747. echo !str!
  748. pause
  749. :skrem
  750. ::判断是否有相同的类型,paix(#3-2.1.1),有的话,取一个比当前的大的出牌。
  751.                                           
  752. ::如果有符合的牌,则提取选好的牌到变量paig(点字符串) paif(花字符串)chpn(个数不变)paix(规则不变)最后点数(paic)
  753. ::按现出规则,如果有大的则出牌
  754. (endlocal
  755. set pai%vn%d=%pad%
  756. set pai%vn%f=%paf%
  757. set paic=!kkk:*%find:~,1%=!
  758. set chp1=%paid%
  759. set chp2=%paif%
  760. set/a num%vn%=num%vn%-%chpn%
  761. set chpn=%chpn%
  762. set paix=%paix%
  763. )
  764. set ain2= !num2!
  765. set ain3= !num3!
  766. ::出牌显示处理
  767. :putbuff
  768. set bu1=&set bu2=&set bu3=&set bu4=
  769. set/a chen=chpn-1
  770. if !num%sub:~-1%! equ 0 set system=这一盘 !name%sub:~-1%! 赢了!
  771. for /l %%a in (0,1,!chen!) do (
  772. set bu1=!bu1!=┯
  773. set bu2=!bu2!!chp1:~%%a,1!│
  774. set bu3=!bu3!!chp2:~%%a,1!│
  775. set bu4=!bu4!=┷
  776. )
  777. ::放弃记数清0,记录最后出牌者
  778. set ascc=0
  779. set lasssub=%sub%
  780. goto :eof
  781. :aizlp
  782. 需要解决的问题
  783. 3。电脑出牌,如何处理组合牌形,如:顺子,三带一(二),飞机,四带二,连对等。
复制代码
注:非原创

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你太好笑了,你斗地主让人输牌,我无语……,给你看看这个可以直接点的斗地主,就是逻辑基本没写,电脑不会出牌:
  1. @echo off&SETLOCAL ENABLEDELAYEDEXPANSION&(CHCP 437 &GRAFTABL 936)>NUL
  2. mode con cols=80 lines=25 >nul
  3. ::斗地主 一个鼠标操控的脚本游戏,用来演示和测试SYBC的鼠标支持
  4. ::开发:SYBN QQ:354324773 E-mail:sybnwork@Gmail.com
  5. ::SVN/HTTP下载地址:http://syxq.googlecode.com/svn/trunk/SYXQ/DDZ/ddz.cmd
  6. ::支持:此脚本已于2010年2月开发结束,未发现显见BUG,未搭载自动更新模块
  7. ::变量初始化
  8. ::玩家1-3 的牌统一使用P1XXX-p3XXX变量 P4XXX保留   玩家出的牌统一使用P5XXX-P6XXX  P7XXX保留  P0XXX 用于临时需要
  9. ::与扑克有关的变量牌统一使用PKXXX   
  10. ::    PKSXX代表各个点数的牌与字符的对应值 pks11=J  pks12=Q
  11. ::    PKHX代表各个花色的数字与字符的对应值 pkh1= (红桃) pkh0=T (王)
  12. ::    PKYX代表各个颜色的数字与字符的对应值 扑克只有红黑2色 pky0=c (红) pky1=0 (黑) (同color命令)
  13. 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
  14. set pk%a:;=&set pk%
  15. ::载入/生成sybc 变量SYBCOM保存SYBC的16进制数据 V保存DEBUG代码 最后通过管道交由DEBUG执行
  16. 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``
  17. 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``
  18. SET SYBCV=`A80`DB FF``RCX`200`G`Q
  19. SET V=`RCX`200`N SYBC.COM`W`Q
  20. (ECHO.%SYBCOM:`=&ECHO.DW %&ECHO.%V:`=&ECHO.%)|DEBUG>NUL
  21. ::保存刷新块坐标 游戏界面中间部分(出牌的位置),每次需要局部刷新,变量DEBUGQK保存要刷新的内存地址起止点
  22. 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
  23. set kh=                                                                                ;
  24. for /l %%a in (1,1,6) do set kh=!kh!%KH%
  25. ::初始信息
  26. color 3e
  27. echo 斗地主 {注释版} 2010-3-20
  28. echo.
  29. echo 目前没有AI,电脑不会出牌.你可以随便出牌,出完自动发牌.
  30. echo.
  31. echo 按键模式功能:M(鼠标模式) F2(从新发牌) F5(刷新) 方向键(控制扑克) 空格(出牌)
  32. echo.
  33. echo 鼠标模式功能:键盘按钮(键盘模式) 扑克(选择/取消选择 一张扑克) 出牌(出牌)
  34. echo.
  35. echo 注意:由于CMD.exe键盘事件机制问题,键盘模式下连续按键可能导致窗口卡死。此问题将在SYXQ中谋求解决。鼠标模式需要生成SYBC实体文件,其他情况无需SYBC实体文件。
  36. echo.
  37. echo 按任意键开始测试...
  38. echo.
  39. call :SYBC
  40. (echo.Q)|DEBUG>NUL
  41. echo 测试失败.请关闭游戏.并联系SYBN QQ:354324773
  42. call :SYBC 11300$0A测试成功.请再按任意键以开始游戏,祝您游戏愉快.
  43. echo.
  44. echo win 2003以后系统无法正常运行SYBC,所以会看到"测试失败"字样.
  45. echo [win 2003 R2]系统测试通过  [win XP SP2]系统测试通过
  46. pause>NUL
  47. :2
  48. ::调用发牌模块
  49. call :FP
  50. :1
  51. ::变量CBXX统一用于颜色背景信息  
  52. set cB0=$f
  53. cls
  54. ::计时1
  55. set t1=%time%
  56. ::显示顶部栏
  57. 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│ 底 牌 │:::
  58. 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│       │::  
  59. 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│       │:   
  60. SET SYBCS=%SYBCS%;:10168%CB0%%PDI1Y%%PDI1S% %CB0%%PDI2Y%%PDI2S% %CB0%%PDI3Y%%PDI3S%;%CB0%%PDI1Y%%PDI1H% %CB0%%PDI2Y%%PDI2H% %CB0%%PDI3Y%%PDI3H%
  61. set SYBCS0=%SYBCS%
  62. ::显示3人的名称框
  63. SET SYBCS=%SYBCS%;:10300$4c☉$4c▄▄▄▄$4c☉;$c4▌$c9 电脑左 $4c▌;$c4▌$ce余牌11张$4c▌;$4c☉$c4▄▄▄▄$4c☉
  64. SET SYBCS=%SYBCS%;:10368$4c☉$4c▄▄▄▄$4c☉;$c4▌$c9 电脑右 $4c▌;$c4▌$ce余牌7 张$4c▌;$4c☉$c4▄▄▄▄$4c☉
  65. SET SYBCS=%SYBCS%;:11400$4c☉$4c▄▄▄▄$4c☉;$c4▌$c9玩家SYBN$4c▌;$c4▌$ce余牌17张$4c▌;$4c☉$c4▄▄▄▄$4c☉
  66. ::显示电脑的牌背
  67. call :pb 10701
  68. call :pb 10769
  69. set SYBCS1=%SYBCS%
  70. CALL :SYBCS
  71. ::P11显示玩家的牌
  72. set kzms=sb
  73. call :p11
  74. ::计时2
  75. set t2=%time%
  76. ::计算时差并显示
  77. call :timec
  78. goto :%kzms%
  79. :GB
  80. :SB
  81. title 请用鼠标选择您要出的牌...
  82. :SB1
  83. set kzms=sb
  84. sybc M
  85. set err=%errorlevel%
  86. set /a GBSvv=err-8,GBSvm=17+p2z*3,GBS=GBSvv/3
  87. if %err% gtr %GBSvm% (goto chupai) else (if %err% == 10 (goto chupai) else (if %err% lss 10 set kzms=jp&&call :p11&&goto :GBJ))
  88. if %GBs% gtr %p2z% set GBs=%P2z%
  89. 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)
  90. goto :SB1
  91. :GBJ
  92. title 请选用键盘择您要出的牌...
  93. ::初始化选牌指针 变量GBy为原指针位置
  94. set /a GBy=12212,GBs=1
  95. :GB1
  96. set kzms=jp
  97. ::定位选牌指针 变量GBW为新指针位置
  98. set /a GBW=12209+GBs*3
  99. ::显示选牌指针并擦除原指针
  100. call :sybc %GBy%f1  ;
  101. call :sybc %GBw%f1↑
  102. ::无参数的SYBC功能类似CHOICE,暂停脚本并获取一个按键
  103. call :sybc
  104. ::下一行,显示所按的键
  105. ::title sybc-%errorlevel%-
  106. ::根据不同的按键执行相应的操作
  107. ::  左右键移动光标
  108. if %errorlevel% == 75 set /a GBs-=1
  109. if %errorlevel% == 77 set /a GBs+=1
  110. ::  上下键拉起/放下扑克 并刷新玩家的牌
  111. if %errorlevel% == 72 if !p2w%GBs%! == 0 set /a p2w%GBs%=1&&call :p11 1 %GBs%
  112. if %errorlevel% == 80 if !p2w%GBs%! == 1 set /a p2w%GBs%=0&&call :p11 0 %GBs%
  113. ::  空格 出牌
  114. if %errorlevel% == 57 goto chupai
  115. ::  F2 重新发牌
  116. if %errorlevel% == 60 goto 2
  117. ::  F5 刷新
  118. if %errorlevel% == 63 goto 1
  119. ::
  120. if %errorlevel% == 50 goto :SB
  121. ::指针超出高低极限则恢复
  122. if %GBs% lss 1 set gbs=%p2z%
  123. if %GBs% gtr %p2z% set gbs=1
  124. ::保存原指针等待擦除
  125. set /a GBy=GBw
  126. goto :GB1
  127. :chupai
  128. ::出牌
  129. set /a p6s=0,p6h=0,p6y=0,p6z=0,p0s=0,p0h=0,p0y=0,p0z=0,p2zBF=%p2z%
  130. set p2sBF=%p2s%
  131. set p2hBF=%p2h%
  132. set p2yBF=%p2y%
  133. 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!)
  134. for /l %%a in (1,1,%p0z%) do (set /a p2z=p0z&&set p2s=!p0s!&&set p2h=!p0h!&&set p2y=!p0y!)
  135. :yanzheng
  136. set px=违规&set pxs=0&set pxz={违规了!}&set ps=---34567890JQKA02N$
  137. ::初始化
  138. for /l %%a in (0,1,4) do set pss%%a=0
  139. 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
  140. ::计算各中点数的牌的数量
  141. for /l %%a in (1,1,20) do for /f %%b in ("!p6s:~%%a,1!") do set /a ps%%b+=1
  142. ::计算牌的数量
  143. set /a p6zs=%ps3%+%ps4%+%ps5%+%ps6%+%ps7%+%ps8%+%ps9%+%ps0%+%psj%+%psq%+%psk%+%psa%+%ps2%+%psn%
  144. ::获取标记字符串%p6ss%
  145. set p6ss=---%ps3%%ps4%%ps5%%ps6%%ps7%%ps8%%ps9%%ps0%%psj%%psq%%psk%%psa%0%ps2%%psn%$
  146. ::提取最大的单张,2张,3张,4张
  147. for /l %%a in (3,1,17) do set pss!p6ss:~%%a,1!=%%a
  148. ::提取最小的单张,2张,3张,4张
  149. for /l %%a in (17,-1,3) do set psx!p6ss:~%%a,1!=%%a
  150. ::单牌
  151. if %p6zs% == 1 set px=一张&set pxz=一张{!ps:~%pss1%,1!}&set pxs=%pss1%
  152. set p=%p6ss%&set q=%p6zs%
  153. ::3张和飞机
  154. ::解释:  %p:3=.% == %p%  表示%p%中没有3则if生效,加上not表示有3则if生效
  155. if %q% == 6 if not %p:33=.% == %p% set px=飞机
  156. if %q% == 8 if not %p:33=.% == %p% set px=飞机带单
  157. if %q% == 10 if not %p:33=.% == %p% if %p:1=.% == %p% set px=飞机带对
  158. if not %px:飞机=.% == %px% set pxs=%pss3%&set pxz=%px%
  159. if %q% == 9 if not %p:333=.% == %p% set px=三顺
  160. if %q% == 12 if not %p:333=.% == %p% set px=三顺带单
  161. if %q% == 15 if not %p:333=.% == %p% if %p:1=.% == %p% set px=三顺带对
  162. if %q% == 12 if not %p:3333=.% == %p% set px=三大顺
  163. if %q% == 16 if not %p:3333=.% == %p% set px=三大顺带单
  164. set p3=%p:3333=.%
  165. if %q% == 20 if not %p:3333=.% == %p% if %p:1=.% == %p% if %p3:3=.% == %p3% set px=三大顺带对
  166. if %q% == 15 if not %p:33333=.% == %p% set px=三巨顺
  167. if %q% == 20 if not %p:33333=.% == %p% set px=三巨顺带单
  168. if %q% == 18 if not %p:333333=.% == %p% set px=三神顺
  169. if not %px:三=.% == %px% set pxs=%pss3%&set pxz=%px%
  170. if %q% == 3 if not %p:3=.% == %p% set px=三张&set pxz=三张!ps:~%pss3%,1!
  171. if %q% == 4 if not %p:3=.% == %p% set px=三带一&set pxz=三张!ps:~%pss3%,1!带一张!ps:~%pss1%,1!
  172. if %q% == 5 if not %p:3=.% == %p% if not %p:2=.% == %p% set px=三带对&set pxz=三张!ps:~%pss3%,1!带一对!ps:~%pss2%,1!
  173. ::对子和兄弟
  174. if %q% == 2 if %p:1=.% == %p% set px=对子&set pxz=一对!ps:~%pss2%,1!&set pxs=%pss2%
  175. if %q% == 6 if not %p:222=.% == %p% set px=3兄弟
  176. if %q% == 8 if not %p:2222=.% == %p% set px=4兄弟
  177. if %q% == 10 if not %p:22222=.% == %p% set px=5兄弟
  178. if %q% == 12 if not %p:222222=.% == %p% set px=6兄弟
  179. if %q% == 14 if not %p:2222222=.% == %p% set px=7兄弟
  180. if %q% == 16 if not %p:22222222=.% == %p% set px=8兄弟
  181. if %q% == 18 if not %p:222222222=.% == %p% set px=9兄弟
  182. if %q% == 20 if not %p:2222222222=.% == %p% set px=10兄弟
  183. ::顺子
  184. if %q% == 5 if not %p:11111=.% == %p% set px=5张顺子
  185. if %q% == 6 if not %p:111111=.% == %p% set px=6张顺子
  186. if %q% == 7 if not %p:1111111=.% == %p% set px=7张顺子
  187. if %q% == 8 if not %p:11111111=.% == %p% set px=8张顺子
  188. if %q% == 9 if not %p:111111111=.% == %p% set px=9张顺子
  189. if %q% == 10 if not %p:1111111111=.% == %p% set px=10张顺子
  190. if %q% == 11 if not %p:11111111111=.% == %p% set px=11张顺子
  191. if %q% == 12 if not %p:111111111111=.% == %p% set px=12张顺子
  192. ::炸弹
  193. if %q% == 4 if not %p:4=.% == %p% set px=炸弹&set pxz=炸弹{四张!ps:~%pss4%,1!}&set pxs=%pss4%&set pxs=%pss4%
  194. if %q% == 2 if not %p:2$=.% == %p% set px=王炸&set pxz=王炸{无敌}&set pxs=%pss2%
  195. ::提取有效牌(顺子和兄弟里的最大一张,3张里的不含带牌的最大一张)
  196. if not %px:顺子=.% == %px% set pxs=%pss1%&set pxz=%px%!ps:~%psx1%,1!到!ps:~%pss1%,1!
  197. if not %px:兄弟=.% == %px% set pxs=%pss2%&set pxz=%px%!ps:~%psx2%,1!到!ps:~%pss2%,1!
  198. call :sybc 11468$30您出的牌:   ;            ;:11568$3C%pxz%
  199. if "%px%" == "违规" (set p2s=%p2sBF%&&set p2h=%p2hBF%&&set p2y=%p2yBF%&&set p2z=%p2zBF%
  200. for /l %%a in (1,1,20) do set p2w%%a=0
  201. call :p11
  202. call :sybc 11668$30不能这样出.;请重新出牌!
  203. goto :GB)
  204. (ECHO.fB800:%DEBUGQK:;= 20 3e&ECHO.fB800:% 20 3e&ECHO.q%)|DEBUG>NUL
  205. 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%
  206. call :sybcs
  207. for /l %%a in (1,1,20) do set p2w%%a=0
  208. SET SYBCS=%SYBCS%;:10350$30  ▁▁▁▁▁▁  ;$03▉$30      ▏;$03▉$3e 俺懒得要!$30▏;$03▉$3e      $30╲;  $03▇▇▇▇▇▇▇
  209. call :sybcs
  210. SET SYBCS=%SYBCS%;:10713$30  ▁▁▁▁▁▁  ;$03▉$30      ▏;$03▉$3e 俺要不起!$30▏;╱$3e      $30▏;$03▇▇▇▇▇▇▇$30  
  211. call :sybcs
  212. if %p6z% == %p2zBF% goto :win
  213. call :p11
  214. call :sybc 11606$ce  ;:11606$ce%p2z%
  215. call :sybc 11668$30没人要得起.;请继续出牌!
  216. goto :GB
  217. :p1
  218. if "%2" == "" goto :P11
  219. :P11
  220. set SYBCS=11800$3e%KH%:12000$3E按M键切换;到鼠标模式;出牌更方便;建议用鼠标;:12070$3EF2重新发牌;F5刷新屏幕;方向键控制;空格键出牌
  221. if "%kzms%" == "sb" set SYBCS=11800$3e%KH%:11900$3E┌───┒;│键  盘┃;┕━━━┛;鼠标模式不;能用功能键;点击用键盘;:11970$3E┌───┒;│出  牌┃;┕━━━┛;鼠标模式下;单击选扑克;然后出牌.
  222. 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! 农 民
  223. CALL :SYBCS
  224. goto :eof
  225. :pl
  226. set pl=%2
  227. for %%a in (0,1,20) set /a pq1=%%a*7+5,pq2=%%a*7+6 &&call :pa %1
  228. goto :eof
  229. :pb
  230. SET SYBCS=%SYBCS%;:%1%pkBK3%▄▄▄▄▄;%pkbk% %pkNB% {\__/} %pkBK% ; %pkNB% / $fc@@%pkNB% \ %pkBK% ; %pkNB%( ($f0oo%pkNB%) )%pkBK% ; %pkNB% / ~~ \ %pkBK% ;%pkbk% $f2斗 地 主%pkbk% ;%pkBK4%▄▄▄▄▄%pkBK%
  231. goto :eof
  232. :pa
  233. 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%
  234. goto :eof
  235. :fp
  236. title 发牌中...
  237. for /l %%a in (1,1,20) do set p2w%%a=0
  238. set paid=&set paif=&set paiy=&set /a p1z=17,p2z=17,p3z=17
  239. :FP1
  240. set /a pran+=1,m=0,n=0,d=0
  241. ::随机排序54张牌(洗牌)
  242. 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))
  243. set P%pran%#300543001.N-!pkh0!-!pky1!=1&set P%pran%#543001000.N-!pkh0!-!pky0!=1
  244. ::发牌,并留三张底
  245. set he1=&set he2=&set he3=&set Di=
  246. 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)
  247. 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%
  248. set pdi%a:;=&set pdi%
  249. ::整理各家手上的牌
  250. 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 (
  251. set pd%pran%#%%c=!pd%pran%#%%c!%%c
  252. set pf%pran%#%%c=!pf%pran%#%%c!%%d
  253. set py%pran%#%%c=!py%pran%#%%c!%%e))
  254. 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!
  255. 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
  256. )
  257. if "%pdi3s%" == "" goto FP
  258. goto :eof
  259. :win
  260. (echo.FB800:B40 FFF 20 3E&echo q)|DEBUG>NUL
  261. set sybcs=12030F1╔════════╗;║$FC恭喜你,获得胜利.$F1║;║$F8按任意键从新开局$F1║;╚════════╝
  262. call :SYBCS
  263. pause>nul
  264. goto :2
  265. :timec
  266. IF "%t1%" == "" EXIT /B 0
  267. 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
  268. IF "%t2%" == "" SET /A T=N*360000+O*6000+P*100+Q-36610100&&EXIT /B !T!
  269. 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
  270. 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)
  271. IF "%L%" == "" SET L=T
  272. call :sybc 1176831耗时:   厘秒;:11773$3c!%L%!
  273. goto :eof
  274. :SYBCS
  275. echo %SYBCS% >>sybc.txt
  276. (ECHO.%SYBCOM:`=&ECHO.DW %&ECHO.%SYBCV:`=&ECHO.%)|DEBUG>NUL
  277. goto :EOF
  278. :SYBC
  279. IF "%1" == "" SET SYBCCD=00&GOTO SYBCC
  280. echo %1 >>sybc.txt
  281. SET SYBCCD=64
  282. set SYBCC=%*
  283. :SYBCC
  284. SET V=`A80`DB %SYBCCD% 00 "%SYBCC%" 0D``RCX`200`G`Q
  285. (ECHO.%SYBCOM:`=&ECHO.DW %&ECHO.%V:`=&ECHO.%)|DEBUG>NUL
  286. EXIT /B %ERRORLEVEL%
复制代码

TOP

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

TOP

返回列表