PDA

Visualizza la versione completa : [C++] Errore sezione ripetitiva(credo)


Vinciokaboom
03-03-2013, 16:49
Salve, programmo da poco in C++, quindi so pochi elementi di base e vorrei continuare ad usare quelli quali la switch ed il do..
Ora posto, purtroppo non in spoiler dato che non lo trovo, il codice del programma e vorrei sapere dove è l'errore perché, durante la prima battaglia, anche se non si hanno magie, il programma o le utilizza, o fa premere due volte lo stesso tasto per poi fare un'azione di combattimento in automatico o non ricordo cos'altro :confused: . Nel caso della terza magia quale quella della scimmia esso funziona bene dato che il nemico muore, ma negli altri due casi va in tilt. Grazie :D



#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
//generali
int risposta;
//scelte
int sceltainiziale;
int sceltamagia;
int sceltabattaglia;
//statistiche
int atkmio=50;
int difmio=50;
int magiafuoco=0;
int magiatempo=0;
int magiascimmia=0;
int hpmio=1000;
int mpfuoco=30;
int mptempo=30;
int mpscimmia=30;
//statistiche nemici 1
int atknemico1=50;
int difnemico1=30;
int hpnemico1=150;
cout<<"Sei il figlio illeggittimo del re, assaggia la vendetta e conquista il trono che ti spetta."<<endl<<endl;
cout<<" Queste sono le tue statistiche ATK=50; DANNO MAGIA=0; DIF=50; PUNTI MAGIA=30; HP=1000."<<endl<<endl;
cout<<"Sei davanti al castello di tuo padre, combatti i guerrieri."<<endl<<endl;
cout<<"Hai due possibilità, cosa vuoi fare? Aumentare il tuo attacco [1], aumentare la tua difesa[2] o imparare una magia[3], cosa scegli?"<<endl<<endl;
cin>>sceltainiziale;
switch (sceltainiziale)
{
case 1:
cout<<"Hai deciso di aumentare il tuo attacco, hai ricevuto una spada con del fuoco attorno[Shishkebab, attacco + 30!]"<<endl<<endl;
atkmio = atkmio+30;
mpfuoco = mpfuoco-30;
mptempo= mptempo- 30;
mpscimmia= mpscimmia - 30;

break;

case 2:
cout<<"Hai deciso di aumentare la tua difesa, hai ricevuto uno scudo e un'armatura di maglia[scudo del re, armatura di maglia, difesa +30!]"<<endl<<endl;
difmio = difmio+30;
mpfuoco = mpfuoco-30;
mptempo= mptempo- 30;
mpscimmia= mpscimmia - 30;
break;

case 3:
cout<<" Hai deciso di imparare una magia, premi un tasto a caso tra 1, 2, 3 e imparerai una magia."<<endl<<endl;
cin>>sceltamagia;
switch (sceltamagia)
{
case 1:
cout<<"Hai imparato la magia del fuoco che potrai usare in alcune occasioni nella battaglia. [magia+47!]Questa magia ti diminurà gli mp di 3"<<endl<<endl;
magiafuoco = magiafuoco+47;
mptempo= mptempo- 30;
mpscimmia= mpscimmia - 30;
break;
case 2:
cout<<"Hai imparato la magia del tempo, tu sarai superveloce e i tuoi nemici saranno lentissimi[magia +67]Questa magia ti diminuirà gli mp di 5."<<endl<<endl;
magiatempo = magiatempo+67;
mpfuoco= mpfuoco- 30;
mpscimmia= mpscimmia - 30;
break;
case 3:
cout<<"Hai imparato la magia più potente, complimenti, trasformerai il tuo avversario in una scimmia con hp di 0 e vincerai. La potrai usare contro chi vuoi, una sola volta, tranne contro il boss finale.[magia + 1000!] Questa magia ti diminuirà i tuoi mp a 0."<<endl<<endl;
magiascimmia = magiascimmia+1000;
mpfuoco= mpfuoco- 30;
mptempo= mptempo - 30;
}//sceltamagia
}//sceltainiziale
if (hpnemico1<=0)
{
cout<<"Hai ucciso il tuo nemico!"<<endl<<endl;
}
else
{
do
{
cout<<"I tuoi hp:"<<hpmio<<endl;
cout<<"I tuoi mpfuoco:"<<mpfuoco<<endl;
cout<<"I tuoi mptempo:"<<mptempo<<endl;
cout<<"I tuoi mpscimmia:"<<mpscimmia<<endl;
cout<<"Hp del nemico"<<hpnemico1<<endl;
cout<<"Un nemico! Cosa vuoi fare? [1] usa attacco, [2] usa magia fuoco, [3] usa magia tempo, [4] usa magia scimmia, [5] difenditi."<<endl;

cin>>sceltabattaglia;
switch (sceltabattaglia)
{
case 1:
cout<<"Hai attaccato il primo nemico, i suoi hp scendono!"<<endl<<endl;
hpnemico1=hpnemico1 - (atkmio-difnemico1);
cout<<"Ugh!"<<endl;
cout<<"Ti attacca anche lui, i tuoi hp scendono!"<<endl<<endl;
hpmio= hpmio- atknemico1;
if (hpnemico1<=0)
{cout<<"hai ucciso il nemico!"<<endl<<endl;
cout<<"COMPLIMENTI, HAI VINTO!"<<endl;
cout<<"premi [0] ";
cin>>risposta;}
else {
cout<<"Premi [1]"<<endl<<endl;
cin>>risposta;}

break;
case 2:
if (mpfuoco<3)
{
cout<<"Non puoi usarla. Premi [2](non sbagliare tasto)";
cin>>risposta;
}//chiusura if finiti mp
else
{cout<<"Hai attaccato il primo nemico con la magia del fuoco"<<endl<<endl;
hpnemico1=hpnemico1 - (magiafuoco-difnemico1);
mpfuoco= mpfuoco - 3;
if (hpnemico1<=0)
{cout<<"hai ucciso il nemico!"<<endl<<endl;
cout<<"COMPLIMENTI, HAI VINTO!"<<endl;
cout<<"premi [0] ";
cin>>risposta;}//chiusura if
else {
cout<<"Premi [1]"<<endl<<endl;
cin>>risposta;}//chiusura else
break;
}//chiusura else magia fuoco
case 3:
if (mptempo<5)
{
cout<<"Non puoi usarla. Premi [2](non sbagliare tasto)";
cin>>risposta;
}//chiusura if finiti mp
else
{cout<<"Hai attaccato il nemico con la magia del tempo!"<<endl<<endl;
hpnemico1=hpnemico1 - (magiatempo-difnemico1);
mptempo= mptempo - 5;
if (hpnemico1<=0)
{cout<<"hai ucciso il nemico!"<<endl<<endl;
cout<<"COMPLIMENTI, HAI VINTO!"<<endl;
cout<<"premi [0] ";
cin>>risposta;}//chiusura if
else {
cout<<"Premi [1]"<<endl<<endl;
cin>>risposta;}//chiusura else
break;
}//chiusura else magia tempo
case 4:
if (mpscimmia<30)
{
cout<<"Non puoi usarla. Premi [2](non sbagliare tasto)";
cin>>risposta;
}//chiusura if finiti mp
else
{cout<<"Hai attaccato il nemico con la magia della scimmia, spero tu l'abbia usata bene!"<<endl<<endl;
hpnemico1=hpnemico1 - (magiascimmia-difnemico1);
mpscimmia= mpscimmia - 30;
if (hpnemico1<=0)
{cout<<"Hai ucciso il nemico!"<<endl<<endl;
cout<<"COMPLIMENTI, HAI VINTO!"<<endl;
cout<<"premi [0] ";
cin>>risposta;}//chiusura if
else {
cout<<"Premi [1]"<<endl<<endl;
cin>>risposta;}//chiusura else
break;
}//chiusura else magia scimmia
case 5:
cout<<"Hai decido di difenderti dall'attacco del nemico!";
hpmio=hpmio - (atknemico1-difmio);
cout<<" Il nemico ti ha colpito!"<<endl<<endl;
break;
}//chiusura switchbattaglia
}//chiusura do
while (risposta==1);
cout<<"Complimenti, ora si va avanti!"<<endl;
system("PAUSE");
return 0;
}
}

oregon
03-03-2013, 19:26
Utilizza i tag CODE altrimenti non si comprende nulla del codice.

E specifica meglio il problema perché "va in tilt" può andare bene per un flipper ma non dice molto dell'errore che hai.

MItaly
03-03-2013, 20:44
Aggiunti i tag CODE; per questa e altre cose da tenere presenti quando si posta qui, dai un'occhiata al regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887). :ciauz:

Alex'87
03-03-2013, 21:56
Il codice è abbastanza illeggile.. Però guarda bene lo switch, a volte il break mi pare nel posto sbagliato.

Ad esempio,



if (hpnemico1<=0)
{cout<<"hai ucciso il nemico!"<<endl<<endl;
cout<<"COMPLIMENTI, HAI VINTO!"<<endl;
cout<<"premi [0] ";
cin>>risposta;}//chiusura if
else {
cout<<"Premi [1]"<<endl<<endl;
cin>>risposta;}//chiusura else
break;
}

Il break viene eseguito solo nel ramo "else". E' quello che vuoi?

oregon
03-03-2013, 22:04
Originariamente inviato da Alex'87
Il codice è abbastanza illeggile..

Anche per le volgarità inutili ...

MItaly
04-03-2013, 02:29
Volgarità rimosse (poi tutto sommato era una, non è stato un gran lavoro :) ), @Vinciokaboom in futuro evita, non è molto professionale e può dare fastidio... :stordita:

Vinciokaboom
04-03-2013, 20:20
Scusatemi per il linguaggio ma era uno scherzo ad un amico, ed ho dimenticato di cancellarla.
Per quanto riguarda il programma se potreste provarlo è meglio, però l'errore sta nel fatto che in alcuni casi esegue funzioni che non dovrebbe eseguire.

MItaly
04-03-2013, 20:48
Originariamente inviato da Vinciokaboom
Per quanto riguarda il programma se potreste provarlo è meglio, però l'errore sta nel fatto che in alcuni casi esegue funzioni che non dovrebbe eseguire.
Non puoi essere un po' più preciso? :stordita: Chiedere di tentare tutti i percorsi possibili in un programma "a bivi" è un po' eccessivo, specie considerando che noi non abbiamo bene in mente che cosa dovrebbe fare nelle tue intenzioni. Inoltre, hai letto il messaggio di Alex'87? È facile che, nell'indentazione diciamo "poco ordinata" del tuo programma abbia fatto confusione con break & co.

Il mio consiglio è indentare il codice in maniera coerente (in modo da vedere al volo dove si chiudono gli scope), e quindi controllare man mano che i break e le varie istruzioni di controllo del flusso siano dove devono stare. Per aggiustare ora l'indentazione, comunque, basta un tool automatico come astyle:


#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
//generali
int risposta;
//scelte
int sceltainiziale;
int sceltamagia;
int sceltabattaglia;
//statistiche
int atkmio=50;
int difmio=50;
int magiafuoco=0;
int magiatempo=0;
int magiascimmia=0;
int hpmio=1000;
int mpfuoco=30;
int mptempo=30;
int mpscimmia=30;
//statistiche nemici 1
int atknemico1=50;
int difnemico1=30;
int hpnemico1=150;
cout<<"Sei il figlio illeggittimo del re, assaggia la vendetta e conquista il trono che ti spetta."<<endl<<endl;
cout<<" Queste sono le tue statistiche ATK=50; DANNO MAGIA=0; DIF=50; PUNTI MAGIA=30; HP=1000."<<endl<<endl;
cout<<"Sei davanti al castello di tuo padre, combatti i guerrieri."<<endl<<endl;
cout<<"Hai due possibilità, cosa vuoi fare? Aumentare il tuo attacco [1], aumentare la tua difesa[2] o imparare una magia[3], cosa scegli?"<<endl<<endl;
cin>>sceltainiziale;
switch (sceltainiziale)
{
case 1:
cout<<"Hai deciso di aumentare il tuo attacco, hai ricevuto una spada con del fuoco attorno[Shishkebab, attacco + 30!]"<<endl<<endl;
atkmio = atkmio+30;
mpfuoco = mpfuoco-30;
mptempo= mptempo- 30;
mpscimmia= mpscimmia - 30;

break;

case 2:
cout<<"Hai deciso di aumentare la tua difesa, hai ricevuto uno scudo e un'armatura di maglia[scudo del re, armatura di maglia, difesa +30!]"<<endl<<endl;
difmio = difmio+30;
mpfuoco = mpfuoco-30;
mptempo= mptempo- 30;
mpscimmia= mpscimmia - 30;
break;

case 3:
cout<<" Hai deciso di imparare una magia, premi un tasto a caso tra 1, 2, 3 e imparerai una magia."<<endl<<endl;
cin>>sceltamagia;
switch (sceltamagia)
{
case 1:
cout<<"Hai imparato la magia del fuoco che potrai usare in alcune occasioni nella battaglia. [magia+47!]Questa magia ti diminurà gli mp di 3"<<endl<<endl;
magiafuoco = magiafuoco+47;
mptempo= mptempo- 30;
mpscimmia= mpscimmia - 30;
break;
case 2:
cout<<"Hai imparato la magia del tempo, tu sarai superveloce e i tuoi nemici saranno lentissimi[magia +67]Questa magia ti diminuirà gli mp di 5."<<endl<<endl;
magiatempo = magiatempo+67;
mpfuoco= mpfuoco- 30;
mpscimmia= mpscimmia - 30;
break;
case 3:
cout<<"Hai imparato la magia più potente, complimenti, trasformerai il tuo avversario in una scimmia con hp di 0 e vincerai. La potrai usare contro chi vuoi, una sola volta, tranne contro il boss finale.[magia + 1000!] Questa magia ti diminuirà i tuoi mp a 0."<<endl<<endl;
magiascimmia = magiascimmia+1000;
mpfuoco= mpfuoco- 30;
mptempo= mptempo - 30;
}//sceltamagia
}//sceltainiziale
if (hpnemico1<=0)
{
cout<<"Hai ucciso il tuo nemico!"<<endl<<endl;
}
else
{
do
{
cout<<"I tuoi hp:"<<hpmio<<endl;
cout<<"I tuoi mpfuoco:"<<mpfuoco<<endl;
cout<<"I tuoi mptempo:"<<mptempo<<endl;
cout<<"I tuoi mpscimmia:"<<mpscimmia<<endl;
cout<<"Hp del nemico"<<hpnemico1<<endl;
cout<<"Un nemico! Cosa vuoi fare? [1] usa attacco, [2] usa magia fuoco, [3] usa magia tempo, [4] usa magia scimmia, [5] difenditi."<<endl;

cin>>sceltabattaglia;
switch (sceltabattaglia)
{
case 1:
cout<<"Hai attaccato il primo nemico, i suoi hp scendono!"<<endl<<endl;
hpnemico1=hpnemico1 - (atkmio-difnemico1);
cout<<"Ugh!"<<endl;
cout<<"Ti attacca anche lui, i tuoi hp scendono!"<<endl<<endl;
hpmio= hpmio- atknemico1;
if (hpnemico1<=0)
{
cout<<"hai ucciso il nemico!"<<endl<<endl;
cout<<"COMPLIMENTI, HAI VINTO!"<<endl;
cout<<"premi [0] ";
cin>>risposta;
}
else
{
cout<<"Premi [1]"<<endl<<endl;
cin>>risposta;
}

break;
case 2:
if (mpfuoco<3)
{
cout<<"Non puoi usarla. Premi [2](non sbagliare tasto)";
cin>>risposta;
}//chiusura if finiti mp
else
{
cout<<"Hai attaccato il primo nemico con la magia del fuoco"<<endl<<endl;
hpnemico1=hpnemico1 - (magiafuoco-difnemico1);
mpfuoco= mpfuoco - 3;
if (hpnemico1<=0)
{
cout<<"hai ucciso il nemico!"<<endl<<endl;
cout<<"COMPLIMENTI, HAI VINTO!"<<endl;
cout<<"premi [0] ";
cin>>risposta;
}//chiusura if
else
{
cout<<"Premi [1]"<<endl<<endl;
cin>>risposta;
}//chiusura else
break;
}//chiusura else magia fuoco
case 3:
if (mptempo<5)
{
cout<<"Non puoi usarla. Premi [2](non sbagliare tasto)";
cin>>risposta;
}//chiusura if finiti mp
else
{
cout<<"Hai attaccato il nemico con la magia del tempo!"<<endl<<endl;
hpnemico1=hpnemico1 - (magiatempo-difnemico1);
mptempo= mptempo - 5;
if (hpnemico1<=0)
{
cout<<"hai ucciso il nemico!"<<endl<<endl;
cout<<"COMPLIMENTI, HAI VINTO!"<<endl;
cout<<"premi [0] ";
cin>>risposta;
}//chiusura if
else
{
cout<<"Premi [1]"<<endl<<endl;
cin>>risposta;
}//chiusura else
break;
}//chiusura else magia tempo
case 4:
if (mpscimmia<30)
{
cout<<"Non puoi usarla. Premi [2](non sbagliare tasto)";
cin>>risposta;
}//chiusura if finiti mp
else
{
cout<<"Hai attaccato il nemico con la magia della scimmia, spero tu l'abbia usata bene!"<<endl<<endl;
hpnemico1=hpnemico1 - (magiascimmia-difnemico1);
mpscimmia= mpscimmia - 30;
if (hpnemico1<=0)
{
cout<<"Hai ucciso il nemico!"<<endl<<endl;
cout<<"COMPLIMENTI, HAI VINTO!"<<endl;
cout<<"premi [0] ";
cin>>risposta;
}//chiusura if
else
{
cout<<"Premi [1]"<<endl<<endl;
cin>>risposta;
}//chiusura else
break;
}//chiusura else magia scimmia
case 5:
cout<<"Hai decido di difenderti dall'attacco del nemico!";
hpmio=hpmio - (atknemico1-difmio);
cout<<" Il nemico ti ha colpito!"<<endl<<endl;
break;
}//chiusura switchbattaglia
}//chiusura do
while (risposta==1);
cout<<"Complimenti, ora si va avanti!"<<endl;
system("PAUSE");
return 0;
}
}


