Как упростить партию с большим количеством ifs - PullRequest
0 голосов
/ 08 апреля 2019

Есть ли способ упростить этот код и сделать его продолжаемым до сих пор?

set /a food=%random% %% 6 + 1
if %food%==1 (set foodtype=bread)
if %food%==2 (set foodtype=apple)
if %food%==3 (set foodtype=steak)
if %food%==4 (set foodtype=banana)

и т.д.

Я не знаю много партии, но я ожидаю что-то вроде этого:

set /a food=%random% %% 6 + 1
 if food = (1, 2, 3, 4) (set foodtype bread, apple, steak, banana)

Ответы [ 5 ]

3 голосов
/ 08 апреля 2019

В качестве альтернативы вы также можете использовать список:

@echo off
setlocal 
set count=0
set "foodlist=bread apple steak banana"
for %%a in (%list%) do set /a count+=1
set /a tok=%random% %% %count% + 1
for /f "tokens=%tok%" %%a in ("%foodlist%") do set "foodtype=%%~a"
echo/%foodtype%

(Преимущество: вы можете изменять список (удалять или добавлять предметы) «на лету» (например, во время игры) без адаптации кода)

2 голосов
/ 09 апреля 2019

Другой, более короткий подход:

@echo off
setlocal EnableDelayedExpansion
set "foodList=bread apple steak banana "

set /A food=%random% %% 4

set "this=%foodList: =" & (if !food! equ 0 set "foodtype=!this!") & set /A "food-=1" & set "this=%"

echo %foodtype%

В этом решении используется тот же метод саморасширяющегося кода, который показан в ответе LotPing ...

2 голосов
/ 08 апреля 2019

Вы можете использовать псевдо-массивы (так как массивы на самом деле не поддерживаются).

setlocal EnableDelayedExpansion
set "arr_foodtype[0]=bread"
set "arr_foodtype[1]=apple"
set "arr_foodtype[2]=steak"
set "arr_foodtype[3]=banana"

set /a food=%random% %% 4

set "foodtype=!arr_foodtype[%food%]!"
1 голос
/ 08 апреля 2019

Метод, аналогичный ответу Стефана, для преобразования списка в массив, но используя своего рода саморасширяющийся код.

:: Q:\Test\2019\04\08\SO_55575835.cmd
@Echo off&SetLocal EnableDelayedExpansion

Set i=0&Set "foodtypes= bread apple steak banana"
Set "foodtypes=%foodtypes: ="&Set /a i+=1&Set "foodtypes[!i!]=%"

set /a food=%random% %% %i% + 1
set "foodtype=!foodtypes[%food%]!"

set food

Пример вывода:

>  SO_55575835.cmd
food=2
foodtype=apple
foodtypes[1]=bread
foodtypes[2]=apple
foodtypes[3]=steak
foodtypes[4]=banana
0 голосов
/ 09 апреля 2019

Как насчет многострочного строкового подхода (пустые строки в коде обязательны):

@echo off
set /A "FOOD=%RANDOM%%%4+1"
for /F "tokens=1*" %%I in (^"
1 bread^

2 apple^

3 steak^

4 banana^

^") do if %%I equ %FOOD% set "FOODTYPE=%%J"
echo %FOOD%: %FOODTYPE%

Пример вывода:

2: apple

ByКстати, set /a food=%random% %% 6 + 1 присваивает значение от 1 до 6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...