Ciclo Polimorfico

di il
6 risposte

Ciclo Polimorfico

Classe java che definisce dato con n faccie, valori da 1 a n la classe impleemnta un costruttore che prendi in input un numero di facce un metodo int che lancia e ritorna un valore casuale tra 1 e n

devo poi definire classe dato e la sua sottoclasse dadotruccato che implementa questo comportamento, il valore di ogni lancio di dado è uguale al valore del lancio precedente aumentato di uno se il lancio supera n si riparte da 1 per esempio un dado con tre facce ritornera nell'ordine 1 2 3 1 2 3
scrivere classe Main che memorizza un vettore di due oggetti uno di tipo dado e uno di tipo dadotruccato che esegue un ciclo polimorfico e mostra il risultato di due lanci del primo dado seguiti da 2 lanci del secondo

io ho implementato il codice che è il seguente...
ma il problema è che mi stampa solo due valori casuali, non ritorna nulla nell'ordine richiesto
sicuramente il problema sarà nel ciclo for... come potrei aggiustarlo?

public class Dado {    
    Scanner scan = new Scanner(System.in);
  
    int facce;
    
    public Dado(int facce) {
    this.facce = facce;
           
    }
    public int lancia() {
      int casuale = (int)(Math.random()*facce); /*numero casuale tra 1 e facce
      digitato dall'utente  */
      return casuale;
    }
    
    @Override
    public String toString() {
        return Integer.toString(lancia());
        }
    
}

sottoclasse dado truccato:

public class DadoTruccato extends Dado { 

    public DadoTruccato(int facce) {
        super(facce);
    }
    
    @Override
    public int lancia() {
       if (super.lancia() + 1 >= super.facce) {
          return super.lancia();   
        }
       return super.lancia();
    }
    
    @Override
    public String toString() {
        return super.toString();
    }
}

MAIN:
blic static void main(String[] args) {
        // TODO code application logic here
        Scanner scan = new Scanner(System.in);
        System.out.println("inserire numero di facce");
        
        int n = scan.nextInt();
        Dado dado = new Dado(n);
        DadoTruccato dadoTruccato = new DadoTruccato(n);
        
        for(int i=0; i < 4;i++) {
           dado.lancia();
           dadoTruccato.lancia();          
       	 }
       
       } 
    }
      



Grazie mille in anticipo

