classe Giocatore
classe Torneocodice:import java.util.*; public class Giocatore implements Comparable{ public String nome; public int id; Contatore partiteGiocate; List<Giocatore> compagniList; // lista dei compagni con i quali deve giocare public Giocatore() { this(0); } public Giocatore(int identificativo) { this.nome="Sconosciuto"; this.id=identificativo; this.partiteGiocate = new Contatore(); this.compagniList = new ArrayList<Giocatore>(); } public void nuovaListaCompagni(Giocatore [] g) { for(Giocatore a: g) { if(a.id!=this.id) // se il giocatore non è se stesso lo si aggiunge ai compagni compagniList.add(a); } } public void stampaGiocatore() { System.out.printf("%-8s %-10s ID: %2d nP: %2d","Nome:", this.nome, this.id, this.partiteGiocate.getValore()); } @Override public int compareTo(Object o) { // per comparare Giocatore con l'oggetto bisogna fare un cast dell'oggetto if(this.partiteGiocate.cmpContatore(((Giocatore)o).partiteGiocate.getValore())) return 0; // ritorna 0 se sono uguali else if(this.partiteGiocate.isLessNumber(((Giocatore)o).partiteGiocate.getValore())) return -1; // -1 se l'oggetto corrente è minore else return 1; // altrimenti è maggiore e ritorna 1 } public boolean scegliCompagno(List<Giocatore> compagniScelti) { Giocatore temp = new Giocatore(); boolean esisteGiocatore=false; if(!compagniList.isEmpty()) // se la lista dei compagni da scegliere non è vuota { Collections.sort(compagniList); // ordina la lista dei compagni per numero di partite giocate for(Giocatore i: compagniList) { if(!compagniScelti.contains(i)) // se il giocatore non è già stato scelto in giornata lo aggiunge ed esce dal ciclo { temp=i; compagniScelti.add(this); compagniScelti.add(i); this.partiteGiocate.incContatore(); esisteGiocatore=true; break; } } if(esisteGiocatore) // se ha trovato un giocatore da aggiungere { temp.partiteGiocate.incContatore(); compagniList.remove(temp); return true; // ritorna vero se ha aggiuto un giocatore } } return false; // ritorna false se non esistono giocatori nella lista compagni che ancora non hanno giocato in giornata } public boolean CompagnoGiaGiocato(List<Giocatore> compagniScelti) { Giocatore temp = new Giocatore(); if(!compagniList.isEmpty()) // se non e' vuota { Collections.sort(compagniList); // la riordina temp=compagniList.get(0); // copia in temp il primo elemento della lista che sarà quello con meno partite compagniScelti.add(this); compagniScelti.add(temp); this.partiteGiocate.incContatore(); temp.partiteGiocate.incContatore(); compagniList.remove(temp); System.out.printf("In questa giornata |%-10s ID: %2d| giocherà 2 volte\n", temp.nome, temp.id); return true; } return false; } }
classe Maincodice:import java.util.*; public class Torneo { int partecipanti; public Giocatore [] vetGiocatori; public Torneo(int n) { partecipanti=n; vetGiocatori = new Giocatore[partecipanti]; resetGiocatori(); } public void resetGiocatori() { for(int i=0; i<vetGiocatori.length; i++) vetGiocatori[i] = new Giocatore(i+1); } public void accoppiamenti() { for(Giocatore a: vetGiocatori) a.nuovaListaCompagni(vetGiocatori); } private void stampaListaGiornata(List<Giocatore> compagniScelti) { int i=1; for(Giocatore n: compagniScelti) { n.stampaGiocatore(); if(i%2==0) System.out.println(); else System.out.printf("\te\t"); i++; } } public void calcoloGiornata() { List<Giocatore> compagniScelti = new ArrayList<Giocatore>(); Giocatore temp = new Giocatore(); while(compagniScelti.size()<16 && !tutteListeVuote()) { Arrays.sort(vetGiocatori); if(tuttiUguali()) // se tutti i giocatori hanno le stesse partite fa una scelta random vetGiocatori[sceltaRandom()].scegliCompagno(compagniScelti); else { for(Giocatore a: vetGiocatori) { if(!compagniScelti.contains(a)) { temp=a; if(temp.compagniList.isEmpty()) // se il giocatore scelto ha finito i compagni passa al prossimo continue; else break; } } // fine for if(!temp.scegliCompagno(compagniScelti)) // se tutti i compagni di temp hanno già giocato in giornata { if(!temp.CompagnoGiaGiocato( compagniScelti)) // sceglie un compagno che ha già giocato in giornata { // se si entra in questo if il giocatore ha finito i compagni (NON DOVREBBE MAI SUCCEDERE) temp.stampaGiocatore(); System.out.printf("\nHa finito i compagni\n"); stampaLista(temp.compagniList); System.out.println(); stampaLista(compagniScelti); System.exit(-1); } } } // fine else } // fine while System.out.println(); stampaListaGiornata(compagniScelti); } private boolean tutteListeVuote() { // ritorna vero se tutte le liste dei giocatori sono vuote for(Giocatore g: vetGiocatori) { if(!g.compagniList.isEmpty()) // se una lista non e' vuota ritorna falso return false; } return true; } private int sceltaRandom() { return (int)Math.floor(Math.random()*vetGiocatori.length); // sceglie un giocatore random tra tutti i partecipanti } private boolean tuttiUguali() { // ritorna true se tutti i partecipanti hanno lo stesso numero di partite for(int i=0; i<vetGiocatori.length-1; i++) { if(!vetGiocatori[i].partiteGiocate.cmpContatore(vetGiocatori[i+1].partiteGiocate.getValore())) // se qualche giocatore e' diverso pone uguali false return false; } return true; } public void stampaLista(List<Giocatore> lista) { for(Giocatore a: lista) { a.stampaGiocatore(); System.out.println(); } } }
La classe contatore è la stessa che ho postato prima quindi non la copio...codice:public class Main { /** * @param args */ public static void main(String[] args) { String [] nomi = {"Buffon","Grosso","Cannavaro","Materazzi","Zambrotta","Gattuso","Pirlo","De Rossi", "Totti","Camoranesi","Perrotta","Del Piero","Toni","Gilardino","Inzaghi","Iaquinta","Peruzzi","Amelia"}; Torneo t = new Torneo(18); // crea un nuovo torneo for(int i=0; i<t.vetGiocatori.length ; i++) { t.vetGiocatori[i].nome=nomi[i]; } t.accoppiamenti(); // crea le liste per tutti i giocatori for(int i=0; i<39; i++) // in 39 giornate tutte le liste compagni finiscono { System.out.printf("Giornata %2d\n", i+1); t.calcoloGiornata(); } } }![]()
In questa versione tutti giocano tutte le partite mantenendo una gestione delle attese quasi perfetta. Il problema ora è che un giocatore eventualmente può dover giocare più di una volta a giornata...![]()
proverò a sistemare l'inghippo ricalcolando l'intera giornata se qualcuno è costretto a giocare 2 partite...
fammi sapere se hai altre idee![]()

Rispondi quotando
...

