0

我正在为我的办公室创建一个打字游戏,供任何想尝试提高他们的数字键盘打字技能的人使用。如果输入正确或不正确,我的代码保持得分,并且在 stackoverflow 社区(伟大的 Compo)的帮助下,我的代码得到了改进。现在我正在尝试为用户添加难度选项。但我似乎在将批次参考回输入的难度并遵循正确的难度选项时遇到问题。我知道我可以使用 IF 和 ELSE,但我仍然习惯了批处理的工作方式。

增加难度前的代码版本 1

@ECHO OFF

SET/A "correct=incorrect=0"

:START
CLS
COLOR 07
SET "num=%RANDOM%"
ECHO.
ECHO SCORE - CORRECT %correct%, INCORRECT %incorrect%
ECHO.
ECHO %num%
ECHO.
SET /P "INP= "
ECHO.
IF "%INP%"=="%num%" (
    COLOR 27
    ECHO CORRECT
    SET/A "correct+=1"
    PING -n 2 0.0.0.0 1>NUL
) ELSE (
    COLOR 47
    ECHO INCORRECT
    SET/A "incorrect+=1"
    PING -n 2 0.0.0.0 1>NUL
)
GOTO START

有难度选项的代码版本 1

@ECHO OFF

SET/A "correct=incorrect=0"

:STARTDIFF
ECHO DIFFICULTY?
ECHO.
ECHO EASY
ECHO HARD
ECHO.
SET /P "DIFF= "
IF "%DIFF%" EQU EASY GOTO STARTEASY
IF "%DIFF%" EQU HARD GOTO STARTHARD
::IF "%DIFF%" NEQ EASY GOTO STARTDIFF

: STARTEASY
CLS
COLOR 07
SET "num=%RANDOM%"
GOTO TEST

: STARTHARD
CLS
COLOR 07
SET "num=%RANDOM%%RANDOM%"
GOTO TEST

: TEST
ECHO.
ECHO SCORE - CORRECT %correct%, INCORRECT %incorrect%
ECHO.
ECHO %num%
ECHO.
SET /P "INP= "
ECHO.
IF "%INP%"=="%num%" (
    COLOR 27
    ECHO CORRECT
    SET/A "correct+=1"
    PING -n 2 0.0.0.0 1>NUL
) ELSE (
    COLOR 47
    ECHO INCORRECT
    SET/A "incorrect+=1"
    PING -n 2 0.0.0.0 1>NUL
)

ECHO %DIFF%>NUL
IF "%DIFF%" EQU EASY GOTO STARTEASY
IF "%DIFF%" EQU HARD GOTO STARTHARD
::IF "%DIFF%" NEQ EASY GOTO STARTDIFF

::GOTO START

如何告诉代码从一开始就参考设定的难度并继续使用该难度?

抱歉,我希望我使用正确的术语来更好地解释我正在尝试做的事情。

4

3 回答 3

0

尝试运行此代码,稍作修改。

@echo off

SET/A "correct=incorrect=0"

:STARTDIFF
ECHO DIFFICULTY?
ECHO.
ECHO EASY
ECHO HARD
ECHO.
SET /P "DIFF= "
IF "%DIFF%" EQU EASY GOTO STARTEASY
IF "%DIFF%" EQU HARD GOTO STARTHARD
::IF "%DIFF%" NEQ EASY GOTO STARTDIFF

:STARTEASY
SET X="EASY"
CLS
COLOR 07
SET "num=%RANDOM%"
GOTO TEST

:STARTHARD
SET X="HARD"
CLS
COLOR 07
SET "num=%RANDOM%%RANDOM%"


:TEST
ECHO.
ECHO SCORE - CORRECT %correct%, INCORRECT %incorrect%
ECHO.
ECHO %num%
ECHO.
SET /P "INP= "
ECHO.
IF "%INP%"=="%num%" (
    COLOR 27
    ECHO CORRECT
    SET/A "correct+=1"
    PING -n 2 0.0.0.0 1>NUL
) ELSE (
    COLOR 47
    ECHO INCORRECT
    SET/A "incorrect+=1"
    PING -n 2 0.0.0.0 1>NUL
)
IF %X%=="EASY" GOTO STARTEASY
IF  %X%=="HARD" GOTO STARTHARD
pause
于 2017-04-27T08:56:52.073 回答
0

if是非常字面的,两个参数必须完全相同才能被声明为相等。

因此,例如

IF "%DIFF%" EQU EASY GOTO STARTEASY

应该

IF "%DIFF%" EQU "EASY" GOTO STARTEASY

或更好,

IF /I "%DIFF%" EQU "EASY" GOTO STARTEASY

这使得比较不区分大小写。

但是请注意,由于您将带引号的字符串分配给变量x,因此该比较是正确的。

也许您应该了解子程序。

:STARTEASY
CLS
COLOR 07
SET "num=%RANDOM%"
call :TEST
goto starteasy

然后删除if例程中的最后 2 个语句,:test并在pause后面加上一行(毫无疑问,这是临时的调试)goto :eof。这会导致例程返回到call.

实际上,这goto :eof并不是严格要求的,只是一种好的做法,这样如果你添加更多的例程,你就不会从一个到下一个流程。

请注意,冒号很重要。在此批处理文件call :somelabel中的标签处执行例程。(没有冒号)执行一个名为.somelabelcall somelabelsomelabel

:in:eof也很重要 - 可以理解为“cmd文件结尾”

于 2017-04-27T09:22:12.347 回答
0

我不确定您为什么决定将结构完全改回一系列 GOTO:

试试这个:

@ECHO OFF

ECHO DIFFICULTY?
ECHO.
ECHO 1. EASY
ECHO 2. HARD
ECHO.
CHOICE /C 12
SET "LEVEL=%ERRORLEVEL%"
SET/A "correct=incorrect=0"

:START
CLS
COLOR 07
IF "%LEVEL%"=="2" (Set "num=%RANDOM%%RANDOM%") ELSE SET "num=%RANDOM%" 
ECHO.
ECHO SCORE - CORRECT %correct%, INCORRECT %incorrect%
ECHO.
ECHO %num%
ECHO.
SET/P "INP= "
ECHO.
IF "%INP%"=="%num%" (
    COLOR 27
    ECHO CORRECT
    SET/A "correct+=1"
    TIMEOUT 1 1>NUL
) ELSE (
    COLOR 47
    ECHO INCORRECT
    SET/A "incorrect+=1"
    TIMEOUT 1 1>NUL
)
GOTO START
于 2017-04-27T11:36:20.480 回答