Board logo

标题: CMD下批处理小游戏21点 [打印本页]

作者: everest79    时间: 2008-10-26 09:20     标题: CMD下批处理小游戏21点

规则:
发牌与叫牌为先闲后庄
庄为电脑,闲为玩家
首次发牌一家两张,一明一暗,庄家的明牌显示在屏幕上给闲家参考,闲家的明牌做为一个值提供给电脑判断是否要牌,然后闲家首先决定是否叫牌
当闲家爆掉(大于21点)时,庄家直接赢得本局,庄家不用再叫牌
闲家牌总数达到五张时,自动结束闲家叫牌,转为庄家选择叫牌
闲家放弃叫牌后转为庄家叫牌
相同点数庄吃闲,五张牌大4-20点
要求:
在CMD下不能显示扑克牌图案,用汉字代替
需要有总局数,庄闲胜局纪录
胜利判定需要你自定义一个渐进递归的算式,例如
总局为1-5局时需要对战比分 1:2
6-15局时比分 1:1.9
...
具体局数自定义,递归单位也自定义
游戏的结局有三个结果,第一是庄胜闲,第二是闲胜庄,第三是累死电累(达到总局上限)
牌的正面:
  1. ┏━━┓
  2. ┃A   ┃
  3. ┃    ┃
  4. ┃  梅┃
  5. ┗━━┛
复制代码
牌的背面
  1. ┏━━┓
  2. ┃++++┃
  3. ┃++++┃
  4. ┃++++┃
  5. ┗━━┛
复制代码
操作界面
  1. ┏━━┓┏━━┓
  2. ┃6   ┃┃++++┃
  3. ┃    ┃┃++++┃
  4. ┃  方┃┃++++┃
  5. ┗━━┛┗━━┛
  6. ┏━━┓┏━━┓
  7. ┃10  ┃┃A   ┃
  8. ┃    ┃┃    ┃
  9. ┃  黑┃┃  梅┃
  10. ┗━━┛┗━━┛
复制代码
我自已也在写,但判断方面比较困难
首先电脑叫牌与否取决于自已牌面大小,对家明牌,对家叫了几张牌,接近21点时叫牌判断不但要考虚这些,还需要添加一个随机数
再者就是代码的效率,这个每个人的爱好不同,就不多讲了
作者: pusofalse    时间: 2008-10-29 20:22

期待大侠的代码出炉!~
作者: everest79    时间: 2008-10-31 23:38

