Board logo

标题: [文本处理] [已解决]文曲星上猜字游戏的批处理如何理解? [打印本页]

作者: 290601953    时间: 2011-4-9 19:06     标题: [已解决]文曲星上猜字游戏的批处理如何理解?

  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. set var=A&pause>nul
  15. :begin
  16. set /a a=%random%%%10
  17. for %%a in (%var%) do if %%a equ %a% goto begin
  18. set var=%var% %a%
  19. if "%var:~8%" equ "" goto begin
  20. set var=%var:~2%&set m=0
  21. :again
  22. set /a n=0,v=0,ws=0,s=0,t=10-m
  23. if %t% equ 0 goto end
  24. cls&echo.&echo    请注意你总共只有10次机会,现在还剩下%t%次机会
  25. if "%m%" neq "0" for /l %%i in (1,1,%m%) do echo.&echo !_%%i!
  26. set codes=A
  27. echo.&set /p code=   请在此输入:
  28. echo %code: =%|findstr "[^0-9]"&&goto wrong
  29. for %%a in (%code%) do (
  30.     for %%i in (!codes!) do if %%i equ %%a goto wrong
  31.     set codes=!codes! %%a
  32.     set /a n+=1
  33. )
  34. if %n% neq 4 goto wrong
  35. set codes=%codes:~2%
  36. for %%i in (%codes%) do (
  37.     set str=%%i
  38.     if "!str:~1!" neq "" goto wrong
  39. )
  40. for %%a in (%var%) do (
  41.     set /a v+=1,x=0
  42.     for %%i in (%codes%) do (
  43.         set /a x+=1
  44.         if %%a equ %%i if !x! equ !v! (
  45.            set /a ws+=1,s+=1
  46.            ) else (
  47.            set /a s+=1
  48.         )
  49.     )
  50. )
  51. set /a m+=1
  52. if "%var%" equ "%codes%" goto suc
  53. set _%m%=  %codes%中数值正确的有%s%个,其中位置数值都正确的有%ws%个&goto again
  54. :wrong
  55. cls
  56. echo.&echo     所输入的非合法十进制整数,或数值不合要求,
  57. echo.&echo     或有重复数,或输入的数值个数不是4个。
  58. ping /n 2 127.1>nul&goto again
  59. :suc
  60. if %m% equ 1 cls&echo.&echo   不会吧,1次就搞定了,你是不是神仙下凡啊?&goto select
  61. if %m% leq 3 cls&echo.&echo   你真是聪明绝顶啊,只用%m%次就猜中了。&goto select
  62. if %m% leq 5 cls&echo.&echo   看来你还是很厉害,用了%m%次就猜中了。&goto select
  63. if %m% leq 9 cls&echo.&echo   呵呵,猜了%m%次,勉强过关了。&goto select
  64. if %m% equ 10 cls&echo.&echo   你太精明了,硬是把机会给用完成功过关。
  65. :select
  66. ping /n 3 127.1>nul
  67. cls&echo.&set select=&set /p select=  是否再来一次(是就输入y/Y,其它任意键退出):
  68. if /i "%select%" equ "y" (goto begin) else (goto exit)
  69. :end
  70. cls&echo.&echo   对不起你已经用完了所有的机会了。正确答案是%var%&goto select
  71. :exit
  72. ping /n 3 127.1>nul
复制代码
上面是源代码,
  1. :begin
  2. set /a a=%random%%%10
  3. for %%a in (%var%) do if %%a equ %a% goto begin
  4. set var=%var% %a%
  5. if "%var:~8%" equ "" goto begin
  6. set var=%var:~2%&set m=0
复制代码
这段代码我看不懂、、、
第一行应该是去随机数然后除10取余数,
第二行是不是如果重复了就重新随机取数?
第三行是不是把随机数加进去?
第四行是不是就是说第八个字符以后的字符不是
空就继续随机取?但是如果取了4个随机数,那么var=0 1 2 3那么第八个字符是空啊,难道继续取?
第五行,是不是一共取了5个数字?然后舍弃了第一个数字?
那个取随机能不能set /a RandomNumber=%random%%%9+0,即0到9之间取随机、
作者: hanyeguxing    时间: 2011-4-9 19:44

