2012-03-19 3 views
7

Questo codice è stato progettato per assomigliare ad una versione più semplice del gioco di battaglia Pokemon. Ho solo codificato negli attacchi. Ho provato a fondo e ho trovato un messaggio di errore (Goto era inatteso in questo momento) ogni volta che l'utente ha confermato il suo attacco. AVVERTIMENTO!! Il codice è lungo 96 righe. Alla fine, inserirò la sezione del problema, quindi puoi saltare questo primo enorme pezzo.Goto era inatteso in questo momento batch 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 

Problema Area:

: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 

Il codice arriva qui bene, ma una volta che sono qui, non si aspetta i comandi Goto. Chiunque può aggiustare questa carne? (Nota: Tackle è solo un esempio. Nessuno degli attacchi funziona.) EDIT: Se l'utente inserisce "Sì", "No", senza senso o nulla, continua a inviare lo stesso messaggio di errore (goto era inaspettato in questo momento)

+7

Sono curioso dei downvotes; asker ha pubblicato il codice, ha individuato un'area di problemi di esempio e ha persino fornito il messaggio di errore. Sembra una buona domanda per me. E 'solo disdegno per i file batch? Ciò non dovrebbe influire sul fatto che la domanda sia buona o meno. –

+0

@WesleyPetrowski, probabilmente perché ha pubblicato il suo intero script. E poi ha pubblicato una copia aggiuntiva del codice problematico. Avrebbe dovuto solo pubblicare il codice che era problematico. – mikerobi

+0

'Se% move% == Catpure goto capture' So che i gatti purre, ma penso che questo sia un typo ^^ – Stephan

risposta

2

Se l'utente immette nulla, i tuoi If linee probabilmente restituiscono qualcosa di simile:

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

che è sintatticamente corretto. Vorrei suggerire inizializzazione accept prima del comando set /p con un certo valore di default:

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

questo modo, se l'utente preme basta inserire la variabile accept manterrà il valore di default, e la successiva if non finirà nel errore.

+1

o impostare un test prima dell'IF == YES per testare in modo specifico se% accept% è null - potrebbe sembrare come 'IF.% accept% ==. goto xxxx ... ' – RobW

+0

Puoi anche usare le virgolette intorno ai tuoi oggetti per confrontare, quindi valutano su "" == "Sì". È comunque consigliabile utilizzare il valore predefinito come consigliato da Andriy. –

3

Il tuo problema è che questa linea:

set /p accept=Yes/No? 

non utilizzare lo stesso nome di variabile che questi:

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

Sopra variabili hanno "CCC", ma il primo solo "cc "

EDIT

Ciao, uso r1205760; Ho un po 'di tempo da dedicare, quindi prendo il tuo programma e lo riduco leggermente. Questa è la mia versione:

@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

Ciò potrebbe far male. Bella presa. –

6

Devi mettere tra virgolette:

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

O meglio, se non volete rendere maiuscole e minuscole:

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

Non proprio * devo *, intendiamoci, ma certamente lo potete, e questo è probabilmente il metodo più diffuso per risolvere il problema (e uno, anche, per qualche ragione a cui non pensavo all'epoca). –

-1

Scusi,
Questa è solo una domanda per i downvotes.
Le persone che chiedono solo NON È SICURO devono essere il problema in QUESTA PARTE.

ad es.

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

Se ho appena inserisco questa linea:

if %a%==1 echo yes 

poi sarà sapere a tutti qual è il problema?


Ricorda per la variabile, come% abc%, è meglio usarlo con", [o {in modo da evitare che il messaggio di errore.


esempio

set /p abc= 

e l'utente non inserisce nulla
Quindi la riga successiva deve essere:

if %abc%==1 echo Hi 

Ma è diventato:

if ==1 echo Hi 

, come "% abc%" == ""
Ma con "", diventerà

if ""=="1" echo Hi 

E "" diverso da "1" .
Comprendere?


EDIT ---

Se si utilizza Windows 7 (o altre versioni), si può anche provare questo:

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

Il ^ è solo sfuggire alla "pipe" (|).

Spero che questo ti sia utile!

+0

Cosa sta succedendo? Ho avuto downvotes e il mio commento è stato cancellato? – Jamie