Goto был неожиданным в это время пакетом для Windows 7 Starter

Этот код разработан, чтобы напоминать более простую версию игрового процесса Pokemon Battle. Я только закодировал атаки. Я тщательно тестировал и обнаружил, что сообщение об ошибке (Goto в то время было неожиданным) всякий раз, когда пользователь подтверждал свою атаку. ПРЕДУПРЕЖДЕНИЕ!! Код состоит из 96 строк. В конце я помещу проблемный раздел, чтобы вы могли пропустить этот первый огромный кусок.

@echo off
Set H1=20
Set A1=8
Set D1=6
Set S1=5
Set H2=14
Set A2=5
Set D2=4
Set S2=8
:Begin
CLS
Echo Bulbasur
Echo %H2%/14      /\       
Echo           (__) ___  
Echo           l __lo.ol 
Echo           l_\ l_\"  
Echo.        
Echo     _ 
Echo *  / \ 
Echo \\l  )
Echo  \\__l   Charmander
Echo             %H1%/20
Echo -Attack -Capture
Echo -Item   -Run 
Set /p Move=Action?
If %move%==Attack goto Attack
If %move%==Catpure goto capture
If %move%==Item goto Item
If %move%==Run Goto Run
Echo I'm sorry, Charmander can't do that. 
Pause
goto Begin
:Attack
ClS
Echo Attacks
Echo 1)Tackle
Echo 2)Growl
Echo 3)Ember
Echo 4)Scratch
Set /p attack=Which one?
If %attack%==Tackle goto Tackle
If %attack%==1 goto Tackle
If %attack%==Growl Goto Growl
If %attack%==2 goto Growl
If %attack%==Ember goto Ember
If %attack%==3 goto Ember
If %attack%==Scratch goto Scratch
If %attack%==4 goto Scratch
If %attack%==Cancel goto Begin
Echo I didn't get that
Goto Attack
:Tackle
CLS
Echo Tackle Hits The opponent where it hurts. EVERYWHERE.
Echo Do you want to?
set /p accept=Yes/No?
If %acccept%==Yes goto Combat
If %acccept%==No goto Begin
Echo I didn't get that.
goto Tackle 
:Growl
CLS
Echo Growl lowers the opponents attack.
Echo Do you want to?
set /p accept=Yes/No?
If %acccept%==Yes goto Status
If %acccept%==No goto Begin
Echo I didn't get that.
goto Growl
:Scratch
CLS
Echo Scratch hits the foe with a claw.
Echo Do you want to?
set /p accept=Yes/No?
If %acccept%==Yes goto Combat
If %acccept%==No goto Begin
Echo I didn't get that.
goto  Scratch
:Ember
CLS
Echo Ember hits the opponent with a small fire.
Echo Do you want to?
set /p accept=Yes/No?
If %acccept%==Yes goto Combat
If %acccept%==No goto Begin
Echo I didn't get that.
goto Ember
:Combat
CLS
If NOT %attack%==Growl If NOT %attack%==2 set /a H2=%H2%-(%A1%^2/%D2%)
set /a H1=%H1%-(%A2%^2/%D1%)
goto Begin
:Status
CLS
Set /a A1=%A1%-1
goto Combat

Проблемная область:

:Tackle
CLS
Echo Tackle Hits The opponent where it hurts. EVERYWHERE.
Echo Do you want to?
set /p accept=Yes/No?
If %acccept%==Yes goto Combat
If %acccept%==No goto Begin
Echo I didn't get that.
goto Tackle 

Код попадает сюда нормально, но как только я здесь, он не ожидает команд goto. Кто-нибудь может исправить эту говядину? (Примечание: Tackle - это просто пример. Ни одна из атак не работает.) РЕДАКТИРОВАТЬ: если пользователь вводит «Да», «Нет», тарабарщину или ничего, он все равно выдает то же сообщение об ошибке (goto в это время был неожиданным )


person user1205760    schedule 19.03.2012    source источник
comment
Мне любопытны голоса против; Автор вопроса разместил код, выделил пример проблемной области и даже выдал сообщение об ошибке. Мне кажется, это хороший вопрос. Это просто пренебрежение пакетными файлами? Это не должно влиять на то, хороший вопрос или нет.   -  person Wesley Petrowski    schedule 19.03.2012
comment
@WesleyPetrowski, вероятно, потому что он опубликовал весь свой сценарий. А потом выложил дополнительную копию проблемного кода. Он должен был опубликовать только проблемный код.   -  person mikerobi    schedule 12.06.2012
comment
If %move%==Catpure goto capture Я знаю, что кошки мурлыкают, но я думаю, что это опечатка ^^   -  person Stephan    schedule 02.02.2014


Ответы (4)


Вы должны заключить это в кавычки:

if "%accept%"=="yes" goto combat
if "%accept%"=="no" goto begin

Или, скорее, если вы не хотите делать его чувствительным к регистру:

if /i "%accept%"=="yes" goto combat
if /i "%accept%"=="no" goto begin
person Answer    schedule 12.06.2012
comment
На самом деле, обязательно, заметьте, но вы, безусловно, можете, и это, вероятно, самый распространенный метод решения проблемы (и тот, который по какой-то причине я не подумал на время). - person Andriy M; 16.12.2013

