PDA

Visualizza la versione completa : [JAVA] gioco del colore


Ol3iconfini
07-07-2004, 16:07
Ciao ragazzi, ho da risolvere :confused: un piccolo progetto..Da scrivere in JAVA :oVVoVe: ..Ogni aiuto ben accolto!

Il gioco del colore per m giocatori formulato nel modo seguente:
i giocatori dispongono di un mazzo di n=xy carte, suddivise in y colori differenti con x
carte per ogni colore. Si suppone n>xm+m.
Il mazzo posto al centro di un tavolo rotondo, intorno al quale sono seduti i giocatori.
Inizialmente, ogni giocatore preleva x carte dal mazzo. A questo punto inizia il gioco, nel
quale ogni giocatore esegue una successione di giocate. Ogni giocata consiste nel
prelevare la carta in testa al mazzo e nello scartare una carta scelta casualmente,
depositandola in testa al mazzo. I giocatori eseguono le giocate senza un ordine fisso,
salvo che:
il generico giocatore, dopo ogni giocata, attende che almeno un altro giocatore
abbia eseguito la sua giocata.
Il gioco termina, con la segnalazione del vincitore, quando un giocatore ha in mano x carte
dello stesso colore.
Definire in pseudo-codice il programma eseguito dal generico giocatore per un corretto
svolgimento del gioco, utilizzando variabili condivise e semafori.
Traccia:
Giocatorei :
inizializza();
while(TRUE) {
???
carta = prendi();
???
verifica_colore();
???
scarta();
???
}
Si pu ipotizzare di disporre delle seguenti funzioni:
- inizializza(): inizializza il giocatore con x carte;
- prendi(): prende una carta in testa al mazzo e la restituisce al giocatore;
- verifica_colore(): restituisce true se, con lultima carta prelevata, il giocatore
pu vincere (ha in mano tutte carte dello stesso colore pi quella da scartare), false
altrimenti;
- scarta(): sceglie una carta tra quelle del giocatore e la pone in testa al mazzo;
- get_pid(): restituisce lidentificatore del giocatore (intero > 0).


Come costruire il tutto??AIUTO :dh:

Lucked
07-07-2004, 21:14
bisogna prima parlare di come deve essere questo programma...
premesso che devi evitare situazioni limite come 20 carte 2 colori con 3 giocatori. per vedere che non rientri in una di queste condizioni basta che moltiplichi 3x10 e vedi che il numero sia minore del numero delle carte altrimenti impossibile iniziare il gioco.


l'idea questa: di avere un array di carte, caratterizzante solo il colore, quindi neanche un array di oggetti...(i metodi prendi carta e metti carta nel mazzo dovrebbero avere un loro conteggio delle carte date)

**************************************
inizialmente prendi sempre carte fino a che non arrivi a 10 e poi ne prendi una, verifichi con la procedura verifica_colore() se puoi vincere e poi ne scarti un'altra e vai avanti cosi.
**************************************

c'e da vedere nell'ottica che partecipi piu di un giocatore in che modo si succedono la mano, il mio consiglio : fai prima il progr. per un giocatore una volta che funziona, istanzi oggetti giocatori al quale gli fai fare un turno. turno = procedura asteriscata

Ol3iconfini
08-07-2004, 13:37
Allora la struttura del progetto deve prendere spunto da quest'altro programma..Spero possa aiutarci/vi.


public class Arbitro
{
public static void main(String args[]) {
// crea il campo di gioco
Campo campo = new Campo(Integer.parseInt(args[1]),Integer.parseInt(args[2]));
campo.popola();
int giocatori = Integer.parseInt(args[0]);
System.out.println("Sessione di gioco con " + giocatori + " giocatori");
for (int i=0;i<giocatori;i++) {
// crea il numero di giocatori richiesto
Giocatore player = new Giocatore(i,campo);
player.start();
}
}
}


public class Giocatore extends Thread
{
private Campo campo; // campo di gioco
private int number; // identificativo del giocatore
private int score;
public Giocatore(int n,Campo c) {
number = n;
campo = c;
score = 0; // score accumulato dal giocatore
}
public void run() {
int value;
int i = (int) (Math.random()*campo.getRow());
int j = (int) (Math.random()*campo.getColumn());
System.out.println("Selezione del giocatore " + number + " = (" + i + "," + j + ")");
boolean stop = false;
while (!stop) {
value = campo.seleziona(number,i,j);
if (value!=-1)
score += value;
else
stop = true;
}
System.out.println("Giocatore " + number + " termina con score = " + score);
}
}

