Package belotetime.application.launch

Source Code of belotetime.application.launch.GameController

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;
    }
  }
}
TOP

Related Classes of belotetime.application.launch.GameController

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.