-2

我最近看了一个 VSauce 2 视频,其中包含一个你总能赢的游戏,我制作了一个程序,玩家可以在其中与计算机玩游戏。问题是当轮到用户时,当你输入一个数字(或任何东西)时,程序就会关闭。我和一个也编程的朋友试图解决这个问题,但没有任何效果。觉得你能帮上忙?

这是不断搞砸的代码块:

:usr
cls
echo.
echo SUM: %tot%
echo.
echo LAST ENTRY:
echo COMPUTER: %com%
echo YOU: %usr%
echo.
echo.
set/p usr=ENTER A NUMBER BETWEEN 1 AND 10: 
if "%usr%" => "11" (
goto usr
)
if "%usr%" =< "0" (
    goto usr
)
set/a tot=%tot%+%usr%
if "%tot%" == "100" (
    goto win
)
if "%tot%" => "101" (
    goto lose
) else (
    goto com
)

每个 GOTO 都去到其他存在的地方

4

1 回答 1

0

1.usr作为标签和变量的名称

使用usras label 和 as name of an environment variable 不是一个好主意,因为它使搜索 label 或 variable 变得困难usr


2. 无效的论据=><=

=>并且不是命令IF<=的有效比较运算符。打开命令提示符窗口并运行此命令列表的帮助以及所有受支持的运算符。if /?

任何内部命令cmd.exe都可以在带有参数的命令提示符窗口中执行,/?以显示该命令的帮助。大多数外部命令(即目录%SystemRoot%\System32输出中的控制台应用程序)也有助于将它们/?作为参数运行。


3. 整数与字符串比较

GEQ(大于或等于)这样的运算符主要用于有符号的 32 位整数比较。通过将用于比较的两个参数括在双引号中,Windows 命令处理器无法再将双引号字符串转换为整数,因此字符串比较由IF执行。

字符串"2"大于字符串"11"。两个比较字符串的第一个字符是"十进制代码值 34,这在两个字符串上是相等的。第二个字符是2左字符串的十进制码值 50,大于1右字符串的十进制码值 49,因此字符串"2"大于字符串"11"

有关字符串与整数比较的更多详细信息,请阅读Windows 批处理文件中与 NEQ、LSS、GTR 等等效的符号的答案


4.正确的命令语法

命令行set/p usr=ENTER A NUMBER BETWEEN 1 AND 10: 不好,因为cmd.exe必须在命令行上应用自动更正才能执行。

更好的是:

set /P "usr=ENTER A NUMBER BETWEEN 1 AND 10: "

参数 0 是命令set

空格用于将命令与其第一个参数选项分开/P

多一个空格用于分隔第二个参数,该参数variable=prompt text用双引号括起来,因为它包含一个或多个空格。在这种特殊情况下,不需要将参数字符串括在双引号中,因为命令SET具有其他命令和应用程序所没有的特殊参数字符串解析,但是在此将第二个参数括在双引号中会更好表单以查看尾随空格并且永远不会自动删除它,例如通过在文件保存时修剪尾随空格的文本编辑器。

也可能是因为对使用 optionusr="ENTER A NUMBER BETWEEN 1 AND 10: "的命令进行了另一种特殊解析。但是前一种语法更好,因为它可以用于 的每种用法,而不仅仅是用于提示用户输入字符串。set/Pset

有关更多详细信息,请阅读为什么在命令行上使用 'set var = text' 后没有带有 'echo %var%' 的字符串输出?


5.set /Pchoice

在使用set /P提示用户输入字符串时,用户可以自由地不输入任何内容或输入用户要求的内容或输入完全不同的内容,这会给进一步处理用户输入字符串带来很多麻烦。

有关更多详细信息,请参阅如何阻止 Windows 命令解释器在用户输入不正确时退出批处理文件执行?

在这种情况下,故障安全代码需要这样的代码:

@echo off

:GetValue
set "UserValue="
set /P "UserValue=Enter a number between 1 and 10: "

rem Has the user not entered any string?
if not defined UserValue goto GetValue

rem Remove all double quotes from entered string.
set "UserValue=%UserValue:"=%"

rem Is there no string left anymore?
if not defined UserValue goto GetValue

rem Does the string contain any other character than a digit?
for /F delims^=0123456789^ eol^= %%I in ("%UserValue%") do goto GetValue

rem Remove all leading zeros because of an integer with a leading 0
rem is interpreted on IF comparsion below as an octal number and 08
rem and 09 would be interpreted as 0 because of invalid octal numbers.
:RemoveLeadingZeros
if "%UserValue:~0,1%" == "0" (
    set "UserValue=%UserValue:~1%"
    if not defined UserValue goto GetValue
    goto RemoveLeadingZeros
)

rem More than two digits are not allowed for a number in range 1 to 10.
rem This check must be done because of the user could enter also the
rem string 12345678901234567890 which is greater maximum positive 32-bit
rem integer value 2147483647 supported on conversion from string to integer.
if not "%UserValue:~2,1%" == "" goto GetValue

rem A value greater 10 is not allowed as also value 0 detected already
rem on removing leading zeros because of TempValue not defined anymore.
if %UserValue% GTR 10 goto GetValue

echo You entered the value %UserValue%.
pause

有很多代码可以确保用户确实输入了一个字符串,该字符串是一个 1 到 10 范围内的数字。

更好的代码将利用在命令提示符窗口中运行的帮助输出中解释的外部命令CHOICE :choice /?

@echo off
%SystemRoot%\System32\choice.exe /C 1234567890 /N /M "Enter 1 to 0 (=10): "
set "UserValue=%ERRORLEVEL%"
echo You entered the value %UserValue%.
pause

这要容易得多,用户甚至不会因为CHOICE excepts only 1, 2, ...0Ctrl+C退出批处理文件执行而出现输入错误。

也可能是:

%SystemRoot%\System32\choice.exe /C 0123456789 /N /M "Enter 0 to 9: "

结果与以前相同,因为0导致CHOICE退出 with exit code19with exit code 10


6.echo.可能无法输出空行

DosTips 论坛主题ECHO。FAILS to give text or blank line - 改为使用 ECHO/解释何时echo.无法输出空行。最好使用echo/echo(输出一个空行。

在这种特殊情况下,不遵循第 4 点所写的规则,因为命令ECHO的非常特殊的参数字符串解析忽略了仅由空格/制表符组成的参数字符串并打印状态offon在没有非空白参数字符串的情况下调用它。


7.故障安全重写批处理代码

这是重写的批处理代码是故障安全的。

@echo off
:UserInput
cls
echo/
echo SUM: %tot%
echo/
echo LAST ENTRY:
echo COMPUTER: %com%
echo YOU: %usr%
echo/
echo/
%SystemRoot%\System32\choice.exe /C 0123456789 /N /M "Enter 0 to 9: "
set /A tot+=%ERRORLEVEL%
if %tot% EQU 100 goto win
if %tot% GTR 100 goto lose
echo Reached code for "com".
goto :EOF

:win
echo Reached code for "win".
goto :EOF

:lose
echo Reached code for "lose".

即使未定义set /A tot+=%ERRORLEVEL%环境变量,命令行也能正常工作。tot

要了解使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • choice /?
  • cls /?
  • echo /?
  • goto /?
  • if /?
  • set /?
于 2018-10-01T09:45:18.963 回答