0

作成中のバッチ ゲームでネストされた変数を取得しようとしています。確率変数を選択してXに変更するようにしたいのですが、すでに選択されている場合は、戻って別の数値を選択する必要があります。

set 1=a
set 2=b
set 3=c
set 4=d
set 5=e

それらは変数でした。ここにコードがあります

setlocal enabledelayedexpansion

:eliminator
set /a eliminate=(%random * 5) / 32767 + 1
if %%eliminate%%==X goto eliminator
echo The letter !!eliminate!! was chosen
timeout 5
set %%eliminate%%=X
goto eliminator 

さて、エコーしようとすると、値の代わりに変数の名前が書き込まれます。また、すでに選択されている変数が再び選択されています。これを修正する方法はありますか?ありがとう。

4

2 に答える 2

2

これを試して:

@echo off&setlocal
set "var1=a"
set "var2=b"
set "var3=c"
set "var4=d"
set "var5=e"
:loop
set /a rd=%random%%%5+1
if defined var%rd% call echo %%var%rd%%%
set "var%rd%="
set "var" >nul 2>&1 && goto:loop

..出力 (異なる場合があります):

d
a
c
b
e
于 2013-06-06T14:15:30.667 に答える
1

投稿されたコードの末尾が欠落しています%-random読む必要があります%random%

1 から 5 までの乱数の式は、必要以上に複雑です。私は使うだろう:

set /a eliminate=%random% %% 5 + 1

「ネストされた変数」を展開するには、必要です!%eliminate%!

しかし、私はあなたのアルゴリズムを完全に書き直します。私はあなたが望むことを次のようにすると思います:

@echo off
setlocal enableDelayedExpansion
set "chars=abcde"
set charCnt=5
:loop
set /a "pos=%random% %% charCnt, pos2=pos+1, charCnt-=1"
set "letter=!chars:~%pos%,1!"
echo The letter %letter% was chosen
set "chars=!chars:~0,%pos%!!chars:~%pos2%!"
if defined chars goto loop

スクリプトは、反復ごとに常に有効な未使用の文字を選択するように最適化されています。

于 2013-06-06T15:53:09.340 に答える