/*
* Controlador.java
*/
package aplicacio;
import domini.Carta;
import domini.Jugador;
import domini.Marcador;
import domini.Partida;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JButton;
import presentacio.Gui;
/**
* Modela el controlador façana de l'aplicació.
* @author acots jamoros
*/
public class Controlador implements Runnable {
private List<Gui> llistaGuis;
private Partida partida;
private List<Jugador> jugadors; //No sé si ho hauria de posar aquí
private List<CartaTapet> cartesTapet; //posaré les 4 cartes del tapet
public Controlador() {
//modificacio Julio per a la resolucio (linies passades per Quim)
//Podríem estudiar quina és la resolució de la pantalla que juga i en funció d'aquesta
//fer una geometria variable de les cartes i posició al taulell de tots els elements.
final Toolkit t = Toolkit.getDefaultToolkit();
final int ppp = t.getScreenResolution(); // Píxels per posada
final int w = t.getScreenSize().width; // Amplada en píxels
final int h = t.getScreenSize().height; // Altura en píxels
System.out.println("Resolució de la pantalla ");
System.out.println("Width = " + w);
System.out.println("Height = " + h);
System.out.println("Píxels per polsada = " + ppp);
//creo els 4 jugadors
jugadors = new LinkedList<Jugador>();
for (int i = 0; i < 4; i++) {
jugadors.add(new Jugador()); //lhaure de definir judador per tenir més informació
}
//creo les 4 gui (hauria de passar informació dels jugadors..)
llistaGuis = new LinkedList<Gui>();
//Creo les cartes del tapet (s'ahuria de fer una classe amb gui-jugador i cartaTapet??? No pq nomès tindré una gui
cartesTapet = new LinkedList<CartaTapet>();
EventQueue.invokeLater(this);
this.run();
}
public void run() {
iniciarComponents();
//He d'haver creat els jugadors i passar-li'
//partida = new Partida();
}
private void iniciarComponents() {
//així és molt cutre però si ho faig amb for tinc problemes amb el eoid de la gui
Gui g1 = new Gui(0, this);
Gui g2 = new Gui(1, this);
Gui g3 = new Gui(2, this);
Gui g4 = new Gui(3, this);
llistaGuis.add(g1);
llistaGuis.add(g2);
llistaGuis.add(g3);
llistaGuis.add(g4);
/* //Crea una llista de 8 guis, però amb les eoid que toca. COMPROVACIÓ
System.out.println("size llistaGuis " + llistaGuis.size());
for (int i = 0; i < 4; i++){
System.out.println(llistaGuis.get(i).getEoid());
}
*/
llistaGuis.get(0).getJlParella1NomJugador1().setOpaque(true);
llistaGuis.get(0).getJlParella1NomJugador1().setForeground(Color.red);
llistaGuis.get(2).getJlParella1NomJugador2().setForeground(Color.red);
llistaGuis.get(1).getJlParella2NomJugador1().setForeground(Color.red);
llistaGuis.get(3).getJlParella2NomJugador2().setForeground(Color.red);
llistaGuis.get(0).setLocation(10, 20);
llistaGuis.get(1).setLocation(160, 20);
llistaGuis.get(2).setLocation(310, 20);
llistaGuis.get(3).setLocation(460, 20);
llistaGuis.get(0).setVisible(true);
llistaGuis.get(1).setVisible(true);
llistaGuis.get(2).setVisible(true);
llistaGuis.get(3).setVisible(true);
//Creo un arrai de cartesTapet (poso una cartatapet per cada jugador)
for (int i = 0; i < 4; i++) {
cartesTapet.add(new CartaTapet(llistaGuis, i));
}
//inicialitzo les 4 cartaTapet a null
for (int i = 0; i < 4; i++) {
cartesTapet.get(i).pintaCartaTapet(null);
}
//Creo un marcador perqè la partida encara no s'ha creat
Marcador m = new Marcador();
pintaMarcador(m);
}
public void gestionarAccioBotoCarta1(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de la carta 1 del jugador" + gui.getEoid());
tirarJBCarta(gui, gui.getJbCarta1());
gui.getJbCarta1().setEnabled(false);
}
public void gestionarAccioBotoCarta2(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de la carta 2 del jugador" + gui.getEoid());
tirarJBCarta(gui, gui.getJbCarta2());
gui.getJbCarta2().setEnabled(false);
}
public void gestionarAccioBotoCarta3(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de la carta 3 del jugador" + gui.getEoid());
tirarJBCarta(gui, gui.getJbCarta3());
gui.getJbCarta3().setEnabled(false);
}
public void gestionarAccioBotoCarta4(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de la carta 4 del jugador" + gui.getEoid());
tirarJBCarta(gui, gui.getJbCarta4());
gui.getJbCarta4().setEnabled(false);
}
public void gestionarAccioBotoCarta5(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de la carta 5 del jugador" + gui.getEoid());
tirarJBCarta(gui, gui.getJbCarta5());
gui.getJbCarta5().setEnabled(false);
}
public void gestionarAccioBotoCarta6(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de la carta 6 del jugador" + gui.getEoid());
tirarJBCarta(gui, gui.getJbCarta6());
gui.getJbCarta6().setEnabled(false);
}
public void gestionarAccioBotoCarta7(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de la carta 7 del jugador" + gui.getEoid());
tirarJBCarta(gui, gui.getJbCarta7());
gui.getJbCarta7().setEnabled(false);
}
public void gestionarAccioBotoCarta8(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de la carta 8 del jugador" + gui.getEoid());
tirarJBCarta(gui, gui.getJbCarta8());
gui.getJbCarta8().setEnabled(false);
}
public void gestionarAccioBotoCarta9(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de la carta 9 del jugador" + gui.getEoid());
tirarJBCarta(gui, gui.getJbCarta9());
gui.getJbCarta9().setEnabled(false);
}
public void gestionarAccioBotoCarta10(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de la carta 10 del jugador" + gui.getEoid());
tirarJBCarta(gui, gui.getJbCarta10());
gui.getJbCarta10().setEnabled(false);
}
public void gestionarAccioBotoCarta11(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de la carta 11 del jugador" + gui.getEoid());
tirarJBCarta(gui, gui.getJbCarta11());
gui.getJbCarta11().setEnabled(false);
}
public void gestionarAccioBotoCarta12(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de la carta 12 del jugador" + gui.getEoid());
tirarJBCarta(gui, gui.getJbCarta12());
gui.getJbCarta12().setEnabled(false);
}
public void gestionarAccioBotoCantarOros(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de cantar oros.");
accioCantarTrumfo(0, gui);
}
public void gestionarAccioBotoCantarCopes(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de cantar Copes.");
accioCantarTrumfo(1, gui);
}
public void gestionarAccioBotoCantarEspases(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de cantar Espases.");
accioCantarTrumfo(3, gui);
}
public void gestionarAccioBotoCantarBastos(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de cantar Bastos.");
accioCantarTrumfo(2, gui);
}
public void gestionarAccioBotoCantarButifarra(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de cantar Butifarra.");
accioCantarTrumfo(4, gui);
}
public void gestionarAccioBotoPassar(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de cantar Passar.");
//desactivem els botons del trumfo i del propi botó passar
desActivarBotonsCantar(gui);
gui.getJbPassar().setEnabled(false);
//activem els botons de cantar trumfo del company
int company = (gui.getEoid() + 2) % 4;
Gui guiCompany = llistaGuis.get(company);
activarBotonsCantar(guiCompany);
//deixem d'estar a primer pla i passa a estar-ho el company
gui.setAlwaysOnTop(false);
guiCompany.setAlwaysOnTop(true);
guiCompany.toFront();
}
//Es poden ordenar les cartes en qualsevol moment. Quan s'han ordenat es desactiva
public void gestionarAccioBotoOrdenar(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de cantar Contar.");
int jugador = gui.getEoid();
Collections.sort(jugadors.get(jugador).getCartesJugador());
pintaCartes(gui, jugadors.get(jugador));
gui.getJbOrdenar().setEnabled(false);
}
//Nomès estarà actiu pel jugador quiComenca (variable del datActual)
//Activarà les seves cartes perquè pugui clicar-les
public void gestionarAccioBotoNovaBasa(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de cantar nova Basa.");
//Primer mirem si ja és la última basa (s'ha d'apretar el botó una vegada s'han acabat les cartes)
//ACABEM EL DAT
if (partida.getDatActual().sHaAcabatElDat()) {
System.out.println("S'ha acabat el dat.");
//retirem les cartes del tapet
retirarCartesTapet();
//desactivar el botó de nova baza i les gui (els desactivo tots) fins que no es torni a repartir
for (Gui g : llistaGuis) {
g.getJbNovaBasa().setEnabled(false);
g.setAlwaysOnTop(false);
}
//S'ha d'activar el botó de qui repartirà desprès i la seva gui
Gui g = llistaGuis.get((partida.getQuiReparteix() + 1) % 4);
g.getJbRepartir().setEnabled(true);
g.setAlwaysOnTop(true);
g.toFront();
//Actualitzo el marcador de la partida
partida.actualitzaMarcador();
pintaMarcador(partida.getMarcador());
System.out.println("Marcador de la partida: " + partida.getMarcador());
}
//Si no és la última, faig la basa
else {
System.out.println("Ha de començar el jugador" + partida.getDatActual().getjugadorQueComenca());
//Ull viu: modificacio Julio
//Passem a primer pla el taulell que començara
llistaGuis.get(partida.getDatActual().getjugadorQueComenca()).toFront();
//truquillo per fer que l'anterior tapet no estigui a primer pla
//llistaGuis.get( (partida.getDatActual().getjugadorQueComenca() +3 ) % 4 ).setAlwaysOnTop(false);
llistaGuis.get(partida.getDatActual().getjugadorQueComenca()).setAlwaysOnTop(true);
retirarCartesTapet();
//Fem una baza
partida.getDatActual().baza();
//Desactivar el botó novaBasa (Activar el del que ha guanyat ho fan les cartes)
gui.getJbNovaBasa().setEnabled(false);
}
}
public void gestionarAccioIniciarPartida(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó de iniciar la partida.");
partida = new Partida(jugadors);
partida.iniciaPartida();
//Falta desactivar tots els botons excepte el de repartir del jugador 0
//que es quiReparteix de moment
System.out.println("Comencem la partida, reparteix " + partida.getQuiReparteix());
//Desactivem els botons iniciarPartida de totes les gui
for (Gui a : llistaGuis) {
a.getJbSIniciarPartida().setEnabled(false);
}
int nosecomferquivullquecomenci = 0;
//Activem el botó de repartir les cartes del quiReparteix (del jugador 0)
Gui r = llistaGuis.get(nosecomferquivullquecomenci);
r.getJbRepartir().setEnabled(true);
//ATENCIO: en comptes del 0 hi hauria d'haver
// partida.getQuiReparteix() però no em va bé pq quiReparteix està inicialitzat a -1
//Poso a primer pla la gui del jugador que ha de repartir
r.setAlwaysOnTop(true);
r.toFront();
}
//Hauria de dir-se Nou Dat
//Nomès estarà actiu pel jugador (quiReparteix) (el que reparteix)
public void gestionarAccioBotoRepartir(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click al botó repartir.");
partida.nouDat();
//Pinto les cartes per cada gui i acciono els botons
for (int i = 0; i < 4; i++) {
Gui g = llistaGuis.get(i);
pintaCartes(g, jugadors.get(i));
g.getJbCarta1().setEnabled(true);
g.getJbCarta2().setEnabled(true);
g.getJbCarta3().setEnabled(true);
g.getJbCarta4().setEnabled(true);
g.getJbCarta5().setEnabled(true);
g.getJbCarta6().setEnabled(true);
g.getJbCarta7().setEnabled(true);
g.getJbCarta8().setEnabled(true);
g.getJbCarta9().setEnabled(true);
g.getJbCarta10().setEnabled(true);
g.getJbCarta11().setEnabled(true);
g.getJbCarta12().setEnabled(true);
}
System.out.println("Comencem el dat, reparteix " + partida.getQuiReparteix());
//desactivar el botó repartir que estava activat
llistaGuis.get(partida.getQuiReparteix()).getJbRepartir().setEnabled(false);
//gestionar els botons contro, passo
activarBotonsCantar(gui);
gui.getJbPassar().setEnabled(true);
//activar tots els botons ordenar
for (int i = 0; i < 4; i++) {
llistaGuis.get(i).getJbOrdenar().setEnabled(true);
}
}
//Hauria de començar la partida aquí
public void gestionarAccioMenuItemNovaPartiva(Gui gui, ActionEvent evt) {
System.out.println("S'ha fet un click menú item Nova Partida.");
}
public static void main(String args[]) {
new Controlador();
}
private void pintaCartes(Gui gui, Jugador jugador) {
//Per cada carta la posem al seu botó
//No controlem exceptions perquè segur que n'hi ha 12
List<Carta> cartes12 = jugador.getCartesJugador();
gui.getJbCarta1().setIcon((cartes12.get(0).getImatge()));
gui.getJbCarta2().setIcon((cartes12.get(1).getImatge()));
gui.getJbCarta3().setIcon((cartes12.get(2).getImatge()));
gui.getJbCarta4().setIcon((cartes12.get(3).getImatge()));
gui.getJbCarta5().setIcon((cartes12.get(4).getImatge()));
gui.getJbCarta6().setIcon((cartes12.get(5).getImatge()));
gui.getJbCarta7().setIcon((cartes12.get(6).getImatge()));
gui.getJbCarta8().setIcon((cartes12.get(7).getImatge()));
gui.getJbCarta9().setIcon((cartes12.get(8).getImatge()));
gui.getJbCarta10().setIcon((cartes12.get(9).getImatge()));
gui.getJbCarta11().setIcon((cartes12.get(10).getImatge()));
gui.getJbCarta12().setIcon((cartes12.get(11).getImatge()));
}
private void tirarJBCarta(Gui gui, JButton jBCarta) {
//Miro de quin jugador és la gui (AQUI NECESSITARIA LA CLASSE GUIjUGADOR)
int jugadorQueTira = gui.getEoid();
//pinto la carta a tots els tapets en la posició del eoid
cartesTapet.get(jugadorQueTira).pintaCartaTapet(jBCarta.getIcon());
//afegeixo la carta a la llista de la basa
Carta c = new Carta(jBCarta.getIcon());
partida.getDatActual().getBasaActual().add(c);
//trec la icona del botó de la carta de la gui que l'acciona
jBCarta.setIcon(null);
//si és l'última carta de la basa, gestiono el que s'ha de fer
//ACABEM LA BASA
if (partida.getDatActual().eslUltimaCartaDeLaBasa()) {
System.out.println("S'ha acabat la basa");
partida.getDatActual().acabarBasa();
//activo novaBasa del guanyador i la seva gui
//(primer desactivo totes les gui)
for (Gui g : llistaGuis) {
g.setAlwaysOnTop(false);
}
Gui r = llistaGuis.get(partida.getDatActual().getjugadorQueComenca());
r.getJbNovaBasa().setEnabled(true);
r.setAlwaysOnTop(true);
r.toFront();
}
//Si no, activo la gui seguent
else {
//temporitzador:
//for (long i = 0L; i < 1000000000L; i++) {
//}
gui.setAlwaysOnTop(false);
Gui r = llistaGuis.get((jugadorQueTira + 1) % 4);
r.setAlwaysOnTop(true);
r.toFront();
}
}
private void pintaMarcador(Marcador m) {
String pNos = new Integer(m.getNos()).toString();
String pVos = new Integer(m.getVos()).toString();
for (Gui gui : llistaGuis) {
gui.getJlParella1Punts().setText(pNos);
gui.getJlParella2Punts().setText(pVos);
}
}
//Activo tots els botons dels possibles trumfo
private void activarBotonsCantar(Gui gui) {
gui.getJbCantarBastos().setEnabled(true);
gui.getJbCantarButifarra().setEnabled(true);
gui.getJbCantarCopes().setEnabled(true);
gui.getJbCantarEspases().setEnabled(true);
gui.getJbCantarOros().setEnabled(true);
}
//Activo tots els botons dels possibles trumfo
private void desActivarBotonsCantar(Gui gui) {
gui.getJbCantarBastos().setEnabled(false);
gui.getJbCantarButifarra().setEnabled(false);
gui.getJbCantarCopes().setEnabled(false);
gui.getJbCantarEspases().setEnabled(false);
gui.getJbCantarOros().setEnabled(false);
}
private void accioCantarTrumfo(int pal, Gui gui) {
//Poso el trumfo del dat
partida.getDatActual().setTrumfo(pal);
//activo i desactivo els botons pertinents
desActivarBotonsCantar(gui);
gui.getJbPassar().setEnabled(false);
//Ha de posar-se actiu nomès el botó novaBasa de quiReparteix + 1
Gui r = llistaGuis.get((partida.getQuiReparteix() + 1) % 4);
r.getJbNovaBasa().setEnabled(true);
//Es posa a davant la gui de qui reparteix + 1. Per fer-ho primer les desactivo totes
for (Gui g : llistaGuis) {
g.setAlwaysOnTop(false);
}
r.setAlwaysOnTop(true);
r.toFront();
}
public void retirarCartesTapet() {
for (int i = 0; i < 4; i++) {
cartesTapet.get(i).pintaCartaTapet(null);
}
}
}