Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C++] Errore sezione ripetitiva(credo)

    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 . 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

    codice:
    #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;
    }
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3

    Moderazione

    Aggiunti i tag CODE; per questa e altre cose da tenere presenti quando si posta qui, dai un'occhiata al regolamento.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Il codice è abbastanza illeggile.. Però guarda bene lo switch, a volte il break mi pare nel posto sbagliato.

    Ad esempio,

    codice:
    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?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da Alex'87
    Il codice è abbastanza illeggile..
    Anche per le volgarità inutili ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6

    Moderazione

    Volgarità rimosse (poi tutto sommato era una, non è stato un gran lavoro ), @Vinciokaboom in futuro evita, non è molto professionale e può dare fastidio...
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    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.

  8. #8
    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? 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:
    codice:
    #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 ), in modo da poter controllare facilmente una funzione alla volta che non contengano errori e quindi richiamarle via via dal main.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.