(批处理)如何使用两个变量来引用IF语句中的另一个变量?

问题描述:

这是我正在制作的游戏的代码的一部分。(批处理)如何使用两个变量来引用IF语句中的另一个变量?

:south 
set "message=You take a step South" 
set /a "posY=%posY%+1" //Moves player down one tile 
if "%p%posX%%posY%%"=="#" set /a "posY=%posY%-1" //checks if the player has hit a wall. If this is the case, bring him back one tile. 
goto renderMap 

假设%POSX%== 1%波西%== 3,我试图让程序读取IF语句为:

if "p13"=="#" set /a "posY=%posY%-1" 

但没有什么我试着似乎上班。我想知道是否有人能给我一个正确的方法来做到这一点。

@ECHO OFF 
SETLOCAL 
SET p13=# 
SET posy=2 
SET posx=1 

SET /a posy=posy+1 
CALL SET destsq=%%p%posx%%posy%%% 
IF "%destsq%"=="#" (
    ECHO hit wall - ouch!&SET /a posy-=1 
) ELSE (ECHO moved south.) 

这可能是最简单的。

注意,所谓是
set destsq=
%% - %逃脱的%
p
%posx%的特殊意义 - 评价为1
%posy% - 评估为3
%% - %逃离的特殊意义的%

所以结果是 集destq =%P13%

注意set/a允许你做业务没有%并且还允许形式set /a var+=something添加%的东西%至变种。

当然, 集/一个变种+ =东西 集/一个变种+ =%东西% 集/一个VAR = VAR +东西 集/一个VAR =%VAR%+东西 集/一个变种=%var%+%%% set/var = var +你选择哪种风格你用...

看到

set /? 

从提示docco。

+0

嗯,看,这更先进的东西我还没有真正得到进入然而 – Covrt 2013-04-11 08:00:33

+0

我只是得到一个“ ELSE(此时出乎意料)“此错误来自 – Covrt 2013-04-11 08:29:22

+0

'ELSE'和'('之间必须有一个空格,并且')ELSE('必须位于同一条物理线路上 – Magoo 2013-04-11 08:48:54

OK,这里是一个简单的例子,在那里你可以看到,它是如何工作:

@echo off&setlocal enabledelayedexpansion 
set "posX=1" 
set "posY=3" 
set "p13=#" 
set "pos=p%posX%%posY%" 
if "!%pos%!"=="#" echo "#" found. 

..输出为:

"#" found. 
+0

这只是读取“!%pos%!” as!p13!而不是%p13%的值 – Covrt 2013-04-11 08:09:45

+0

不,它必须读取扩展的pos变量。没有两个变量'%pos%'和'!pos!',它们都指向'pos'。但它确实读取了'p13'的值。 – Endoro 2013-04-11 08:22:17

如果您在书面方式批游戏,那么你的程序速度很重要。

  • 有三种方法使用一个变量作为另一个的名称的一部分:与CALL命令,使用命令FOR,或使用延迟扩展。 CALL是最慢的和延迟扩展最快的。

  • 总是尝试使用最短的方式来编写任何命令。增加变量的最快方法是set /A var+=1

  • 我强烈建议你使用标准的数组符号包围在广场braquets下标;这种形式更清晰。您可以阅读Arrays, linked lists and other data structures in cmd.exe (batch) script以获得关于这一点的进一步解释。

下面是你相同的代码上面,但包括前面的点:

setlocal EnableDelayedExpansion 
:south 
set "message=You take a step South" 
set /a posY+=1 //Moves player down one tile 
if "!p[%posX%][%posY%]!" == "#" set /a posY-=1 //checks if the player has hit a wall. If this is the case, bring him back one tile. 
goto renderMap