2013-04-11 67 views
0

這是我正在製作的遊戲的代碼的一部分。(批處理)如何使用兩個變量來引用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" 

但沒有什麼我試着似乎上班。我想知道是否有人能給我一個正確的方法來做到這一點。

回答

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

這可能是最簡單的。

注意,所謂是
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

1

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

2

如果您在書面方式批遊戲,那麼你的程序速度很重要。

  • 有三種方法使用一個變量作爲另一個的名稱的一部分:與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