如何仅选择可用的选项批处理文件

时间:2013-12-09 01:55:41

标签: batch-file

我发现本教程是在Notepad ++上制作游戏并制作批处理文件以在CMD上运行。那么这就是我到目前为止所做的:

:ChooseWeapon 

cls 

echo "I almost forgot. Here are the weapons I have avaliable, choose one and begin your quest." 

echo. 

set /p weapon=What is your weapon? (Sword, Double-Bladed Axe, Dagger): 

关键是要通过输入你想要的东西来选择你想要使用的武器。现在,问题是我可以输入“ghregff”,它会说这是我的武器。如何制作它以便你必须选择:剑,双刃斧或匕首?

4 个答案:

答案 0 :(得分:1)

您可以将它设为如下所示的选择菜单,如果他们选择的数字不是1 2或3,它会将它们踢回来再次输入选择。

@echo off

:chooseweapon
cls
echo "I almost forgot. Here are the weapons I have avaliable, choose one and begin your quest."
echo.
echo  What is your weapon? (Sword, Double-Bladed Axe, Dagger): 
echo   1 - Sword
echo   2 - Double-Bladed Axe
echo   3 - Dagger
echo.

set /P Weapon="Enter a choice: "
echo --------------------------------------------------------------------
for %%I in (1 2 3) do if #%Weapon%==#%%I goto wp%%I
goto chooseweapon

:wp1
Set weapon=Sword
goto end

:wp2
Set weapon=Double-Bladed Axe
goto end

:wp3
Set weapon=Dagger
goto end

:end
echo %weapon%
pause

答案 1 :(得分:0)

@echo off
set "NumberWeapons=3"

:ChooseWeapon
color 07
cls 
echo."I almost forgot. Here are the weapons I have avaliable, choose one and begin your quest." 
echo.
echo.1 Sword
echo.2 Double-Bladed Axe
echo.3 Dagger
set /p Weapon=What is your weapon? (1-%NumberWeapons%): 
echo.
if %Weapon% lss 1 goto :ChoiceError
IF %Weapon% gtr %NumberWeapons% goto :ChoiceError
GOTO :Start

:ChoiceError
COLOR CF
ECHO.Error! Choose a valid choice.
pause
goto :ChooseWeapon

:Start
echo.Replace this line with the rest of your stuff & pause

答案 2 :(得分:0)

@ECHO OFF
SETLOCAL
SET setprompt=What is your weapon?
CALL :chooselist  Sword, "Double-Bladed Axe", Dagger
ECHO(Choice made was %response%
CALL :chooselist2  Sword, "Double-Bladed Axe", Dagger
ECHO(Choice made was %response%
CALL :choosemenu  Sword, "Double-Bladed Axe", Dagger
ECHO(Choice made was %response%
GOTO :EOF

:chooselist
SET valid=%*
SET "nchoices="
CALL :choose "%setprompt% (%valid:"=%):"
GOTO :eof

:chooselist2
SET valid=%*
SET "nchoices="
FOR %%Z IN (%*) DO ECHO %%~Z
CALL :choose "%setprompt%:"
GOTO :eof

:choosemenu
SET valid=%*
SET /a nchoices=0
FOR %%Z IN (%*) DO SET /a nchoices+=1&CALL ECHO %%nchoices%% : %%~Z
CALL :choose "%setprompt%:"
GOTO :eof

:choose
SET /p "response=%~1 "
IF NOT DEFINED response GOTO choose
IF DEFINED nchoices FOR /l %%Z IN (1,1,%nchoices%) DO IF "%%Z"=="%response%" CALL :setresp %valid%&GOTO :eof
SET /a cmatch=0
CALL :countresp %valid%
IF NOT %cmatch%==1 GOTO choose
GOTO :eof

:setresp
IF %response% neq 1 SET /a response-=1&shift&GOTO setresp
SET response=%~1
GOTO :eof

:countresp
SET $1=%~1
IF NOT DEFINED $1 (
 IF %cmatch%==1 (SET response=%$3%)
 GOTO :eof
)
CALL SET $2=%%$1:*%response%=%%
IF /i "%response%%$2%"=="%$1%" SET /a cmatch+=1&SET "$3=%~1"
shift&GOTO countresp

GOTO :eof

这是一段灵活的代码,可让您以三种方式做出选择:

使用chooselist,参数列表会附加到setprompt,用户可以选择完整输入任何响应,或者只是足以明确定义需求。例如,“s”将定义Sword,但“Double-Bladed Ax”需要“do”而“Dagger”需要“da”,因为“d”是模糊的。

使用chooselist2类似,它只是在单独的行中列出每个选项并要求输入。

最后,choosemenu执行相同操作,但对行进行编号,可以使用数字或明确的起始字符串进行选择。

回复始终位于response

答案 3 :(得分:0)

最简单的方法似乎是通过findstr命令来完成它。

:Choice
set /p weapon=What is your weapon? (Sword, Double-Bladed Axe, Dagger):
echo %weapon%| findstr /r "^Sword$ ^Double-Bladed Axe$ ^Dagger$">nul
if errorlevel 1 (
    echo %weapon% was sadly not an option.
    goto :Choice
)
echo you chose %weapon%.

(你需要^和$。^表示行首,$表示行结束)

OR

如果您想多次使用该系统,可以使用带参数和返回值的findstr

:MakeChoice
set /p answer= : 
echo %answer%| findstr /r "^%~2$ ^%~3$ ^%~4$ ^%~5$ ">nul
if errorlevel 1 (
echo "%answer%" is sadly not a valid choice, choose again.
goto :MakeChoice
)
set %~1=%answer%
goto :eof

你可以这样调用这个函数:

echo choose a weapon(Sword, Axe, Dagger)
call :MakeChoice chosenOption "Sword" "Double-Bladed Axe" "Dagger"
echo you chose %chosenOption%

这适用于1-4个变量,但是如果你想要更多,你总是可以在^%~5 $之后添加^%〜6 $ ^%〜7 $ ....