- 帖子
- 9
- 积分
- 12
- 技术
- 0
- 捐助
- 0
- 注册时间
- 2011-4-4
|
本帖最后由 290601953 于 2011-4-11 21:59 编辑
13# batman我重新的编辑了一下,我解释了每一句话,希望你能帮我看下对吗?那个紫色的我不太确定很有疑问,我承认我很菜,希望您有耐心帮我回答,谢谢!我真的想知道为什么!
@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里面第八个以后的字符是否已经被定义,如果没有就继续取随机,也就是说刚好取到四个数字
:S: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>nul
|
|