Ваша проблема в том, что эта строка:

set /p accept=Yes/No?

НЕ использует то же имя переменной, что и эти:

If %acccept%==Yes goto Combat
If %acccept%==No goto Begin

Вышеуказанные переменные имеют «ccc», но первая просто «cc».

ИЗМЕНИТЬ

Привет, user1205760; У меня есть время потратить, поэтому я взял вашу программу и уменьшил ее. Это моя версия:

@echo off

Setlocal EnableDelayedExpansion
Set Actions=Attack Capture Item Run
Set Attacks=Tackle Growl Ember Scratch Cancel
Set i=0
For %%a in (%Attacks%) do set /A i+=1 & set Attack[!i!]=%%a

Set H1=20
Set A1=8
Set D1=6
Set S1=5
Set H2=14
Set A2=5
Set D2=4
Set S2=8

:Begin
:Cancel
CLS
Echo Bulbasur
Echo %H2%/14      /\       
Echo           (__) ___  
Echo           l __lo.ol 
Echo           l_\ l_\"  
Echo.        
Echo     _ 
Echo *  / \ 
Echo \\l  )
Echo  \\__l   Charmander
Echo             %H1%/20
Echo -Attack -Capture
Echo -Item   -Run 
Set /p Move=Action? 
For %%a in (%Actions%) do if /I %move%==%%a goto %move%
Echo I'm sorry, Charmander can't do that. 
Pause
goto Begin

:Attack
Cls
Echo Attacks
For %%a in (1 2 3 4) do echo %%a)!Attack[%%a]!
Set /p attack=Which one? 
for %%a in (1 2 3 4) do if %attack%==%%a set attack=!Attack[%%a]!
for %%a in (%Attacks%) do if /I %attack%==%%a goto %attack%
Echo I didn't get that
Pause
Goto Attack

:Tackle
call :Confirm Tackle Hits The opponent where it hurts. EVERYWHERE.
If %accept%==Yes goto Combat
goto Begin

:Growl
call :Confirm Growl lowers the opponents attack.
If %accept%==Yes goto Status
goto Begin

:Ember
call :Confirm Ember hits the opponent with a small fire.
If %accept%==Yes goto Combat
goto Begin

:Scratch
call :Confirm Scratch hits the foe with a claw.
If %accept%==Yes goto Combat
goto Begin

:Status
Set /A A1-=1
:Combat
If /I NOT %attack%==Growl set /A H2=H2-(A1^2/D2)
set /A H1=H1-(A2^2/D1)
goto Begin

:Confirm 
Cls
Echo %*
Echo Do you want to?
set /p accept=Yes/No? 
For %%a in (Yes No) do if /I %accept%==%%a exit /B
Echo I didn't get that.
Pause
goto Confirm
person Aacini    schedule 19.03.2012

Если пользователь ничего не вводит, ваши If строки, вероятно, оцениваются примерно так:

…
If ==Yes goto Combat
If ==No goto Begin
…

что синтаксически неверно. Я бы предложил инициализировать accept перед командой set /p с некоторым значением по умолчанию:

…
set accept=default
set /p accept=Yes/No?
if …

Таким образом, если пользователь просто нажмет Enter, переменная accept сохранит значение default, и последующий if не приведет к ошибке.

person Andriy M    schedule 19.03.2012
comment
или установите тест перед IF == YES, чтобы специально проверить, является ли% accept% нулем - это может выглядеть как IF.% accept% ==. goto xxxx ... ' - person RobW; 19.03.2012
comment
Вы также можете заключать в кавычки свои элементы для сравнения, чтобы они оценивались как If == Yes. По-прежнему рекомендуется использовать значение по умолчанию, как рекомендует Андрей. - person Aaron Altman; 20.03.2012

Извините,
Это просто вопрос к отрицательным голосам.
Люди, которые спрашивают, просто НЕ УВЕРЕНЫ, должна ли проблема быть в ЭТОЙ ЧАСТИ.

e.g.

set a=
if %a%==1 echo yes

Если я просто опубликую эту строку:

if %a%==1 echo yes

Тогда ВСЕ ЗНАЮТ В ЧЕМ ПРОБЛЕМА?


Помните, что для переменной, такой как% abc%, лучше использовать ее с ", [или {, чтобы предотвратить сообщение об ошибке.


e.g.

set /p abc=

и пользователь ничего не вводит.
Тогда следующая строка должна быть:

if %abc%==1 echo Hi

Но стало:

if ==1 echo Hi

, как "% abc%" == ""
Но с "" он станет

if ""=="1" echo Hi

И "" не равно "1".
Понятно?


РЕДАКТИРОВАТЬ---

Если вы используете Windows 7 (или другие версии), вы также можете попробовать следующее:

choice /c YN /n /m "Confirm? [Y^|N]

^ просто выходит из "трубы" (|).

Надеюсь, это будет вам полезно!

person Jamie    schedule 02.02.2014
comment
Что происходит? Я получил голоса против, и МОЙ КОММЕНТАРИЙ ОТМЕНЕН? - person Jamie; 04.02.2014