- ::程序头部
- @echo off&setlocal enabledelayedexpansion
- title ◇逻辑牌游戏◆Weichenxiehou@www.bathome.net
- cls&mode con cols=90 lines=30&color 17
-
- ::以下为程序中要用到的常量
- set n=&for %%i in (一 二 三 四 五 六 七 八 九 十) do set/a n+=1&set !n!=%%i
- set +=少减&set -=多减
- for /l %%i in (1 1 25) do set "ming=!ming!冥"
- for /l %%i in (1 1 1000) do set "back=!back!"
- set "tab= "::在此处添加实际的制表符
- set "back2o=echo,%tab%%back% 2>nul&set/p= <nul"::back2o用于返回原点
- for /l %%a in (1 1 80) do set "kong=!kong! "
- set hx=小偷&set ht=土匪&set hb=扒手&set hq=强盗
- set wz=p1&set ws=p2&set wh=p3&set wx=p4
- set w1=z&set w2=s&set w3=h&set w4=x
- set "sf=小偷 土匪 扒手 强盗 ** 原告 证人 法官 加减 花样 轻重 打手"
- set n=&for %%i in (砸窗哥 三轮哥 火车哥 犀利哥) do set/a n+=1&set p!n!=%%i
- set "face3=●0●"
- set "face2=●︿●"
- set "face1=⊙ω⊙"
- set "a=┌══┐"
- set "b=︱ ◆ ︱"
- set "c=︱ ◇ ︱"
- set "d=└══┘"
-
- ::加载游戏帮助
- call :help
-
- (for /l %%i in (1 1 14) do echo,)&echo,%kong:~,30%正在加载游戏,请稍等……&ping -n 3 127.1>nul
-
- :again
- ::以下为程序中要用到的变量(脸型、积分、手牌、五星)
- set show=%kong:~,48%
- for /l %%a in (1 1 4) do (
- set "facep%%a=%face1%"
- set "score%%a=***"
- set "star%%a= "
- for /l %%b in (1 1 3) do (
- set "b%%a%%b=%b%"&set "c%%a%%b=%c%"
- )
- )
-
- ::加载游戏桌面
- for /l %%i in (1 1 29) do call :echo%%i
- call :show "加载完成!"
-
- ::下面开始洗牌
- for %%i in (%sf%) do set #!random!!random!!random!=%%i
- set n=&for /f "tokens=1* delims==" %%a in ('set #') do set "pai=!pai!%%b"&set %%a=
-
- ::下面开始发牌
- call :show "开始发牌!"
- for /l %%i in (1 1 4) do (
- for /l %%j in (1 1 3) do (
- set p%%i%%j=!pai:~,2!&set !pai:~,2!=p%%i%%j&set pai=!pai:~2!
- )
- )
- for /l %%i in (1 1 23) do echo,
-
- ::将玩家的牌翻开
- for /l %%i in (1 1 3) do call :echop p4%%i !p4%%i! y
- call :show "发牌完成!"
-
- ::找出拥有**牌的玩家
- call :show "**请现身!"
- call :echop %**% ** n
- call :show "!%**:~,2%!是**!"
- ::用五星符号标明**身份
- if "%**:~,2%"=="p1" set star1=☆&call :echo9
- if "%**:~,2%"=="p2" set star2=☆&call :echo15
- if "%**:~,2%"=="p3" set star3=☆&call :echo15
- if "%**:~,2%"=="p4" set star4=☆&call :echo22
- ::**怀疑坏人
- set "sentence=**"
- set "leftbad=xbtq"::剩下的坏人
- call :show "**请指人!"
- :suspect
- set num=1234
- if not "%**:~,2%"=="p4" (
- if defined leftbad (
- set num1=!num:%**:~1,1%=!&set /a pos=!random!%%3&for %%i in (!pos!) do set ran=!num1:~%%i,1!
- for %%i in (!ran!) do set h=!w%%i!&call :judge "!h!!leftbad:~,1!"
- set num1=&set pos=&set ran=&set h=&goto :suspect
- )
- ) else (
- if defined leftbad (
- call :show "**手动输入!"
- set/p input=在此输入(如怀疑砸窗哥是强盗,就输入zq):
- echo,!input!|findstr "^[zshx][!leftbad!]$">nul||(
- call :show "输入错误!"
- set input=&goto :suspect
- )
- call :judge "!input!"&set input=&goto :suspect
- )
- )
- %back2o%&call :echo1
- ::以上程序段采取两种方式获得要进行审判的人,置于变量sentence中,如果**一个都没猜对,就只审**
- ::下面进入审理阶段
- ::所有人物现身
- for %%i in (原告 证人 法官 加减 花样 打手 轻重) do (
- call :show "请%%i现身!"
- call :echop !%%i! %%i y
- )
-
- ::加载积分信息
- call :show "正在加载玩家积分信息!"
- if not exist score.txt (for /l %%i in (1 1 4) do echo,score%%i:100>>score.txt)
- call :score j z
- ::判决被审判的人
- for %%i in (%sentence%) do call :sentence "%%i"
- call :show "本轮游戏结束,没人积分变负!"
- call :show "正在准备下一轮游戏!"
- call :show "正在加载……"
- goto :again
-
- :show "显示内容"
- ::本子程序用于屏幕中央的信息显示,从当前任意位置返回到原点,然后跳到显示位置显示完相应信息,再下降到第30行,再返回原点且延时
-
- 一定时间
- %back2o%&for /l %%i in (1 1 14) do echo,
- set "show=冥冥冥冥冥【系统提示】%~1%ming%"&set "show=!show:~,24!"&set "show=!show:冥= !"&call :echo15
- (for /l %%i in (1 1 12) do echo,)&%back2o%
- ping 127.1>nul&goto :eof
-
- :judge %hy%
- ::本子程序用于判断**猜测是否正确,每判断一次,把相应的坏人牌翻开,并指定剩下还有哪些坏人
- set hy=%~1
- set hr=!h%hy:~1%!
- set wj=!w%hy:~,1%!
- call :show "**猜测!%wj%!是%hr%!
- if "!%hr%:~,2!"=="!w%hy:~,1%!" (
- set "sentence=!sentence! %hr%"
- call :show "**猜测正确!"&call :face %**:~,2% 3&call :face %wj% 2
- call :show "请!%wj%!把%hr%亮出!
- call :echop !%hr%! %hr% n
- if defined leftbad set "leftbad=!leftbad:%hy:~1%=!"
- ) else (
- call :show "**猜测错误!"&call :face %**:~,2% 2&call :face !%hr%:~,2! 3
- for %%i in ("!%hr%:~,2!") do call :show "请!%%~i!把%hr%亮出!
- call :echop !%hr%! %hr% y
- call :show "%hr%逃跑!"
- if defined leftbad set "leftbad=!leftbad:%hy:~1%=!"
- )
- ::为免出错,清除临时变量
- set hy=&set hr=&set wj=&set left=
- goto :eof
-
- :face 玩家 脸号
- ::本子程序用于玩家变脸,用于玩家的脸在高兴、悲哀、正常三种状态下切换
- set face%1=!face%2!
- if "%1"=="p1" call :echo2
- if "%1"=="p2" call :echo15
- if "%1"=="p3" call :echo15
- if "%1"=="p4" call :echo29
- goto :eof
-
- :echop 牌号 人物 y/n
- ::本子程序用于翻牌,将参数1对应的牌翻开为参数2代表的人物,y/n决定是否更改边框,用于标记坏人是否逃跑
- set paihao=%1&set renwu=%2
- ::替换要显示的牌
- if "%3"=="y" (set !paihao:p=b!=︱ %renwu:~,1% ︱&set !paihao:p=c!=︱ %renwu:~1% ︱) else (set !paihao:p=b!=┠ %renwu:~,1%
-
- ┨&set !paihao:p=c!=┠ %renwu:~1% ┨)
- ::刷新相应行
- if "%paihao:~,2%"=="p1" call :echo6&call :echo7
- if "%paihao:~,2%"=="p2" call :echo11&call :echo12&call :echo15&call :echo16&call :echo19&call :echo20
- if "%paihao:~,2%"=="p3" call :echo11&call :echo12&call :echo15&call :echo16&call :echo19&call :echo20
- if "%paihao:~,2%"=="p4" call :echo24&call :echo25
- ::打扫战场
- set paihao=&set renwu=
- goto :eof
-
- ::桌面显示部分的固定代码
- :echo1 第一行
- %back2o%&echo,%kong%&%back2o%&goto :eof
- :echo2 第二行
- %back2o%&echo,&echo,%kong:~,42%%facep1%&goto :eof
- :echo3 第三行
- echo,%kong:~,42%%p1%&goto :eof
- :echo4 第四行
- %back2o%&echo,&echo,&echo,&echo,%kong:~,42%〖%score1%〗&goto :eof
- :echo5 第五行
- echo,%kong:~,33%%a%%a%%a%&goto :eof
- :echo6 第六行
- %back2o%&(for /l %%i in (1 1 5)do echo,)&echo,%kong:~,33%%b11%%b12%%b13%&goto :eof
- :echo7 第七行
- %back2o%&(for /l %%i in (1 1 6)do echo,)&echo,%kong:~,33%%c11%%c12%%c13%&goto :eof
- :echo8 第八行
- echo,%kong:~,33%%d%%d%%d%&goto :eof
- :echo9 第九行
- %back2o%&(for /l %%i in (1 1 8)do echo,)&echo,%kong:~,44%%star1%&goto :eof
- :echo10 第十行
- echo,%kong:~,11%%a%%kong:~,52%%a%&goto :eof
- :echo11 第十一行
- %back2o%&(for /l %%i in (1 1 10)do echo,)&echo,%kong:~,11%%b21%%kong:~,52%%b31%&goto :eof
- :echo12 第十二行
- %back2o%&(for /l %%i in (1 1 11)do echo,)&echo,%kong:~,11%%c21%%kong:~,52%%c31%&goto :eof
- :echo13 第十三行
- echo,%kong:~,11%%d%%kong:~,52%%d%&goto :eof
- :echo14 第十四行
- echo,%kong:~,11%%a%%kong:~,52%%a%&goto :eof
- :echo15 第十五行
- %back2o%&(for /l %%i in (1 1 14)do echo,)&echo,%kong:~,5%%facep2%%b22%%star2%%show%%star3%%b32%%facep3%&echo,&echo,&goto
-
- :eof
- :echo16 第十六行
- %back2o%&(for /l %%i in (1 1 15)do echo,)&echo,%kong:~,5%%p2%%c22%%kong:~,52%%c32%%p3%&echo,&goto :eof
- :echo17 第十七行
- %back2o%&(for /l %%i in (1 1 16)do echo,)&echo,%kong:~,4%〖%score2%〗%d%%kong:~,52%%d%〖%score3%〗&goto :eof
- :echo18 第十八行
- echo,%kong:~,11%%a%%kong:~,52%%a%&goto :eof
- :echo19 第十九行
- %back2o%&(for /l %%i in (1 1 18)do echo,)&echo,%kong:~,11%%b23%%kong:~,52%%b33%&goto :eof
- :echo20 第二十行
- %back2o%&(for /l %%i in (1 1 19)do echo,)&echo,%kong:~,11%%c23%%kong:~,52%%c33%&goto :eof
- :echo21 第二十一行
- echo,%kong:~,11%%d%%kong:~,52%%d%&goto :eof
- :echo22 第二十二行
- %back2o%&(for /l %%i in (1 1 21)do echo,)&echo,%kong:~,44%%star4%&goto :eof
- :echo23 第二十三行
- echo,%kong:~,33%%a%%a%%a%&goto :eof
- :echo24 第二十四行
- %back2o%&(for /l %%i in (1 1 23)do echo,)&echo,%kong:~,33%%b41%%b42%%b43%&goto :eof
- :echo25 第二十五行
- %back2o%&(for /l %%i in (1 1 24)do echo,)&echo,%kong:~,33%%c41%%c42%%c43%&goto :eof
- :echo26 第二十六行
- echo,%kong:~,33%%d%%d%%d%&goto :eof
- :echo27 第二十七行
- %back2o%&(for /l %%i in (1 1 26)do echo,)&echo,%kong:~,42%〖%score4%〗&goto :eof
- :echo28 第二十八行
- echo,%kong:~,42%%p4%&goto :eof
- :echo29 第二十九行
- %back2o%&(for /l %%i in (1 1 28)do echo,)&echo,%kong:~,42%%facep4%&goto :eof
-
- :score 积分号 操作
- ::本子程序用于积分的加载、改变、储存和刷新显示,没有参数表示加载,第一个参数表示对哪个积分进行操作,第二个参数表示如何操作
- set/a score%1=1!score%1!%%1000
- if "%1%2"=="jz" for /f "tokens=1,2 delims=:" %%i in (score.txt) do set %%i=%%j
- set "opr=%2"&if not "!opr:~,1!"=="-" set "opr=+!opr!"
- set/a score%1=!score%1!%opr%
- if !score%1! geq 0 (
- set/a score%1=1000+!score%1!
- set score%1=!score%1:~-3!
- )
- 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
- call :echo4&call :echo17&call :echo27
- set opr=&goto :eof
-
- :sentence "被审判人"
- ::本子程序用于对于被审判人的审判,法官、原告、证人、加减、花样可以实现智能话判断,如果被审判人是自己就手下留情,而如果是别
-
- 人就痛下杀手
- ::法庭审理是很严肃的,所有人表情回归正常
- set "shenpan=%~1"
- set continue=
- for /l %%i in (1 1 4) do call :face p%%i 1
- call :show "法官:开始审判%~1!"
- call :show "法官:原告请发言!"
- call :face %原告:~,2% 3
- if not "%原告:~,2%"=="p4" (if "%原告:~,2%"=="!%~1:~,2!" (call :show "原告:我不告%~1!") else (call :show "原告:我要告%~1
-
- !"&call :face !%~1:~,2! 2&set continue=yes)) else call :input 原告
- if not defined continue goto :eof
- call :show "法官:证人请发言!"
- call :face %证人:~,2% 3
- if not "%证人:~,2%"=="p4" (if "%证人:~,2%"=="!%~1:~,2!" (call :show "证人:我没看见%~1啊!"&set continue=) else (call :show
-
- "证人:我看见了%~1的!"&call :face !%~1:~,2! 2&set continue=yes)) else call :input 证人
- if not defined continue goto :eof
- call :show "法官:下面开始对%~1判刑!"
- call :face %法官:~,2% 3
- if not "%法官:~,2%"=="p4" (if "%法官:~,2%"=="!%~1:~,2!" (set/a operation=-1&call :show "法官:判对%~1积分减一!") else
-
- (set/a operation=-10&call :show "法官:判对%~1积分减十!"&call :face !%~1:~,2! 2)) else call :input 法官
- call :show "法官:加减官请发言!"
- call :face %加减:~,2% 3
- if not "%加减:~,2%"=="p4" (if "%加减:~,2%"=="!%~1:~,2!" (set/a operation=!operation!+5&call :show "加减官:%~1积分少减五吧
-
- !") else (set/a operation=!operation!-5&call :show "加减官:%~1积分多减五吧!"&call :face !%~1:~,2! 2)) else call :input
-
- 加减
- call :show "法官:花样官请发言!"
- call :face %花样:~,2% 3
- if not "%花样:~,2%"=="p4" (if "%花样:~,2%"=="!%~1:~,2!" (set/a operation=!operation!*1&call :show "花样官:不改变!") else
-
- (set/a operation=!operation!*5&call :face !%~1:~,2! 2&call :show "花样官:小小的乘以个五吧!")) else call :input 花样
- call :show "法官:轻重官请发言!"
- call :face %轻重:~,2% 3
- if not "%轻重:~,2%"=="p4" (if "%轻重:~,2%"=="!%~1:~,2!" (set/a operation=!operation!*1&call :show "轻重官:不改变!") else
-
- (set/a operation=!operation!*2&call :face !%~1:~,2! 2&call :show "轻重官:小小的乘以个二吧!")) else call :input 轻重
- call :show "法官:打手执行!"
- call :face %打手:~,2% 3&call :show "打手:%~1来挨打吧!"
- call :face !%~1:~,2! 2&call :show "%~1:哎哟!您轻点儿吧!"
- call :score !%~1:~1,1! %operation%
- ::法官、打手、**分钱
- call :show "下面法官、**、打手分钱!"
- set/a dsf=(-!operation!)%%2
- call :score %打手:~1,1% %dsf%
- set/a fgf=-!operation!-!dsf!
- set/a fjf=(-!operation!-!dsf!)/2
- if not "**"=="%~1" (
- call :score %法官:~1,1% %fjf%
- call :score %**:~1,1% %fjf%
- ) else call :score %法官:~1,1% %fgf%
- for %%i in ("!%~1:~1,1!") do if !score%%~i! lss 0 call :show "%~1积分变为负!"&call :show "本局游戏结束!"&pause>nul&del
-
- /a /q score.txt&exit
- ::清理局部变量
- set operation=&set dsf=&set fjf=
- goto :eof
-
- :input 身份
- ::本子程序用于判刑环节玩家的手动输入,让玩家更多地参与到游戏中来
- call :show "请%1手动输入!"
- :here
- set/p input=在此输入:
- if "%1"=="原告" (
- echo,%input%|findstr "^[yn]">nul||(call :show "输入错误!"&set/p=原告请输入y或n!<nul&pause&call :echo1&goto :here)
- if "%input:~,1%"=="y" call :show "原告:我要告%shenpan%!"&call :face !%~1:~,2! 2&set continue=yes
- if "%input:~,1%"=="n" call :show "原告:我不告%shenpan%!"
- )
- if "%1"=="证人" (
- echo,%input%|findstr "^[yn]">nul||(call :show "输入错误!"&set/p=证人请输入y或n!<nul&pause&call :echo1&goto :here)
- if "%input:~,1%"=="y" call :show "证人:我看见了%shenpan%的!"&call :face !%~1:~,2! 2&set continue=yes
- if "%input:~,1%"=="n" call :show "证人:我没看见%shenpan%啊!"&set continue=
- )
- if "%1"=="法官" (
- echo,%input%|findstr "^[1-9]">nul&&(if %input% gtr 10 set/a a=1/0)||(call :show "输入错误!"&set/p=法官请输入1至10的数字
-
- !<nul&pause&call :echo1&goto :here)
- set/a operation=!operation!-%input%&call :show "法官:判对%shenpan%积分减!%input%!!"
- )
- if "%1"=="加减" (
- echo,%input%|findstr "^[+-][0-5]$">nul||(call :show "输入错误!"&set/p=加减官请输入[+-][0-5]!<nul&pause&call :echo1&goto
-
- :here)
- set/a operation=!operation!%input%&call :show "加减官:%shenpan%积分!%input:~,1%!!%input:~1,1%!吧!"
- )
- if "%1"=="花样" (
- echo,%input%|findstr "^[1-5]$">nul||(call :show "输入错误!"&set/p=花样官请输入1至5的数字!<nul&pause&call :echo1&goto
-
- :here)
- set/a operation=!operation!*%input%&call :face !%~1:~,2! 2&call :show "花样官:小小的乘以个!%input%!吧!"
- )
- if "%1"=="轻重" (
- echo,%input%|findstr "^[12]$">nul||(call :show "输入错误!"&set/p=轻重官请输入1或2!<nul&pause&call :echo1&goto :here)
- set/a operation=!operation!*%input%&call :face !%~1:~,2! 2&call :show "轻重官:小小的乘以个!%input%!吧!"
- )
- call :echo1
- goto :eof
-
- :help
- ::此段为本小游戏的帮助说明部分
- echo,%kong:~,40%游戏简介
- echo, 真心感谢批处理之家论坛各位前辈高人长期以来的无私奉献,让我等新人得以跨进批处理的大门,批处理之家是一个很好的公益性
-
- 学习论坛,真心祝愿你发展得越来越好!
- echo,&echo, 游戏名称:纯批逻辑牌 作者:weichenxiehou 发布时间:2011-3-25
- echo,&echo, 游戏规则:
- echo,&echo, 游戏设置了四个玩家(犀利哥、砸窗哥、火车哥、三轮哥)和十二张牌(小偷、土匪、扒手、强盗、**、原告、证人、法
-
- 官、加减、花样、轻重、打手),每名玩家的初始积分为100,玩家名称仅供娱乐,不针对任何人!
- echo,&echo, 每名玩家获得3张牌后,拥有“**”牌的玩家亮出自己的“**”牌,**开始猜测哪位玩家拥有哪张坏人牌(小偷、土
-
- 匪、扒手、强盗),猜测四次,如果猜对,该名坏人就会被逮捕,如果猜错,该名坏人逃跑,被逮捕的坏人和**将会在下一阶段被审理。
- echo,&echo, 审理阶段,由原告、证人、法官、加减、花样、轻重、打手对被逮捕的坏人和**进行审理,由拥有这些牌的玩家操作,审
-
- 理由法官主持,首先原告决定是否起诉被审判者,证人陈述是否看到被审判者,只要二者之一放弃,这名被审判者就逃过一劫,跳过后面的
-
- 判刑阶段。
- echo,&echo, 判刑阶段,法官首先判决对拥有被审判者牌的玩家扣多少分(1-10),然后加减官决定加减多少分(1-5),花样官决定打
-
- 哪儿(*1,*2,*3,*4,*5),轻重官决定打轻还是打重(*1,*2),后两者是指在前两者级算出的要扣的积分上乘以几。
- echo,&echo, 拥有被审判者牌的玩家失去的积分由拥有打手、法官、**的玩家分配,如果所扣积分为奇数,打手获得1分,反之不得分
-
- ,剩下的由法官和**平分,如果被审理者是**,法官获得剩下全部积分。
- echo,&echo, 如果本轮结束有玩家积分变为负,游戏结束,反之,重复以上步骤。
- echo,&pause&cls
- echo,&echo, 操作指南:
- echo,&echo, 您的玩家名称为“犀利哥”,位于屏幕下方,在猜人阶段和审判阶段均有可能被要求输入。
- echo,&echo, 猜测坏人时分别输入玩家名称和坏人名称的拼音的第一个字母,如输入zq表示怀疑“砸窗哥”有“强盗”牌。
- echo,&echo, 审判阶段,法官可以输入0至10的任意一个数,表示判被审理者扣多少积分。
- echo,&echo, 审判阶段,原告和证人可以输入y或n,表示是否起诉被审理者和是否为审理作证,任何一个放弃,被审理者将会跳过判刑。
- echo,&echo, 审判阶段,加减官可以输入[+-][12345]搭配出的任何一个,表示在法官判决的基础上加减多少分,-5表示再给被审判者再
-
- 减5分。
- echo,&echo, 审判阶段,花样官可以输入1至5的任何一个数字,表示对前面计算出的所扣积分乘以多少,输入5表示乘以5。
- echo,&echo, 审判阶段,轻重官可以输入1或者2,意义同花样官。
- echo,&echo, 积分信息存放在同目录下的score.txt中,游戏结束自动删除。
- echo,&echo, 请注意:另外几个玩家并不笨,只要被审判者不是自己,他们将会尽最大努力伤害您!
- echo,&pause&cls
复制代码
|