0

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

: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"

但是我尝试过的任何方法似乎都不起作用。我想知道是否有人可以告诉我一个正确的方法来做到这一点。

4

3 回答 3

2

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

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

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

  • 我强烈建议您使用将下标括在方括号中的标准数组表示法;这种形式更加清晰。您可以阅读cmd.exe (batch) 脚本中的数组、链表和其他数据结构,以进一步了解这一点。

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

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
于 2013-04-11T16:59:48.500 回答
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将 %something% 添加到 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 的提示中。

于 2013-04-11T07:48:46.013 回答
1

好的,这是一个简单的示例,您可以在其中看到它是如何工作的:

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

..输出是:

"#" found.
于 2013-04-11T07:51:33.077 回答