标签:
最近学习批处理,看到一个大神写得猜字游戏,看懂了之后也仿了一个一模一样的,今天就来说道说道。先看下源码和效果图。
@echo off color 0f mode con:cols=55 lines=30 title 猜数字游戏 By leo echo.&echo. echo.&echo ***** 游戏规则 ***** echo.&echo 程序会自动生成一组四个互不相同的0-9内的整数, echo.&echo 请你根据猜测和判断,每次输入一组四个互不相同 echo.&echo 0-9内的整数,中间请用空格格开,如:1 2 3 4, echo.&echo 程序会将你每次输入的数组与其生成的数组进行比 echo.&echo 较,并将比较的结果输出屏幕上以帮助你进一步的 echo.&echo 判断,直到你所输入的数组与其生成的数组的数值 echo.&echo 和次序完全相同,或你已用完了所有的猜测机会。 echo.&echo 如果你已经看懂了规则,请按任意键开始本次游戏。 pause > nul setlocal enabledelayedexpansion cls set var= :begin set /a num=%random%%%10 for %%a in (%var%) do if %%a equ %num% goto begin set var=%var% %num% if "%var:~7%" equ "" goto begin set var=%var:~1% set /a used=0 :task set /a n=0,sum=10,last=sum - used if %last% equ 0 goto end cls&echo.&echo 请注意你总共只有%sum%次机会,现在还剩下%last%次机会 if "%used%" neq "0" for /l %%i in (1,1,%used%) do echo.&echo !_%%i! echo.&set /p numbers= 请在此输入: echo %numbers: =%|findstr "[^0-9]"&&goto wrong set subNums= for %%a in (%numbers%) do ( for %%i in (!subNums!) do if %%i equ %%a goto wrong set subNums=!subNums! %%a set /a n+=1 ) if %n% neq 4 goto wrong set subNums=%subNums:~1% for %%i in (%subNums%) do ( set str=%%i if "!str:~1!" neq "" goto wrong ) set /a rightCount=0,rightPos=0,vPos=0 for %%a in (%var%) do ( set /a vPos+=1,nPos=0 for %%i in (%subNums%) do ( set /a nPos+=1 if %%a equ %%i if !vPos! equ !nPos! ( set /a rightPos+=1,rightCount+=1 ) else ( set /a rightCount+=1 ) ) ) set /a used+=1 if "%var%" equ "%subNums%" goto success set _%used%= %subNums%中数值正确的有%rightCount%个,其中位置数值都正确的有%rightPos%个&goto task :wrong cls echo.&echo 所输入的非合法十进制整数,或数值不合要求, echo.&echo 或有重复数,或输入的数值个数不是4个。 ping /n 4 127.1>nul&goto task :success if %used% equ 1 cls&echo.&echo 不会吧,1次就搞定了,你是不是神仙下凡啊?&goto select if %used% leq 3 cls&echo.&echo 你真是聪明绝顶啊,只用%used%次就猜中了。&goto select if %used% leq 5 cls&echo.&echo 看来你还是很厉害,用了%used%次就猜中了。&goto select if %used% leq 9 cls&echo.&echo 呵呵,猜了%used%次,勉强过关了。&goto select if %used% equ 10 cls&echo.&echo 你太精明了,硬是把机会给用完成功过关。 :select echo. set /p choose= 是否再来一局吗(是就输入y/Y,其它任意键退出)?: if /i "%choose%" equ "y" (goto begin) else (goto exit) :end cls&echo.&echo 对不起你已经用完了所有的机会了。正确答案是%var%&goto select :exit ping /n 3 127.1>nul pause
批处理中color是设置颜色用的,设置默认的控制台前景和背景颜色。
COLOR [attr]
attr:指定控制台输出的颜色属性
颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为前景。每个数字可以为以下任何值之一:
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 湖蓝色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时的颜色。这个值来自当前控制台窗口、/T 开关或DefaultColor 注册表值。
如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令会将 ERRORLEVEL 设置为 1。例如: "COLOR fc" 在亮白色上产生亮红色
mode con: cols=55 lines=30 这句话是来设置批处理窗口的尺寸的,con后的冒号可以略去。利用这个性质,我们还可以实现个小动画。
:anime set /a col+=4 set /a line+=2 mode con: cols=%col% lines=%line% if %col% lss 100 goto anime这段代码可以实现个窗体渐变的效果。
echo.是换行,一个&是将两条执行语句连接起来,〉nul是不让输出显示在屏幕上。
游戏的第一步是产生四个随机数,这四个数字都是10以内的数字,利用批处理中的%random%可以产生随机数,然后对10取余,就保证得到的数字是10以内的数字。这里需要注意两个问题,首先是需要保留这四个数字,第二是数字不能是重复的。这里用到的思路是,将每次产生的数字保存在一个字串里,下一次产生新的检测有没有重复的,有的话就重新生成。%var:~7%的意思是从var的第7位开始,取后面的字串 。这个命令的用法如下:
字符串截取
**********************************************
截取功能统一语法格式为:%a:~[m[,n]]%
**********************************************
方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)
字符串替换
**********************************************
**********************************************
上面语法的意思就是:将字符串变量%PATH%中的str1替换为str2。
验证完数字后,就需要验证是否存在重复的数字,
set subNums=
for %%a in (%numbers%) do (
for %%i in (!subNums!) do if %%i equ %%a goto wrong
set subNums=!subNums! %%a
set /a n+=1
)
if %n% neq 4 goto wrong
这段代码通过一个subNums变量,来进行重复数字的验证。遍历原有的数串,每遍历完一个,就将其添加到suvNums里面,然后将subNums与剩余的数字比较,重复则出错返回。这里的n是记录输入了多少个数字,如果不是4则出错。下一步开始验证输入的数串是否都是个位数,
set subNums=%subNums:~1%
for %%i in (%subNums%) do (
set str=%%i
if "!str:~1!" neq "" goto wrong
)
这里注意一下,不要使用numbers,虽然这是原来的输入穿,但考虑这种情况,如果输入了四个数字后多输入了一些空格,那这个变量里就有空格了,而subNums是拼接的,不存在这种情况。遍历subNums,验证数字的后面是不是空格,如果不是则出错。
现在程序产生的数字和用户输入的都确定了,下一步就是开始对比是否一致了。
set /a rightCount=0,rightPos=0,vPos=0
for %%a in (%var%) do (
set /a vPos+=1,nPos=0
for %%i in (%subNums%) do (
set /a nPos+=1
if %%a equ %%i if !vPos! equ !nPos! (
set /a rightPos+=1,rightCount+=1
) else (
set /a rightCount+=1
)
)
)
验证的过程其实就是一个双重for循环,对比数字的值和位置是否相等,然后记录下正确的个数。
set /a used+=1
if "%var%" equ "%subNums%" goto success
set _%used%= %subNums%中数值正确的有%rightCount%个,其中位置数值都正确的有%rightPos%个&goto task
这个地方需要注意了,前两句比较直观,第三句其实是定义了一个变量,这个变量以_开头,后接使用次数的值,然后这个变量的值就是后面的字符串。这个变量定义后,会在下一次循环的时候输出,这点需要理解清楚。往上看代码:
cls&echo.&echo 请注意你总共只有%sum%次机会,现在还剩下%last%次机会
if "%used%" neq "0" for /l %%i in (1,1,%used%) do echo.&echo !_%%i!
这段代码,就是遍历定义了几个_used变量,然后依次输出。这样屏幕上就会显示出每次输入数字后的结果提示:
至此,其实大部分的流程已经明了了。
当然,这里还提一些小地方。批处理中也有定时器的概念,ping /n 4 127.1>nul&goto task 这就是一个定时器,停在这个画面4秒,其他的就没什么可说的了。现在,你已经可以用批处理开发一款小游戏啦!
标签:
原文地址:http://blog.csdn.net/yongshi6/article/details/51062122