Можете ли вы использовать две переменные для сравнения GEQ в пакете - PullRequest
0 голосов
/ 06 апреля 2020

В данный момент я пытаюсь сделать фанатскую игру про покемонов. Я делаю человека, который продает шары тыкать. Вот код, который я использовал, чтобы сделать это. Но по какой-то причине файл не может выполнить последнюю часть. Кстати, я тоже новичок в кодировании. В какой-то степени, по крайней мере. Также я использую windows Batch.

@echo off
:setvariables
cls
set/a pokeballs=0
set/a pokemondollar=1000
set/a manprice=500

:Pokeball_Sale
cls
echo How many do you want to buy?
set/p pokeballamount=
set/a totalpokeballprice="pokeballamount * manprice"
echo The price = %totalpokeballprice%
pause 
echo Do you want to buy it?
echo Press y for yes
echo Or press n for no
set/p ha=Choose

if %ha% == y goto Payment
if %ha% == n goto Upstairs_House3

:Payment
cls
if "pokemondollar%" GEQ "pokeballprice" set/a pokemondollar-=totalpokeballprice
set/a pokeballs+=pokeballamount
echo You spent %totalpokeballprice% on %pokeballamount%. You now have %pokeballs%.

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

Помимо совета, который вы уже дали в комментариях, я решил опубликовать этот пример, демонстрируя методологию, которая имеет больше смысла.

@Echo Off

:SetVariables
ClS
Set /A PokeBalls=0,PokemonDollar=1000,ManPrice=500

:PokeBall_Sale
ClS
Set /A PokeBallAmount=0,MaxPokeBalls=PokemonDollar/ManPrice
Set /P "PokeBallAmount=How many Poke Balls do you want to buy [Maximum %MaxPokeBalls%]? "
If %PokeBallAmount% Equ 0 GoTo Upstairs_House3
If %PokeBallAmount% Gtr %MaxPokeBalls% (
    Echo You do not have enough funds!
    "%__AppDir__%timeout.exe" 3 /NoBreak>NUL
    GoTo PokeBall_Sale
)
Set /A TotalPokeBallPrice=PokeBallAmount*ManPrice
"%__AppDir__%choice.exe" /M "The cost is %TotalPokeBallPrice%. Do you want to buy it"
If ErrorLevel 2 GoTo Upstairs_House3

:Payment
ClS
If %PokemonDollar% GEq %TotalPokeBallPrice% (
    Echo You spent %TotalPokeBallPrice% on %PokeBallAmount% Poke Balls.
    Set /A PokemonDollar-=TotalPokeBallPrice
    Set /A PokeBalls+=PokeBallAmount
    SetLocal EnableDelayedExpansion
    Echo You now have !PokeBalls! Poke Balls and !PokemonDollar! Pokemon Dollars.
    EndLocal
    "%__AppDir__%timeout.exe" 5 /NoBreak>NUL

)

:Upstairs_House3
ClS
1 голос
/ 06 апреля 2020

Да, две переменные типа Integer действительно могут использоваться в сравнениях, если они расширены. Заключение в кавычки целых чисел для сравнения - это одно из средств защиты от недопустимых переменных, другое - использование отложенного расширения (включено)

Здесь есть отличное объяснение проблем синтаксиса целочисленного сравнения

Приведенный ниже MathCro может использоваться для назначения и изменения переменных, если вам это интересно. В случае попытки оперировать 1-м аргументом с необъявленной переменной, изменение не произойдет.

@Echo Off

%= Establish Macros =%
    setlocal DisableDelayedExpansion
    (set LF=^


    %= Newline =%)
    Set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"

    (Set "Operate=Endlocal ^& Set /A ""%%G%%H=%%I"""

%= 'Tunnels' variable value, Allows Definition of Arithmetic within Macro =%)

    Set @M=for /L %%n in (1 1 2) do if %%n==2 (%\n%
    for /F "tokens=1,2,3 delims=, " %%G in ("!argv!") do (%\n%
    %Operate%%\n%
%=  Display value of variable. Optional. If not syntax is required to constrain expansion =%
    If Not "!%%G!"=="" Echo(%%G: !%%G!%\n%
    ) %\n%
) ELSE setlocal enableDelayedExpansion ^& set argv=, 


%= script main body =%
%=  Facilitate modification of variables within codeblocks. =%
Setlocal EnableDelayedExpansion

REM macro can be used to define as well as modify variables
REM output of macro can be redirected to nul (hidden) like so:
REM (%@M% hp + 50)>nul

    %@M% hp + 50
    (%@M% heal + 40)>nul
    %@M% hp - 30
    %@M% hp + 25
    %@M% hp * 3
    %@M% hp / 2
    %@M% hp + heal
    %@M% heal - 10
    %@M% hp + heal
%=  Demonstrates use of an equation beyond the initial Operator. Spaces and parentheses in equation must be ommited =%
%=  Increments variable by a random amount in the range of 10 to 20 =%
    For /L %%A in (1,1,50) do (%@M% hp + !random!%%10+10)>nul
    Echo(hp: %hp%
    For /L %%A in (1,1,50) do IF Not !hp! LSS !heal! (%@M% hp - !random!%%15+10)

pause >nul
Exit /B
...