Groove89
25-11-2012, 18:28
Ciao ragazzi, sto letteralmente impazzendo nel fare un progetto personale, ossia il gioco briscola. E' la prima volta che tento di programmare un gioco completo e mi sono reso conto di aver sviluppato un codice veramente incasinato e non so veramente come districarmi adesso. Il problema principale che sto incontrando è come GESTIRE I TURNI dei due giocatori (umano e computer).
Posto il codice delle classi principali (è molto lungo).
Classe Giocatore
package singleplayer;
import java.util.HashSet;
import carta.Carta;
import classifica.RecordClassifica;
public class Giocatore
{
private String nome;
private RecordClassifica dati; //per la classifica
private HashSet<Carta> carte; //le carte in mano al giocatore
public Giocatore(String nome) {
this.nome = nome;
dati = new RecordClassifica(nome);
carte = new HashSet<Carta>();
}
public int quanteCarte() {
return carte.size();
}
public void setCarta(Carta c) {
carte.add(c);
}
public void rimuoviCarta(Carta c) {
carte.remove(c);
}
public String getNome() {
return nome;
}
public String toString() {
return "Giocatore: " + this.nome;
}
public HashSet<Carta> carte() {
return carte;
}
}
Classe GiocatoreElettronico
package singleplayer;
import java.util.HashSet;
import carta.Carta;
public class GiocatoreElettronico extends Giocatore {
private HashSet<Carta> carte;
public GiocatoreElettronico(String nome) {
super(nome);
carte = new HashSet<Carta>();
}
public int quanteCarte() {
return carte.size();
}
public void setCarta(Carta c) {
carte.add(c);
}
public void rimuoviCarta(Carta c) {
carte.remove(c);
}
}
Classe Partita
package singleplayer;
import java.util.HashSet;
import classifica.RecordClassifica;
import carta.Carta;
import carta.Mazzo;
public class Partita
{
private Giocatore giocatore;
private Giocatore avversario;
private Mazzo mazzo;
private final Carta briscola;
private RecordClassifica record;
public Partita(Giocatore a, Giocatore b, RecordClassifica r) {
this.giocatore = a;
this.avversario = b;
this.record = r;
mazzo = new Mazzo();
briscola = mazzo.getBriscola();
}
public RecordClassifica getRecordClassifica() {
return record;
}
public Giocatore getGiocatore() {
return giocatore;
}
public Giocatore getAvversario() {
return avversario;
}
public Carta getBriscola() {
return briscola;
}
public Mazzo getMazzo() {
return mazzo;
}
public int carteRimanenti() {
return mazzo.carteRimanenti();
}
public HashSet<Carta> distribuisciCarteGiocatore() {
Carta a1 = mazzo.estrai();
Carta a2 = mazzo.estrai();
Carta a3 = mazzo.estrai();
giocatore.setCarta(a1);
giocatore.setCarta(a2);
giocatore.setCarta(a3);
HashSet<Carta> ret = new HashSet<Carta>();
ret.add(a1);
ret.add(a2);
ret.add(a3);
return ret;
}
public HashSet<Carta> distribuisciCarteAvversario() {
Carta a1 = mazzo.estrai();
Carta a2 = mazzo.estrai();
Carta a3 = mazzo.estrai();
giocatore.setCarta(a1);
giocatore.setCarta(a2);
giocatore.setCarta(a3);
HashSet<Carta> ret = new HashSet<Carta>();
ret.add(a1);
ret.add(a2);
ret.add(a3);
return ret;
}
public Carta pescaGiocatore() {
Carta c = mazzo.estrai();
giocatore.setCarta(c);
return c;
}
public Carta pescaAvversario() {
Carta c = mazzo.estrai();
avversario.setCarta(c);
return c;
}
//Mossa del computer a seconda della Carta c
public Carta giocaAvversario(Carta c) {
Carta giocata = null;
//imposterò una logica di gioco per inizializzare giocata...
avversario.rimuoviCarta(giocata);
return giocata;
}
public void giocaGiocatore(Carta c) {
giocatore.rimuoviCarta(c);
}
}
Classe GuiPartita
package gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import singleplayer.Giocatore;
import singleplayer.Partita;
import carta.Carta;
import carta.Mazzo;
import classifica.RecordClassifica;
@SuppressWarnings("serial")
public class GuiPartita extends JFrame implements ActionListener
{
private String url = "images/sfondotavolo.jpg";
private MyPanel sfondo;
private Object notifica;
private Random random;
private Partita p;
private JPanel nord;
private JPanel centro;
private JPanel sud;
private Box boxes[];
private JLabel computer;
private JLabel nG;
//label che rappresentano le carte del computer
private JLabel avvUno;
private JLabel avvDue;
private JLabel avvTre;
//pulsanti che rappresentano le carte del giocatore
private JButton primaCarta;
private JButton secondaCarta;
private JButton terzaCarta;
//pulsante associato al mazzo
private JButton labelMazzo;
//label briscola
private JButton buttonBriscola;
//label carte rimanenti
private JLabel carteRimanenti;
//label carte giocate
private JLabel cartaGiocata1;
private JLabel cartaGiocata2;
//turno dei giocatori
boolean turnoGiocatore, turnoAvversario;
public GuiPartita(String titolo, Partita p) {
super(titolo);
this.p = p;
sfondo = new MyPanel(url);
notifica = null;
random = new Random();
int turno = random.nextInt(2); //-> 0 se tocca al giocatore, 1 all'avversario
if(turno==0)
turnoGiocatore = true; //-> turnoMazziere vale true se è il giocatore a dover fare da mazziere, false altrimenti
turnoAvversario = !turnoGiocatore; //-> Inizialmente è il turno di chi non fa il mazziere
RecordClassifica record = p.getRecordClassifica();
Giocatore giocatore = p.getGiocatore();
Giocatore avversario = p.getAvversario();
Container c = this.getContentPane();
sfondo.setLayout(new BorderLayout());
c.add(sfondo);
boxes = new Box[3];
boxes[0] = Box.createHorizontalBox();
boxes[1] = Box.createHorizontalBox();
boxes[2] = Box.createHorizontalBox();
//ZONA NORD: AVVERSARIO
computer = new JLabel("Computer");
computer.setForeground(Color.WHITE);
nord = new JPanel(new BorderLayout());
nord.setOpaque(false);
nord.add(computer, BorderLayout.NORTH);
avvUno = new JLabel();
avvUno.setPreferredSize(new Dimension(117,185));
avvUno.setMinimumSize(new Dimension(117,185));
avvUno.setMaximumSize(new Dimension(117,185));
avvUno.setOpaque(true);
avvDue = new JLabel();
avvDue.setPreferredSize(new Dimension(117,185));
avvDue.setMinimumSize(new Dimension(117,185));
avvDue.setMaximumSize(new Dimension(117,185));
avvDue.setOpaque(true);
avvTre = new JLabel();
avvTre.setPreferredSize(new Dimension(117,185));
avvTre.setMinimumSize(new Dimension(117,185));
avvTre.setMaximumSize(new Dimension(117,185));
avvTre.setOpaque(true);
boxes[0].setPreferredSize(new Dimension(745,229));
boxes[0].add(Box.createRigidArea(new Dimension(330,190)));
boxes[0].add(avvUno);
boxes[0].add(Box.createRigidArea(new Dimension(25,185)));
boxes[0].add(avvDue);
boxes[0].add(Box.createRigidArea(new Dimension(25,185)));
boxes[0].add(avvTre);
boxes[0].add(Box.createRigidArea(new Dimension(25,185)));
//ZONA SUD: GIOCATORE
String nomeGiocatore = giocatore.getNome();
String text = "Giocatore: " + nomeGiocatore;
nG = new JLabel(text);
nG.setForeground(Color.WHITE);
sud = new JPanel(new BorderLayout());
sud.setOpaque(false);
sud.add(nG, BorderLayout.NORTH);
primaCarta = new JButton();
primaCarta.setPreferredSize(new Dimension(117,185));
primaCarta.setMinimumSize(new Dimension(117,185));
primaCarta.setMaximumSize(new Dimension(117,185));
primaCarta.setOpaque(true);
secondaCarta = new JButton();
secondaCarta.setPreferredSize(new Dimension(117,185));
secondaCarta.setMinimumSize(new Dimension(117,185));
secondaCarta.setMaximumSize(new Dimension(117,185));
secondaCarta.setOpaque(true);
terzaCarta = new JButton();
terzaCarta.setPreferredSize(new Dimension(117,185));
terzaCarta.setMinimumSize(new Dimension(117,185));
terzaCarta.setMaximumSize(new Dimension(117,185));
terzaCarta.setOpaque(true);
boxes[1].setPreferredSize(new Dimension(745,229));
boxes[1].add(Box.createRigidArea(new Dimension(330,190)));
boxes[1].add(primaCarta);
boxes[1].add(Box.createRigidArea(new Dimension(25,185)));
boxes[1].add(secondaCarta);
boxes[1].add(Box.createRigidArea(new Dimension(25,185)));
boxes[1].add(terzaCarta);
boxes[1].add(Box.createRigidArea(new Dimension(25,185)));
//ZONA CENTRALE
centro = new JPanel(new BorderLayout());
centro.setOpaque(false);
carteRimanenti = new JLabel("Carte rimanenti: ");
carteRimanenti.setForeground(Color.WHITE);
centro.add(carteRimanenti, BorderLayout.SOUTH);
labelMazzo = new JButton();
labelMazzo.setPreferredSize(new Dimension(117,185));
labelMazzo.setMinimumSize(new Dimension(117,185));
labelMazzo.setMaximumSize(new Dimension(117,185));
labelMazzo.setOpaque(true);
buttonBriscola = new JButton();
buttonBriscola.setPreferredSize(new Dimension(117,185));
buttonBriscola.setMinimumSize(new Dimension(117,185));
buttonBriscola.setMaximumSize(new Dimension(117,185));
buttonBriscola.setOpaque(true);
cartaGiocata1 = new JLabel();
cartaGiocata1.setPreferredSize(new Dimension(117,185));
cartaGiocata1.setMinimumSize(new Dimension(117,185));
cartaGiocata1.setMaximumSize(new Dimension(117,185));
cartaGiocata1.setOpaque(true);
cartaGiocata1.setVisible(false);
cartaGiocata2 = new JLabel();
cartaGiocata2.setPreferredSize(new Dimension(117,185));
cartaGiocata2.setMinimumSize(new Dimension(117,185));
cartaGiocata2.setMaximumSize(new Dimension(117,185));
cartaGiocata2.setOpaque(true);
cartaGiocata2.setVisible(false);
boxes[2].add(Box.createRigidArea(new Dimension(15,185)));
boxes[2].add(labelMazzo);
boxes[2].add(Box.createRigidArea(new Dimension(15,185)));
boxes[2].add(buttonBriscola);
boxes[2].add(Box.createRigidArea(new Dimension(100,185)));
boxes[2].add(cartaGiocata1);
boxes[2].add(Box.createRigidArea(new Dimension(25,185)));
boxes[2].add(cartaGiocata2);
///////////////
nord.setPreferredSize(new Dimension(750,230));
nord.add(boxes[0], BorderLayout.CENTER);
centro.setPreferredSize(new Dimension(750,235));
centro.add(boxes[2], BorderLayout.CENTER);
sud.setPreferredSize(new Dimension(750,230));
sud.add(boxes[1], BorderLayout.CENTER);
sfondo.add(nord, BorderLayout.NORTH);
sfondo.add(sud, BorderLayout.SOUTH);
sfondo.add(centro, BorderLayout.CENTER);
this.setSize(750, 705);
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setVisible(true);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
//AVVIO PARTITA
start();
System.out.println("PARTITA TERMINATA");
}
//Svolgimento della partita
private void start() {
System.out.println("La partita ha inizio!");
boolean vittoria = false;
while(!vittoria) {
String urlB = p.getBriscola().getUrlImage(p.getBriscola().getSeme());
String urlM = p.getMazzo().getUrlImageMazzo();
//PASSO 1: operazioni preliminari
System.out.println("Distribuisco le carte ai giocatori");
operazioniPreliminari(urlB, urlM);
//Imposta il numero di carte rimanenti. E' da aggiornare ad ogni pescata
carteRimanenti.setText("Carte rimanenti: " + p.carteRimanenti());
System.out.println("Carte rimanenti: " + p.carteRimanenti());
if(turnoGiocatore) {
System.out.println("E' il turno del giocatore");
}
else System.out.println("E' il turno dell'avversario");
//PASSO 2: Si iniziano a giocare le carte
gestioneTurno();
}
}
private void gestioneTurno() {
if(turnoGiocatore) {
turnoGiocatore();
turnoAvversario();
}
else {
turnoAvversario();
turnoGiocatore();
}
}
private void turnoGiocatore() {
while(true) {
notifica = new Object();
synchronized (notifica) {
try {
nG.setText(p.getGiocatore().getNome() + " E' IL TUO TURNO!");
notifica.wait(); //-> Mi metto in attesa che il gioatore tiri
} catch (InterruptedException e) {
System.out.println("Errore nella sincronizzazione del turnoGiocatore");
}
}
primaCarta.addActionListener(this);
secondaCarta.addActionListener(this);
terzaCarta.addActionListener(this);
}
}
private void turnoAvversario() {
System.out.println("E' il turno dell'avversario");
}
@Override
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
if(source.equals(primaCarta)) {
String url = primaCarta.getText();
System.out.println("Il giocatore ha giocato la carta: " + url);
notifica.notify();
}
if(source.equals(secondaCarta)) {
String url = secondaCarta.getText();
System.out.println("Il giocatore ha giocato la carta: " + url);
notifica.notify();
}
if(source.equals(terzaCarta)) {
String url = terzaCarta.getText();
System.out.println("Il giocatore ha giocato la carta: " + url);
notifica.notify();
}
}
/**Si occupa di impostare la fase iniziale del gioco**/
private void operazioniPreliminari(String urlB, String urlM) {
//Imposta la label briscola
System.out.println("Scelgo la briscola");
Carta briscola = p.getBriscola();
briscola.volta();
Image img = briscola.getImage(new Dimension(117,185));
System.out.println("La briscola è: " + briscola.getSeme());
ImageIcon imgIc = new ImageIcon(img);
buttonBriscola.setIcon(imgIc);
buttonBriscola.setText(urlB); //Testo per il riconoscimento della carta selezionata
//Imposta la label mazzo
Mazzo m = p.getMazzo();
Image img_m = m.getImage(new Dimension(117,185));
ImageIcon imgIc_m = new ImageIcon(img_m);
labelMazzo.setIcon(imgIc_m);
labelMazzo.setText(urlM); //Testo per il riconoscimento della carta selezionata
//Distribuisce le carte ai giocatori
HashSet<Carta> cG = p.distribuisciCarteGiocatore();
HashSet<Carta> cA = p.distribuisciCarteAvversario();
String[] urlCG = new String[3];
String[] urlCA = new String[3];
Iterator<Carta> itG = cG.iterator();
int i = 0;
while(itG.hasNext()) {
Carta next = itG.next();
urlCG[i] = next.getUrlImage(next.getSeme());
i++;
}
Iterator<Carta> itA = cA.iterator();
int j = 0;
while(itA.hasNext()) {
Carta next = itA.next();
urlCA[j] = next.getUrlImage(next.getSeme());
j++;
}
Object[] carteAvv = cA.toArray();
Object[] carteGio = cG.toArray();
Image cA1 = ((Carta) carteAvv[0]).getImage(new Dimension(117,185));
Image cA2 = ((Carta) carteAvv[1]).getImage(new Dimension(117,185));
Image cA3 = ((Carta) carteAvv[2]).getImage(new Dimension(117,185));
ImageIcon imgIcA1 = new ImageIcon(cA1);
ImageIcon imgIcA2 = new ImageIcon(cA2);
ImageIcon imgIcA3 = new ImageIcon(cA3);
avvUno.setIcon(imgIcA1);
avvUno.setText(urlCA[0]);
avvDue.setIcon(imgIcA2);
avvDue.setText(urlCA[1]);
avvTre.setIcon(imgIcA3);
avvTre.setText(urlCA[2]);
((Carta) carteGio[0]).volta();
((Carta) carteGio[1]).volta();
((Carta) carteGio[2]).volta();
Image cG1 = ((Carta) carteGio[0]).getImage(new Dimension(117,185));
Image cG2 = ((Carta) carteGio[1]).getImage(new Dimension(117,185));
Image cG3 = ((Carta) carteGio[2]).getImage(new Dimension(117,185));
ImageIcon imgIcG1 = new ImageIcon(cG1);
ImageIcon imgIcG2 = new ImageIcon(cG2);
ImageIcon imgIcG3 = new ImageIcon(cG3);
primaCarta.setIcon(imgIcG1);
primaCarta.setText(urlCG[0]);
secondaCarta.setIcon(imgIcG2);
secondaCarta.setText(urlCG[1]);
terzaCarta.setIcon(imgIcG3);
terzaCarta.setText(urlCG[2]);
}
}
Come vedete la classe GuiPartita sta uscendo un bel casino.. oltre ai turni
ho incontrato problemi sul come ottenere la carta in base al JButton cliccato.
L'idea di un restyling completo mi spaventa tantissimo.. xD Aiuto :mc:
Posto il codice delle classi principali (è molto lungo).
Classe Giocatore
package singleplayer;
import java.util.HashSet;
import carta.Carta;
import classifica.RecordClassifica;
public class Giocatore
{
private String nome;
private RecordClassifica dati; //per la classifica
private HashSet<Carta> carte; //le carte in mano al giocatore
public Giocatore(String nome) {
this.nome = nome;
dati = new RecordClassifica(nome);
carte = new HashSet<Carta>();
}
public int quanteCarte() {
return carte.size();
}
public void setCarta(Carta c) {
carte.add(c);
}
public void rimuoviCarta(Carta c) {
carte.remove(c);
}
public String getNome() {
return nome;
}
public String toString() {
return "Giocatore: " + this.nome;
}
public HashSet<Carta> carte() {
return carte;
}
}
Classe GiocatoreElettronico
package singleplayer;
import java.util.HashSet;
import carta.Carta;
public class GiocatoreElettronico extends Giocatore {
private HashSet<Carta> carte;
public GiocatoreElettronico(String nome) {
super(nome);
carte = new HashSet<Carta>();
}
public int quanteCarte() {
return carte.size();
}
public void setCarta(Carta c) {
carte.add(c);
}
public void rimuoviCarta(Carta c) {
carte.remove(c);
}
}
Classe Partita
package singleplayer;
import java.util.HashSet;
import classifica.RecordClassifica;
import carta.Carta;
import carta.Mazzo;
public class Partita
{
private Giocatore giocatore;
private Giocatore avversario;
private Mazzo mazzo;
private final Carta briscola;
private RecordClassifica record;
public Partita(Giocatore a, Giocatore b, RecordClassifica r) {
this.giocatore = a;
this.avversario = b;
this.record = r;
mazzo = new Mazzo();
briscola = mazzo.getBriscola();
}
public RecordClassifica getRecordClassifica() {
return record;
}
public Giocatore getGiocatore() {
return giocatore;
}
public Giocatore getAvversario() {
return avversario;
}
public Carta getBriscola() {
return briscola;
}
public Mazzo getMazzo() {
return mazzo;
}
public int carteRimanenti() {
return mazzo.carteRimanenti();
}
public HashSet<Carta> distribuisciCarteGiocatore() {
Carta a1 = mazzo.estrai();
Carta a2 = mazzo.estrai();
Carta a3 = mazzo.estrai();
giocatore.setCarta(a1);
giocatore.setCarta(a2);
giocatore.setCarta(a3);
HashSet<Carta> ret = new HashSet<Carta>();
ret.add(a1);
ret.add(a2);
ret.add(a3);
return ret;
}
public HashSet<Carta> distribuisciCarteAvversario() {
Carta a1 = mazzo.estrai();
Carta a2 = mazzo.estrai();
Carta a3 = mazzo.estrai();
giocatore.setCarta(a1);
giocatore.setCarta(a2);
giocatore.setCarta(a3);
HashSet<Carta> ret = new HashSet<Carta>();
ret.add(a1);
ret.add(a2);
ret.add(a3);
return ret;
}
public Carta pescaGiocatore() {
Carta c = mazzo.estrai();
giocatore.setCarta(c);
return c;
}
public Carta pescaAvversario() {
Carta c = mazzo.estrai();
avversario.setCarta(c);
return c;
}
//Mossa del computer a seconda della Carta c
public Carta giocaAvversario(Carta c) {
Carta giocata = null;
//imposterò una logica di gioco per inizializzare giocata...
avversario.rimuoviCarta(giocata);
return giocata;
}
public void giocaGiocatore(Carta c) {
giocatore.rimuoviCarta(c);
}
}
Classe GuiPartita
package gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import singleplayer.Giocatore;
import singleplayer.Partita;
import carta.Carta;
import carta.Mazzo;
import classifica.RecordClassifica;
@SuppressWarnings("serial")
public class GuiPartita extends JFrame implements ActionListener
{
private String url = "images/sfondotavolo.jpg";
private MyPanel sfondo;
private Object notifica;
private Random random;
private Partita p;
private JPanel nord;
private JPanel centro;
private JPanel sud;
private Box boxes[];
private JLabel computer;
private JLabel nG;
//label che rappresentano le carte del computer
private JLabel avvUno;
private JLabel avvDue;
private JLabel avvTre;
//pulsanti che rappresentano le carte del giocatore
private JButton primaCarta;
private JButton secondaCarta;
private JButton terzaCarta;
//pulsante associato al mazzo
private JButton labelMazzo;
//label briscola
private JButton buttonBriscola;
//label carte rimanenti
private JLabel carteRimanenti;
//label carte giocate
private JLabel cartaGiocata1;
private JLabel cartaGiocata2;
//turno dei giocatori
boolean turnoGiocatore, turnoAvversario;
public GuiPartita(String titolo, Partita p) {
super(titolo);
this.p = p;
sfondo = new MyPanel(url);
notifica = null;
random = new Random();
int turno = random.nextInt(2); //-> 0 se tocca al giocatore, 1 all'avversario
if(turno==0)
turnoGiocatore = true; //-> turnoMazziere vale true se è il giocatore a dover fare da mazziere, false altrimenti
turnoAvversario = !turnoGiocatore; //-> Inizialmente è il turno di chi non fa il mazziere
RecordClassifica record = p.getRecordClassifica();
Giocatore giocatore = p.getGiocatore();
Giocatore avversario = p.getAvversario();
Container c = this.getContentPane();
sfondo.setLayout(new BorderLayout());
c.add(sfondo);
boxes = new Box[3];
boxes[0] = Box.createHorizontalBox();
boxes[1] = Box.createHorizontalBox();
boxes[2] = Box.createHorizontalBox();
//ZONA NORD: AVVERSARIO
computer = new JLabel("Computer");
computer.setForeground(Color.WHITE);
nord = new JPanel(new BorderLayout());
nord.setOpaque(false);
nord.add(computer, BorderLayout.NORTH);
avvUno = new JLabel();
avvUno.setPreferredSize(new Dimension(117,185));
avvUno.setMinimumSize(new Dimension(117,185));
avvUno.setMaximumSize(new Dimension(117,185));
avvUno.setOpaque(true);
avvDue = new JLabel();
avvDue.setPreferredSize(new Dimension(117,185));
avvDue.setMinimumSize(new Dimension(117,185));
avvDue.setMaximumSize(new Dimension(117,185));
avvDue.setOpaque(true);
avvTre = new JLabel();
avvTre.setPreferredSize(new Dimension(117,185));
avvTre.setMinimumSize(new Dimension(117,185));
avvTre.setMaximumSize(new Dimension(117,185));
avvTre.setOpaque(true);
boxes[0].setPreferredSize(new Dimension(745,229));
boxes[0].add(Box.createRigidArea(new Dimension(330,190)));
boxes[0].add(avvUno);
boxes[0].add(Box.createRigidArea(new Dimension(25,185)));
boxes[0].add(avvDue);
boxes[0].add(Box.createRigidArea(new Dimension(25,185)));
boxes[0].add(avvTre);
boxes[0].add(Box.createRigidArea(new Dimension(25,185)));
//ZONA SUD: GIOCATORE
String nomeGiocatore = giocatore.getNome();
String text = "Giocatore: " + nomeGiocatore;
nG = new JLabel(text);
nG.setForeground(Color.WHITE);
sud = new JPanel(new BorderLayout());
sud.setOpaque(false);
sud.add(nG, BorderLayout.NORTH);
primaCarta = new JButton();
primaCarta.setPreferredSize(new Dimension(117,185));
primaCarta.setMinimumSize(new Dimension(117,185));
primaCarta.setMaximumSize(new Dimension(117,185));
primaCarta.setOpaque(true);
secondaCarta = new JButton();
secondaCarta.setPreferredSize(new Dimension(117,185));
secondaCarta.setMinimumSize(new Dimension(117,185));
secondaCarta.setMaximumSize(new Dimension(117,185));
secondaCarta.setOpaque(true);
terzaCarta = new JButton();
terzaCarta.setPreferredSize(new Dimension(117,185));
terzaCarta.setMinimumSize(new Dimension(117,185));
terzaCarta.setMaximumSize(new Dimension(117,185));
terzaCarta.setOpaque(true);
boxes[1].setPreferredSize(new Dimension(745,229));
boxes[1].add(Box.createRigidArea(new Dimension(330,190)));
boxes[1].add(primaCarta);
boxes[1].add(Box.createRigidArea(new Dimension(25,185)));
boxes[1].add(secondaCarta);
boxes[1].add(Box.createRigidArea(new Dimension(25,185)));
boxes[1].add(terzaCarta);
boxes[1].add(Box.createRigidArea(new Dimension(25,185)));
//ZONA CENTRALE
centro = new JPanel(new BorderLayout());
centro.setOpaque(false);
carteRimanenti = new JLabel("Carte rimanenti: ");
carteRimanenti.setForeground(Color.WHITE);
centro.add(carteRimanenti, BorderLayout.SOUTH);
labelMazzo = new JButton();
labelMazzo.setPreferredSize(new Dimension(117,185));
labelMazzo.setMinimumSize(new Dimension(117,185));
labelMazzo.setMaximumSize(new Dimension(117,185));
labelMazzo.setOpaque(true);
buttonBriscola = new JButton();
buttonBriscola.setPreferredSize(new Dimension(117,185));
buttonBriscola.setMinimumSize(new Dimension(117,185));
buttonBriscola.setMaximumSize(new Dimension(117,185));
buttonBriscola.setOpaque(true);
cartaGiocata1 = new JLabel();
cartaGiocata1.setPreferredSize(new Dimension(117,185));
cartaGiocata1.setMinimumSize(new Dimension(117,185));
cartaGiocata1.setMaximumSize(new Dimension(117,185));
cartaGiocata1.setOpaque(true);
cartaGiocata1.setVisible(false);
cartaGiocata2 = new JLabel();
cartaGiocata2.setPreferredSize(new Dimension(117,185));
cartaGiocata2.setMinimumSize(new Dimension(117,185));
cartaGiocata2.setMaximumSize(new Dimension(117,185));
cartaGiocata2.setOpaque(true);
cartaGiocata2.setVisible(false);
boxes[2].add(Box.createRigidArea(new Dimension(15,185)));
boxes[2].add(labelMazzo);
boxes[2].add(Box.createRigidArea(new Dimension(15,185)));
boxes[2].add(buttonBriscola);
boxes[2].add(Box.createRigidArea(new Dimension(100,185)));
boxes[2].add(cartaGiocata1);
boxes[2].add(Box.createRigidArea(new Dimension(25,185)));
boxes[2].add(cartaGiocata2);
///////////////
nord.setPreferredSize(new Dimension(750,230));
nord.add(boxes[0], BorderLayout.CENTER);
centro.setPreferredSize(new Dimension(750,235));
centro.add(boxes[2], BorderLayout.CENTER);
sud.setPreferredSize(new Dimension(750,230));
sud.add(boxes[1], BorderLayout.CENTER);
sfondo.add(nord, BorderLayout.NORTH);
sfondo.add(sud, BorderLayout.SOUTH);
sfondo.add(centro, BorderLayout.CENTER);
this.setSize(750, 705);
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setVisible(true);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
//AVVIO PARTITA
start();
System.out.println("PARTITA TERMINATA");
}
//Svolgimento della partita
private void start() {
System.out.println("La partita ha inizio!");
boolean vittoria = false;
while(!vittoria) {
String urlB = p.getBriscola().getUrlImage(p.getBriscola().getSeme());
String urlM = p.getMazzo().getUrlImageMazzo();
//PASSO 1: operazioni preliminari
System.out.println("Distribuisco le carte ai giocatori");
operazioniPreliminari(urlB, urlM);
//Imposta il numero di carte rimanenti. E' da aggiornare ad ogni pescata
carteRimanenti.setText("Carte rimanenti: " + p.carteRimanenti());
System.out.println("Carte rimanenti: " + p.carteRimanenti());
if(turnoGiocatore) {
System.out.println("E' il turno del giocatore");
}
else System.out.println("E' il turno dell'avversario");
//PASSO 2: Si iniziano a giocare le carte
gestioneTurno();
}
}
private void gestioneTurno() {
if(turnoGiocatore) {
turnoGiocatore();
turnoAvversario();
}
else {
turnoAvversario();
turnoGiocatore();
}
}
private void turnoGiocatore() {
while(true) {
notifica = new Object();
synchronized (notifica) {
try {
nG.setText(p.getGiocatore().getNome() + " E' IL TUO TURNO!");
notifica.wait(); //-> Mi metto in attesa che il gioatore tiri
} catch (InterruptedException e) {
System.out.println("Errore nella sincronizzazione del turnoGiocatore");
}
}
primaCarta.addActionListener(this);
secondaCarta.addActionListener(this);
terzaCarta.addActionListener(this);
}
}
private void turnoAvversario() {
System.out.println("E' il turno dell'avversario");
}
@Override
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
if(source.equals(primaCarta)) {
String url = primaCarta.getText();
System.out.println("Il giocatore ha giocato la carta: " + url);
notifica.notify();
}
if(source.equals(secondaCarta)) {
String url = secondaCarta.getText();
System.out.println("Il giocatore ha giocato la carta: " + url);
notifica.notify();
}
if(source.equals(terzaCarta)) {
String url = terzaCarta.getText();
System.out.println("Il giocatore ha giocato la carta: " + url);
notifica.notify();
}
}
/**Si occupa di impostare la fase iniziale del gioco**/
private void operazioniPreliminari(String urlB, String urlM) {
//Imposta la label briscola
System.out.println("Scelgo la briscola");
Carta briscola = p.getBriscola();
briscola.volta();
Image img = briscola.getImage(new Dimension(117,185));
System.out.println("La briscola è: " + briscola.getSeme());
ImageIcon imgIc = new ImageIcon(img);
buttonBriscola.setIcon(imgIc);
buttonBriscola.setText(urlB); //Testo per il riconoscimento della carta selezionata
//Imposta la label mazzo
Mazzo m = p.getMazzo();
Image img_m = m.getImage(new Dimension(117,185));
ImageIcon imgIc_m = new ImageIcon(img_m);
labelMazzo.setIcon(imgIc_m);
labelMazzo.setText(urlM); //Testo per il riconoscimento della carta selezionata
//Distribuisce le carte ai giocatori
HashSet<Carta> cG = p.distribuisciCarteGiocatore();
HashSet<Carta> cA = p.distribuisciCarteAvversario();
String[] urlCG = new String[3];
String[] urlCA = new String[3];
Iterator<Carta> itG = cG.iterator();
int i = 0;
while(itG.hasNext()) {
Carta next = itG.next();
urlCG[i] = next.getUrlImage(next.getSeme());
i++;
}
Iterator<Carta> itA = cA.iterator();
int j = 0;
while(itA.hasNext()) {
Carta next = itA.next();
urlCA[j] = next.getUrlImage(next.getSeme());
j++;
}
Object[] carteAvv = cA.toArray();
Object[] carteGio = cG.toArray();
Image cA1 = ((Carta) carteAvv[0]).getImage(new Dimension(117,185));
Image cA2 = ((Carta) carteAvv[1]).getImage(new Dimension(117,185));
Image cA3 = ((Carta) carteAvv[2]).getImage(new Dimension(117,185));
ImageIcon imgIcA1 = new ImageIcon(cA1);
ImageIcon imgIcA2 = new ImageIcon(cA2);
ImageIcon imgIcA3 = new ImageIcon(cA3);
avvUno.setIcon(imgIcA1);
avvUno.setText(urlCA[0]);
avvDue.setIcon(imgIcA2);
avvDue.setText(urlCA[1]);
avvTre.setIcon(imgIcA3);
avvTre.setText(urlCA[2]);
((Carta) carteGio[0]).volta();
((Carta) carteGio[1]).volta();
((Carta) carteGio[2]).volta();
Image cG1 = ((Carta) carteGio[0]).getImage(new Dimension(117,185));
Image cG2 = ((Carta) carteGio[1]).getImage(new Dimension(117,185));
Image cG3 = ((Carta) carteGio[2]).getImage(new Dimension(117,185));
ImageIcon imgIcG1 = new ImageIcon(cG1);
ImageIcon imgIcG2 = new ImageIcon(cG2);
ImageIcon imgIcG3 = new ImageIcon(cG3);
primaCarta.setIcon(imgIcG1);
primaCarta.setText(urlCG[0]);
secondaCarta.setIcon(imgIcG2);
secondaCarta.setText(urlCG[1]);
terzaCarta.setIcon(imgIcG3);
terzaCarta.setText(urlCG[2]);
}
}
Come vedete la classe GuiPartita sta uscendo un bel casino.. oltre ai turni
ho incontrato problemi sul come ottenere la carta in base al JButton cliccato.
L'idea di un restyling completo mi spaventa tantissimo.. xD Aiuto :mc: