Ho finito il programma..Che ne pensate? Vedete qualke bugs? Qualke miglioria?!?!Devo consegnarlo al prof e non vorrei ke ci fossero imperfezioni..Come posso fare per dichiarare il vincitore?!? Ecco il sorgente.

Ci sono 3 file:mazzo, arbitro, giocatore: vorrei anke metterlo in rete..come si fa??
------------------------------------
import javax.swing.*;

public class Mazzo
{

private int numeroCarte;
private int colori;
public int mazzo[]; //Crea un array di carte
private int last;
private int primo;
private int libero;
private int cartaCorrente;
private String output;
private String output2;
private boolean verify;
JTextArea outputArea;
JScrollPane scroller;

public Mazzo(int n , int c) //Costruttore della classe mazzo di carte
{
numeroCarte = n;
colori = c;
int primo=0;
int libero=0;
mazzo = new int[ numeroCarte*colori ];
cartaCorrente = 0;
last = -1;
output ="";
output2="";
verify = false;
outputArea = new JTextArea(20,26);
scroller = new JScrollPane(outputArea);

for ( int count = 0; count < mazzo.length; count++ )
mazzo[ count ] = (count+1)%colori;
}

public void mescola()
{
/* Per ogni carta dell'array ne sceglie un'altra a caso e compie uno swap tra le due */

for ( int first = 0; first < mazzo.length; first++ )
{
int second = ( int ) ( Math.random() * numeroCarte );
int temp = mazzo[ first ];
mazzo[ first ] = mazzo[ second ];
mazzo[ second ] = temp;
}
}

public synchronized void distribuisci( int num,int manoGioc[],int tot )
{
for ( int count = 0 ; count < tot ; count ++ )
{
manoGioc[count] = mazzo[cartaCorrente];
cartaCorrente++;
}
primo = cartaCorrente;
}

public synchronized boolean pesca( int num , int manoGioc[] ,int tot )
{
while( num == last )
{
try // Permette di accedere al metodo
{ // distribuisci solo ad un giocatore alla volta
wait(); // e inoltre non permette l'accesso all'ultimo che
} // ha appena preso la carta.
catch( InterruptedException e )
{
output=( "Thread "+num+" interrotto in attesa .\n" );
display(2,output);

}
}

last = num;
int cartaTmp = mazzo[primo];
output = ("Il giocatore "+num+" pesca una carta di colore " +Colora(cartaTmp)+".\n");
display(2,output);

verify = verifica( num, cartaTmp , manoGioc , tot );
if ( verify == true )
{
output = ("Il giocatore "+num+" ha vinto la partita.\n");
display(3,output);
System.exit(0);
}
else
{
int i = scegliCarta( manoGioc );
//int i = (int)(Math.random()*tot);
mazzo[libero]=manoGioc[i];
output = ("Il giocatore "+num+" scarta una carta di colore "+Colora(manoGioc[i])+".\n");
primo = (primo+1)%(numeroCarte*colori);
libero = (libero+1)%(numeroCarte*colori);
manoGioc[i]=cartaTmp;

display(2,output);

}

notifyAll();

return verify;
}



public boolean verifica(int num, int cartaTmp , int manoGioc[] , int tot)
{
int equal=0;
for (int count = 0;count < tot;count++)
{
if(cartaTmp==manoGioc[count])
equal++;

output=("Il giocatore "+num+" ha in mano una carta di colore "+Colora(manoGioc[count])+".\n" );
display(2,output);
}

if (equal==tot-1)
return true;
else
return false;

}

public void display (int scelta ,String output)
{
switch(scelta)
{
case 1:
output2+=("I giocatori giocano con "+numeroCarte+" carte di "+colori+" colori diversi \n");
break;

case 2:
output2+=(output);
break;

case 3:
output2+=(output);
outputArea.setText(output2);
JOptionPane.showMessageDialog( null , scroller , "GIOCO DEL COLORE" , JOptionPane.INFORMATION_MESSAGE );
break;

}
}

public int scegliCarta (int manoGioc[])
{
int massimo = 0;
int frequenza[] = new int [colori];
for (int count = 0; count < numeroCarte ; count++)
{
++frequenza[ manoGioc[count] ];
}

for (int count = 0; count < (colori-1) ; count++)
{
if(frequenza[count] > frequenza[count+1])
massimo = count;
else
massimo = count+1;
}
int counter = 0;
while(manoGioc[counter] == massimo && counter < numeroCarte)
{
counter++;
}
return counter;
}

public String Colora (int colore)
{
String c = null;
switch(colore)
{
case 0:
c = "Bianco";
break;

case 1:
c = "Rosso";
break;

case 2:
c = "Verde";
break;

case 3:
c = "Blu";
break;

case 4:
c = "Rosa";
break;

case 5:
c = "Viola";
break;
}

return c;
}
}
------------------------------
import javax.swing.*;

public class Giocatore extends Thread
{
private Mazzo mazzo;
private int number; /* Identificativo del giocatore */
private int manoGiocatore[];
private int cDDistribuire;


public Giocatore (int cDD, int n ,Mazzo m)
{
cDDistribuire = cDD ;
number = n ;
mazzo = m ;
manoGiocatore = new int [cDDistribuire];


}

public void run()
{

boolean controllo = false;
mazzo.distribuisci(number,manoGiocatore, cDDistribuire);
while(controllo == false )
{

controllo = mazzo.pesca(number,manoGiocatore,cDDistribuire);

}


}
}
-------------------------------------
import javax.swing.*;

public class Arbitro
{

public static void main (String args[])
{
/* Crea il mazzo fornendo numero
di carte e numero di colori */
String numero;
String colori;
String giocatori;
String testoIniz;
int n;
int c;
int g;

numero = JOptionPane.showInputDialog("Inserisci il numero di carte per colore : ");
n = Integer.parseInt(numero);
colori = JOptionPane.showInputDialog("Inserisci il numero di colori : ");
c = Integer.parseInt(colori);
giocatori = JOptionPane.showInputDialog("Inserisci il numero di giocatori : ");
g = Integer.parseInt(giocatori);
testoIniz="";


//if( (n*c) < ( (n*g) +g ) )
if (n*c<0)
{
JOptionPane.showMessageDialog(null,"Hai inserito un numero di giocatori troppo elevato","ATTENZIONE",JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
else
{
Mazzo mazzo = new Mazzo ( n , c );
mazzo.mescola();
mazzo.display(1,testoIniz);

for (int count = 0; count < g; count ++ )
{
/* Crea nuovi giocatori fornendo ad
ognuno di essi il proprio PID
ed il mazzo */

Giocatore player = new Giocatore (n , count , mazzo );
player.start();
}

}

}
}
------------------------

grazie a tutti.