From 2ef1c5de3cfcc7104df3ebb50eaf064183ffc97a Mon Sep 17 00:00:00 2001
From: OPALVENS Florence <fopalvens@ad.unistra.fr>
Date: Tue, 10 Jan 2017 23:18:56 +0100
Subject: [PATCH] jeu fonctionnel

---
 Tron/TronClient/TronClient/Client.cs    | 31 +++++-----
 Tron/TronServeur/TronServeur/Program.cs | 75 +++++++++++++------------
 2 files changed, 56 insertions(+), 50 deletions(-)

diff --git a/Tron/TronClient/TronClient/Client.cs b/Tron/TronClient/TronClient/Client.cs
index 1ca1b3f..a9319c6 100644
--- a/Tron/TronClient/TronClient/Client.cs
+++ b/Tron/TronClient/TronClient/Client.cs
@@ -13,36 +13,38 @@ namespace TronClient
         private Tron.Tron myTron;        // Moteur du jeu
         public byte frequence;      // Temps du tour de jeu (en dixieme de s)
         Socket clientSocket;
-        int serverPort = 17021;
-        string serverIP = "130.79.81.203";
-        const int MsgsBufferSize = 100000000;
-        EndPoint serverEP;
+        int serverPort;
+        String serverIP;
 
         // constructeur : IP/Port du serveur
         public Client(String myServerIP, int myServerPort)
         {
             // TODO : Creation de la socket d'écoute TCP
             clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+            this.serverIP = myServerIP;
+            this.serverPort = myServerPort;
         }
 
-
         // Appelé au début de la partie
         public Tron.Tron Init()
         {
             System.Console.WriteLine("Init");
 
             // TODO Connexion au serveur  
-            clientSocket.Bind(new IPEndPoint(IPAddress.Any, 56000));
-            serverEP = new IPEndPoint(IPAddress.Parse(serverIP), serverPort);
+            Console.WriteLine("Tentative de connexion ...");
+            clientSocket.Bind(new IPEndPoint(IPAddress.Any, 0));
+            IPEndPoint serverEP = new IPEndPoint(IPAddress.Parse(serverIP), serverPort);
             clientSocket.Connect(serverEP);
+            Console.WriteLine("Connexion au serveur...");
 
             // TODO Réception des paramètres
-            byte[] buffer = new byte[MsgsBufferSize];
-            clientSocket.ReceiveFrom(buffer, buffer.Length, SocketFlags.None, ref serverEP);
+            byte[] buffer = new byte[4];
+            clientSocket.Receive(buffer);
             byte myNJoueurs = buffer[0];
             byte myTaille = buffer[1];
             byte myFrequence = buffer[2];
             byte myMonNum = buffer[3];
+            Console.WriteLine("Paramètres reçus : " + buffer[0] + " " + buffer[1] + " " + buffer[2] + " " + buffer[3]);
 
             // TODO Initialisation de la fréquence : frequence = <frequence>
             frequence = myFrequence;
@@ -60,14 +62,13 @@ namespace TronClient
             System.Console.WriteLine("Routine");
 
             // TODO Envoie de sa direction : myTron.getDirection()
-            byte[] buffer = new byte[1];
-            buffer[0] = myTron.getDirection();
-            clientSocket.SendTo(buffer, 0, buffer.Length, SocketFlags.None, serverEP);
+            byte[] maDirection = new byte[1] { myTron.getDirection() };
+            clientSocket.Send(maDirection, 0, maDirection.Length, SocketFlags.None);
 
             // TOSO Reception de toutes les directions : myTron.setDirections(byte[] < toutes les directions>);
-            byte[] buffer_direction = new byte[MsgsBufferSize];
-            clientSocket.ReceiveFrom(buffer_direction, buffer_direction.Length, SocketFlags.None, ref serverEP);
-            byte[] directions = buffer_direction[0];
+            byte[] buffer_direction = new byte[myTron.getNJoueurs()];
+            clientSocket.Receive(buffer_direction);
+            myTron.setDirections(buffer_direction);
 
         }
 
diff --git a/Tron/TronServeur/TronServeur/Program.cs b/Tron/TronServeur/TronServeur/Program.cs
index d2013a6..d150bf6 100644
--- a/Tron/TronServeur/TronServeur/Program.cs
+++ b/Tron/TronServeur/TronServeur/Program.cs
@@ -16,74 +16,78 @@ namespace TronServeur
             Tron.Tron myTron;            // Moteur du jeu
 
             byte nJoueurs = 2;      // Nombre de joueurs
