A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不二晨 金牌黑马   /  2019-1-3 09:19  /  699 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

最近学习批处理,看到一个大神写得猜字游戏,看懂了之后也仿了一个一模一样的,今天就来说道说道。先看下源码和效果图。

@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为截取长度(缺省为全部)

获取了产生的数串,就应该让用户输入自己的数字了,需要对输入的数串进行验证,必须是10以内的数字,不能重复,。
echo %numbers: =%|findstr "[^0-9]"&&goto wrong 这句话的意思是将数串numbers(也就是用户输入的内容)的空格去掉,然后检验里面是否有非数字的字符。
字符串替换

**********************************************

%PATH:str1=str2%
**********************************************

上面语法的意思就是:将字符串变量%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秒,其他的就没什么可说的了。现在,你已经可以用批处理开发一款小游戏啦!
---------------------
转载,仅作分享,侵删
作者:吹成狗的攻城狮
原文:https://blog.csdn.net/yongshi6/article/details/51062122


1 个回复

倒序浏览
奈斯,加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马