diff --git a/src/Client.java b/src/Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..13d93e9197b00e243c7bbfdb4b555a83dc874cd1
--- /dev/null
+++ b/src/Client.java
@@ -0,0 +1,93 @@
+package src;
+
+import java.io.*;
+import java.net.*;
+import java.util.Scanner;
+
+public class Client {
+    private static final String SERVER_ADDRESS = "localhost";
+    private static final int PORT = 1234;
+    private Socket socket;
+    private BufferedReader in;
+    private PrintWriter out;
+    private Scanner scanner;
+
+    public Client() {
+        scanner = new Scanner(System.in);
+    }
+    public void connect() {
+        try {
+            socket = new Socket(SERVER_ADDRESS, PORT);
+            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+            out = new PrintWriter(socket.getOutputStream(), true);
+            System.out.println("Connecté au serveur Mastermind !");
+            play();
+        } catch (IOException e) {
+            System.err.println("Erreur de connexion au serveur : " + e.getMessage());
+        } finally {
+            closeConnection();
+        }
+    }
+
+    private void play() {
+        while (true) {
+            String guess = getUserInput();
+            if (guess == null) continue;
+
+            sendGuess(guess);
+            String response = receiveResponse();
+
+            if (response == null) {
+                System.out.println("Connexion fermée par le serveur.");
+                break;
+            }
+
+            System.out.println("Réponse du serveur : " + response);
+
+            if (response.equals("4 0")) {
+                System.out.println("Félicitations ! Vous avez trouvé la bonne combinaison !");
+                break;
+            }
+        }
+    }
+
+    private String getUserInput() {
+        System.out.print("Entrez une combinaison (4 lettres parmi B,G,O,R,W,Y) : ");
+        String input = scanner.nextLine().toUpperCase();
+
+        if (!input.matches("[BGORWY]{4}")) {
+            System.out.println("Combinaison invalide, veuillez entrer exactement 4 lettres parmi B, G, O, R, W, Y.");
+            return null;
+        }
+        return input;
+    }
+
+    private void sendGuess(String guess) {
+        out.println(guess);
+    }
+
+    private String receiveResponse() {
+        try {
+            return in.readLine();
+        } catch (IOException e) {
+            System.err.println("Erreur de lecture du serveur : " + e.getMessage());
+            return null;
+        }
+    }
+
+    private void closeConnection() {
+        try {
+            if (socket != null) socket.close();
+            if (in != null) in.close();
+            if (out != null) out.close();
+            scanner.close();
+        } catch (IOException e) {
+            System.err.println("Erreur lors de la fermeture des ressources : " + e.getMessage());
+        }
+    }
+
+
+    public static void main(String[] args) {
+        new Client().connect();
+    }
+}
diff --git a/src/Code.java b/src/Code.java
index 4e67f1e380003dd911326af35844c059de332ad5..ef623a7e2eabc7675f8b1fa9feba88d1e61d012c 100644
--- a/src/Code.java
+++ b/src/Code.java
@@ -1,4 +1,78 @@
 package src;
 
+import java.util.Random;
+
 public class Code {
+    public static final int CODE_LENGTH = 4;
+    public static char[] COLORS = new char[]{'B','G','O','R','W','Y'};
+    private final  char[] codeWord = new char[CODE_LENGTH];
+
+    public Code(Random random){
+        for (int i = 0; i < CODE_LENGTH; i++) {
+            codeWord[i] = COLORS[random.nextInt(COLORS.length)];
+        }
+    }
+
+    public Code(String codeString){
+        assert(codeString.length() == CODE_LENGTH);
+        for(int i=0; i<CODE_LENGTH; i++)
+            codeWord[i] = codeString.charAt(i);
+    }
+
+    @Override
+    public String toString() {
+        return new String(codeWord);
+    }
+
+    /**
+     * return the number of colors of guess that are correctly positioned
+     */
+    public int numberOfColorsWithCorrectPosition(Code guess){
+        int count = 0;
+        for(char color : COLORS){
+            count += numberOfMatches(color, guess);
+        }
+        return count;
+    }
+
+    /**
+     * return the number of colors of guess that are in this codeWord
+     * but do not have the correct position
+     */
+    public int numberOfColorsWithIncorrectPosition(Code guess){
+        int count = 0;
+        for(char color:COLORS){
+            int nMatchedOccurrences = numberOfMatches(color, guess);
+            int nUnmatchedOccurrencesCode  = numberOfOccurrences(color, this) - nMatchedOccurrences;
+            int nUnmatchedOccurrencesGuess = numberOfOccurrences(color, guess) - nMatchedOccurrences;
+            count += Math.min(nUnmatchedOccurrencesCode, nUnmatchedOccurrencesGuess);
+        }
+        return count;
+    }
+
+
+    private int numberOfOccurrences(char color, Code code){
+        int count = 0;
+        for (int i = 0; i < CODE_LENGTH; i++) {
+            if (code.codeWord[i] == color) count++;
+        }
+        return count;
+    }
+
+    private int numberOfMatches(char color, Code guess){
+        int count = 0;
+        for (int i = 0; i < CODE_LENGTH; i++) {
+            if ((this.codeWord[i] == guess.codeWord[i]) && (this.codeWord[i] == color)){
+                count++;
+            }
+        }
+        return count;
+    }
+
+    @Override
+    public boolean equals(Object o){
+        if (o == null) return false;
+        if (!(o instanceof Code)) return false;
+        return this.toString().equals(o.toString());
+    }
 }
diff --git a/src/server.java b/src/server.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f410c6f17c29e6c21f0c168806781f306376d34
--- /dev/null
+++ b/src/server.java
@@ -0,0 +1,4 @@
+package src;
+
+public class server {
+}