2012-03-19 8 views
7

Bu kod, Pokemon savaş oyununun daha basit bir versiyonunu andırmak için tasarlandı. Sadece saldırılarda kodlandım. İyice test ettim ve kullanıcı saldırıyı onayladığında bir hata mesajının (Goto şu anda beklenmedik bir şekilde) bulunduğunu tespit etti. UYARI!! Kod 96 satırdır. Sonunda sorun bölümünü koyacağım, böylece ilk büyük parçayı atlayabilirsiniz.Goto bu seferde beklenmedik durumdaydı Windows 7 başlatıcısı

@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 

Sorunlu Alan:

: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 

kod burada ince alır, ama ben buradayım kez, bu Goto komutları beklemiyor. Bu sığır eti herkes düzeltebilir mi? (Not: Mücadele sadece bir örnektir. Saldırıların hiçbiri işe yaramıyor.) DÜZENLEME: Eğer kullanıcı "Evet", "Hayır", anlamsız ya da hiçbir şey koymazsa, hala aynı hata mesajını verir (bu seferde beklenmedik bir şey oldu))

kullanıcı şey girerse
+7

Downvotes'u merak ediyorum; askere gönderilen kod, örnek bir sorun alanı ekledi ve hatta hata mesajını verdi. Bana iyi bir soru gibi görünüyor. Sadece toplu iş dosyaları için küçümsüyor mu? Bu sorunun iyi olup olmadığını etkilememelidir. –

+0

@WesleyPetrowski, muhtemelen tüm senaryosunu yayınladığı için. Ve sonra sorunlu kodun ek bir kopyasını yayınladı. Sadece sorunlu olan kodu yayınlamalıydı. – mikerobi

+0

'Eğer% move% == Catpure goto capture' Biliyorum, bu kediler purre, ama bence bu bir yazım hatası ^^ – Stephan

cevap

2

, sizin If hatları muhtemelen böyle bir şey değerlendirmek: sözdizimi yanlış

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

. Kullanıcı sadece Enter vurursa

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

Bu şekilde, accept değişken default değerlerini muhafaza edecek ve daha sonraki if sona olmaz: Ben bazı varsayılan değeri ile set /p komutundan önce accept başlatılıyor öneririm hata.

+1

veya IF == YES'den önce bir testi ayarla,% accept% is null ise 'IF.%% accept% == gibi görünebilir. goto xxxx ... ' – RobW

+0

Ayrıca karşılaştırmak için öğelerinizin etrafında alıntılar da kullanabilirsiniz, böylece "" == "Evet" olarak değerlendirirler. Andriy'nin önerdiği gibi varsayılan değeri kullanmak için hala iyi bir fikir. –

3

Sizin sorundur bu hat şu: bunlar o

set /p accept=Yes/No? 

aynı değişken adı kullanmak ETMEZ: değişkenler Üstü

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

"ccc" var, ama ilki sadece "cc "

DÜZENLEME

Merhaba, kullanımı r1205760; Harcayacağım zamanım var, bu yüzden programınızı alıp biraz daha küçük yaptım. Tırnak koymak zorunda

@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

Bu acıtabilir. Güzel yakalayış. –

6

: Bu benim sürümüdür

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

Daha doğrusu bunu harf duyarlı yapmak istemiyorsanız:

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

Gerçekten değil *, düşünün, ama kesinlikle yapabilirsin, ve bu muhtemelen sorunun çözülmesinde en yaygın yöntemdir (ve bir de, o sırada düşünmediğim bir nedenden ötürü). –

-1

,
Afedersiniz Bu sadece aşağı çekilmelerin bir sorudur.
Sadece SORUNSUZDAN SORMAYAN kişiler, sorunun PARÇALARDA olması gerekir.

örn.

if %a%==1 echo yes 

Sonra HERKESİN SORUN VAR NE BİLMEK OLACAK: Sadece bu çizgiyi yayınlarsanız

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

?


, değişken için hatırla gibi% abc%, bu "ile kullanmak için, [veya {öylesine hata mesajı önlemek için.


iyidir mesela

set /p abc= 

ve Kullanıcı hiçbir şey girmez
Sonra sıradaki satır şu şekilde olmalıdır:

if %abc%==1 echo Hi 
"Eşitsiz "1"" Bu

if ""=="1" echo Hi 

olacak " "
Ama ile"" == "% abc%" olarak,

if ==1 echo Hi 

Ve:

Ama oldu .
Anlayın?


DÜZENLEME ---

Windows 7 (ya da diğer sürümleri) kullanıyorsanız, ayrıca bu deneyebilirsiniz:

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

^ sadece "boru" kaçıyor (|).

Bunun sizin için yararlı olacağını umuyorum!

+0

Neler oluyor? Downvotes aldım ve GELECEĞİME GİTMEDİ MI? – Jamie