抛砖引玉,我只写了一半,逻辑方面还没有完成
  1. @ECHO OFF
  2. :Init
  3. ECHO A=0 B=0 >ll.txt
  4. SETLOCAL ENABLEDELAYEDEXPANSION
  5. Set _String=黑红梅方
  6. Set _Replace1=1  A   1  1
  7. Set _Replace2=A3 K  13 10
  8. Set _Replace3=A2 Q  12 10
  9. Set _Replace4=AA J  11 10
  10. Set _Replace5=A0 10 10 10
  11. Set /A _ZFen=0,_XFen=0,Total+=1
  12. :Start
  13. Set /A Count+=1,1/(2/Count) 2>nul||Set Count=2&&Goto SelectP
  14. If Not Defined _Computer2 (
  15.    CALL :FaPai Computer%Count%
  16.    If Not Defined _Computer2 (
  17.       CALL :Screen "A" "!DianShu:~0,2!" "!HuaSe!"
  18.       CAll :Back "A"
  19.    )
  20. )
  21. CALL :FaPai Players%Count%
  22. CALL :Screen "B" "!DianShu:~0,2!" "!HuaSe!"
  23. Goto Start
  24. :SelectP
  25. Set /A CountP+=1,1/(3/CountP) 2>nul||Set CountP=3&&Goto SelectC
  26. If Not Defined _Players3 (
  27.    Set ACount=2
  28.    CALL :JiFen Players SelectP
  29. )
  30. CALL :Output
  31. Set /P Instr="(Quit;Enter any key;Enter):"
  32. If Defined Instr (
  33.    If /I *!Instr! == *quit (
  34.       Goto :eof
  35.    ) Else (
  36.       Set /A CountP=CountP-1
  37.       Goto SelectC
  38.    )
  39. )
  40. CALL :Console "Players" "B" "SelectP" %CountP%
  41. Goto %_Label%
  42. :SelectC
  43. Set /A CountC+=1,1/(3/CountC) 2>nul||Set CountC=3&&Goto End
  44. Set /A _Chk1=Players1+10,_Chk2=(21-ComputerFen-CountP)/2
  45. Set /A _Chk3=%random%%%2,_Chk4=%random%%%100
  46. If Not Defined _Computer3 (
  47.    Set ACount=2
  48.    CALL :JiFen Computer SelectC
  49. )
  50. If %ComputerFen% LSS 15 (
  51.    Goto Next) Else (
  52.    If !_Chk1! GTR !ComputerFen! (
  53.       If !CountP! GTR 0 (
  54.          If !_Chk2! GEQ 2 (
  55.            If !_Chk3! EQU 1 (Goto Next)
  56.          ) Else (
  57.          If !_Chk2! LEQ -2 (
  58.            If !_Chk4! EQU 99 (Goto Next)
  59.          )
  60.          )
  61.       )
  62.    )
  63. )
  64. Set /A CountC-=1
  65. Goto End
  66. :Next
  67. CALL :Console "Computer" "A" "SelectC" %CountC%
  68. Goto %_Label%
  69. :Console
  70. ::%1=Players(Computer) %2=B(A) %3=Select+C(P)
  71. Set /A ACount=Count+%~4
  72. CALL :FaPai %~1%ACount%
  73. CALL :JiFen %~1 %~3
  74. CALL :Screen "%~2" "!DianShu:~0,2!" "!HuaSe!"
  75. Goto :eof
  76. :FaPai
  77. ::%1=Computer(Players)+Count
  78. Set /A DianShu=%random%%%13+1
  79. If *!Set%DianShu%! == *Not Goto FaPai
  80. Set _%~1=%DianShu%
  81. If Not Defined Set%DianShu% (
  82. CALL :Strto
  83. Set Set%DianShu%=!Str!
  84. )
  85. Set Set%DianShu%=!Set%DianShu%:Not=!
  86. Set HuaSe=!Set%DianShu%:~0,1!
  87. Set Set%DianShu%=!Set%DianShu%:%HuaSe%=!Not
  88. :Conver
  89. For /F "tokens=2-5 delims== " %%a in ('
  90. Set _Replace') DO (
  91. Set "DianShu=!DianShu:%%a=%%b! "
  92. Set _%~1=!_%~1:%%c=%%d!
  93. )
  94. Set _x%~1=!DianShu:~0,2! !HuaSe!
  95. Goto :eof
  96. :Strto
  97. Set Str=%_String%
  98. Set /A _str1=%random%%%4
  99. Set _str2=!Str:~%_str1%,4!
  100. Set Str=%_str2%!Str:%_str2%=!
  101. Set /A _str1=%random%%%3+1
  102. Set _str2=!Str:~0,-%_str1%!
  103. Set Str=%_str2%!Str:%_str2%=!
  104. Goto :eof
  105. :JiFen
  106. Set /A Shangx=21,Fen=0,aaa=0,bbb=0,xxx=0
  107. For /L %%i in (1,1,%ACount%) DO (
  108. Set /A aaa=!_%~1%%i!,bbb=aaa/^(aaa*aaa^)*10,Fen+=aaa+bbb,Shangx+=bbb
  109. Set /A xxx+=aaa/^(aaa*aaa^)
  110. )
  111. If %xxx% GTR 0 Set /A Fen=Fen-(xxx-1)*10
  112. If %Fen% LEQ %Shangx% (
  113. Set _Label=%~2
  114. If !Fen! GTR 21 Set /A Fen-=10
  115. ) Else (
  116. Set _Label=Overflow
  117. Set _Lose=%~2
  118. If !Shangx! GTR 21 Set /A Fen-=10)
  119. Set %~1Fen=%Fen%
  120. Goto :eof
  121. :Screen
  122. ::%1=A(B) %2=DianShu %3=HuaSe
  123. Set %~11=!%~11!┏━━┓
  124. Set %~12=!%~12!┃%~2  ┃
  125. Set %~13=!%~13!┃    ┃
  126. Set %~14=!%~14!┃  %~3┃
  127. Set %~15=!%~15!┗━━┛
  128. Goto :eof
  129. :Back
  130. Set %~11=!%~11!┏━━┓
  131. Set %~12=!%~12!┃++++┃
  132. Set %~13=!%~13!┃++++┃
  133. Set %~14=!%~14!┃++++┃
  134. Set %~15=!%~15!┗━━┛
  135. Goto :eof
  136. :Output
  137. CLS
  138. CALL :Show 5 A
  139. CALL :Show 9
  140. ECHO.%_XFen%/%Total%
  141. CALL :Show 5 B
  142. CALL :Show 2
  143. Goto :eof
  144. :Show
  145. For /L %%i in (1,1,%~1) DO ECHO.!%~2%%i!
  146. Goto :eof
  147. :Overflow
  148. If *%_Lose% == *SelectC (
  149. Set _Lose=闲) Else (Set _Lose=庄)
  150. Goto Pri
  151. :End
  152. If %ComputerFen% GEQ %PlayersFen% (
  153. Set _Lose=庄) Else (Set _Lose=闲)
  154. Goto Pri
  155. :Pri
  156. Set /A CountC+=Count
  157. For /L %%i in (1,1,5) DO Set "A%%i="
  158. For /L %%i in (1,1,%CountC%) DO CALL :Screen "A" "!_xComputer%%i:~0,2!" "!_xComputer%%i:~-1!"
  159. CALL :Output
  160. ECHO %_Lose%赢
  161. For /F "tokens=1,2" %%i in (ll.txt) DO Set /a %%i,%%j
  162. If *%_Lose% == *庄 (
  163. Set /A A+=1) Else (
  164. Set /A B+=1)
  165. ECHO A=%A% B=%B% >ll.txt
  166. PAUSE>nul
  167. ENDLOCAL
  168. Goto :Init
