Problema con valori di ritorno delle funzioni, indici e funzioni...

di il
6 risposte

Problema con valori di ritorno delle funzioni, indici e funzioni...

Ciao a tutti, sto cercando di sviluppare un programma java con delle funzioni e procedure... il programma sinteticamente funziona cosi:
abbiamo una matrice che rappresenta un labirinto n*n, nel percorso di questo labirinto ci sono diversi simboli: "*" sta per spazio libero,
"+" sta per trappola mortale "5,10,50" invece sono i punti che possiamo trovare nel gioco... per vincere bisogna partire dallo start (i=0;j=0) e arrivare a end (i=n-1;j=n-1), il problema è che non riesco a far "muovere" il personaggio e credo che l'errore sia dovuto dagli indici che non hanno mai lo stesso valore nelle diverse funzioni (ho fatto 4 funzioni solo per i 4 movimenti possibili: su, giù,destra,sinistra)... quindi se ho capito bene qual'è il problema la mia domanda è: come posso far risultare sempre gli stessi indici anche in funzioni diverse contando che il return lo uso già per salvarmi il punteggio...
p.s. sono uno studente del 3° superiore e lunedì verrò interrogato su questo programma per cercare di prendere un bel voto quindi se volete chiedermi il codice per darmi qualche consiglio per migliorare la struttura del programma sarebbe fantastico.
grazie a chiunque leggerà questo messaggio dell'attenzione

