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

    Avventura testuale, primo programma

    Ciao a tutti,
    ho iniziato da poco a studiare il Java. Il libro che sto usando spiega bene i concetti più che la pratica in sè, e consiglia di provare da soli a progettare un programma e scrivere un codice. Ho pensato di fare una piccola avventura testuale. Sono riuscito a fare senza errori il primo passo, cioè quello di avere delle stanze e di potermi muovere tra esse. Ho costruito due classi per farlo, Stanza e Gioco. Ne ho aggiunta una terza Porta, per avere delle uscite bloccate, ma qui ho avuto i primi errori. Chiedo a voi come mai.
    codice:
    import java.util.Scanner;
    
    public class Stanza {
        
        private String dir;
        private Scanner s;
        private Stanza[] usciteStanza;
        private String Descrizione;
        private Boolean[] usciteChiuse;
        private Porta porta;
        private String[] porteChiuse;
        private Boolean statoPorta;
        
        //Le stanze adiacenti possibili
        public void setUscite(Stanza uscite[]){
            this.usciteStanza = uscite;
        }
        
        public Stanza[] getUscite(){
            return usciteStanza;
        }
        //Richiesta di una direzione in input
        public Scanner getDirezione(){
            System.out.println("Dove vorresti muoverti?");
            Scanner s = new Scanner(System.in);
            return s;
        }
        
        //Controllo la direzione inserita.
        public void miMuovo(Scanner s){
        dir = s.nextLine();
        String[] comeSiApre = this.getPorteChiuse();
        switch(dir){
            case "n":
                if (usciteChiuse[0]==true){
                    statoPorta = porta.Aprimi(comeSiApre[0]);
                    }
                Stanza Stanza1 = usciteStanza[0];
                Stanza1.getUscite();
                Stanza1.getDescrizione();
                s = Stanza1.getDirezione();
                Stanza1.miMuovo(s);
                break;
            case "s":
                Stanza Stanza2 = usciteStanza[1];
                Stanza2.getUscite();
                Stanza2.getDescrizione();
                s = Stanza2.getDirezione();
                Stanza2.miMuovo(s);
                break;
            case "o":
                Stanza Stanza3 = usciteStanza[2];
                Stanza3.getUscite();
                Stanza3.getDescrizione();
                s = Stanza3.getDirezione();
                Stanza3.miMuovo(s);
                break;
            case "e":
                Stanza Stanza4 = usciteStanza[3];
                Stanza4.getUscite();
                Stanza4.getDescrizione();
                s = Stanza4.getDirezione();
                Stanza4.miMuovo(s);
                break;
            }
        }
        //La descrizione della stanza.
        public String setDescrizione(String Descrizione){
            return this.Descrizione = Descrizione;
        }
        public void getDescrizione(){
            System.out.println(Descrizione);
        }
    
        public Boolean[] getUsciteChiuse() {
            return usciteChiuse;
        }
    
        public void setUsciteChiuse(Boolean[] usciteChiuse) {
            this.usciteChiuse = usciteChiuse;
        }
    
        public String[] getPorteChiuse() {
            return porteChiuse;
        }
    
        public void setPorteChiuse(String[] porteChiuse) {
            this.porteChiuse = porteChiuse;
        }
    
    }
    codice:
    import java.util.Scanner;
    public class Gioco {
    public static void main(String[] args){
        Stanza Terreno1 = new Stanza();
        Stanza Terreno2 = new Stanza();
        Stanza Terreno3 = new Stanza();
        Stanza[] Terreno1Uscite = {Terreno2,Terreno3}; //Stanze adiacenti alla stanza
        Stanza[] Terreno2Uscite = {Terreno3,Terreno1};
        Stanza[] Terreno3Uscite = {Terreno1,Terreno2};
        Terreno1.setUscite(Terreno1Uscite);
        Terreno2.setUscite(Terreno2Uscite);
        Terreno3.setUscite(Terreno3Uscite);
        Terreno1.setDescrizione("Bevenuto nel Terreno1"); 
        Terreno2.setDescrizione("Bevenuto nel Terreno2");
        Terreno3.setDescrizione("Benvenuto nel Terreno3");
        Terreno1.getDescrizione();
        String[] Terreno1PorteChiuse = {"codice","codice"}; //Come si aprono le porte nelle varie direzioni
        Terreno1.setPorteChiuse(Terreno1PorteChiuse);
        Boolean[] Terreno1UsciteChiuse = {true,true}; //Quali direzioni sono chiuse
        Terreno1.setUsciteChiuse(Terreno1UsciteChiuse); 
        Scanner dir = Terreno1.getDirezione(); //prendo la prima direzione
        Terreno1.miMuovo(dir); 
    }
    }
    codice:
    import java.util.Scanner;
    
    public class Porta {
        
        private String s;
        
        
        public Boolean Aprimi(String s){
            System.out.println("La porta è chiusa");
            switch(s){
            case "codice":
                System.out.println("Serve un codice per aprirla!");
                Scanner stringaInserita = this.getInput();
                String codiceInserito = stringaInserita.nextLine();
                if (codiceInserito=="1234"){
                    return true;
                }
                
            }
            return false;
        }
    
    
        private Scanner getInput(){
            System.out.println("Dimmi come");
            Scanner inputInserito = new Scanner(System.in);
            return inputInserito;
        }
    }
    E restituisce questo messaggio di errore:
    Exception in thread "main" java.lang.NullPointerException
    at Stanza.miMuovo(Stanza.java:35)
    at Stanza.miMuovo(Stanza.java:55)
    at Stanza.miMuovo(Stanza.java:55)
    at Gioco.main(Gioco.java:22)
    Quando inserisco come input "n".

    Chi mi può aiutare?

  2. #2
    ciao,
    in primis questo e' sbagliato
    codice:
      if (codiceInserito=="1234"){
    Le stringhe si eguagliano con il metodo equals o equalsIgnoreCase quindi ==> codiceInserito.equals("1234")

    Per il tuo errore quando chiami
    codice:
     Stanza Stanza1 = usciteStanza[0];
    Dove hai istanziato e riempito usciteStanza[0] visto che non esiste nemmeno costruttore ? (infatti metti costruttore vuoto).

    Quando istanzi questi (gi� ci sarebbe molto da ridire perch� le varibili si scrivono con l'iniziale minuscola ES. Stanza terreno1 oppure Stanza[] terreno1Uscite, proprio per differenziarli dagli oggetti.)

    codice:
       Stanza Terreno1 = new Stanza();
        Stanza Terreno2 = new Stanza();
        Stanza Terreno3 = new Stanza();
        Stanza[] Terreno1Uscite = {Terreno2,Terreno3}; //Stanze adiacenti alla stanza
        Stanza[] Terreno2Uscite = {Terreno3,Terreno1};
        Stanza[] Terreno3Uscite = {Terreno1,Terreno2};
        Terreno1.setUscite(Terreno1Uscite);
    istanzi delle stanze vuote "empty", quindi siccome a monte usciteStanza sar� null la set ti caricher� un oggetto null.

    Ciao
    Ultima modifica di schumy2000; 20-02-2017 a 18:39
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  3. #3
    Quote Originariamente inviata da schumy2000 Visualizza il messaggio
    ciao,
    in primis questo e' sbagliato
    codice:
      if (codiceInserito=="1234"){
    Le stringhe si eguagliano con il metodo equals o equalsIgnoreCase quindi ==> codiceInserito.equals("1234")

    Per il tuo errore quando chiami
    codice:
     Stanza Stanza1 = usciteStanza[0];
    Dove hai istanziato e riempito usciteStanza[0] visto che non esiste nemmeno costruttore ? (infatti metti costruttore vuoto).

    Quando istanzi questi (gi� ci sarebbe molto da ridire perch� le varibili si scrivono con l'iniziale minuscola ES. Stanza terreno1 oppure Stanza[] terreno1Uscite, proprio per differenziarli dagli oggetti.)

    codice:
       Stanza Terreno1 = new Stanza();
        Stanza Terreno2 = new Stanza();
        Stanza Terreno3 = new Stanza();
        Stanza[] Terreno1Uscite = {Terreno2,Terreno3}; //Stanze adiacenti alla stanza
        Stanza[] Terreno2Uscite = {Terreno3,Terreno1};
        Stanza[] Terreno3Uscite = {Terreno1,Terreno2};
        Terreno1.setUscite(Terreno1Uscite);
    istanzi delle stanze vuote "empty", quindi siccome a monte usciteStanza sar� null la set ti caricher� un oggetto null.

    Ciao
    Ciao, grazie di aver risposto.
    Ho innanzitutto sostituito l'uguaglianza delle stringhe. Volevo capire meglio questo fatto del costruttore vuoto. Il settere può avere ritorno void, o sbaglio? Di fatto non ho cercato lì l'errore perché quella parte funziona perfettamente, di fatto il codice non produce errore se mi muovo a sud, a ovest o a est, ma solo se decido di muovermi a nord, quando faccio fare il controllo.
    codice:
        //Le stanze adiacenti possibili
        public void setUscite(Stanza uscite[]){
            this.usciteStanza = uscite;
        }
        
        public Stanza[] getUscite(){
            return usciteStanza;
        }
    Quando mi dici che ho instanziato "Stanze vuote" è perché ho scritto
    codice:
    Stanza Terreno1 = new Stanza();
        Stanza Terreno2 = new Stanza();
        Stanza Terreno3 = new Stanza();
    ?
    Perché a questo punto forse ho delle grosse lacune, in quanto io non ho dichiarato nessun costruttore, quindi, essendoci quello di default non dovrei avere problemi a instanziare un oggetto in questa maniera.

    Ciao, grazie ancora.

  4. #4
    Ciao,
    Si infatti essendoci quello di default l'oggetto viene istanziato ma tutti gli oggetti che hai dichiarato sono nulli. private String dir;
    private Scanner s;
    private Stanza[] usciteStanza;
    private String Descrizione;
    private Boolean[] usciteChiuse;
    private Porta porta;
    private String[] porteChiuse;
    private Boolean statoPorta;

    Inoltre perché dichiari Scanner s, se poi lo dichiari nuovamente all'interno del metodo?
    codice:
      public Scanner getDirezione(){
            System.out.println("Dove vorresti muoverti?");
            Scanner s = new Scanner(System.in);
            return s;
        }
    Sai che sono due oggetti diversi e con due diversi scope?

    Non voglio essere critico, ma forse e' meglio che studi ancora un po prima di buttarsi in questi programmi un po' complicati, perche' bisogna avere un background abbastanza completo per affrontare problemi un po' più seri.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  5. #5
    Quote Originariamente inviata da schumy2000 Visualizza il messaggio
    Ciao,
    Si infatti essendoci quello di default l'oggetto viene istanziato ma tutti gli oggetti che hai dichiarato sono nulli. private String dir;
    private Scanner s;
    private Stanza[] usciteStanza;
    private String Descrizione;
    private Boolean[] usciteChiuse;
    private Porta porta;
    private String[] porteChiuse;
    private Boolean statoPorta;

    Inoltre perché dichiari Scanner s, se poi lo dichiari nuovamente all'interno del metodo?
    codice:
      public Scanner getDirezione(){
            System.out.println("Dove vorresti muoverti?");
            Scanner s = new Scanner(System.in);
            return s;
        }
    Sai che sono due oggetti diversi e con due diversi scope?

    Non voglio essere critico, ma forse e' meglio che studi ancora un po prima di buttarsi in questi programmi un po' complicati, perche' bisogna avere un background abbastanza completo per affrontare problemi un po' più seri.
    Ciao,
    non mi ero accorto dell'errore sullo scanner. Ho corretto.
    Detto questo, gli oggetti sono vuoti, ma vengono riempiti successivamente attraverso i setter. Dalla teoria e daglia esercizi sul libro ho riscontrato esattamente lo stesso modo di agire.
    Non è sbagliato dichiarare oggetti vuoti e riempirli successivamente, siamo solo d'accordo sul fatto che potrebbe non essere professionale o efficente, ma si allonta molto dal mio scopo princiapale.

    L'errore del post iniziale consisteva nel non riempire mai l'oggetto porta, quindi quando richiamavo il metodo
    codice:
    statoPorta = porta.Aprimi(comeSiApre[0]);
    all'interno del metodo miMuovo() della classe stanza avevo ovviamente un errore.
    Corregendo questa cosa ho risolto, e ora il mio programma permette di muoversi liberamente e di aprire porte senza nessun errore.

Tag per questa discussione

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.