蝙蝠的游戏.添加定时器set /p



我制作的是一款。bat游戏,目前在输入命令时代码是

set /p command=

我想知道的是你是否可以有一个输入命令的时间限制。例如,如果你与守卫战斗,而你在5秒内没有发出命令,守卫就会攻击。

这不是迫切需要的东西,我只是想知道更多关于我约束的限制,我想我知道答案(答案是你不能)

谢谢

也可以只批处理。

你可以用start /b创建第二个线程(在同一个窗口)。
如果这个线程使用set /p等待用户输入,主线程不受影响。
这个示例将为userinput等待5秒,如果用户输入文本,则将其移动到一个文件中,以便第一个线程可以访问它。

@echo off
setlocal EnableDelayedExpansion
if "%1" NEQ "" goto %1
del enter.tmp 2>nul >nul
start /b cmd /c %0 :secondThread
:FirstThread
set n=0
echo Enter Text (5 seconds timeout):
:loop
set /a n+=1
ping -n 2 localhost > nul
if !n! LSS 5 (
    if not exist entER.tmp goto :loop
    < Enter.tmp (
        set /p input=
    )
    echo !input!
) ELSE (
    echo Timeout for input
)
exit /b
:secondThread
set /p var=
> enter.tmp echo !var!
exit /b

可以将批处理文件与其他文件混合使用,例如c#。现在几乎所有的windows电脑都安装了。net,这应该不是什么大问题。

在下面的例子中,有一个3秒的延迟,用户可以输入一些输入。如果没有输入,程序继续,但%result%将为空。

/* 2>NUL
@echo off 
REM cls
set WinDirNet=%WinDir%Microsoft.NETFramework
IF EXIST "%WinDirNet%v2.0.50727csc.exe" set csc="%WinDirNet%v2.0.50727csc.exe"
IF EXIST "%WinDirNet%v3.5csc.exe" set csc="%WinDirNet%v3.5csc.exe"
IF EXIST "%WinDirNet%v4.0.30319csc.exe" set csc="%WinDirNet%v4.0.30319csc.exe"
%csc% /nologo /out:"%~0.exe" %0

echo enter some text:
set result=
for /F "tokens=*" %%a in ('"%~0.exe"') do set result=%%a
echo you have entered:%result%


del "%~0.exe"
goto :eof
*/
using System;
using System.Text;
using System.IO;
using System.Threading;
class Program
{
    static void Main (string[] args)
    {
        byte[] buffer=new byte[80];
        using (Stream s = Console.OpenStandardInput ()) {
            ManualResetEvent e=new ManualResetEvent(false);
            s.BeginRead (buffer, 0, buffer.Length, x => e.Set(), null);
            e.WaitOne (3000);
        }
        Console.WriteLine (Encoding.UTF8.GetString (buffer));
    }
}

这样你就可以编写你的批处理文件,并使用c#来完成批处理文件中不可能完成的一切。请注意,这段代码可能有几个改进。

参见如何在Console.ReadLine()中添加超时?对于c#代码的改进。

(嵌入c#代码的源代码)

如果命令有唯一的起始字母,也许您可以考虑使用CHOICE命令?

批处理文件的能力可以在辅助程序的帮助下增加,如果用汇编语言编写,其中一些程序可能非常简单:

@ECHO OFF
(
ECHO A100
ECHO MOV AH,B
ECHO INT 21
ECHO MOV AH,4C
ECHO INT 21
ECHO/
ECHO RCX
ECHO 8
ECHO W
ECHO Q
) | DEBUG CHKKEY.COM

上一个批处理文件创建8字节长的CHKKEY.COM辅助程序,检查是否按下了一个键,如果按下了,返回ERRORLEVEL 255,如果没有返回0。例如:

:waitforkey
echo Waiting for a key to be pressed...
chkkey
if not errorlevel 1 goto waitforkey
echo A key was pressed!

如果你没有DEBUG.COM程序,你可以在网上得到它。这样,等待一个键5秒:

for /F "tokens=3 delims=:." %%a in ("%time%") do set /A second=%%c+5
if %second% geq 60 set /A second-=60
:waitforkey
for /F "tokens=3 delims=:." %%a in ("%time%") do if %%c == %second% goto timeexceeded
chkkey
if not errorlevel 1 goto waitforkey
set /P command=

如果将MOV AH,B指令中的B值更改1,则读取一个键并在ERRORLEVEL中返回其ASCII码;该功能允许读取单个击键并立即处理它。如果该值为8,则屏幕上不显示读取的密钥;这允许处理键盘上的任何键,甚至函数和返回两个值的特殊键:第一个为零(标识特殊键),第二个标识按下的键。例如,F1键返回0和59。

最新更新