Board logo

标题: [其他] [分享]自编纯批处理逻辑牌游戏 [打印本页]

作者: weichenxiehou    时间: 2011-3-25 16:17     标题: [分享]自编纯批处理逻辑牌游戏

  1. ::程序头部
  2. @echo off&setlocal enabledelayedexpansion
  3. title ◇逻辑牌游戏◆Weichenxiehou@www.bathome.net
  4. cls&mode con cols=90 lines=30&color 17
  5. ::以下为程序中要用到的常量
  6. set n=&for %%i in (一 二 三 四 五 六 七 八 九 十) do set/a n+=1&set !n!=%%i
  7. set +=少减&set -=多减
  8. for /l %%i in (1 1 25) do set "ming=!ming!冥"
  9. for /l %%i in (1 1 1000) do set "back=!back!"
  10. set "tab= "::在此处添加实际的制表符
  11. set "back2o=echo,%tab%%back% 2>nul&set/p= <nul"::back2o用于返回原点
  12. for /l %%a in (1 1 80) do set "kong=!kong! "
  13. set hx=小偷&set ht=土匪&set hb=扒手&set hq=强盗
  14. set wz=p1&set ws=p2&set wh=p3&set wx=p4
  15. set w1=z&set w2=s&set w3=h&set w4=x
  16. set "sf=小偷 土匪 扒手 强盗 ** 原告 证人 法官 加减 花样 轻重 打手"
  17. set n=&for %%i in (砸窗哥 三轮哥 火车哥 犀利哥) do set/a n+=1&set p!n!=%%i
  18. set "face3=●0●"
  19. set "face2=●︿●"
  20. set "face1=⊙ω⊙"
  21. set "a=┌══┐"
  22. set "b=︱ ◆ ︱"
  23. set "c=︱ ◇ ︱"
  24. set "d=└══┘"
  25. ::加载游戏帮助
  26. call :help
  27. (for /l %%i in (1 1 14) do echo,)&echo,%kong:~,30%正在加载游戏,请稍等……&ping -n 3 127.1>nul
  28. :again
  29. ::以下为程序中要用到的变量(脸型、积分、手牌、五星)
  30. set show=%kong:~,48%
  31. for /l %%a in (1 1 4) do (
  32.   set "facep%%a=%face1%"
  33.   set "score%%a=***"
  34.   set "star%%a=  "
  35.   for /l %%b in (1 1 3) do (
  36.     set "b%%a%%b=%b%"&set "c%%a%%b=%c%"
  37.   )                    
  38. )
  39. ::加载游戏桌面
  40. for /l %%i in (1 1 29) do call :echo%%i
  41. call :show "加载完成!"
  42. ::下面开始洗牌
  43. for %%i in (%sf%) do set #!random!!random!!random!=%%i
  44. set n=&for /f "tokens=1* delims==" %%a in ('set #') do set "pai=!pai!%%b"&set %%a=
  45. ::下面开始发牌
  46. call :show "开始发牌!"
  47. for /l %%i in (1 1 4) do (
  48.   for /l %%j in (1 1 3) do (
  49.     set p%%i%%j=!pai:~,2!&set !pai:~,2!=p%%i%%j&set pai=!pai:~2!
  50.   )
  51. )
  52. for /l %%i in (1 1 23) do echo,
  53. ::将玩家的牌翻开
  54. for /l %%i in (1 1 3) do call :echop p4%%i !p4%%i! y
  55. call :show "发牌完成!"
  56. ::找出拥有**牌的玩家
  57. call :show "**请现身!"
  58. call :echop %**% ** n
  59. call :show "!%**:~,2%!是**!"
  60. ::用五星符号标明**身份
  61. if "%**:~,2%"=="p1" set star1=☆&call :echo9
  62. if "%**:~,2%"=="p2" set star2=☆&call :echo15
  63. if "%**:~,2%"=="p3" set star3=☆&call :echo15
  64. if "%**:~,2%"=="p4" set star4=☆&call :echo22
  65. ::**怀疑坏人
  66. set "sentence=**"
  67. set "leftbad=xbtq"::剩下的坏人
  68. call :show "**请指人!"
  69. :suspect
  70. set num=1234
  71. if not "%**:~,2%"=="p4" (
  72.   if defined leftbad (
  73.     set num1=!num:%**:~1,1%=!&set /a pos=!random!%%3&for %%i in (!pos!) do set ran=!num1:~%%i,1!
  74.     for %%i in (!ran!) do set h=!w%%i!&call :judge "!h!!leftbad:~,1!"
  75.     set num1=&set pos=&set ran=&set h=&goto :suspect
  76.   )
  77. ) else (
  78.   if defined leftbad (
  79.     call :show "**手动输入!"
  80.     set/p input=在此输入(如怀疑砸窗哥是强盗,就输入zq):
  81.     echo,!input!|findstr "^[zshx][!leftbad!]$">nul||(
  82.       call :show "输入错误!"
  83.       set input=&goto :suspect
  84.     )
  85.     call :judge "!input!"&set input=&goto :suspect
  86.   )
  87. )
  88. %back2o%&call :echo1
  89. ::以上程序段采取两种方式获得要进行审判的人,置于变量sentence中,如果**一个都没猜对,就只审**
  90. ::下面进入审理阶段
  91. ::所有人物现身
  92. for %%i in (原告 证人 法官 加减 花样 打手 轻重) do (
  93.   call :show "请%%i现身!"
  94.   call :echop !%%i! %%i y
  95. )
  96. ::加载积分信息
  97. call :show "正在加载玩家积分信息!"
  98. if not exist score.txt (for /l %%i in (1 1 4) do echo,score%%i:100>>score.txt)
  99. call :score j z
  100. ::判决被审判的人
  101. for %%i in (%sentence%) do call :sentence "%%i"
  102. call :show "本轮游戏结束,没人积分变负!"
  103. call :show "正在准备下一轮游戏!"
  104. call :show "正在加载……"
  105. goto :again
  106. :show "显示内容"
  107. ::本子程序用于屏幕中央的信息显示,从当前任意位置返回到原点,然后跳到显示位置显示完相应信息,再下降到第30行,再返回原点且延时
  108. 一定时间
  109. %back2o%&for /l %%i in (1 1 14) do echo,
  110. set "show=冥冥冥冥冥【系统提示】%~1%ming%"&set "show=!show:~,24!"&set "show=!show:冥=  !"&call :echo15
  111. (for /l %%i in (1 1 12) do echo,)&%back2o%
  112. ping 127.1>nul&goto :eof   
  113. :judge %hy%
  114. ::本子程序用于判断**猜测是否正确,每判断一次,把相应的坏人牌翻开,并指定剩下还有哪些坏人
  115. set hy=%~1
  116. set hr=!h%hy:~1%!
  117. set wj=!w%hy:~,1%!
  118. call :show "**猜测!%wj%!是%hr%!
  119. if "!%hr%:~,2!"=="!w%hy:~,1%!" (
  120.   set "sentence=!sentence! %hr%"
  121.   call :show "**猜测正确!"&call :face %**:~,2% 3&call :face %wj% 2
  122.   call :show "请!%wj%!把%hr%亮出!
  123.   call :echop !%hr%! %hr% n
  124.   if defined leftbad set "leftbad=!leftbad:%hy:~1%=!"
  125. ) else (
  126.   call :show "**猜测错误!"&call :face %**:~,2% 2&call :face !%hr%:~,2! 3
  127.   for %%i in ("!%hr%:~,2!") do call :show "请!%%~i!把%hr%亮出!
  128.   call :echop !%hr%! %hr% y
  129.   call :show "%hr%逃跑!"
  130.   if defined leftbad set "leftbad=!leftbad:%hy:~1%=!"
  131. )
  132. ::为免出错,清除临时变量
  133. set hy=&set hr=&set wj=&set left=
  134. goto :eof
  135. :face 玩家 脸号
  136. ::本子程序用于玩家变脸,用于玩家的脸在高兴、悲哀、正常三种状态下切换
  137. set face%1=!face%2!
  138. if "%1"=="p1" call :echo2
  139. if "%1"=="p2" call :echo15
  140. if "%1"=="p3" call :echo15
  141. if "%1"=="p4" call :echo29
  142. goto :eof
  143. :echop 牌号 人物 y/n
  144. ::本子程序用于翻牌,将参数1对应的牌翻开为参数2代表的人物,y/n决定是否更改边框,用于标记坏人是否逃跑
  145. set paihao=%1&set renwu=%2
  146. ::替换要显示的牌
  147. if "%3"=="y" (set !paihao:p=b!=︱ %renwu:~,1% ︱&set !paihao:p=c!=︱ %renwu:~1% ︱) else (set !paihao:p=b!=┠ %renwu:~,1%
  148. ┨&set !paihao:p=c!=┠ %renwu:~1% ┨)
  149. ::刷新相应行
  150. if "%paihao:~,2%"=="p1" call :echo6&call :echo7
  151. if "%paihao:~,2%"=="p2" call :echo11&call :echo12&call :echo15&call :echo16&call :echo19&call :echo20
  152. if "%paihao:~,2%"=="p3" call :echo11&call :echo12&call :echo15&call :echo16&call :echo19&call :echo20
  153. if "%paihao:~,2%"=="p4" call :echo24&call :echo25
  154. ::打扫战场
  155. set paihao=&set renwu=
  156. goto :eof
  157. ::桌面显示部分的固定代码
  158. :echo1 第一行
  159. %back2o%&echo,%kong%&%back2o%&goto :eof
  160. :echo2 第二行
  161. %back2o%&echo,&echo,%kong:~,42%%facep1%&goto :eof
  162. :echo3 第三行
  163. echo,%kong:~,42%%p1%&goto :eof
  164. :echo4 第四行
  165. %back2o%&echo,&echo,&echo,&echo,%kong:~,42%〖%score1%〗&goto :eof
  166. :echo5 第五行
  167. echo,%kong:~,33%%a%%a%%a%&goto :eof
  168. :echo6 第六行
  169. %back2o%&(for /l %%i in (1 1 5)do echo,)&echo,%kong:~,33%%b11%%b12%%b13%&goto :eof
  170. :echo7 第七行
  171. %back2o%&(for /l %%i in (1 1 6)do echo,)&echo,%kong:~,33%%c11%%c12%%c13%&goto :eof
  172. :echo8 第八行
  173. echo,%kong:~,33%%d%%d%%d%&goto :eof
  174. :echo9 第九行
  175. %back2o%&(for /l %%i in (1 1 8)do echo,)&echo,%kong:~,44%%star1%&goto :eof
  176. :echo10 第十行
  177. echo,%kong:~,11%%a%%kong:~,52%%a%&goto :eof
  178. :echo11 第十一行
  179. %back2o%&(for /l %%i in (1 1 10)do echo,)&echo,%kong:~,11%%b21%%kong:~,52%%b31%&goto :eof
  180. :echo12 第十二行
  181. %back2o%&(for /l %%i in (1 1 11)do echo,)&echo,%kong:~,11%%c21%%kong:~,52%%c31%&goto :eof
  182. :echo13 第十三行
  183. echo,%kong:~,11%%d%%kong:~,52%%d%&goto :eof
  184. :echo14 第十四行
  185. echo,%kong:~,11%%a%%kong:~,52%%a%&goto :eof
  186. :echo15 第十五行
  187. %back2o%&(for /l %%i in (1 1 14)do echo,)&echo,%kong:~,5%%facep2%%b22%%star2%%show%%star3%%b32%%facep3%&echo,&echo,&goto
  188. :eof
  189. :echo16 第十六行
  190. %back2o%&(for /l %%i in (1 1 15)do echo,)&echo,%kong:~,5%%p2%%c22%%kong:~,52%%c32%%p3%&echo,&goto :eof
  191. :echo17 第十七行
  192. %back2o%&(for /l %%i in (1 1 16)do echo,)&echo,%kong:~,4%〖%score2%〗%d%%kong:~,52%%d%〖%score3%〗&goto :eof
  193. :echo18 第十八行
  194. echo,%kong:~,11%%a%%kong:~,52%%a%&goto :eof
  195. :echo19 第十九行
  196. %back2o%&(for /l %%i in (1 1 18)do echo,)&echo,%kong:~,11%%b23%%kong:~,52%%b33%&goto :eof
  197. :echo20 第二十行
  198. %back2o%&(for /l %%i in (1 1 19)do echo,)&echo,%kong:~,11%%c23%%kong:~,52%%c33%&goto :eof
  199. :echo21 第二十一行
  200. echo,%kong:~,11%%d%%kong:~,52%%d%&goto :eof
  201. :echo22 第二十二行
  202. %back2o%&(for /l %%i in (1 1 21)do echo,)&echo,%kong:~,44%%star4%&goto :eof
  203. :echo23 第二十三行
  204. echo,%kong:~,33%%a%%a%%a%&goto :eof
  205. :echo24 第二十四行
  206. %back2o%&(for /l %%i in (1 1 23)do echo,)&echo,%kong:~,33%%b41%%b42%%b43%&goto :eof
  207. :echo25 第二十五行
  208. %back2o%&(for /l %%i in (1 1 24)do echo,)&echo,%kong:~,33%%c41%%c42%%c43%&goto :eof
  209. :echo26 第二十六行
  210. echo,%kong:~,33%%d%%d%%d%&goto :eof
  211. :echo27 第二十七行
  212. %back2o%&(for /l %%i in (1 1 26)do echo,)&echo,%kong:~,42%〖%score4%〗&goto :eof
  213. :echo28 第二十八行
  214. echo,%kong:~,42%%p4%&goto :eof
  215. :echo29 第二十九行
  216. %back2o%&(for /l %%i in (1 1 28)do echo,)&echo,%kong:~,42%%facep4%&goto :eof
  217. :score 积分号 操作
  218. ::本子程序用于积分的加载、改变、储存和刷新显示,没有参数表示加载,第一个参数表示对哪个积分进行操作,第二个参数表示如何操作
  219. set/a score%1=1!score%1!%%1000
  220. if "%1%2"=="jz" for /f "tokens=1,2 delims=:" %%i in (score.txt) do set %%i=%%j
  221. set "opr=%2"&if not "!opr:~,1!"=="-" set "opr=+!opr!"
  222. set/a score%1=!score%1!%opr%
  223. if !score%1! geq 0 (
  224.   set/a score%1=1000+!score%1!
  225.   set score%1=!score%1:~-3!
  226. )
  227. attrib -s -h score.txt&cd.>score.txt&for /l %%i in (1 1 4) do echo,score%%i:!score%%i!>>score.txt&attrib +s +h score.txt
  228. call :echo4&call :echo17&call :echo27
  229. set opr=&goto :eof
  230. :sentence "被审判人"
  231. ::本子程序用于对于被审判人的审判,法官、原告、证人、加减、花样可以实现智能话判断,如果被审判人是自己就手下留情,而如果是别
  232. 人就痛下杀手
  233. ::法庭审理是很严肃的,所有人表情回归正常
  234. set "shenpan=%~1"
  235. set continue=
  236. for /l %%i in (1 1 4) do call :face p%%i 1
  237. call :show "法官:开始审判%~1!"
  238. call :show "法官:原告请发言!"
  239. call :face %原告:~,2% 3
  240. if not "%原告:~,2%"=="p4" (if "%原告:~,2%"=="!%~1:~,2!" (call :show "原告:我不告%~1!") else (call :show "原告:我要告%~1
  241. !"&call :face !%~1:~,2! 2&set continue=yes)) else call :input 原告
  242. if not defined continue goto :eof
  243. call :show "法官:证人请发言!"
  244. call :face %证人:~,2% 3
  245. if not "%证人:~,2%"=="p4" (if "%证人:~,2%"=="!%~1:~,2!" (call :show "证人:我没看见%~1啊!"&set continue=) else (call :show
  246. "证人:我看见了%~1的!"&call :face !%~1:~,2! 2&set continue=yes)) else call :input 证人
  247. if not defined continue goto :eof
  248. call :show "法官:下面开始对%~1判刑!"
  249. call :face %法官:~,2% 3
  250. if not "%法官:~,2%"=="p4" (if "%法官:~,2%"=="!%~1:~,2!" (set/a operation=-1&call :show "法官:判对%~1积分减一!") else
  251. (set/a operation=-10&call :show "法官:判对%~1积分减十!"&call :face !%~1:~,2! 2)) else call :input 法官
  252. call :show "法官:加减官请发言!"
  253. call :face %加减:~,2% 3
  254. if not "%加减:~,2%"=="p4" (if "%加减:~,2%"=="!%~1:~,2!" (set/a operation=!operation!+5&call :show "加减官:%~1积分少减五吧
  255. !") else (set/a operation=!operation!-5&call :show "加减官:%~1积分多减五吧!"&call :face !%~1:~,2! 2)) else call :input
  256. 加减
  257. call :show "法官:花样官请发言!"
  258. call :face %花样:~,2% 3
  259. if not "%花样:~,2%"=="p4" (if "%花样:~,2%"=="!%~1:~,2!" (set/a operation=!operation!*1&call :show "花样官:不改变!") else
  260. (set/a operation=!operation!*5&call :face !%~1:~,2! 2&call :show "花样官:小小的乘以个五吧!")) else call :input 花样
  261. call :show "法官:轻重官请发言!"
  262. call :face %轻重:~,2% 3
  263. if not "%轻重:~,2%"=="p4" (if "%轻重:~,2%"=="!%~1:~,2!" (set/a operation=!operation!*1&call :show "轻重官:不改变!") else
  264. (set/a operation=!operation!*2&call :face !%~1:~,2! 2&call :show "轻重官:小小的乘以个二吧!")) else call :input 轻重
  265. call :show "法官:打手执行!"
  266. call :face %打手:~,2% 3&call :show "打手:%~1来挨打吧!"
  267. call :face !%~1:~,2! 2&call :show "%~1:哎哟!您轻点儿吧!"
  268. call :score !%~1:~1,1! %operation%
  269. ::法官、打手、**分钱
  270. call :show "下面法官、**、打手分钱!"
  271. set/a dsf=(-!operation!)%%2
  272. call :score %打手:~1,1% %dsf%
  273. set/a fgf=-!operation!-!dsf!
  274. set/a fjf=(-!operation!-!dsf!)/2
  275. if not "**"=="%~1" (
  276.   call :score %法官:~1,1% %fjf%
  277.   call :score %**:~1,1% %fjf%
  278. ) else call :score %法官:~1,1% %fgf%
  279. for %%i in ("!%~1:~1,1!") do if !score%%~i! lss 0  call :show "%~1积分变为负!"&call :show "本局游戏结束!"&pause>nul&del
  280. /a /q score.txt&exit
  281. ::清理局部变量
  282. set operation=&set dsf=&set fjf=
  283. goto :eof
  284. :input 身份
  285. ::本子程序用于判刑环节玩家的手动输入,让玩家更多地参与到游戏中来
  286. call :show "请%1手动输入!"
  287. :here
  288. set/p input=在此输入:
  289. if "%1"=="原告" (
  290.   echo,%input%|findstr "^[yn]">nul||(call :show "输入错误!"&set/p=原告请输入y或n!<nul&pause&call :echo1&goto :here)
  291.   if "%input:~,1%"=="y" call :show "原告:我要告%shenpan%!"&call :face !%~1:~,2! 2&set continue=yes
  292.   if "%input:~,1%"=="n" call :show "原告:我不告%shenpan%!"
  293. )
  294. if "%1"=="证人" (
  295.   echo,%input%|findstr "^[yn]">nul||(call :show "输入错误!"&set/p=证人请输入y或n!<nul&pause&call :echo1&goto :here)
  296.   if "%input:~,1%"=="y" call :show "证人:我看见了%shenpan%的!"&call :face !%~1:~,2! 2&set continue=yes
  297.   if "%input:~,1%"=="n" call :show "证人:我没看见%shenpan%啊!"&set continue=
  298. )
  299. if "%1"=="法官" (
  300.   echo,%input%|findstr "^[1-9]">nul&&(if %input% gtr 10 set/a a=1/0)||(call :show "输入错误!"&set/p=法官请输入1至10的数字
  301. !<nul&pause&call :echo1&goto :here)
  302.   set/a operation=!operation!-%input%&call :show "法官:判对%shenpan%积分减!%input%!!"
  303. )
  304. if "%1"=="加减" (
  305.   echo,%input%|findstr "^[+-][0-5]$">nul||(call :show "输入错误!"&set/p=加减官请输入[+-][0-5]!<nul&pause&call :echo1&goto
  306. :here)
  307.   set/a operation=!operation!%input%&call :show "加减官:%shenpan%积分!%input:~,1%!!%input:~1,1%!吧!"
  308. )
  309. if "%1"=="花样" (
  310.   echo,%input%|findstr "^[1-5]$">nul||(call :show "输入错误!"&set/p=花样官请输入1至5的数字!<nul&pause&call :echo1&goto
  311. :here)
  312.   set/a operation=!operation!*%input%&call :face !%~1:~,2! 2&call :show "花样官:小小的乘以个!%input%!吧!"
  313. )
  314. if "%1"=="轻重" (
  315.   echo,%input%|findstr "^[12]$">nul||(call :show "输入错误!"&set/p=轻重官请输入1或2!<nul&pause&call :echo1&goto :here)
  316.   set/a operation=!operation!*%input%&call :face !%~1:~,2! 2&call :show "轻重官:小小的乘以个!%input%!吧!"
  317. )
  318. call :echo1
  319. goto :eof
  320. :help
  321. ::此段为本小游戏的帮助说明部分
  322. echo,%kong:~,40%游戏简介
  323. echo,    真心感谢批处理之家论坛各位前辈高人长期以来的无私奉献,让我等新人得以跨进批处理的大门,批处理之家是一个很好的公益性
  324. 学习论坛,真心祝愿你发展得越来越好!
  325. echo,&echo,    游戏名称:纯批逻辑牌  作者:weichenxiehou 发布时间:2011-3-25
  326. echo,&echo,    游戏规则:
  327. echo,&echo,    游戏设置了四个玩家(犀利哥、砸窗哥、火车哥、三轮哥)和十二张牌(小偷、土匪、扒手、强盗、**、原告、证人、法
  328. 官、加减、花样、轻重、打手),每名玩家的初始积分为100,玩家名称仅供娱乐,不针对任何人!
  329. echo,&echo,    每名玩家获得3张牌后,拥有“**”牌的玩家亮出自己的“**”牌,**开始猜测哪位玩家拥有哪张坏人牌(小偷、土
  330. 匪、扒手、强盗),猜测四次,如果猜对,该名坏人就会被逮捕,如果猜错,该名坏人逃跑,被逮捕的坏人和**将会在下一阶段被审理。
  331. echo,&echo,    审理阶段,由原告、证人、法官、加减、花样、轻重、打手对被逮捕的坏人和**进行审理,由拥有这些牌的玩家操作,审
  332. 理由法官主持,首先原告决定是否起诉被审判者,证人陈述是否看到被审判者,只要二者之一放弃,这名被审判者就逃过一劫,跳过后面的
  333. 判刑阶段。
  334. echo,&echo,    判刑阶段,法官首先判决对拥有被审判者牌的玩家扣多少分(1-10),然后加减官决定加减多少分(1-5),花样官决定打
  335. 哪儿(*1,*2,*3,*4,*5),轻重官决定打轻还是打重(*1,*2),后两者是指在前两者级算出的要扣的积分上乘以几。
  336. echo,&echo,    拥有被审判者牌的玩家失去的积分由拥有打手、法官、**的玩家分配,如果所扣积分为奇数,打手获得1分,反之不得分
  337. ,剩下的由法官和**平分,如果被审理者是**,法官获得剩下全部积分。
  338. echo,&echo,    如果本轮结束有玩家积分变为负,游戏结束,反之,重复以上步骤。
  339. echo,&pause&cls
  340. echo,&echo,    操作指南:
  341. echo,&echo,    您的玩家名称为“犀利哥”,位于屏幕下方,在猜人阶段和审判阶段均有可能被要求输入。
  342. echo,&echo,    猜测坏人时分别输入玩家名称和坏人名称的拼音的第一个字母,如输入zq表示怀疑“砸窗哥”有“强盗”牌。
  343. echo,&echo,    审判阶段,法官可以输入0至10的任意一个数,表示判被审理者扣多少积分。
  344. echo,&echo,    审判阶段,原告和证人可以输入y或n,表示是否起诉被审理者和是否为审理作证,任何一个放弃,被审理者将会跳过判刑。
  345. echo,&echo,    审判阶段,加减官可以输入[+-][12345]搭配出的任何一个,表示在法官判决的基础上加减多少分,-5表示再给被审判者再
  346. 减5分。
  347. echo,&echo,    审判阶段,花样官可以输入1至5的任何一个数字,表示对前面计算出的所扣积分乘以多少,输入5表示乘以5。
  348. echo,&echo,    审判阶段,轻重官可以输入1或者2,意义同花样官。
  349. echo,&echo,    积分信息存放在同目录下的score.txt中,游戏结束自动删除。
  350. echo,&echo,    请注意:另外几个玩家并不笨,只要被审判者不是自己,他们将会尽最大努力伤害您!
  351. echo,&pause&cls
复制代码

作者: hbwazxf    时间: 2011-3-26 17:52

很强大,学习一下。。支持 楼主。
作者: yangyf34    时间: 2011-3-27 23:13

不错,如果带点背景音效更爽,哈哈 。
一个错误:

::判决被审判的人

for %%i in (%sentence%) do call :sentence "%%i"

call :show "本轮游戏结束,没人积分变负!"

--------------
实际积分负的一塌糊涂了也这么说~~~
作者: weichenxiehou    时间: 2011-3-28 21:53

3# yangyf34
多谢3楼指正,代码已在顶楼修改,附件已更新。
作者: qzwqzw    时间: 2011-3-29 08:00

本帖最后由 qzwqzw 于 2011-3-29 09:38 编辑

程序写的非常不错!
有此功底很不简单。
还有几个问题

积分计算还有些问题
比如在一方还有75分时
系统即判定这一方为负
——————————
应该是下面这句的问题
for %%i in (!%~1:~1,1!) do if !score%%i! lss 0 set over=1
改为下面这样就可以了
for %%i in ("!%~1:~1,1!") do if !score%%~i! lss 0 set over=1
另外从全文中看不出特意指定over变量的意义
应该可以直接在lss 0后显示信息并退出
退出前最后加pause暂停或者是否重开的选择

在玩家(犀利哥)为原告或证人时
不论如何输入
都会继续有罪审判流程
——————————
应该是call :input 原告 的问题
程序在:input中 goto :eof跳转是没有用的
仍然回到了审判主流程
所以应该使用一个全局性的有罪标记来决定流程走向
另外看到:input中goto :eof经常成对使用
这应该是没有意义的
而goto :here却不是每段都有
感觉很奇怪
所以有时候在玩家作为证人或加减输入错误时
不会提示重新输入

程序判断逻辑需要继续完善
根据利益最大化原则
要让自己尽量少受损失多得利益
要让对手尽量多受损失少得利益
有几种情况需要考虑
1
当对手A同为被审判者、法官和加减官时
A会被判有罪但不仅不会处罚反而会奖励
这时本身作为花样官或轻重官
就不能选择最大倍数
而应选择最小倍数
2
当对手A为高分(比如350)
对手B为低分(比如30)
在A为被审判者B为法官或警察
这时本身作为原告、证人、加减、花样或轻重
就应该选择最小惩罚
而非最大惩罚

最后建议将花样官的积分策略改变一下
*1到*5的倍数有些大了
很多情况下通常一个判罚就可能淘汰对手
这就丧失了游戏的平衡性了
可以将花样官的判罚移至最后(即轻重官之后)
改为提取或去除当前惩罚积分的某一位
比如150去掉十位得到10
或者去掉百位得到50
作为最后的惩罚积分
这样不仅增加了游戏平衡性
也使前后玩家可以相互制约
促使玩家根据现实情况选择最有利于自身的策略
而不是仅仅选择最高和最低的分值和倍数
从而也提高了游戏的趣味性
作者: weichenxiehou    时间: 2011-3-29 09:43

5# qzwqzw
非常感谢qzwqzw给出的宝贵意见!膜拜!那个积分出错的问题,我是在3楼提出来之后才发现的,然后草草的做了修改,忘了加引号,导致for把括号里的逗号当成了参数分隔符,前面遇到过这个问题的,我也用您给的方法解决过,哪知这儿忘了,呵呵,贻笑大方了!
输入n没反应的问题还得谢谢您,多谢您帮忙测试,并给出意见,最后写那个input子程序的时候时间有点儿紧,草草写出来就挂上来了,不像前面写代码那么细心了,呵呵~弄得有点儿虎头蛇尾,实在是见笑了……
代码和附件已在顶楼更新,欢迎提出其他问题!
作者: weichenxiehou    时间: 2011-3-29 09:52

5# qzwqzw
所言极是,意见宝贵,尽量采纳。。。
作者: batman    时间: 2011-3-29 10:40

有错就改,这就是好的学习态度,楼主写这个真不容易。。。

但个人建议这样的代码只为练手而用,千万不要沉醉于此而迷失正确的方向。。。
作者: qzwqzw    时间: 2011-3-29 10:54

嗯,这个continue名字倒是跟我最初的想法不谋而合
只是你忘记了在证人发言前将continue重新清空
导致如果玩家作为原告决定起诉后
再玩家轮到作为证人不证明后仍然会进入有罪流程

解决的方法有两个
1是在玩家选择前或者选择否时将continue置空
2是改用break变量,再玩家选择否后将break置真
作者: weichenxiehou    时间: 2011-3-29 13:59

9# qzwqzw
呵呵,真是再小的错误都逃不过你的法眼呢!
作者: weichenxiehou    时间: 2011-3-29 14:00

8# batman
batman说得是,我也感觉批处理最大的用处还是在文件管理和系统维护上,纯为练手,呵呵。




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