2012-03-19 6 views
7

Este código está diseñado para parecerse a una versión más simple del juego de batalla de Pokémon. Solo he codificado los ataques. He estado probando a fondo, y encontré que un mensaje de error (Goto era inesperado en este momento) cada vez que el usuario confirmaba su ataque. ¡¡ADVERTENCIA!! El código tiene 96 líneas de longitud. Al final, pondré la sección del problema, para que puedas omitir esta primera gran parte.Goto fue inesperado en este momento por lotes Windows 7 starter

@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 

Área del problema:

: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 

El código obtiene aquí bien, pero una vez que estoy aquí, que no espera que los comandos Goto. ¿Alguien puede arreglar esta carne? (Nota: Tackle es solo un ejemplo. Ninguno de los ataques funciona.) EDITAR: Si el usuario pone "Sí", "No", galimatías o nada, sigue emitiendo el mismo mensaje de error (goto fue inesperado en este momento)

+7

Tengo curiosidad sobre los votos hacia abajo; asker publicó el código, seleccionó un área de problema de ejemplo e incluso dio el mensaje de error. Me parece una buena pregunta. ¿Es solo desdén por los archivos por lotes? Eso no debería afectar si la pregunta es buena o no. –

+0

@WesleyPetrowski, probablemente porque publicó todo el guión. Y luego publicó una copia adicional del código problemático. Solo debería haber publicado el código que fue problemático. – mikerobi

+0

'Si% move% == Catpure goto capture' Sé que los gatos ronronean, pero creo que este es un error tipográfico ^^ – Stephan

Respuesta

2

Si el usuario introduce nada, sus If líneas probablemente se evalúan a algo como esto:

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

que es sintácticamente incorrecta. Yo sugeriría inicialización accept antes del comando set /p con algún valor por defecto:

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

De esta forma, si el usuario simplemente golpea Enter, la variable accept conservará el valor default, y la posterior if no va a terminar en el error.

+1

o establece una prueba antes del IF == YES para probar específicamente si% accept% es nulo - podría parecerse a 'IF.% accept% ==. goto xxxx ... ' – RobW

+0

También puede usar comillas alrededor de sus elementos para comparar, por lo que evalúan si "" == "Sí". Sigue siendo una buena idea usar el valor predeterminado como lo recomienda Andriy. –

3

Su problema es que esta línea:

set /p accept=Yes/No? 

no utiliza el mismo nombre de variable que éstos:

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

Por encima de las variables tienen "CCC", pero el primero sólo "cc "

EDITAR

Hola, el uso r1205760; Tengo tiempo para gastar, así que tomo tu programa y lo hago algo más pequeño. Esta es mi versión:

@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 
+0

Eso podría doler. Buena atrapada. –

6

Tienes que ponerlo entre comillas:

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

O más bien si no quieres para que sea sensible a mayúsculas:

if /i "%accept%"=="yes" goto combat 
if /i "%accept%"=="no" goto begin 
+0

En realidad no * tengo que *, pero puedes hacerlo, y ese es probablemente el método más extendido para resolver el problema (y uno que, por alguna razón, no pensé en ese momento). –

-1

Disculpe,
Esta es solo una pregunta para los votos a favor.
La gente que pregunta simplemente NO ESTÁ SEGURA debe ser el problema en esa parte.

p. Ej.

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

Si tan sólo publicar esta línea:

if %a%==1 echo yes 

entonces todo el mundo sabe cuál es el problema?


Recuerde que para la variable, como% abc%, es mejor usarlo con", [o {a fin de evitar mensaje de error.


por ejemplo

set /p abc= 

y el usuario ingresa nada.
Luego la siguiente línea debe ser:

if %abc%==1 echo Hi 

Pero se convirtió en:

if ==1 echo Hi 

, como "% abc%" == ""
Pero con "", se convertirá en

if ""=="1" echo Hi 

Y "" desigual a "1" .
¿Entiendes?


EDITAR ---

Si se está utilizando Windows 7 (u otras versiones), es posible que también intente esto:

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

El ^ se acaba de escapar de la "tubería" (|).

Espero que esto sea útil para usted!

+0

¿Qué está pasando? Obtuve votos atrasados ​​y ¿SE CANCELÓ MI COMENTARIO? – Jamie

Cuestiones relacionadas