6 Risposte

  • Re: Ciclo Polimorfico

    KernelPanic ha scritto:


    ma il problema è che mi stampa solo due valori casuali, non ritorna nulla nell'ordine richiesto
    sicuramente il problema sarà nel ciclo for... come potrei aggiustarlo?
    Beh, intanto il lancia() (di entrambe le classi) non stampa nulla. Quindi se nel main fai solo es. dado.lancia(); non "vedi" nulla in output. Ma questo è un altro discorso ..

    Il punto è che nel lancia() di DadoTruccato invochi 3 volte super.lancia() che dà un valore casuale. Quindi come puoi aspettarti una sequenza logica e prevedibile tipo 1 2 3 1 2 3 ..... ?
    Per buon senso, il lancia() di DadoTruccato NON dovrebbe nemmeno sfruttare il lancia() di Dado. Dovrebbe farsi la sua logica e basta.

    P.S. attenzione al range dei valori:
    (int)(Math.random()*facce)

    Se facce è 6, i valori vanno tra 0 e 5 inclusi. Non da 1 a 6 (come invece dovrebbe)
  • Re: Ciclo Polimorfico

    andbin ha scritto:


    Beh, intanto il lancia() (di entrambe le classi) non stampa nulla. Quindi se nel main fai solo es. dado.lancia(); non "vedi" nulla in output. Ma questo è un altro discorso ..

    Il punto è che nel lancia() di DadoTruccato invochi 3 volte super.lancia() che dà un valore casuale. Quindi come puoi aspettarti una sequenza logica e prevedibile tipo 1 2 3 1 2 3 ..... ?
    Per buon senso, il lancia() di DadoTruccato NON dovrebbe nemmeno sfruttare il lancia() di Dado. Dovrebbe farsi la sua logica e basta.
    ho risolto il problema del random aggiungendo un +1 finale, al di fuori di tutte le parentesi, grazie per avermelo fatto notare

    però non riesco a risolvere il problema dei lanci, in dado truccato non so come far ripartire il valore di lancio da 1 se supera il numero delle facce digitate dall'utente..
    
     public int lancioTruccato() {
           if (super.lancia() + 1 <= super.facce) {
              return super.lancia();   
            }
           else 
               return lancioTruccato();
        }
        
    questa è la modifica apportata al metodo nella sottoclasse dadoTruccato
    nel ciclo main ho stampato ma comunque continua a darmi valori casuali, e solo il primo lancio di dado truccato è aumentato di 1 rispetto al precedente


    se metto tre facce per esempio in input
    in output mi restituisce:
    "inserire numero di facce
    3
    lancio primo dado: 2
    lancio secondo: 2
    lancio primo dado: 2
    lancio secondo: 3"
  • Re: Ciclo Polimorfico

    KernelPanic ha scritto:


    però non riesco a risolvere il problema dei lanci, in dado truccato non so come far ripartire il valore di lancio da 1 se supera il numero delle facce digitate dall'utente..
    Ragiona: non ha senso che DadoTruccato sfrutti il lancia() di Dado. Una sequenza ben prevedibile come 1 2 3 1 2 3 1 2 .... di "casuale" non ha proprio nulla!
    Semplicemente DadoTruccato deve rifare del tutto la logica senza basarsi su quella di Dado. Quindi DadoTruccato semplicemente si tiene in una variabile di istanza l'ultimo/precedente valore e ad ogni lancia() lo incrementa. Se sfora chiaramente riparte dall'inizio.
    E' una sequenza .... nulla di più. Non "perderti" per queste cose ....
  • Re: Ciclo Polimorfico

    andbin ha scritto:


    Ragiona: non ha senso che DadoTruccato sfrutti il lancia() di Dado. Una sequenza ben prevedibile come 1 2 3 1 2 3 1 2 .... di "casuale" non ha proprio nulla!
    Semplicemente DadoTruccato deve rifare del tutto la logica senza basarsi su quella di Dado. Quindi DadoTruccato semplicemente si tiene in una variabile di istanza l'ultimo/precedente valore e ad ogni lancia() lo incrementa. Se sfora chiaramente riparte dall'inizio.
    E' una sequenza .... nulla di più. Non "perderti" per queste cose ....
    un po' sinceramente mi sono perso...
    ho modificato il lancio in questo modo
    
         public int lancioTruccato() {
            int valore = 0;
            for(int i=0; i < super.facce;i++) {
               valore++;
            }
            return valore;
         
          }
        
    ma comunque in output mi tornano valori del secondo lancio pari al valore inserito...
    sono un po' fuori strada
    poi non saprei come farlo ripartire in caso il valore superasse le facce
    probabilmente sto annegando in un bicchier d'acqua...
  • Re: Ciclo Polimorfico

    KernelPanic ha scritto:


    un po' sinceramente mi sono perso...
    ho modificato il lancio in questo modo
    
         public int lancioTruccato() {
            int valore = 0;
            for(int i=0; i < super.facce;i++) {
               valore++;
            }
            return valore;
         
          }
        
    No, non ha alcun senso quello che hai scritto.

    Lo ripeto ancora per l'ultima (speriamo..) volta: DadoTruccato deve dare una numerazione sequenziale e ripetitiva, stando a quanto hai detto. Se ci sono es. 4 facce, 1 2 3 4 1 2 3 4 1 2 ..... giusto?
    Bene, ad ogni invocazione del SUO lancia() (quello in override!) devi passare da un valore al successivo, salvo poi rifare il giro da 1 ovviamente quando sei arrivato al massimo.
    Questo vuol dire che per farlo devi MANTENERE all'interno dell'oggetto un valore, quello ultimo estratto o il prossimo da estrarre (a seconda di come si ragiona). E in sostanza vuol dire che devi mettere una variabile di istanza es.

    private int valore;

    In modo che il valore sia nell'oggetto (e non una banale variabile locale!). NON c'è nulla di strano nel fatto che gli oggetti DadoTruccato abbiano una variabile di istanza in più rispetto agli oggetti Dado !!

    KernelPanic ha scritto:


    poi non saprei come farlo ripartire in caso il valore superasse le facce
    Ripensa a questo alla luce di quanto ti ho appena detto.

    KernelPanic ha scritto:


    probabilmente sto annegando in un bicchier d'acqua...
    La tazzona del latte, non un bicchiere ....
  • Re: Ciclo Polimorfico

    Grazie mille! Ho risolto!!
Devi accedere o registrarti per scrivere nel forum
6 risposte