package belotetime.application.launch;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Timer;
import java.util.TimerTask;
import belotetime.application.data.MySQLManager;
import belotetime.application.game.Card;
import belotetime.application.game.Game;
import belotetime.application.game.Pack;
import belotetime.application.game.Player;
import belotetime.application.game.Set;
import belotetime.application.game.XmlFeeds;
import belotetime.application.server.GameServer;
import belotetime.core.controller.AbstractController;
public class GameController extends AbstractController
{
private Game game;
private Socket client;
private DataOutputStream request;
private DataInputStream response;
private int numPlayer = -1;
private String gameName;
private boolean online = true;
private int cnt;
public GameController()
{
super();
//Mod�le
game = new Game();
cnt = 0;
}
public void addGamePlayer(){
MySQLManager.getInstance().addGamePlayer(getGameName());
}
public void setGameName(String gameName){
this.gameName = gameName;
}
public String getGameName()
{
return gameName;
}
public Game getGame()
{
return game;
}
public void setGame(Game game)
{
this.game = game;
}
public void setValue(Integer numPlayer)
{
this.numPlayer = numPlayer;
}
public Integer getValue()
{
return numPlayer;
}
public boolean isOnline() {
return online;
}
public void setOnline(boolean online) {
this.online = online;
}
/**
* Nouvelle partie
*/
public void start()
{
online = false;
// On ajoute des joueurs dans les �quipes
game.getT1().setP1(new Player("Joueur 1"));
game.getT2().setP1(new Player("Joueur 2"));
game.getT1().setP2(new Player("Joueur 3"));
game.getT2().setP2(new Player("Joueur 4"));
// On ins�re les joueurs dans la liste des players de la partie.
/*game.getPlayers().add(game.getT1().getP1());
game.getPlayers().add(game.getT2().getP1());
game.getPlayers().add(game.getT1().getP2());
game.getPlayers().add(game.getT2().getP2());*/
// Initialisation de la partie
game.prepare();
game.setStarted(true);
game.getPacket().cut();
game.getCurrentSet().defineStarter();
game.getCurrentSet().firstDeal(Set.THREE_CARDS);
numPlayer = 0;
notifyView(game);
if (game.getPlayers().indexOf(game.getCurrentSet().getStarter()) != numPlayer)
{
basicAI();
}
}
public boolean isStarter(Integer numPlayer)
{
return game.getCurrentSet().getStarter().getLogin().equals(game.getPlayers().get(numPlayer).getLogin());
}
public boolean trickComplete()
{
return game.getCarpet().getCards().size() == 3;
}
public boolean soloTrickComplete()
{
return game.getCarpet().getCards().size() == 4;
}
public boolean belotePlayed(Integer numCard, Integer numPlayer)
{
Card c = game.getPlayers().get(numPlayer).getHand().getCards().get(numCard);
return ((c.getName().equals("Roi") || c.getName().equals("Dame")) && c.isTrump());
}
public boolean isValid(Integer numCard, Integer numPlayer)
{
int carpetSize = game.getCarpet().getCards().size();
// Si le tapis est vide, la carte est �videmment valide.
if (carpetSize < 1)
{
return true;
}
// Dans le cas contraire, il faut tester les cas
else
{
Pack carpet = new Pack(game.getCarpet().getCards());
Card playedCard = game.getPlayers().get(numPlayer).getHand().getCards().get(numCard);
// Si la premi�re carte jou�e n'est pas un atout...
if (!carpet.getCards().get(0).isTrump())
{
// ...et que la carte s�lectionn�e est de la m�me couleur alors elle est valide.
if (carpet.getCards().get(0).getColor().equals(playedCard.getColor()))
{
return true;
}
// ...et que la carte s�lectionn�e est un atout...
else if (playedCard.isTrump())
{
// ...et que le joueur dispose d'une carte de la bonne couleur dans sa main...
for (Card c : game.getPlayers().get(numPlayer).getHand().getCards())
{
// ...alors la carte n'est pas valide.
if (carpet.getCards().get(0).getColor().equals(c.getColor()))
{
return false;
}
}
Pack playedTrumps = new Pack();
for (int i = 1; i < carpet.getCards().size(); i++)
{
if (carpet.getCards().get(i).isTrump())
{
playedTrumps.getCards().add(carpet.getCards().get(i));
}
}
// ...et qu'aucun autre autout n'a �t� jou�...
if (playedTrumps.getCards().size() == 0)
{
// ...alors la carte est valide.
return true;
}
// ...et qu'un autre atout (ou plusieurs) a d�j� �t� pos� sur le pli...
else
{
Card highestCard = playedTrumps.getCards().get(0);
for (Card c : playedTrumps.getCards())
{
highestCard = Card.max(playedCard, c);
}
// ...et que le joueur a pos� l'atout le plus haut...
if (playedCard.getName().equals(highestCard.getName()))
{
// ...alors la carte est valide.
return true;
}
// ...et que le joueur n'a pas choisi un atout plus haut...
else
{
for (Card c : game.getPlayers().get(numPlayer).getHand().getCards())
{
if (c.isTrump())
{
highestCard = Card.max(highestCard, c);
// ...et qu'il poss�de un atout sup�rieur au plus haut pos�...
if (highestCard.getName().equals(c.getName()))
{
// ...alors la carte n'est pas valide.
return false;
}
}
}
// ...et qu'il ne poss�de pas un atout sup�rieur au plus haut pos�
// ...alors la carte est valide.
return true;
}
}
}
// ...et que la carte diff�re en couleur...
else
{
// ...si une autre carte de la bonne couleur existe...
for (Card c : game.getPlayers().get(numPlayer).getHand().getCards())
{
// ...alors la carte n'est pas valide.
if (carpet.getCards().get(0).getColor().equals(c.getColor()))
{
return false;
}
}
// ...sinon si le pli est assez grand...
if (carpetSize > 1)
{
Card alliedCard = carpet.getCards().get(carpetSize - 2);
Card highestCard = carpet.getCards().get(0);
// ..et si la carte de l'alli� n'est pas un atout...
if (!alliedCard.isTrump())
{
Pack playedTrumps = new Pack();
for (int i = 0; i < carpet.getCards().size(); i++)
{
if (carpet.getCards().get(i).isTrump())
{
playedTrumps.getCards().add(carpet.getCards().get(i));
}
}
for (int i = 1; i < carpetSize; i ++)
{
if (carpet.getCards().get(i).getColor().equals(carpet.getCards().get(0).getColor()))
{
highestCard = Card.max(highestCard, carpet.getCards().get(i));
}
}
// ...et qu'elle est la plus forte du pli courant...
if ((alliedCard.getName().equals(highestCard.getName())) && (playedTrumps.getCards().size() == 0))
{
// ...alors la carte est valide.
return true;
}
// ...et qu'elle n'est pas la plus forte...
else
{
// ...et que le joueur poss�de un atout
for (Card c : game.getPlayers().get(numPlayer).getHand().getCards())
{
if (c.isTrump())
{
// ...alors la carte n'est pas valide.
return false;
}
}
// ...et que le joueur ne poss�de pas d'atouts, alors la carte est valide.
return true;
}
}
// ...et si la carte de l'alli� est un atout...
else
{
Pack playedTrumps = new Pack();
for (int i = 0; i < carpet.getCards().size(); i++)
{
if (carpet.getCards().get(i).isTrump())
{
playedTrumps.getCards().add(carpet.getCards().get(i));
}
}
// ...et qu'il est le seul atout coupant le pli...
if (playedTrumps.getCards().size() == 1)
{
// ...alors la carte est valide.
return true;
}
// ...et qu'il n'est pas le seul atout coupant le pli...
else
{
highestCard = playedTrumps.getCards().get(0);
for (Card c : playedTrumps.getCards())
{
highestCard = Card.max(highestCard, c);
}
// ...et qu'il poss�de l'atout le plus haut
if (highestCard.equals(alliedCard))
{
// ...alors la carte est valide.
return true;
}
// ...et qu'il ne poss�de pas l'atout le plus haut...
else
{
// ...et que le joueur poss�de un atout
for (Card c : game.getPlayers().get(numPlayer).getHand().getCards())
{
if (c.isTrump())
{
// ...alors la carte n'est pas valide.
return false;
}
}
// ...et que le joueur ne poss�de pas d'atouts, alors la carte est valide.
return true;
}
}
}
}
// ...sinon si le pli est trop petit...
else
{
// ...et que le joueur poss�de un atout
for (Card c : game.getPlayers().get(numPlayer).getHand().getCards())
{
if (c.isTrump())
{
// ...alors la carte n'est pas valide.
return false;
}
}
// ...sinon la carte est valide.
return true;
}
}
}
// Si la premi�re carte jou�e est un atout...
else
{
// ...et que la carte choisie est un atout...
if (playedCard.isTrump())
{
// (on cr�� une liste contenant tous les atouts jou�s)
Pack playedTrumps = new Pack();
for (int i = 0; i < carpet.getCards().size(); i++)
{
if (carpet.getCards().get(i).isTrump())
{
playedTrumps.getCards().add(carpet.getCards().get(i));
}
}
Card highestCard = playedTrumps.getCards().get(0);
for (Card c : playedTrumps.getCards())
{
highestCard = Card.max(highestCard, c);
}
highestCard = Card.max(highestCard, playedCard);
// ...et que le joueur a pos� l'atout le plus haut...
if (playedCard.getName().equals(highestCard.getName()))
{
// ...alors la carte est valide.
return true;
}
// ...et que le joueur n'a pas choisi un atout plus haut...
else
{
for (Card c : game.getPlayers().get(numPlayer).getHand().getCards())
{
if (c.isTrump())
{
highestCard = Card.max(highestCard, c);
// ...et qu'il poss�de un atout sup�rieur au plus haut pos�...
if (highestCard.getName().equals(c.getName()))
{
// ...alors la carte n'est pas valide.
return false;
}
}
}
// ...et qu'il ne poss�de pas un atout sup�rieur au plus haut pos�
// ...alors la carte est valide.
return true;
}
}
// ...et que la carte choisie n'est pas un atout...
else
{
// ...et que le joueur poss�de un atout
for (Card c : game.getPlayers().get(numPlayer).getHand().getCards())
{
if (c.isTrump())
{
// ...alors la carte n'est pas valide.
return false;
}
}
// ...sinon la carte est valide.
return true;
}
}
}
}
public void initTrick()
{
if (online)
{
try
{
request.writeUTF(XmlFeeds.initTrickActionToXml());
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
else
{
//Fin du pli
cnt = 0;
game.getCurrentSet().trickWin();
game.setCarpet(new Pack());
//Fin de la manche
if(game.getT1().getPoints() + game.getT2().getPoints() == 152)
{
game.getCurrentSet().result();
game.getPacket().cut();
int dealer = game.getPlayers().indexOf(game.getCurrentSet().getDealer());
game.setCurrentSet(new Set(game, game.getPlayers().get((dealer + 1) % 4)));
game.getCurrentSet().defineStarter();
game.getCurrentSet().firstDeal(Set.THREE_CARDS);
}
//Fin de la partie
if(game.getT1().getGamePoints() > 1000 || game.getT2().getGamePoints() > 1000)
{
game.setStarted(false);
}
notifyView(game);
if ((game.getPlayers().indexOf(game.getCurrentSet().getStarter()) != 0) && (game.isStarted()))
{
basicAI();
}
}
}
public void initSet()
{
try
{
request.writeUTF(XmlFeeds.passSetActionToXml(numPlayer));
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
/**
* On joue une carte
* @param numCard Le num�ro de la carte
* @param numPlayer Le num�ro du joueur
*/
public void playCard(Integer numCard, Integer numPlayer)
{
if (online)
{
try
{
request.writeUTF(XmlFeeds.playCardActionToXml(numCard, numPlayer));
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
else
{
Player p = game.getPlayers().get(numPlayer);
game.getCarpet().getCards().add(p.playCard(numCard));
game.getCurrentSet().nextStarter();
notifyView(game);
if ((game.getPlayers().indexOf(game.getCurrentSet().getStarter()) != 0) && (game.getCarpet().getCards().size() < 4))
{
basicAI();
}
}
}
public void playCard(Integer numCard, Integer numPlayer, Boolean belote)
{
try
{
request.writeUTF(XmlFeeds.playCardActionToXml(numCard, numPlayer, belote));
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
/**
* Choix de l'atout sur la table
* @param numPlayer Le joueur qui prend l'atout
*/
public void takeTrump(Integer numPlayer)
{
if (online)
{
try
{
request.writeUTF(XmlFeeds.takeTrumpActionToXml(numPlayer));
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
else
{
String color = game.getPacket().getCards().get(game.getPacket().getCards().size() - 1).getColor();
game.getCurrentSet().setTrump(color);
game.getCurrentSet().takeTrump(game.getPlayers().get(numPlayer));
game.getCurrentSet().secondDeal();
game.getCurrentSet().alterTrumpValue();
notifyView(game);
if (game.getPlayers().indexOf(game.getCurrentSet().getStarter()) != 0)
{
basicAI();
}
}
}
/**
* Choix d'un autre atout
* @param numPlayer Joueur qui prend
* @param trump Atout choisi
*/
public void takeOtherTrump(Integer numPlayer, String trump)
{
if (online)
{
try
{
request.writeUTF(XmlFeeds.takeTrumpActionToXml(trump, numPlayer));
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
else
{
String color = trump;
game.getCurrentSet().setTrump(color);
game.getCurrentSet().takeTrump(game.getPlayers().get(numPlayer));
game.getCurrentSet().secondDeal();
game.getCurrentSet().alterTrumpValue();
notifyView(game);
if (game.getPlayers().indexOf(game.getCurrentSet().getStarter()) != 0)
{
basicAI();
}
}
}
public void passTrump()
{
if (online)
{
try
{
request.writeUTF(XmlFeeds.passTurnActionToXml(numPlayer));
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
else
{
game.getCurrentSet().setTaker(game.getPlayers().get((game.getPlayers().indexOf(game.getCurrentSet().getTaker()) + 1) % 4));
cnt ++;
if(cnt > 3)
{
game.getCurrentSet().setTurn(Set.SECOND_TURN);
}
if(cnt > 7)
{
cnt = 0;
//Gestion de la nouvelle manche
for (Player p : game.getPlayers())
{
game.getPacket().getCards().addAll((p.getHand().getCards()));
p.getHand().getCards().removeAll(p.getHand().getCards());
}
game.getPacket().cut();
int numDealer = game.getPlayers().indexOf(game.getCurrentSet().getDealer());
game.setCurrentSet(new Set(game, game.getPlayers().get((numDealer + 1) % 4)));
game.getCurrentSet().defineStarter();
game.getCurrentSet().firstDeal(Set.THREE_CARDS);
}
notifyView(game);
if (game.getPlayers().indexOf(game.getCurrentSet().getTaker()) != 0)
{
basicAI();
}
}
}
public void sendMessage(String message)
{
try
{
request.writeUTF(XmlFeeds.sendMessageActionToXml(message));
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
/**
*
* @return La couleur de la carte atout � choisir
*/
public String getCardColor()
{
return game.getPacket().getCards().get(game.getPacket().getCards().size() - 1).getColor();
}
public void basicAI()
{
if (game.getCurrentSet().getTrump() == null || game.getCurrentSet().getTrump().equals("null"))
{
int numTaker = game.getPlayers().indexOf(game.getCurrentSet().getTaker());
if (numTaker > 0)
{
passTrump();
}
}
else
{
int numStarter = game.getPlayers().indexOf(game.getCurrentSet().getStarter());
if (numStarter > 0)
{
int currentPlayerHandSize = game.getPlayers().get(numStarter).getHand().getCards().size();
for (int i = 0; i < currentPlayerHandSize; i ++)
{
if (isValid(i, numStarter))
{
playCard(i, numStarter);
break;
}
}
}
}
}
public synchronized void create(String gameName, String adresse, String login)
{
try
{
connect(adresse);
request.writeUTF(XmlFeeds.createGameActionToXml(gameName, login));
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public synchronized void join(String adresse)
{
try
{
connect(adresse);
request.writeUTF(XmlFeeds.joinGameActionToXml("test"));
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public synchronized void add(String login)
{
if(numPlayer != -1)
{
try
{
request.writeUTF(XmlFeeds.getNumActionToXml(login, numPlayer));
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
private synchronized void connect(String adresse) throws IOException, UnknownHostException
{
client = new Socket(adresse, 9650);
if(client.isConnected())
{
request = new DataOutputStream(client.getOutputStream());
response = new DataInputStream(client.getInputStream());
final Timer t = new Timer();
t.schedule(new TimerTask()
{
@Override
public synchronized void run()
{
try
{
String data = response.readUTF();
String action = XmlFeeds.xmlGetTag(data, "action");
switch(action)
{
case "other":
break;
case "sendMessage" :
notifyView(XmlFeeds.xmlGetTag(data, "message"));
break;
default:
game = XmlFeeds.xmlToGame(data);
notifyView(game);
break;
}
}
catch(IOException ioe)
{
ioe.printStackTrace();
}
catch(Exception e)
{
try
{
t.cancel();
client.close();
}
catch (IOException e1)
{
e1.printStackTrace();
}
}
}
}, 1500, 1500);
}
}
/**
* Ajoute la Partie dans la table Statistique
* @throws Exception
*/
public void addPartie(String user) throws Exception{
try{
if(MySQLManager.getInstance().addPartie(user)){
System.out.println("Succes de l'incr�mentation de la partie dans Statistique");
}
}catch(Exception e){
e.printStackTrace();
throw e;
}
}
/**
* Ajoute le nombre de Points dans la table Statistique
* @param nbPoints Nombre de Points
* @throws Exception
*/
public void addNbPoints(String user, int nbPoints) throws Exception{
try{
if(MySQLManager.getInstance().addPoints(user, nbPoints)){
System.out.println("Succes de l'incr�mentation des points dans Statistique");
}
}catch(Exception e){
e.printStackTrace();
throw e;
}
}
/**
* Ajoute la Partie gagn�e dans la table Statistique
* @throws Exception
*/
public void addPartieWon(String user) throws Exception{
try{
if(MySQLManager.getInstance().addPartieWon(user)){
System.out.println("Succes de l'incr�mentation de la partie gagn�e dans Statistique");
}
}catch(Exception e){
e.printStackTrace();
throw e;
}
}
}