class Campo
{
public static final int MAX_SCORE = 5;
private int last; // ultimo ad aver giocato
private int count; // numero di elementi della matrice occupati
private int row; // righe del campo
private int column; // colonne del campo
private int[][] field; // campo di gioco
public Campo(int r, int c) { // costruttore
count = 0;
last = -1;
row = r;
column = c;
field = new int[row][column];
}
public int getRow() {
return row;
}
public int getColumn() {
return column;
}
// dispone gli obiettivi sul campo di gioco. simulato con celle di valore diverso
public void popola() {
int score;
for (int i=0;i<row;i++)
for (int j=0;j<column;j++) {
score = (int) (MAX_SCORE * Math.random());
field[i][j] = score;
if (score!=0)
count++;
}
}


// metodo di accesso al campo di gioco
public synchronized int seleziona(int number,int i,int j) {
// non puo' giocare due volte di seguito
while (number==last) {
try {
wait();
}
catch (InterruptedException e) {
System.out.println("Thread " + number + "interrotto");
}
}
int value = field[i][j];
field[i][j] = 0;
last = number;
System.out.println("Score per giocatore " + number + " = " + value);
count --; // decrementa il numero di elementi ancora presenti
if (count<=0) {
System.out.println("Sessione di gioco terminata");
value = -1;
}
notifyAll();
return value;
}
}


VEdiamo un po'...Il prof. mi ha detto che un programmino semplicissimo..Possibile che nessuno in questo popo' di forum possa darmi una mano??? :dh: :dh: :cry:

Lucked
08-07-2004, 14:20
No, io l'avrei fatto diversamente, mi sembra ci siano troppi campi in piu che non si erano considerati. ad esempio lo score..

:oVVoVe: :oVVoVe: :oVVoVe:

Ol3iconfini
08-07-2004, 15:22
MA S OVVIO CHE SIA UNA COSA DIVERSA!! :D VOLEVO SOLO DARE UN MODELLO DI PROGRAMMA JAVA SU CUI COSTRUIRE IL PROGRAMMA SPECIFICO.. :messner: QUELLO ERA IL GIOCO DELLA BATTAGLIA NAVALE!! :bh: TIENI CONTO CHE QUESTO PROGRAMMA PER SISTEMI OPERATIVI. :madai!?: IL SENSO CHE VOLEVO DARTI UN CAMPIONE RITENUTO ESATTO..POI I PARTICOLARI SONO TUTTI DA CAMBIARE! :cry:

Lucked
08-07-2004, 16:04
Ah...ma infatti non capivo cosa c'entrasse :yuppi:
Anche io ti ho voluto dare un modello! Non l'hai letto? :cry:

p.s: quando dici "Si pu ipotizzare di disporre delle seguenti funzioni" vuol dire che non devi farle? Se cosi piu semplice, scrivi meno codice ma non lo puoi provare, ma forse il tuo prof vuole questo :ciauz: :ciauz: :ciauz:

blinkago
08-07-2004, 17:38
non c' nulla di difficile..
Hai definito i campi e i metodi del programma, prendi il tuo editor preferito e inizia a strendere il programma, prima scrivendo solo i campi e metodi, poi creando pian piano le operazioni da fare..
sono d'accordo x l'esempio, c' troppa oop.. non per nulla semplice per qualcuno non troppo esperto..

Ol3iconfini
10-09-2004, 16:30
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.

Ol3iconfini
11-09-2004, 12:22
POSSIBILE CHE NEL FORUM DI HTML NON CI SIA NEANCHE UNA PERSONA CAPACE DI DESTREGGIARSI CON ABILITA' CON JAVA?!?!? O UN CENTINAIO DI RIGHE DI CODICE METTONO K.O. TUTTI I NAVIGANTI?!?!? CAVOLO NEANCHE FOSSE STATO UN PROGRAMMA DELLA NASA..

netarrow
11-09-2004, 18:02
Originariamente inviato da Ol3iconfini
POSSIBILE CHE NEL FORUM DI HTML NON CI SIA NEANCHE UNA PERSONA CAPACE DI DESTREGGIARSI CON ABILITA' CON JAVA?!?!? O UN CENTINAIO DI RIGHE DI CODICE METTONO K.O. TUTTI I NAVIGANTI?!?!? CAVOLO NEANCHE FOSSE STATO UN PROGRAMMA DELLA NASA..

:dott:

Leggi il regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=588640) al punto 3...
Come vedrai nessuno obbligato a risponderti o a tua totale disposizione :nonono: , forse ognuno di noi ha da pensare gi alle sue 100ntinaia di righe di codice... e quando trova un po di tempo va sul forum ad aiutre qualcuno; io il thread l'ho visto ora e ti avrei anche risposto se dopo solo un giorno non avresti dato una reply cos arrogante...

:incupito:

Loading