6 Risposte

  • Re: Problema con valori di ritorno delle funzioni, indici e funzioni...

    manu20 ha scritto:


    il problema è che non riesco a far "muovere" il personaggio e credo che l'errore sia dovuto dagli indici che non hanno mai lo stesso valore nelle diverse funzioni (ho fatto 4 funzioni solo per i 4 movimenti possibili: su, giù,destra,sinistra)... quindi se ho capito bene qual'è il problema la mia domanda è: come posso far risultare sempre gli stessi indici anche in funzioni diverse contando che il return lo uso già per salvarmi il punteggio...
    Dipende tutto da come hai "modellato" le cose .... mostra del codice possibilmente, almeno per far capire la tua logica.
  • Re: Problema con valori di ritorno delle funzioni, indici e funzioni...

    andbin ha scritto:


    manu20 ha scritto:


    il problema è che non riesco a far "muovere" il personaggio e credo che l'errore sia dovuto dagli indici che non hanno mai lo stesso valore nelle diverse funzioni (ho fatto 4 funzioni solo per i 4 movimenti possibili: su, giù,destra,sinistra)... quindi se ho capito bene qual'è il problema la mia domanda è: come posso far risultare sempre gli stessi indici anche in funzioni diverse contando che il return lo uso già per salvarmi il punteggio...
    Dipende tutto da come hai "modellato" le cose .... mostra del codice possibilmente, almeno per far capire la tua logica.
    scusa se non ho risposto subito comunque ecco tutto il codice del programma..
    
    import javax.swing.*;
    
     public class MappaAntica {
        public static void main(String[] argV) {
            //dichiarazione allocaszione e inizializzazione della matrice labirinto
                String[][] labirinto = {
                                     {"start ", "*", "*", "+","+"},
                                     {"10","10","10","50","5"},
                                     {"*","*","*","+","5"},
                                     {"+","*","+","*","50"},
                                     {"*","+","*","+","end"},
                };
                //dichiarazione variabili
                int n;
                int r;
                int c;
                int i;
                int j;
                int tesoro;
                int punteggio;
                String str;
                int somma;
                char opz;
                int punti;
    
                
    
    
                //inizializzazione variabili
                n=5;
                r = 0;
                c = 0;
                tesoro = 0;
                punteggio = 0;
                str = "";
                i = 0;
                j = 0;
                somma = 0;
                opz = ' ';
                punti = 0;
    
               
                // richiamo funzione formattazione
               str=formattazione(labirinto, n );
               
               
    
              //
               opz=JOptionPane.showInputDialog("per muoverti nella mappa useremo i comandi 'wasd'\n" +
                                                                    "w- per andare sopra.\n" + 
                                                                    "a- per andare a sinistra.\n" + 
                                                                    "s- per andare indietro.\n" +
                                                                    "d- per andare a destra.\n" +
                                                                    "ecco a te la mappa:\n" + str).charAt(0);
    
              while(!giocofinito(labirinto, i, j)) {
                 
                 switch(opz) {
                    case 'w': 
                            //richiamo la funzione case w per andae verso l'alto.
                            punti=caseW(labirinto, i, j);
                            somma+=punti;
                            System.out.println("ti trovi nella posizione " + (i+1) + " " + (j+1));
                            break;
    
                    case 'a':
                            //richiamo la funzione caseA per andare a sinistra
                            punti=caseA(labirinto, i, j);
                            somma+=punti;
                            System.out.println("ti trovi nella posizione " + (i+1) + " " + (j+1));
                            break;
    
                    case 'd':
                            //richiamo la funzione caseD per andare a destra
                            punti=caseD(labirinto, n, i, j);
                            somma+=punti;
                            System.out.println("ti trovi nella posizione " + (i+1) + " " + (j+1) );
                            break;
    
                    case 's':
                            //richiamo la funzione caseS per adnare verso il basso.
                            punti=caseS(labirinto, n,i, j);
                            somma+=punti;
                            System.out.println("ti trovi nella posizione " + (i+1) + " " + (j+1) ); 
                            break;
    
                    default:
                           JOptionPane.showMessageDialog(null,"hai digitato male, riprova!");
                 }
                 opz=JOptionPane.showInputDialog("per muoverti nella mappa useremo i comandi 'wasd'\n" +
                                                                    "w- per andare sopra.\n" + 
                                                                    "a- per andare a sinistra.\n" + 
                                                                    "s- per andare indietro.\n" +
                                                                    "d- per andare a destra.\n" +
                                                                    "ecco a te la mappa:\n" + str).charAt(0);
              }
    
              JOptionPane.showMessageDialog(null,"hai totalizzato " + punteggio + " punti, bravo!");
           }
               
               
    
                
            
            // funzione formattazione 
            private static String formattazione(String[][] mat, int dim) {
               //dichiarazione variabili 
                String str;
                int i;
                int j;
    
                //inizializzazione variabili
                str="";
    
    
                for(i = 0; i < dim; i++) {
    
                    for( j = 0; j < dim; j++) {
                        str += String.format("| %2s  ", mat[i][j]);
                    }
                    str += " |\n";
                    str += "+-----------------------------+\n";
                }
    
               return str; 
            }
           
              
    
           //funzione caseW
           private static int caseW(String[][] matrice, int i, int j ) {
            //dichiarazione delle variabili
            int punteggio;
    
            //inizializzazione dell variabili
            
            punteggio = 0;
    
            //controllo per vedere se si e' agli argini
            if(i-1 >= 0) {
                switch(matrice[i-1][j]) {
                    case "*":
                            i--;
                            break;
    
                    case "+":
                            JOptionPane.showMessageDialog(null,"Topolino e' andato su una trappola mortale! riprova da capo!");
                            i = 0;
                            j = 0;
                            break;
    
                    case "5":
                            i--;
                            punteggio+=5;
                            break;
    
                    case "10":
                             i--;
                             punteggio += 10;
                             break;
    
                    case "50": 
                             i--;
                             punteggio += 50;
                             break;
    
                    case "end": JOptionPane.showMessageDialog(null,"WOW! Hai raggiunto la fine, complimenti!");
                                
    
                }
            }
    
             return punteggio;
           }
    
    
           //funzione caseA
           private static int caseA(String[][] matrice, int i, int j) {
            //dichiarazione delle variabili
            int punteggio;
    
            //inizializzazione dell variabili
            
            punteggio = 0;
    
            //controllo per vedere se si e' ai margini
            if(j-1 >= 0) {
                switch(matrice[i][j-1]) {
                    case "*":
                            j--;
                            break;
    
                    case "+":
                            JOptionPane.showMessageDialog(null,"Topolino e' andato su una trappola mortale! riprova da capo!");
                            i = 0;
                            j = 0;
                            break;
    
                    case "5":
                            j--;
                            punteggio+=5;
                            break;
    
                    case "10":
                             j--;
                             punteggio += 10;
                             break;
    
                    case "50": 
                             j--;
                             punteggio += 50;
                             break;
    
                    case "end": JOptionPane.showMessageDialog(null,"WOW! Hai raggiunto la fine, complimenti!");
                                
    
    
                }
            }
    
             return punteggio;
           }
      
    
          //funzione caseD
          private static int caseD(String[][] matrice, int dim, int i, int j) {
            //dichiarazione delle variabili
            int punteggio;
    
            //inizializzazione dell variabili
            
            punteggio = 0;
    
            //controllo per vedere se si e' ai margini
            if(j+1 < dim) {
                switch(matrice[i][j+1]) {
                    case "*":
                            j++;
                            break;
    
                    case "+":
                            JOptionPane.showMessageDialog(null,"Topolino e' andato su una trappola mortale! riprova da capo!");
                            i = 0;
                            j = 0;
                            break;
    
                    case "5":
                            j++;
                            punteggio+=5;
                            break;
    
                    case "10":
                             j++;
                             punteggio += 10;
                             break;
    
                    case "50": 
                             j++;
                             punteggio += 50;
                             break;
    
                    case "end": JOptionPane.showMessageDialog(null,"WOW! Hai raggiunto la fine, complimenti!");
                                
    
    
                }
            }
    
             return punteggio;
           } 
    
    
           //funzione caseS
            private static int caseS(String[][] matrice, int dim, int i, int j) {
            //dichiarazione delle variabili
            int punteggio;
    
            //inizializzazione dell variabili
            
            punteggio = 0;
    
            //controllo per vedere se si e' ai margini
            if(i+1 < dim) {
                switch(matrice[i+1][j]) {
                    case "*":
                            i++;
                            break;
    
                    case "+":
                            JOptionPane.showMessageDialog(null,"Topolino e' andato su una trappola mortale! riprova da capo!");
                            i = 0;
                            j = 0;
                            break;
    
                    case "5":
                            i++;
                            punteggio+=5;
                            break;
    
                    case "10":
                             i++;
                             punteggio += 10;
                             break;
    
                    case "50": 
                             i++;
                             punteggio += 50;
                             break;
    
                    case "end": JOptionPane.showMessageDialog(null,"WOW! Hai raggiunto la fine, complimenti!");
                               
    
    
                }
            }
    
             return punteggio;
           } 
    
        private static boolean giocofinito(String[][] mat, int i, int j) {
            //dichiarazione variabili 
            boolean fine;
    
    
            //inizializzazione variabili
            fine=false;
    
            //controllo
            if(mat[i][j].equals("end")) {
                fine=true;
                return fine;
    
            } else {
                return fine;
            }
    
        }
    
     }
    
    credo ti interessi solo la parte delle funzioni comunque l ho messo tutto magari mi puoi dare qualche chicca
  • Re: Problema con valori di ritorno delle funzioni, indici e funzioni...

    manu20 ha scritto:


    comunque ecco tutto il codice del programma..
    Ho visto ma ... il design generale non è per niente buono. Troppi metodi static, non è per niente "object oriented". Devi passare ogni volta più dati ai metodi e devi per forza restituire un punteggio 0 o non 0. E ci sono ripetizioni evidenti di logica. Ti stai veramente complicando la vita ...
    Dovresti cambiare approccio.
  • Re: Problema con valori di ritorno delle funzioni, indici e funzioni...

    Per quanto riguarda i tanti static forse ti posso rispondere... praticamente l'ultima parte di programma che abbiamo fatto a scuola sono state le funzioni e le procedure e non siamo mai entrati nel dettaglio nella programmazione ad oggetti.. ci è stato detto solo che bisognava cosi per fare un funzione mentre per una procedura bastava togliere il valore di ritorno e mettere void e ovviamente non usare il return.. lo so non sono un molto bravo pero' ho molta voglia di imparare.. comunque fatto sta che non mi riesco a smuovere da questo punto e quindi il personaggio rimane fermo al punto di start, riguardo cio' non hai notato niente di strano negli indici?
    comunque grazie per i consigli
  • Re: Problema con valori di ritorno delle funzioni, indici e funzioni...

    manu20 ha scritto:


    il personaggio rimane fermo al punto di start, riguardo cio' non hai notato niente di strano negli indici?
    Certo che l'ho notato! Nei metodi hai fatto es. i--; o j++; o i = 0; ecc... ma quello che hai fatto è solo cambiare il valore del PARAMETRO, che è una COPIA del valore passato dal main. Quindi cambiare il valore di un parametro NON cambia quello che il chiamante ha "in mano"!

    Visto che non hai nozioni sulla programmazione ad oggetti .... allora dovresti mettere tutte le variabili come static, ovvero FUORI dai metodi, dichiarate con static. A quel punto non devi passarle/restituirle dai metodi static perché sono già in scope nei metodi.

    Il punto è proprio questo tuo design.
  • Re: Problema con valori di ritorno delle funzioni, indici e funzioni...

    Grazie mille! scusami se ti ho fatto perdere con questa cosa cosa qui comunque ora vado a farlo e ti faccio sapere se riesco ad implementarlo bene
    buona giornata!
    edit: ho appena provato ma niente contiua a trovarsi nella stessa posizione ora faccio qualche prova cambiando delle cose e vedo se va
    nuovo edit : finalmente funziona ora devo aggiungere controlli e messaggi...
    comunque grazie ancora dell'aiuto e ti volevo chiedere un ultima cosa se possibile.. se mi sapresti consigliare qualcosa da leggere o da vedere per saperne di più nella programmazione ad oggetti, ovviamente non cose troppo approfondite ma giusto per saperne qualcosa in più
Devi accedere o registrarti per scrivere nel forum
6 risposte