set var=A&pause>nul
注意,这里定义了var为A
:begin
set /a a=%random%%%10
除10后余数范围为0到9,所以变量a的范围就是0到9
for %%a in (%var%) do if %%a equ %a% goto begin
以空格循环解析变量var,每次与变量a比较,如果相同即重新设置变量a
set var=%var% %a%
将变量a定义为var的一部分,以空格分隔
if "%var:~8%" equ "" goto begin
:begin前已定义了var为a,以后每次均为空格+数字,那么%var:~8%指的就是第9个(最前面的为第1个字符)字符及其后面,也就是除了空格的第5个字符,如果把第一个字符A排除那么就是第4个数字。也就是说如果没有定义第4个数字就跳回
set var=%var:~2%&set m=0
用来排除var的第1个字符A和第2个字符空格的
ps:那个取随机能不能set /a RandomNumber=%random%%%9+0,即0到9之间取随机?
好好想想数学知识,就知道错在哪了
作者: 290601953    时间: 2011-4-9 20:04

2# hanyeguxing

我很好奇set var=A什么用?干嘛一定要定义?是不是这样里面就有一个A了?也就是说取到第一个随机数了var=A 1?
set /a a=%random%%%10
除10后余数范围为0到9,所以变量a的范围就是0到9
可是这样每个数字取到的概率就不一样了吧?有没有什么方法能够概率一样?
通用的公式%random%%%(max-min 1) min来产生[min,max]区间里的随机数
这是我百度的、那个你让我想的我还真不知道、是不是边界错了?但是我找不到random的详细用法。。。所以不清楚、
后面的是不是就是说var=A 1 2 3 4这样第九个字符是4也就说定义了,然后就结束?
这样的我就懂了,后面的就是var=1 2 3 4了、对吧?
谢谢斑竹!
作者: hanyeguxing    时间: 2011-4-9 20:44

本帖最后由 hanyeguxing 于 2011-4-9 21:55 编辑

1,0到9这10个数字比较特殊,可以直接用%random:~-1%获取
2,可以这样写:
  1. @echo off
  2. :a
  3. set a=%random:~-1%
  4. for %%a in (%var%) do if "%%a"=="%a%" goto a
  5. set var=%var% %a%
  6. if "%var:~7%"=="" goto a
  7. echo %var%&pause
复制代码
ps:
数学题:余数范围是0到9,那么除数是多少?
作者: batman    时间: 2011-4-9 21:12

呵呵,我n年前的作品,现在来看,很幼稚。。。。
作者: hanyeguxing    时间: 2011-4-9 21:55

5# batman


n年前俺还不知道有“批处理”这东西。。。
作者: wc726842270    时间: 2011-4-9 23:41

大老果然劣害,想想我知到CMD这个东西都不到一年,真是可悲啊,以前浪费了太多的时间。呵呵
作者: semiuel    时间: 2011-4-10 01:11

我从95年开始接触批处理,98年的时候才知道批处理的作用.
但到现在都没能玩转批处理,惭愧啊~
作者: 290601953    时间: 2011-4-10 01:14

4# hanyeguxing


额,谢谢
余数0~9除数是10啊、、、
作者: 290601953    时间: 2011-4-10 01:19

本帖最后由 290601953 于 2011-4-10 01:52 编辑

4# hanyeguxing
  1. ping /n 2 127.1>nul
复制代码
顺便再问下上面这个代码百度说是延时的、延时5秒,也就是说ping一次需要2.5秒?能不能解释为什么?
  1. mode con cols=55 lines=30
复制代码
这个代码里面的cols和lines的数值怎么确定?慢慢调试?
  1. if "%m%" neq "0" for /l %%i in (1,1,%m%) do echo.&echo !_%%i!