-            byte frequence = 10;    // Temps du tour de jeu (en dixieme de s)
+            byte frequence = 1;    // Temps du tour de jeu (en dixieme de s)
             byte taille = 60;       // Taille du terrain
-            string serverAdress = "127.0.0.1";
-            int port = 17021;
+    
 
             // ************************************* Intitialisation partie
             Console.WriteLine("Initialisation");
 
             // TODO Creation de la socket d'écoute TCP
-            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+            Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
             // TODO Creation du tableau des sockets connectées
-            List<Socket> listClients = new List<Socket>();
+            Socket[] socketJoueurs = new Socket[nJoueurs];
+            bool[] joueursConnectes = new bool[nJoueurs];
 
             // Creation du moteur de jeu
             myTron = new Tron.Tron(nJoueurs, taille);
 
             // TODO Bind et listen
 
-            serverSocket.Bind(new IPEndPoint(IPAddress.Any, port));
-            serverSocket.Listen(10);
+            listenSocket.Bind(new IPEndPoint(IPAddress.Any, 8000));
+            listenSocket.Listen(10);
+            Console.WriteLine("Attente d'une nouvelle connexion ...");
 
             // TODO Acceptation des clients
             for (int i = 0; i < nJoueurs; i++)
             {
-                Socket connectedSocket = serverSocket.Accept();
-                listClients.Add(connectedSocket);
-                Console.WriteLine("Client ajouté !");
+                socketJoueurs[i] = listenSocket.Accept();
+                Console.WriteLine("Nouvelle connexion : " + socketJoueurs[i].RemoteEndPoint);
+                joueursConnectes[i] = true;
             }
-
+   
             // TODO Envoie des paramètres
-            byte[] infos = new byte[4];
-            infos[0] = nJoueurs;
-            infos[1] = taille;
-            infos[2] = frequence;
-
-            for (byte i = 1; i <= listClients.Count; i++)
+            for (int i = 0; i < nJoueurs; i++)
             {
-                infos[3] = i;
-                listClients[i-1].Send(infos, 0, infos.Length, SocketFlags.None);
+                byte[] buffer = new byte[] { nJoueurs, taille, frequence, (byte)i };
+                socketJoueurs[i].Send(buffer);
             }
 
             // ************************************* Routine à chaque tour
             System.Console.WriteLine("Routine");
-            byte[] directions;
+
             // Tant que la partie n'est pas finie
             while (!myTron.IsFinished())
             {
                 // TODO Réception de la direction de chaque joueur
-                directions = new byte[listClients.Count];
-
-                for(byte i = 0; i < listClients.Count; i++)
+                byte[] bufferDirection = new byte[nJoueurs];
+                for (int i = 0; i < nJoueurs; i++)
                 {
-
-                    byte []direction = new byte[1];
-                    listClients[i].Receive(direction, direction.Length, SocketFlags.None);
-                    directions[i] = direction[0];
+                    try
+                    {
+                        byte[] dirRecue = new byte[1];
+                        socketJoueurs[i].Receive(dirRecue);
+                        bufferDirection[i] = dirRecue[0];
+                    }
+                    catch
+                    {
+                        bufferDirection[i] = 4;
+                        socketJoueurs[i] = null;
+
+                        if (socketJoueurs.Count() == 1)
+                            bufferDirection[i] = 5;
+                    }
                 }
 
                 // TODO Calcul collision : myTron.Collision(byte[] <toutes les directions>);
-                myTron.Collision(directions);
+                myTron.Collision(bufferDirection);
 
                 // TODO Envoie des directions de tous les joueurs à tous les clients
-                directions = myTron.getDirections();
-
-                for (byte i = 0; i < listClients.Count; i++)
+                for (int i = 0; i < nJoueurs; i++)
                 {
-                    listClients[i].Send(directions, 0, directions.Length, SocketFlags.None);
+                    if (socketJoueurs[i] != null)
+                        socketJoueurs[i].Send(myTron.getDirections());
                 }
             }
 
@@ -92,13 +96,14 @@ namespace TronServeur
             System.Console.WriteLine("Conclusion");
 
             // TODO Fermeture des sockets connectées
-            foreach(Socket s in listClients)
+            for(int i = 0; i < socketJoueurs.Length; i++)
             {
-                s.Close();
+                if (socketJoueurs[i] != null)
+                    socketJoueurs[i].Close();
             }
 
             // TODO Fermeture socket d'écoute
-            serverSocket.Close();
+            listenSocket.Close();
 
         }
     }
-- 
GitLab