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.