复制代码
这段代码我看不懂、前面好像说是m不等于0的时候,后面好像是计数循环,输出空格和后面的是什么?看不懂、、
  1. echo %code: =%|findstr "[^0-9]"&&goto wrong
复制代码
例17
findstr "[^0-9]" 123.txt
如果是纯数字的行便过滤掉,例如2323423423 这样的字符串被过滤,345hh888这样的形式则过滤不了。
注意,纯数字的行不能有空格,不论行首行尾或者是行中都不能有空格,否则过滤失败!
如果这么理解的话,我就不会翻译什么意思了、、、
我是新手菜鸟真的不会、、百度也找不到答案,所以希望不要嫌我麻烦!
作者: Batcher    时间: 2011-4-10 12:26

10# 290601953


批处理中延时的方法
http://bbs.bathome.net/viewthread.php?tid=3693#pid23312
http://bbs.bathome.net/thread-233-1-1.html
作者: 290601953    时间: 2011-4-10 23:40

11# Batcher
额、、、能不能顺便解决下其他问题、、谢谢!
作者: batman    时间: 2011-4-11 09:33

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。
作者: batman    时间: 2011-4-11 11:10

再稍稍修改下源代码:
  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
复制代码

作者: 290601953    时间: 2011-4-11 21:51

  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. set var=A&pause>nul
  15. :begin
  16. set /a a=%random%%%10
  17. ::如果说a随机取得分别是1 2 3 4。var=A 1 2 3 4
  18. for %%a in (%var%) do if %%a equ %a% goto begin
  19. ::分别判断a随机取到的数字有没有和var里面一样的,一样的话就重新回到begin随机取。
  20. set var=%var% %a%
  21. ::var=A 1 2 3 4
  22. if "%var:~8%" equ "" goto begin
  23. ::这个是判断var里面第八个以后的字符是否已经被定义,如果没有就继续取随机,也就是说刚好取到四个数字
  24. ::PS:set var=A我很怀疑这句话有什么用?不定义不行吗?
  25. set var=%var:~2%&set m=0
  26. ::这个是取var第三位开始的字串即var=1 2 3 4。
  27. :again
  28. set /a n=0,v=0,ws=0,s=0,t=10-m
  29. if %t% equ 0 goto end
  30. ::当猜了10次没有猜出来判断失败了
  31. cls&echo.&echo    请注意你总共只有10次机会,现在还剩下%t%次机会
  32. if "%m%" neq "0" for /l %%i in (1,1,%m%) do echo.&echo !_%%i!
  33. ::!_%%i!这个和下面的问题一样,为什么前面加个下划线?这样是::不是还等于%%i?对于你之前的解释我还是看不懂,能不能稍微用::例子解释一下?set codes=A
  34. ::还是上面那个问题,为什么要定义?
  35. echo.&set /p code=   请在此输入:
  36. ::假设输入的是1 5 8 3
  37. echo %code: =%|findstr "[^0-9]"&&goto wrong
  38. ::%成对出现做变量引用处理,但是我不知道这个变量是什么?我看了
  39. ::下输出结果,是不是就是直接输出刚才输入的1 5 8 3?
  40. ::findstr "[^0-9]"是不是就是说过如果输入的是1 5 j l那么就是过
  41. ::不了,然后就输出错误?我想知道空格在哪里被替换了??
  42. for %%a in (%code%) do (
  43.     for %%i in (!codes!) do if %%i equ %%a goto wrong
  44.     ::这个!codes!也是对变量codes的引用吧?但是为什么不也用%?
  45.     ::后半句什么意思?判断是否输入的数字重复,比如1 1 2 3?
  46.     set codes=!codes! %%a
  47.     ::codes=A 1 5 8 3
  48.     set /a n+=1
  49. )
  50. if %n% neq 4 goto wrong
  51. ::这里限制输入的数字必须要四个。
  52. set codes=%codes:~2%
  53. ::codes=1 5 8 3
  54. for %%i in (%codes%) do (
  55.     set str=%%i
  56.    ::这里是str=1583?
  57.     if "!str:~1!" neq "" goto wrong
  58.    ::这里是说第二位开始如果没定义就错了?什么意思?
  59.    ::这一步有什么用?
  60. )
  61. for %%a in (%var%) do (
  62.     set /a v+=1,x=0
  63.     for %%i in (%codes%) do (
  64.         set /a x+=1   
  65.         if %%a equ %%i if !x! equ !v! (
  66.            set /a ws+=1,s+=1
  67.            ) else (
  68.            set /a s+=1
  69.         )
  70.     )
  71. )
  72. ::上面这一段是不是说循环从var里面取一个字符判断和codes里面的
  73. ::每一个数字比较,看下位置和数字是否一样,一样的话就相应参数::+1?
  74. set /a m+=1
  75. ::一次判断完成了就循环次数+1,然后继续用户输入循环判断。
  76. if "%var%" equ "%codes%" goto suc
  77. ::如果完全符合就跳到成功.
  78. set _%m%=  %codes%中数值正确的有%s%个,其中位置数值都正确的有%ws%个&goto again
  79. :: _%m%=  %codes%这个怎么理解?数值应该是输入的1 5 8 3,那个 _%m%是变量吗?为什么前面加个下划线?
  80. :wrong
  81. cls
  82. echo.&echo     所输入的非合法十进制整数,或数值不合要求,
  83. echo.&echo     或有重复数,或输入的数值个数不是4个。
  84. ping /n 2 127.1>nul&goto again
  85. :suc
  86. if %m% equ 1 cls&echo.&echo   不会吧,1次就搞定了,你是不是神仙下凡啊?&goto select
  87. if %m% leq 3 cls&echo.&echo   你真是聪明绝顶啊,只用%m%次就猜中了。&goto select
  88. if %m% leq 5 cls&echo.&echo   看来你还是很厉害,用了%m%次就猜中了。&goto select
  89. if %m% leq 9 cls&echo.&echo   呵呵,猜了%m%次,勉强过关了。&goto select
  90. if %m% equ 10 cls&echo.&echo   你太精明了,硬是把机会给用完成功过关。
  91. :select
  92. ping /n 3 127.1>nul
  93. cls&echo.&set select=&set /p select=  是否再来一次(是就输入y/Y,其它任意键退出):
  94. if /i "%select%" equ "y" (goto begin) else (goto exit)
  95. :end
  96. cls&echo.&echo   对不起你已经用完了所有的机会了。正确答案是%var%&goto select
  97. :exit
  98. ping /n 3 127.1>nul
