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

    Estrazione random da una lista

    Salve, vorrei fare un programma che gestisca un mazzo e un giocatore peschi a caso da una collezione di carte.
    Classe mazzo:
    codice:
    package gioco2;
    import java.util.*;
    public class Mazzo {
        HashSet s =new HashSet();
        Set Mazzo(){
        Carta a[]=null;
            for(int i=1;i<11;i++){
                for(int j=1;j<5;j++){
                   switch(j){
                       case 1:
                       a[i]= new Carta("Spade",i);
                       
                       break;
                       case 2:
                       a[i]=new Carta("Bastoni",i);
                       break;
                       case 3:
                       a[i]=new Carta("Coppe",i);
                       break;
                       case 4:
                       a[i]=new Carta("Danari",i);
                       break;
                   }
                 s.add(a[i]);  
                }
            }
        return s;
        }
        
    }
    Classe giocatore:
    codice:
    package gioco2;
    
    import java.util.Iterator;
    
    
    public class Giocatore {
          Mazzo s;
          void estraidalmazzo(){
          
        
    
    }
    
    }
    Vorrei che la funzione estraidalmazzo, estragga tot carte random dalla lista precedentemente creata.
    Ultima modifica di JavaAddicted; 23-04-2015 a 22:43

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da JavaAddicted Visualizza il messaggio
    Salve, vorrei fare un programma che gestisca un mazzo e un giocatore peschi a caso da una collezione di carte.
    Innanzitutto:

    Set Mazzo(){

    è un metodo ... non un costruttore. Poi comunque Mazzo in teoria (e per un buon design), non dovrebbe fornire di fuori la collezione ma al massimo le singole carte.
    Inoltre, piuttosto che un set, ti converrebbe usare una lista, che è più facile da "indirizzare" per indice.

    Segui questi passi:

    1) in Mazzo tieni un campo private di tipo List<Carta>, inizializzato con un ArrayList<Carta> (se non conosci i "generics" usali anche non parametrizzati, solo List / ArrayList .... chiaramente dovrai fare poi tu dei cast).

    2) metti un costruttore pubblico senza argomenti

    public Mazzo() { ........... }

    che inizializza il mazzo (con i vari cicli come hai fatto) e ogni nuova carta la aggiunge con es. lista.add(carta). Nota: NON ti serve usare un Carta[]

    3) metti un metodo di istanza es.

    public Carta estraiCarta()

    dove dentro usi il size() della lista per estrarre "casualmente" un indice compreso tra 0 (incluso) e il size (escluso). Puoi usare Math.random() o la classe java.util.Random ... a tua scelta. Devi solo tirare fuori un indice casualmente.
    Prendi la carta all'indice, la rimuovi (per indice) dalla lista e la restituisci.

    Se hai dubbi, chiedi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ciao, innanzitutto grazie per la risposta, non capisco bene cosa devo fare nel punto 1 e 3, potresti farmi degli esempi?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da JavaAddicted Visualizza il messaggio
    Ciao, innanzitutto grazie per la risposta, non capisco bene cosa devo fare nel punto 1 e 3, potresti farmi degli esempi?
    Molto molto abbozzato:

    codice:
    public class Mazzo {
        private List<Carta> carte;
    
        public Mazzo() {
            carte = new ArrayList<Carta>();
    
            //... tuoi cicli, creazione carte e tanti inserimenti nella lista
            //... es.  carte.add(new Carta("Spade", i));
        }
    
        public Carta estraiCarta() {
            //... estrai indice casuale 0 <= x < carte.size()
            //... prendi Carta al indice, rimuovi da carte e restituisci
        }
    }

    Per l'estrazione casuale, ripeto, vedi o Math.random() o la classe java.util.Random. Trovi innumerevoli esempi in rete.

    Puoi anche sfruttare una caratteristica utile del remove(int index) di List. Ti restituisce l'elemento che hai rimosso. Quindi non hai nemmeno da fare un get.

    E ripeto ancora, se non conosci i "generics", puoi togliere quei <Carta>. Nel estraiCarta dovrai però fare un cast perché solo List ti dà oggetti come Object e devi fare tu un cast a Carta.

    Ah, e un'altra cosa che non ho detto prima. Il size() può dare 0 e ovviamente vuol dire che non avresti più carte da estrarre. In questo caso puoi restituire null o lanciare una eccezione (a tua scelta).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ho seguito i tuoi consigli e mi è uscito questo codice:
    Classe Carta:
    codice:
    package gioco2;
    
    
    
    
    
    public class Carta {
    public String seme;    
    public int valore;
    
    
    Carta(String a,int b){
    seme=a;
    valore=b;
    };
    
    
    }
    Classe giocatore:
    codice:
    package gioco2;
    
    
    import java.util.ArrayList;
    import java.util.List;
    
    
    
    
    public class Giocatore {
    List g;
    Giocatore(int numerocarte, Mazzo mazzo){  //sceglie quante carte vuole e le estrae
    g= new ArrayList();
    for(int i=0;i<numerocarte;i++){
    Carta tmp =mazzo.estraimazzo(); //estrae dal mazzo quante volte hai scelto di pescare
    g.add(tmp);
    }
    }
    }
    Classe Mazzo:
    codice:
    package gioco2;import java.util.*;
    
    
    public class Mazzo {
      Set mazzo; // inizializzo il mazzo;
      
      Mazzo(){ // creo un set mazzo, costruttore
      this.mazzo=  new HashSet();
      for(int i=1;i<11;i++){
          Carta c1= new Carta("Bastoni",i);
          mazzo.add(c1);
          Carta c2= new Carta("Spade",i);
          mazzo.add(c2);
          Carta c3= new Carta("Coppe",i);
          mazzo.add(c3);
          Carta c4= new Carta("Danari",i);
          mazzo.add(c4);
       }
      }
      Carta estraimazzo(){ //estraggo carta casuale dal mazzo
      Iterator x = mazzo.iterator();
      Object tmp=x.next();
      mazzo.remove(tmp);
      Carta res=(Carta)tmp;
      
      return res;
      }
    }
    Classe Briscola:
    codice:
    package gioco2;
    
    
    import java.util.Comparator;
    
    
    /**
     *
     * @author FinallyDou
     */
    public class Briscola implements Comparator<Carta> {
    
    
        @Override
        public int compare(Carta o1, Carta o2) { //ordina prima per numero poi per seme
        int res=0;
        if(o1.valore<o2.valore) res=-1;
        else if(o1.valore==o2.valore){
             int x=o1.seme.compareTo(o2.seme);
             if(x<0) res=-1;
             else if(x==0) res=0;
             else res=1;
        }
        else res=1;
        return res;
        
        }
        
    }
    Classe Scopone:
    codice:
    
    package gioco2;
    
    
    import java.util.Comparator;
    
    
    /**
     *
     * @author FinallyDou
     */
    public class Scopone implements Comparator <Carta> {
    
    
        @Override
        public int compare(Carta o1, Carta o2) {  //ordina prima per seme poi per numero
            int res=0;
            int x=o1.seme.compareTo(o2.seme);
            if(x<0) res=-1;
            else if(x==0)
                if(o1.valore==o2.valore) res=0;
                else if(o1.valore<o2.valore) res=-1;
            else
                    res=1;
        return res;    
        }
        }
    Classe Main:
    codice:
    
    package gioco2;
    
    
    import javax.swing.JOptionPane;
    
    
    
    
    public class Gioco2 {
        
    
    
        
        public static void main(String[] args) {
           Mazzo m = new Mazzo();
           Giocatore g = new Giocatore(Integer.parseInt(JOptionPane.showInputDialog("Quante carte vuoi?")),m);
           int risp=Integer.parseInt(JOptionPane.showInputDialog("1.Ordina briscola   2.Ordina scopa"));
           switch(risp){
               case 1:
                   Briscola b = new Briscola();
                   
                   break;
               case 2:
                   Scopone s = new Scopone();
                   
                   break;
           }
           
        }
        
    }
    L'esercizio chiedeva di ordinare le carte che pescavi secondo la briscola o scopone, nel main ho fatto un switch per scegliere tra le diverse modalità. Il mio dubbio è come faccio a dire al programma di restituirmi le carte che ho pescato? Ho provato un sort però mi da errore.
    Scusa la mia ignoranza ma sono alle prime armi in java . Ti ringrazio per la pazienza

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da JavaAddicted Visualizza il messaggio
    Ho seguito i tuoi consigli
    Nì ... alcune cose non le hai proprio seguite ...

    Capisco che sei all'inizio ma innanzitutto:
    - metti i campi di istanza private.
    - metti i metodi "accessori" getter/setter public.
    - metti i costruttori public
    (se non ci sono altre esigenze ben più precise .... in Mazzo e Giocatore non hai fatto nulla di tutto questo!!)

    Poi hai usato un HashSet. Di per sé HashSet non garantisce "casualità". In altre parole, HashSet non è certo fatto per fare da generatore di dati "pseudo" casuali.


    Quote Originariamente inviata da JavaAddicted Visualizza il messaggio
    Il mio dubbio è come faccio a dire al programma di restituirmi le carte che ho pescato? Ho provato un sort però mi da errore.
    Da quanto posso capire, devi ordinare secondo l'ordinamento di Briscola/Scopone (che sono dei comparator), le N carte estratte dal giocatore.
    Bene:
    - l'oggetto Giocatore ce l'hai
    - le carte pescate dal Giocatore le hai (sono in Giocatore, nella lista che devi passare a sort)
    - il comparatore (Briscola/Scopone) ce l'hai, che devi passarlo al sort

    Quindi quale è il dubbio?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Capisco che sei all'inizio ma innanzitutto:
    - metti i campi di istanza private.
    - metti i metodi "accessori" getter/setter public.
    - metti i costruttori public
    Queste le mettevo a lavoro "finito", ho messo un ArrayList al posto del hashset

    le carte pescate dal Giocatore le hai (sono in Giocatore, nella lista che devi passare a sort)
    è in questo punto che mi da errore
    Codice: giocatore.g.Sort(b);
    Ultima modifica di JavaAddicted; 24-04-2015 a 18:18

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da JavaAddicted Visualizza il messaggio
    è in questo punto che mi da errore
    Codice: giocatore.g.Sort(b);
    Le liste NON hanno un sort.
    Il sort è un metodo statico di java.util.Collections


    https://docs.oracle.com/javase/8/doc...il.Comparator-
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Risolto grazie
    Ultima modifica di JavaAddicted; 24-04-2015 a 18:48

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.