蝙蝠游戏使用set / p添加计时器

时间:2011-10-09 04:54:55

标签: batch-file

我正在进行.bat游戏,目前在输入命令时代码是

set /p command=

我想知道的是,如果你能以某种方式有输入命令的时间限制。例如,如果你是一名后卫,并且你没有在5秒钟内发出命令,那么后卫就会攻击。

这不是一件迫切需要的事情,我只是想了解更多关于我所受到的限制,而且我认为无论如何我都知道这个问题(答案是你不能)

由于

4 个答案:

答案 0 :(得分:3)

可以将批处理文件与其他内容混合,例如c#。因为现在几乎所有的Windows PC都安装了.net,这应该不是一个大问题。

在下面的示例中,有3秒的延迟,用户可以输入一些输入。如果未输入任何内容,程序将继续,但%result%将为空。

/* 2>NUL
@echo off 
REM cls
set WinDirNet=%WinDir%\Microsoft.NET\Framework
IF EXIST "%WinDirNet%\v2.0.50727\csc.exe" set csc="%WinDirNet%\v2.0.50727\csc.exe"
IF EXIST "%WinDirNet%\v3.5\csc.exe" set csc="%WinDirNet%\v3.5\csc.exe"
IF EXIST "%WinDirNet%\v4.0.30319\csc.exe" set csc="%WinDirNet%\v4.0.30319\csc.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#用于批处理文件中不可能的所有内容。请注意,此代码可以进行一些改进。

有关c#代码的改进,请参阅How to add a Timeout to Console.ReadLine()?

(Source of embedded c# code)

答案 1 :(得分:3)

也可以仅批量完成。

您可以使用start /b创建第二个主题(在同一窗口中) 如果此线程等待set /p用户输入,则主线程不受影响 此示例将等待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

答案 2 :(得分:1)

批量文件功能可以借助辅助程序增加,如果用汇编语言编写,可能会非常简单:

@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。

答案 3 :(得分:1)

如果命令有唯一的起始字母,您可以考虑使用CHOICE命令吗? (在Windows 7中再次可用)