复制代码
13# batman
作者: 290601953    时间: 2011-4-11 21:57

本帖最后由 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

作者: batman    时间: 2011-4-12 13:44

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楼就给出了改进后的代码。
作者: 290601953    时间: 2011-4-12 17:47

17# batman


好!谢谢拉,真的很感谢,其实一开始在这边发帖我整的没想到会有人帮我回答问题,而且这么有耐心,我看过您给的代码,主要是因为我运行的时候出错了,不知道怎么输入,还有就是对于源代码很多不动,所以就准备先看东源代码,然后再好好研究你的,再次真心的感谢你!
作者: caruko    时间: 2011-4-13 00:15

话说,我高三的时候发现文曲星上有QBASIC,于是就用它写游戏玩。
记得写了一个“坦克大战”,就是简单的抛物线计算,然后让电脑根据玩家的距离,确定随机范围,随机移动、随机角度、随机力度。
后面写五子棋IQ的时候写了3000行也没有结果。
作者: terse    时间: 2011-4-13 02:20

这里源意是否这样?echo %code =%|findstr "[^0-9]"||goto wrong
作者: 290601953    时间: 2011-4-14 11:13

20# terse


不是的,他本来就是这个意思的,应该就是检查到输入数据里面不是全部都死数字的话就报错,跳到wrong
作者: 狱渊    时间: 2013-4-20 13:09

回复 1# 290601953


    你们都好强啊
作者: zx_rain    时间: 2013-4-23 16:16

新手表示亚历山大




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2