复制代码

作者: xiong8707    时间: 2008-12-25 22:33     标题: 高手...

小弟 佩服之至!!!!!!!!!!
作者: gbw911    时间: 2009-11-29 10:42

太长了,没奈心看了都
作者: qzwqzw    时间: 2010-1-3 12:59

可以使用ASCII字符集中0x03~0x06显示花色
  1. @echo off
  2. echo.红桃
  3. echo.方片
  4. echo.草花
  5. echo.黑桃
复制代码

作者: anoki    时间: 2010-2-9 00:26

楼主,能写出这样的来,不简单,但小弟发现一个小小问题,自己看图吧~!
作者: caruko    时间: 2011-4-6 12:45

♤♡♧♢ ♠♥♦♣
作者: caruko    时间: 2011-4-6 21:25

本帖最后由 caruko 于 2011-4-6 21:37 编辑

测试数十次,可能还有些隐藏BUG,另外拿5张牌的没有设置特殊。
  1. @ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION
  2. set /a C=0,P=0
  3. set /a j=10,q=10,k=10,a=100
  4. set "s_hs=,,,"
  5. set "s_pai=A,2,3,4,5,6,7,8,9,10,J,Q,K"
  6. :start
  7. set /a 庄_张次=0,闲_张次=0,庄_牌值=0,闲_牌值=0,P_明值=0
  8. set "庄_牌="
  9. set "闲_牌="
  10. set "P_明="
  11. set "msg="
  12. set "msg1="
  13. set "牌="
  14. set "s_p="
  15. for /l %%i in (1,1,5) do set "p%%i="
  16. for %%i in (!s_hs!) do for %%j in (!s_pai!) do set "s_p=%%i_%%j !s_p!"
  17. set "标准牌=!s_p!"
  18. ::洗牌 【随机5-11次洗牌,可自己改】
  19. set /a "n=%RANDOM% %% 7 + 5"
  20. :洗牌次
  21. for %%i in (!s_p!) do (
  22.     set /a "x=!RANDOM! %% 2"
  23.     if !x! equ 1 (set "牌=!牌! %%i") else set "牌=%%i !牌!"
  24. )
  25. set /a n-=1
  26. set "s_p=!牌!"
  27. if !n! GTR 0 (
  28.   set "牌="
  29.   goto :洗牌次
  30. )
  31. ::主流程
  32. call :发牌 庄
  33. call :发牌 闲 P1
  34. call :发牌 庄
  35. call :发牌 闲
  36. :loop
  37. call :玩家叫牌||goto :loop
  38. call :判断玩家值
  39. call :估计玩家值 !庄_牌值!
  40. :break
  41. ::计分重来
  42. if !庄_牌值! gEQ !闲_牌值! (
  43.   set msg1=!庄_牌值!:!闲_牌值!,庄家获胜!
  44.   set /a C+=1
  45. ) else (
  46.   set msg1=!庄_牌值!:!闲_牌值!,闲家获胜!
  47.   set /a P+=1
  48. )
  49. call :显示 2
  50. pause
  51. goto :start
  52. :爆
  53. set msg=%1家爆牌,点数!%1!。
  54. if "%1"=="庄" (
  55.   set msg1=闲家获胜!
  56.   set /a P+=1
  57.   ) else (
  58.   set msg1=庄家获胜!
  59.   set /a C+=1
  60.   )
  61. call :显示 3
  62. pause
  63. goto :start
  64. :end
  65. echo,按任意键退出!
  66. pause>nul
  67. exit
  68. :显示
  69. cls
  70. if "%*"=="" (
  71. setlocal
  72. for /l %%i in (1,1,!庄_张次!) do (set "p1=!p1!┏━━┓  "&set "p5=!p5!┗━━┛  ")
  73. for /f "tokens=2 delims=_ " %%i in ("!庄_牌!") do if "%%i"=="10" (set "p2=┃%%i  ┃  ") else set "p2=┃%%i   ┃  "
  74. for /l %%i in (2,1,!庄_张次!) do set "p2=!p2!┃++++┃  "
  75. set "p3=┃    ┃  "
  76. for /l %%i in (2,1,!庄_张次!) do set "p3=!p3!┃++++┃  "
  77. for /f "tokens=1 delims=_ " %%i in ("!庄_牌!") do set "p4=┃   %%i┃  "
  78. for /l %%i in (2,1,!庄_张次!) do set "p4=!p4!┃++++┃  "
  79. for /l %%i in (1,1,5) do echo !p%%i!
  80. endlocal
  81. ) else (
  82. setlocal
  83. for /l %%i in (1,1,!庄_张次!) do (set "p1=!p1!┏━━┓  "&set "p5=!p5!┗━━┛  ")
  84. for %%i in (!庄_牌!) do for /f "tokens=2 delims=_" %%j in ("%%i") do if "%%j"=="10" (set "p2=!p2!┃%%j  ┃  ") else set "p2=!p2!┃%%j   ┃  "
  85. for /l %%i in (1,1,!庄_张次!) do set "p3=!p3!┃    ┃  "
  86. for %%i in (!庄_牌!) do for /f "tokens=1 delims=_" %%j in ("%%i") do set "p4=!p4!┃   %%j┃  "
  87. for /l %%i in (1,1,5) do echo !p%%i!
  88. endlocal
  89. )
  90. echo,&echo,!msg!&echo,&echo,!msg1!&echo,对局: 庄[!C!] / 闲[!P!]
  91. setlocal
  92. for /l %%i in (1,1,!闲_张次!) do (set "p1=!p1!┏━━┓  "&set "p5=!p5!┗━━┛  ")
  93. for %%i in (!闲_牌!) do for /f "tokens=2 delims=_" %%j in ("%%i") do if "%%j"=="10" (set "p2=!p2!┃%%j  ┃  ") else set "p2=!p2!┃%%j   ┃  "
  94. for /l %%i in (1,1,!闲_张次!) do set "p3=!p3!┃    ┃  "
  95. for %%i in (!闲_牌!) do for /f "tokens=1 delims=_" %%j in ("%%i") do set "p4=!p4!┃   %%j┃  "
  96. for /l %%i in (1,1,5) do echo !p%%i!
  97. endlocal
  98. goto :eof
  99. :玩家叫牌
  100. choice /c HSE /n /m "拿牌(Hit:H) 停牌(Stand:S) 退出(Exit:E):"
  101. if !ERRORLEVEL! equ 0 exit /b 1
  102. if !ERRORLEVEL! equ 255 exit /b 1
  103. if !ERRORLEVEL! equ 2 exit /b 0
  104. if !ERRORLEVEL! equ 3 goto :end
  105. call :发牌 闲 ||exit /b 0
  106. exit /b 1
  107. goto :eof
  108. :发牌 [庄/闲]
  109. if !%1_张次! geq 5 (
  110.     set msg=最多只能拿5张牌!
  111.     call :显示
  112.     exit /b 1
  113. )
  114. set "msg=%1家拿牌!"
  115. for /f "tokens=1*" %%i in ("!牌!") do (
  116.     set "当前牌=%%i"
  117.     set "牌=%%j"
  118. )
  119. set "%1_牌=!%1_牌! !当前牌!"
  120. set /a %1_张次+=1
  121. if "%2"=="P1" (
  122.     set "P_明=!当前牌!"
  123.     for /f "tokens=2 delims=_" %%j in ("!当前牌!") do set /a "P_明值=%%j"
  124. )
  125. for /f "tokens=2 delims=_" %%j in ("!当前牌!") do set /a "%1_牌值=!%1_牌值! + %%j"
  126. call :显示
  127. goto :eof
  128. :判断玩家值
  129. if !闲_牌值! gtr 100 (
  130.     set /a tpp=!闲_牌值! %% 100 + 11
  131.     if !tpp! gtr 21 (set /a 闲_牌值=!闲_牌值! %% 100 + 1) else set /a 闲_牌值=tpp
  132.     if !闲_牌值! gtr 21 call :爆 闲
  133. ) else (
  134.     if !闲_牌值! gtr 21 call :爆 闲
  135. )
  136. goto :eof
  137. :估计玩家值 【电脑估计玩家牌值,因为统计学没学好,并且计算量也非常大,就采用初略估计值,否着计算各种值的可能性几分钟绝对算不完。】
  138. if !P_明值! geq 100 (
  139.     if !P_次数! equ 2 set /a P_明值=17
  140.     if !P_次数! equ 3 set /a P_明值=16
  141.     if !P_次数! equ 4 set /a P_明值=16
  142.     if !P_次数! equ 5 set /a P_明值=18
  143. ) else (
  144.     if !P_次数! equ 2 set /a P_明值=14
  145.     if !P_次数! equ 3 set /a P_明值=17
  146.     if !P_次数! equ 4 set /a P_明值=16
  147.     if !P_次数! equ 5 set /a P_明值=18
  148. )
  149. :判断电脑点数
  150. for %%i in (!庄_牌!) do set "标准牌=!标准牌:%%i=!"
  151. for %%i in (!P_明!) do set "标准牌=!标准牌:%%i=!"
  152. if !庄_牌值! GEQ 100 (
  153.     set /a 庄_牌值=%1 %% 100 + 11
  154.     if !庄_牌值! GTR 21 set /a 庄_牌值=%1 %% 100 + 1
  155.     if !庄_牌值! GEQ 17 if !庄_牌值! lss 22 goto :break
  156.     call :判断叫牌 !庄_牌值! || (
  157.         set /a 庄_牌值=%1 %% 100 + 1
  158.         if !庄_牌值! GTR 21 call :爆 庄
  159.         if !庄_牌值! GEQ 17 goto :break
  160.         call :判断叫牌 !庄_牌值!
  161.     )
  162. ) else (
  163.     if !庄_牌值! GTR 21 call :爆 庄
  164.     if !庄_牌值! GEQ 17 goto :break
  165.     call :判断叫牌 !庄_牌值!
  166. )
  167. goto :eof
  168. :判断叫牌 【分析是否叫牌】
  169. set /a jl=0,ct=0,n=0
  170. for %%i in (!标准牌!) do (
  171.     for /f "tokens=2 delims=_" %%j in ("%%i") do (
  172.         set /a num=%%j+%1,n+=1
  173.         if !num! lss 22 set /a jl+=1
  174.         if !num! lss !P_明值! set /a jl+=1
  175.     )
  176. )
  177. set /a jl=jl*100/n
  178. if !jl! gtr 55 (
  179.   set "msg=庄家叫牌!"
  180.   call :发牌 庄 || exit /b 0
  181.   call :判断电脑点数 !庄_牌值!
  182.   exit /b 0
  183. )
  184. exit /b 1
复制代码

作者: caruko    时间: 2011-4-6 21:29

好奇怪,复制代码得到的是LZ的牌。
set s_hs 显示空的,实际是6楼提供的ACSII码。
作者: mikeer    时间: 2011-4-26 21:33

呵呵,我玩这个游戏
开始还行
后来就不行了
作者: sds    时间: 2023-2-3 20:37

回复 6# qzwqzw 大王和小王:




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2