我是批处理文件的新手,这对于对批处理文件有一点了解的人来说似乎是一个愚蠢的问题,但我无法使用我在C ++或其他编程中的方式实现预期的结果。我试图做的是将3个1随机存储到每个2x2阵列的元素中。提前致谢。完整代码如下:
@echo off
setlocal EnableDelayedExpansion
rem ========Creating four 2x2 zero arrays
for /l %%z in (0,1,3) do (
for /l %%y in (0,1,1) do (
for /l %%x in (0,1,1) do (
set map[%%x][%%y][%%z]=0
)
)
)
rem ========Putting three 1s in elements randomly **(How do I shorten this part?)**
set /a count=3
:while0
set /a i=!Random!%%2
set /a j=!Random!%%2
set /a sth=map[!i!][!j!][0]
if !sth! EQU 0 (
set map[!i!][!j!][0]=1
set /a count-=1
)
if not !count! EQU 0 GOTO while0
set /a count=3
:while1
set /a i=!Random!%%2
set /a j=!Random!%%2
set /a sth=map[!i!][!j!][1]
if !sth! EQU 0 (
set map[!i!][!j!][1]=1
set /a count-=1
)
if not !count! EQU 0 GOTO while1
set /a count=3
:while2
set /a i=!Random!%%2
set /a j=!Random!%%2
set /a sth=map[!i!][!j!][2]
if !sth! EQU 0 (
set map[!i!][!j!][2]=1
set /a count-=1
)
if not !count! EQU 0 GOTO while2
set /a count=3
:while3
set /a i=!Random!%%2
set /a j=!Random!%%2
set /a sth=map[!i!][!j!][3]
if !sth! EQU 0 (
set map[!i!][!j!][3]=1
set /a count-=1
)
if not !count! EQU 0 GOTO while3
rem ========Result
echo !map[0][0][0]!!map[1][0][0]!
echo !map[0][1][0]!!map[1][1][0]!
echo.
echo.
echo !map[0][0][1]!!map[1][0][1]!
echo !map[0][1][1]!!map[1][1][1]!
echo.
echo.
echo !map[0][0][2]!!map[1][0][2]!
echo !map[0][1][2]!!map[1][1][2]!
echo.
echo.
echo !map[0][0][3]!!map[1][0][3]!
echo !map[0][1][3]!!map[1][1][3]!
echo.
echo.
pause
答案 0 :(得分:1)
@echo off
setlocal EnableDelayedExpansion
rem ========Creating four 2x2 one arrays
for /l %%z in (0,1,3) do (
for /l %%y in (0,1,1) do (
for /l %%x in (0,1,1) do (
set map[%%x][%%y][%%z]=1
)
)
)
rem ========Putting one 0 in an element randomly
for /l %%z in (0,1,3) do (
set /a i=!Random!%%2
set /a j=!Random!%%2
set map[!i!][!j!][%%z]=0
)
rem ========Result
for /l %%z in (0,1,3) do (
echo !map[0][0][%%z]!!map[1][0][%%z]!
echo !map[0][1][%%z]!!map[1][1][%%z]!
echo/
echo/
)
pause
编辑:新版本,以满足可变数量零的新要求。
@echo off
setlocal EnableDelayedExpansion
rem ========Creating four 2x2 arrays using three 1s and one 0 to populate each
for /l %%z in (0,1,3) do (
set "digits=1110" & set "num=4"
for /l %%y in (0,1,1) do (
for /l %%x in (0,1,1) do (
rem Get a random number between 0 and "num"
set /A ran=!random!%%num, ranP1=ran+1, num-=1
rem Use it to extract a random digit from "digits"
for /F "tokens=1,2" %%i in ("!ran! !ranP1!") do (
set "map[%%x][%%y][%%z]=!digits:~%%i,1!"
set "digits=!digits:~0,%%i!!digits:~%%j!"
)
)
)
)
rem ========Result
for /l %%z in (0,1,3) do (
echo !map[0][0][%%z]!!map[1][0][%%z]!
echo !map[0][1][%%z]!!map[1][1][%%z]!
echo/
echo/
)
pause
答案 1 :(得分:0)
@ECHO OFF
setlocal EnableDelayedExpansion
rem ========Creating four 2x2 zero arrays
:restart
for /l %%z in (0,1,3) do (
for /l %%y in (0,1,1) do (
for /l %%x in (0,1,1) do (
set map[%%x][%%y][%%z]=0
)
)
)
:: loading array randomly with 1s
FOR /L %%c IN (1,1,3) DO (
SET /a x=!random! %% 2, y=!random! %% 2, z=!random! %% 4
for /l %%z in (0,1,3) do (
for /l %%y in (0,1,1) do (
for /l %%x in (0,1,1) do (
IF %%z==!z! IF %%y==!y! IF %%x==!x! (
IF !map[%%x][%%y][%%z]! == 1 GOTO restart
SET /a map[%%x][%%y][%%z]=1
)
)
)
)
)
:: display
FOR /L %%z IN (0,1,3) DO (
FOR /L %%y IN (0,1,1) DO ECHO !map[0][%%y][%%z]!!map[1][%%y][%%z]!
ECHO.
)
GOTO :EOF
中间块设置要插入的1的数量。然后选择三个随机数并分配给x
,y
和z
,并且三个嵌套for/L
命令只需将%%x..%%z
设置为{的每个可能值组合{1}},但为方便起见x..z
。当循环选择正确的组合时,将测试地图上的该点。如果是metaviariable
,请重新开始。如果没有,请将其设置为1
。
显示例程似乎很明显。
答案 2 :(得分:0)
Aacini的代码缩短了一点,(由于标题文字):
@Echo Off
SetLocal EnableDelayedExpansion
Rem ========Creating four 2x2 one arrays
For /L %%A In (0 1 3) Do For /L %%B In (0 1 1) Do For /L %%C In (0 1 1
) Do Set "m[%%C%%B%%A]=1"
Rem ========Putting one 0 in an element randomly
For /L %%A in (0 1 3
) Do Set/A B=!Random!%%2,C=!Random!%%2&Set "m[!B!!C!%%A]=0")
Rem ========Result
For /L %%A In (0 1 3
) Do Echo !m[00%%A]!!m[10%%A]!&Echo !m[01%%A]!!m[11%%A]!&Echo(&Echo(
Pause
请不要接受这个答案,而不是他们的