Bonjour,
Je suis en train d'implémenter le Master Mind en réseau. Je vous explique d'abord ce que j'essaie de faire.
Les deux joueurs essaient de trouver la combinaison choisie par l'ordinateur. Chacun à leur tour ils proposent une combinaison et j'aimerais que la combinaison choisie par le joueur1 s'affiche sur le plateau du joueur2 et vice-versa.
J'utilise pour cela un Thread.
A chaque couleur de billes, on a associé un numéro. Quand on appuie sur le bouton "valider la combinaison", les 4 numéros associés aux couleurs choisies par le joueur sont écrits sur un objet PrintWriter appelé out. Puis, dans la méthode run() du joueur2, je lis ces entiers et je change les composants nécessaires grâce à ces numéros, puis j'appelle la méthode repaint et rien ne se passe. Voilà mon problème dans ce sens là.
Dans le sens joueur2 vers joueur1, je n'arrive pas à créer un PrintWriter. Quand je le fait j'ai des NullPointerException qui s'affichent.
Je précise aussi que l'interface du joueur1 joue le rôle de serveur et l'interface du joueur2 joue le rôle de client.
Voici mon code.
Pourriez-vous m'indiquer mon erreur?
Quand j'appuie sur "Valider la combinaison" chez le joueur1, voici une des instructions réalisées : celle qui écrit sur le PrintWriter out
InterfaceJoueur1.out.print(GestionPanneauDeJeu.CombinaisonJoueur[k]);
Cette instruction se trouve dans une boucle.
Voici le code de l'interface du joueur2 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| import javax.swing.*;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.awt.geom.*;
import java.awt.event.*;
class InterfaceJoueur2 extends JFrame implements Runnable, ActionListener
{
public static Valider Valider;
private static JButton connection;
public static JPanel panneauPrincipal;
public static TextField textfield;
public static PanneauDeSolutions panneauDeSolutions;
private Socket socket;
public static OutputStream out;
public static InputStream in;
Socket insocket;
Thread thread;
public static void main(String[] args)
{
new InterfaceJoueur2();
}
public InterfaceJoueur2()
{
setTitle("Master Mind");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Toolkit kit= Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int hauteur = screenSize.height;
int largeur = screenSize.width;
setSize((largeur/9)*4 +250,(hauteur/25)*24+10);
panneauPrincipal = new JPanel();
panneauPrincipal.setBackground(Color.LIGHT_GRAY);
panneauPrincipal.add(connection = new JButton("Connect"));
panneauPrincipal.add(textfield = new TextField("127.0.0.1"));
panneauPrincipal.add(new PanneauDeJeu());
panneauPrincipal.add(panneauDeSolutions = new PanneauDeSolutions());
panneauPrincipal.add(Valider = new Valider());
panneauPrincipal.add(new PanneauDeBilles());
getContentPane().add(panneauPrincipal);
connection.addActionListener(this);
setVisible(true);
setResizable(false);
}
// Lire les infos provenant de l'autre joueur.
public void run()
{
try{
BufferedReader in = new BufferedReader(new InputStreamReader(insocket.getInputStream()));
int k = 0;
while (k != 4)
{
GestionPanneauDeJeu.CombinaisonJoueur[k] = in.read();
GestionPanneauDeJeu.billesTableau.add(new Ellipse2D.Double(55*k+10, 65, 50, 50));
}
panneauPrincipal.repaint();
}catch(Exception e){}
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == connection)
{
try{
socket = new Socket(textfield.getText(), 8765);
textfield.setText("Connecting...");
in = socket.getInputStream();
out = socket.getOutputStream();
thread = new Thread(this);
thread.start();
}catch(IOException ioe){textfield.setText("Pas connecté.");
}catch (Exception c){
textfield.setText(c.getMessage());
}
if(socket != null && socket.isConnected()){
textfield.setText("Connecté");
}
}
}
} |
Ce que je ne sais pas non plus, c'est quand le Thread est exécuté.
Merci d'avance.
Partager