2012-03-19 5 views
7

इस कोड को पोकीमॉन लड़ाई गेमप्ले का एक सरल संस्करण के समान बनाया गया है। मैंने केवल हमलों में कोड किया है। मैं पूरी तरह से परीक्षण कर रहा हूं, और पाया कि जब भी उपयोगकर्ता ने अपने हमले की पुष्टि की तो एक त्रुटि संदेश (गोटो अप्रत्याशित था)। चेतावनी !! कोड 96 लाइन लंबी है। अंत में, मैं समस्या अनुभाग डाल दूंगा, ताकि आप इस पहले विशाल खंड को छोड़ सकें।गोटो इस समय अनपेक्षित था बैच विंडोज 7 स्टार्टर

@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 

कोड यहाँ ठीक हो जाता है, लेकिन एक बार मैं यहाँ हूँ, यह गोटो आदेशों की उम्मीद नहीं है। कोई भी इस गोमांस को ठीक कर सकता है? (नोट: टैकल सिर्फ एक उदाहरण है। हमलों में से कोई भी काम नहीं करता है।) संपादित करें: यदि उपयोगकर्ता "हां", "नहीं", अस्पष्टता या कुछ भी नहीं डालता है, तो यह अभी भी एक ही त्रुटि संदेश प्रदान करता है (इस समय गोटो अप्रत्याशित था)

+7

मैं डाउनवॉट्स के बारे में उत्सुक हूं; प्रश्नकर्ता ने कोड पोस्ट किया, एक उदाहरण समस्या क्षेत्र को अलग किया, और यहां तक ​​कि त्रुटि संदेश भी दिया। मुझे एक अच्छा सवाल लगता है। क्या यह बैच फाइलों के लिए सिर्फ अपमानजनक है? इससे प्रभावित नहीं होना चाहिए कि सवाल अच्छा है या नहीं। –

+0

@ वेस्लेपेट्रोव्स्की, शायद इसलिए कि उन्होंने अपनी पूरी लिपि पोस्ट की थी। और फिर समस्याग्रस्त कोड की एक अतिरिक्त प्रति पोस्ट की। उसे केवल उस कोड को पोस्ट करना चाहिए जो समस्याग्रस्त था। – mikerobi

+0

'तो% कदम% == Catpure गोटो capture' मुझे पता है, बिल्लियों purre, लेकिन मुझे लगता है कि यह एक लिखने में कोई त्रुटि ^^ – Stephan

उत्तर

2

उपयोगकर्ता कुछ भी नहीं दर्ज करता है, अपने If लाइनों शायद कुछ इस तरह का मूल्यांकन:

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

जो वाक्य रचना सही नहीं है।

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

इस तरह, उपयोगकर्ता केवल एंटर दबाता है, accept चर default मूल्य बनी रहेगी, और बाद में if में समाप्त नहीं होगा: मैं कुछ डिफ़ॉल्ट मान के साथ set /p आदेश से पहले accept initialising सुझाव है त्रुटि।

+1

या विशेष रूप से परीक्षण करने के लिए% स्वीकार करता है, तो% रिक्त है यदि == हाँ से पहले एक परीक्षण सेट किया गया है - यह 'अगर%%% == स्वीकार कर सकता है। गोटो xxxx ... ' – RobW

+0

आप तुलना करने के लिए अपने आइटम के चारों ओर उद्धरणों का भी उपयोग कर सकते हैं, इसलिए वे मूल्यांकन करते हैं यदि "" == "हां"। एंड्री की सिफारिश के रूप में डिफ़ॉल्ट मान का उपयोग करने के लिए अभी भी एक अच्छा विचार है। –

3

आपकी समस्या है इस लाइन है कि:

set /p accept=Yes/No? 

एक ही चर नाम का उपयोग नहीं करता इन लोगों कि:

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

चर से ऊपर "सीसीसी" है, लेकिन पहले एक बस "सीसी "

संपादित

हाय, उपयोग r1205760; मुझे खर्च करने में कुछ समय मिला, इसलिए मैं आपका प्रोग्राम लेता हूं और इसे थोड़ा सा छोटा बना देता हूं। यह मेरा संस्करण है:

@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

जो चोट पहुंचा सकता है। अच्छा पकड़ा। –

6

आप उद्धरण में डाल दिया है:

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

या बल्कि आप इसे केस संवेदी बनाना चाहते न हो तो:

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

वास्तव में * आपको * दिमाग में नहीं है, लेकिन आप निश्चित रूप से कर सकते हैं, और शायद यह समस्या को हल करने का सबसे व्यापक तरीका है (और एक भी, कि किसी कारण से मैंने उस समय के बारे में नहीं सोचा था)। –

-1

मुझे माफ करना,
यह डाउनवॉट्स के लिए सिर्फ एक सवाल है।
जो लोग पूछते हैं कि यह सुनिश्चित नहीं है कि समस्या उस भाग में होनी चाहिए।

उदा।

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

मैं सिर्फ इस लाइन पोस्ट करते हैं:

if %a%==1 echo yes 

तो यह सबके लिए पता होगा समस्या है क्या?


, चर के लिए याद रखें की तरह% एबीसी%, इसके साथ इसका इस्तेमाल करने ", [या {तो त्रुटि संदेश को रोकने के लिए के रूप में।


बेहतर है जैसे

set /p abc= 

और उपयोगकर्ता कुछ भी इनपुट नहीं करता है।
फिर अगली पंक्ति होनी चाहिए:

if %abc%==1 echo Hi 

लेकिन यह बन गया:

if ==1 echo Hi 

, के रूप में "% एबीसी%" == ""
लेकिन साथ "", यह

if ""=="1" echo Hi 

बन जाएगा और "" असमान के लिए "1" ।
समझें?


संपादित करें ---

आप विंडोज 7 (या अन्य संस्करण) का उपयोग कर रहे हैं, तो आप भी इस कोशिश कर सकते हैं:

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

^ सिर्फ "पाइप" भागने है (|)।

आशा है कि यह आपके लिए उपयोगी होगा!

+0

क्या चल रहा है? मुझे डाउनवॉट्स मिल गए और मेरी टिप्पणी को रद्द कर दिया गया? – Jamie