| @echo off&color 1f&mode con cols=55 lines=30 |
| setlocal enabledelayedexpansion |
| title 猜数字游戏 by zw19750516 |
| 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 如果你已经看懂了规则,请按任意键开始本次游戏。 |
| set var=A&pause>nul |
| :begin |
| set /a a=%random%%%10 |
| ::如果说a随机取得分别是1 2 3 4。var=A 1 2 3 4 |
| for %%a in (%var%) do if %%a equ %a% goto begin |
| ::分别判断a随机取到的数字有没有和var里面一样的,一样的话就重新回到begin随机取。 |
| set var=%var% %a% |
| ::var=A 1 2 3 4 |
| if "%var:~8%" equ "" goto begin |
| ::这个是判断var里面第八个以后的字符是否已经被定义,如果没有就继续取随机,也就是说刚好取到四个数字 |
| ::PS:set var=A我很怀疑这句话有什么用?不定义不行吗? |
| set var=%var:~2%&set m=0 |
| ::这个是取var第三位开始的字串即var=1 2 3 4。 |
| :again |
| set /a n=0,v=0,ws=0,s=0,t=10-m |
| if %t% equ 0 goto end |
| ::当猜了10次没有猜出来判断失败了 |
| cls&echo.&echo 请注意你总共只有10次机会,现在还剩下%t%次机会 |
| if "%m%" neq "0" for /l %%i in (1,1,%m%) do echo.&echo !_%%i! |
| ::!_%%i!这个和下面的问题一样,为什么前面加个下划线?这样是::不是还等于%%i?对于你之前的解释我还是看不懂,能不能稍微用::例子解释一下?set codes=A |
| ::还是上面那个问题,为什么要定义? |
| echo.&set /p code= 请在此输入: |
| ::假设输入的是1 5 8 3 |
| echo %code: =%|findstr "[^0-9]"&&goto wrong |
| ::%成对出现做变量引用处理,但是我不知道这个变量是什么?我看了 |
| ::下输出结果,是不是就是直接输出刚才输入的1 5 8 3? |
| ::findstr "[^0-9]"是不是就是说过如果输入的是1 5 j l那么就是过 |
| ::不了,然后就输出错误?我想知道空格在哪里被替换了?? |
| for %%a in (%code%) do ( |
| for %%i in (!codes!) do if %%i equ %%a goto wrong |
| ::这个!codes!也是对变量codes的引用吧?但是为什么不也用%? |
| ::后半句什么意思?判断是否输入的数字重复,比如1 1 2 3? |
| set codes=!codes! %%a |
| ::codes=A 1 5 8 3 |
| set /a n+=1 |
| ) |
| if %n% neq 4 goto wrong |
| ::这里限制输入的数字必须要四个。 |
| set codes=%codes:~2% |
| ::codes=1 5 8 3 |
| for %%i in (%codes%) do ( |
| set str=%%i |
| ::这里是str=1583? |
| if "!str:~1!" neq "" goto wrong |
| ::这里是说第二位开始如果没定义就错了?什么意思? |
| ::这一步有什么用? |
| ) |
| for %%a in (%var%) do ( |
| set /a v+=1,x=0 |
| for %%i in (%codes%) do ( |
| set /a x+=1 |
| if %%a equ %%i if !x! equ !v! ( |
| set /a ws+=1,s+=1 |
| ) else ( |
| set /a s+=1 |
| ) |
| ) |
| ) |
| ::上面这一段是不是说循环从var里面取一个字符判断和codes里面的 |
| ::每一个数字比较,看下位置和数字是否一样,一样的话就相应参数::+1? |
| set /a m+=1 |
| ::一次判断完成了就循环次数+1,然后继续用户输入循环判断。 |
| if "%var%" equ "%codes%" goto suc |
| ::如果完全符合就跳到成功. |
| set _%m%= %codes%中数值正确的有%s%个,其中位置数值都正确的有%ws%个&goto again |
| :: _%m%= %codes%这个怎么理解?数值应该是输入的1 5 8 3,那个 _%m%是变量吗?为什么前面加个下划线? |
| :wrong |
| cls |
| echo.&echo 所输入的非合法十进制整数,或数值不合要求, |
| echo.&echo 或有重复数,或输入的数值个数不是4个。 |
| ping /n 2 127.1>nul&goto again |
| :suc |
| if %m% equ 1 cls&echo.&echo 不会吧,1次就搞定了,你是不是神仙下凡啊?&goto select |
| if %m% leq 3 cls&echo.&echo 你真是聪明绝顶啊,只用%m%次就猜中了。&goto select |
| if %m% leq 5 cls&echo.&echo 看来你还是很厉害,用了%m%次就猜中了。&goto select |
| if %m% leq 9 cls&echo.&echo 呵呵,猜了%m%次,勉强过关了。&goto select |
| if %m% equ 10 cls&echo.&echo 你太精明了,硬是把机会给用完成功过关。 |
| :select |
| ping /n 3 127.1>nul |
| cls&echo.&set select=&set /p select= 是否再来一次(是就输入y/Y,其它任意键退出): |
| if /i "%select%" equ "y" (goto begin) else (goto exit) |
| :end |
| cls&echo.&echo 对不起你已经用完了所有的机会了。正确答案是%var%&goto select |
| :exit |
| ping /n 3 127.1>nulCOPY |