Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    6

    Metodo void non modifica il valore di una variabile

    Salve a tutti, ho bisogno di un piccolo aiuto, qualsiasi suggerimento è ben accetto.


    Sto creando un gioco per l'esame di programmazione dell'università, anche se può sembrare macchinoso in alcuni punti, devo attenermi alle linee guida delle richieste effettuatemi.


    Il problema di per se credo sia semplice ma non riesco a venirne a capo: un metodo void appartenente ad un'altra classe dovrebbe modificare il valore di una variabile booleana a seconda di un valore random. Fin qui molto semplice:
    codice:
    public class CalòPlayer implements Player {
    
    
            @Override
            public void start(boolean isFirst) {
            double random = Math.random()*10;
            System.out.println(random);
            if (random <= 5.0){
                isFirst = true;
                System.out.println(isFirst);
            }
            else{
                isFirst = false;
                System.out.println(isFirst);
            }
    
    
        }
    Come si può vedere, con delle stampe opportunamente fatte durante l'applicazione del metodo,so che la variabile booleana assume correttamente il valore che deve assumere. Tuttavia appena fuori dall'applicazione del metodo la var booleana ritorna ad avere il valore di default (false) oppure true se per esempio al momento della dichiarazione la eguaglio a true.
    Segue la parte di codice in cui il metodo viene applicato:
    codice:
    public class GameManager {
        private  boolean isFirst;
        CalòPlayer dio = new CalòPlayer();
        
        public void gioca (Giocatore g1, Giocatore g2){
            System.out.println("Ha inizio la partita!");
            
            dio.start(this.isFirst);
            System.out.println(isFirst);   //Già qui isFirst assume il valore di default
            g1.colore(isFirst);
            g2.colore(!isFirst);
            System.out.println(g1.getColore());
            System.out.print("  " + isFirst);
        }
    
    
    
    
            
    }
    La classe giocatore ha solo il metodo "colore" al momento che eguaglia il valore "rosso" o "blu" ad una String in base al valore della variabile booleana.
    codice:
    public class Giocatore {
        private String colore = "";
        public Giocatore () {
            System.out.println("Ho instanziato la classe giocatore");
        }
        
        public void colore (boolean isFirst){
            if (isFirst == true){
                this.colore = "rosso";
            }
            else {
                this.colore = "blu";
            }
        }
        
        public String getColore (){
            return this.colore;
        }
    
    
    }
    Infine il metodo Main:
    codice:
    public class Main {
    
    
        public static void main(String[] args) {
            GameManager a = new GameManager();
            Giocatore g1 = new Giocatore();
            Giocatore g2 = new Giocatore();
        a.gioca(g1, g2);
        }
    
    
    }

    Grazie per qualsiasi aiuto

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Un metodo riceve nei parametri una COPIA del valore (numero, carattere, reference o quello che è) degli argomenti passati dal chiamante.
    Cambiare il valore di un parametro NON cambia ciò che ha passato il chiamante.
    La questione è tutta qui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    6
    ok, credo di aver capito il problema di fondo.
    La prima idea che mi è venuta in mente per risolverlo è creare un metodo setIsFirst all'interno della classe GameManager:
    codice:
    public void setIsFirst (boolean isFirst){		this.isFirst = isFirst;
    	}
    e richiamare questo metodo all'interno del metodo start.
    codice:
    public class CalòPlayer implements Player {@Override
    	public void start(boolean isFirst) {
    		double random = Math.random()*10;
    		System.out.println(random);
    		if (random <= 5.0){
    			isFirst = true;
    			a.setIsFirst(isFirst);
    			System.out.println(isFirst);
    		}
    		else{
    			isFirst = false;
    			a.setIsFirst(isFirst);
    			System.out.println(isFirst);
    		}
    
    
    	}
    Ma mi da errore perchè giustamente non sa cosa è "a".
    mhmh non sto capendo come venirne a capo.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Il punto è un altro. Quale è il senso del void start(boolean isFirst) ?
    Vedo che è un override, quindi potrebbe in teoria essere invocato "polimorficamente". Ci potrebbe essere un reference solo di tipo Player e chi invoca start potrebbe non sapere se l'oggetto è realmente un PippoPlayer piuttosto che un PlutoPlayer (per dire).

    Poi certo ... vedo anche che in GameManager hai un reference dio espressamente di tipo CalòPlayer, quindi il tipo è noto/specifico.

    La questione è il concetto d'uso di start.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    6
    Il metodo start ha l'unica funzione di stabilire quale dei due giocatori inizia per primo (assegnando il il colore rosso al primo giocatore e blu al secondo)
    Si tratta di una richiesta esplicita.
    Nel senso che è proprio richiesto dal progetto d'esame compilare una classe che implementa l'interfaccia Player.
    Non posso esimermi dal usare il metodo start che deve essere void e deve avere come parametro una variabile booleana.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da claron Visualizza il messaggio
    Il metodo start ha l'unica funzione di stabilire quale dei due giocatori inizia per primo (assegnando il il colore rosso al primo giocatore e blu al secondo)
    Io lo comprendo così: "qualcuno" (una entità che ha e maneggia i vari player) dice all'oggetto player X "guarda TU sei il primo" e poi dice ad un altro oggetto player Y "guarda TU NON sei il primo".

    Insomma, per come la vedo io NON è un player che sceglie se essere il primo oppure no.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    6
    E' esattamente come hai detto. Il qualcuno di cui parli è appunto il GameManger definibile come l'arbitro del gioco.
    All'inizio di ogni nuova partita innanzitutto (in maniera casuale) stabilisce quali dei due player è il primo a giocare.
    Il gioco che devo programmare è Stratego, grossomodo si può riassumere come uno scacchi in cui non conosci le pedine dell'avversario, sai solo dove sono localizzate all'interno della scacchiera.
    Per questo deve esistere la classe GameManager che utilizzando i metodi di CalòPlayer comunica le mosse all'avversario, oppure fa avvenire gli scontri tra due pedine ecc..

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da claron Visualizza il messaggio
    E' esattamente come hai detto.
    E allora quale è il dubbio? Perché non è quello che il codice all'inizio esprimeva, dove "sembrava" che un player volesse scegliere nello start se essere primo o no.
    Non lo vedo così, il fatto che riceve un boolean vorrebbe già dire: tu sei il primo oppure no.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    6
    Quello che vorrei facesse il programma è che il metodo void start assegnasse ad una variabile booleana il valore di true o false in base alla funzione random. Poi se casualmente il valore della variabile booleana fosse true allora il g1 è primo a giocare e il g2 è secondo.
    Se invece il valore fosse false il g1 è secondo a giocare e il g2 è primo a giocare. Tutto qui.

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da claron Visualizza il messaggio
    è che il metodo void start assegnasse ad una variabile booleana il valore di true o false in base alla funzione random. Poi se casualmente il valore della variabile booleana fosse true allora il g1 è primo a giocare e il g2 è secondo.
    NON è start che dovrebbe farlo, dico il fatto di scegliere "casualmente" se è primo o no. Io l'ho inteso come l'ho detto prima: NON è il player che sceglie se è primo o no. È un'altra entità che dice a ciascun player se è primo o no. Il player può tenersi questa informazione nell'oggetto per motivi suoi o per impostare una variabile del colore o cose del genere.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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 © 2025 vBulletin Solutions, Inc. All rights reserved.