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

时间:2013-04-11 07:17:05

标签: variables if-statement batch-file

这是我正在制作的游戏代码的一部分。

: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和%posY%== 3我试图让程序读取IF语句:

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

但我尝试过的任何东西似乎都没有用。我想知道是否有人能告诉我一个合适的方法。

3 个答案:

答案 0 :(得分:2)

@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.)

这可能是最简单的。

请注意,CALLed是什么 set destsq=
%% - %逃脱了%的特殊含义 p
%posx% - 评估为1
%posy% - 评估为3
%% - %逃脱了%

的特殊含义

所以结果是     设置destq =%p13%

请注意,set/a允许您在没有%的情况下执行操作,并允许表单set /a var+=something将%some%添加到var。

当然,     set / a var + = something     set / a var + =%something%     set / a var = var + something     set / a var =%var%+ something     set / a var =%var%+%something%     set / a var = var +%something%

所有人都做同样的事情。您选择使用哪种风格......

set /?

来自docco的提示。

答案 1 :(得分:2)

如果您正在批量编写游戏,那么程序的速度非常重要。

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

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

  • 我强烈建议您使用方括号中包含下标的标准数组符号;这种形式更清晰。有关这一点的进一步说明,您可以阅读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

答案 2 :(得分:1)

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

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

..输出是:

"#" found.