Inoltre, un'altra cosa che puoi fare per rendere il tuo codice più leggibile (e quindi meno soggetto ad errori di controllo del flusso) è spezzarlo in funzioni (in maniera possibilmente sensata :stordita: ), in modo da poter controllare facilmente una funzione alla volta che non contengano errori e quindi richiamarle via via dal main.

Vinciokaboom
05-03-2013, 12:50
Questo programma sarebbe una specie di videogame senza alcuna grafica e quindi al quale si gioca solamente tramite delle scelte. In pratica, dopo aver scelto quale magia utilizzare all'inizio, mettiamo come esempio la magia del fuoco, durante il combattimento, non sapendo come fare, ho utilizzato il case per decidere se attaccare fisicamente, se attaccare con le magie o difendersi. Nel caso in cui si abbia scelto la magia del fuoco, se si prova ad utilizzare la magia del tempo, il gioco dovrebbe far premere un tasto per tornare alla scelta nella battaglia. Invece il gioco, in automatico fa premere il tasto, utilizza sempre la magia del tempo( se non erro) e attiva la funzione del system("pause") e chiude il gioco quindi proprio non saprei dove è l'errore. Se non sono stato chiaro non ho nessun problema e scusatemi se non sono così preciso e se sono abbastanza disordinato ma sono alle prime armi.

Loading