[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
呵呵,我n年前的作品,现在来看,很幼稚。。。。
***共同提高***

TOP

mode con cols=55 lines=30
这个根据自己的需要修改,这没有多解释的。。。

if "%m%" neq "0" for /l %%i in (1,1,%m%) do echo.&echo !_%%i!
这里的_%%i是在代码后面定义的值,具体在这一句:
set _%m%=  %codes%中数值正确的有%s%个,其中位置数值都正确的有%ws%个&goto again
也就是通过变量把每一次的结果储存下来,你猜测了几次就有几次,由于要清屏所以这些信息每次都要重新
递增输出(每一次输出都会多一条信息)。

echo %code: =%|findstr "[^0-9]"&&goto wrong
这个就是发现了code中含有非数字字符(空格已在前面替换)就跳转到wrong。
***共同提高***

TOP

再稍稍修改下源代码:
  1. @echo off&color 1f&mode con cols=55 lines=30
  2. setlocal enabledelayedexpansion
  3. title 猜数字游戏 by zw19750516
  4. echo.&echo.
  5. echo.&echo               ***** 游戏规则 *****
  6. echo.&echo    程序会自动生成一组四个互不相同的0-9内的整数,
  7. echo.&echo    请你根据猜测和判断,每次输入一组四个互不相同
  8. echo.&echo    0-9内的整数,中间请用空格格开,如:1 2 3 4,
  9. echo.&echo    程序会将你每次输入的数组与其生成的数组进行比
  10. echo.&echo    较,并将比较的结果输出屏幕上以帮助你进一步的
  11. echo.&echo    判断,直到你所输入的数组与其生成的数组的数值
  12. echo.&echo    和次序完全相同,或你已用完了所有的猜测机会。
  13. echo.&echo    如果你已经看懂了规则,请按任意键开始本次游戏。
  14. pause>nul
  15. :begin
  16. for /l %%a in (1,1,9) do set "_!random!-%%a=%%a"
  17. for /f "tokens=2 delims==" %%a in ('set _') do set "var=!var! %%a"
  18. set "var=%var:~,8%"&set /a m=0
  19. :again
  20. for /f "delims==" %%a in ('set _') do set "%%a="
  21. set /a n=0,v=0,ws=0,s=0,t=10-m
  22. if %t% equ 0 goto end
  23. cls&echo.&echo    请注意你总共只有10次机会,现在还剩下%t%次机会s
  24. for /l %%i in (1,1,%m%) do echo.&echo !.%%i!
  25. echo.&set "code="&set /p code=   请在此输入:
  26. echo %code =%|findstr "[^0-9]"&&goto wrong
  27. for %%a in (%code%) do (
  28.     if %%a geq 10 goto wrong
  29.     if not defined _%%a (
  30.        set "_%%a=a"&set /a n+=1
  31.        ) else (
  32.        goto wrong
  33.     )
  34. )
  35. if %n% neq 4 goto wrong
  36. for %%a in (%var%) do (
  37.     set /a v+=1,x=0
  38.     for %%b in (%code%) do (
  39.         set /a x+=1
  40.         if %%a equ %%b if !x! equ !v! (
  41.            set /a ws+=1,s+=1
  42.            ) else (
  43.            set /a s+=1
  44.         )
  45.     )
  46. )
  47. set /a m+=1
  48. if %ws% equ 4 goto suc
  49. set .%m%=  %code%中数值正确的有%s%个,其中位置数值都正确的有%ws%个&goto again
  50. :wrong
  51. cls
  52. echo.&echo     所输入的非合法十进制整数,或数值不合要求,
  53. echo.&echo     或有重复数,或输入的数值个数不是4个。
  54. ping /n 2 127.1>nul&goto again
  55. :suc
  56. for %%a in (1-不会吧,1次就搞定了,你是不是神仙下凡啊? 3-你真是聪明绝顶啊,只用^!m^!次就猜中了。 5-看来你还是很厉害,用了^!m^!次就猜中了。 9-呵呵,猜了^!m^!次,勉强过关了。 10-你太精明了,硬是把机会给用完成功过关) do (
  57.     for /f "tokens=1-2 delims=-" %%b in ("%%a") do if %m% leq %%b cls&echo.&echo   %%c&goto select
  58. )
  59. :select
  60. ping /n 3 127.1>nul
  61. cls&echo.&set select=&set /p select=  是否再来一次(是就输入y/Y,其它任意键退出):
  62. if /i "%select%" equ "y" (goto begin) else (goto exit)
  63. :end
  64. cls&echo.&echo   对不起你已经用完了所有的机会了。正确答案是%var%&goto select
  65. :exit
  66. ping /n 3 127.1>nul
复制代码
***共同提高***

TOP

if "%var:~8%" equ "" goto begin
这个是判断var是否达到9个字符,如果没有就继续取随机。

set "var=A"
这个是不一定要定义的,如没定义,后面就是判断var是否达到了8个字符。

if "%m%" neq "0" for /l %%i in (1,1,%m%) do echo.&echo !_%%i!
这个_就是字符等同于a、b、c等字符,之所以要加上_,是因为%%i的值是数值,而单纯用数字做为变量名
显然是不明智的,而这个变量的定义是在后面的_%m%中定义的。

echo %code: =%|findstr "[^0-9]"&&goto wrong
假如code是1 5 8 3,那么实际就是echo 1583|findstr "[^0-9]"&&goto wrong,至于findstr语句我前
面已经解释了。

for %%i in (!codes!) do if %%i equ %%a goto wrong
因为在for循环中codes的值是在变化的,所以要用变量延迟,后面就是判断输入的数值中是否有重复。

set str=%%i
如codes为1 5  8 3,那么str就依次等于1、5、8、3,实际上这个for循环就是看输入的数值是不是有大于
9的(str的第二位是不是为空)。

至于整个代码是有很多值得改进的地方,我在14楼就给出了改进后的代码。
1

评分人数

    • 290601953: 非常感谢您的解答!技术 + 1
***共同提高***

TOP

返回列表