[Déplacé IRC -> Java]TicTacToe Client/Server

cs_nacimovitch Messages postés 2 Date d'inscription dimanche 25 décembre 2011 Statut Membre Dernière intervention 30 décembre 2011 - 30 déc. 2011 à 12:39
cs_burnit4mosta Messages postés 1 Date d'inscription mardi 20 janvier 2009 Statut Membre Dernière intervention 14 janvier 2012 - 14 janv. 2012 à 23:02
Bonjour Voilà j'ai telechargé ce code Java qui permet d'implémenter le Jeu Tic-Tac-Toe en réseau Cependant j'ai un soucis je n'ai pas su quoi ajouter pour determiner le vainqueur si vous pouviez m'aider s'il vous plait sa serais sympa a vous :

// Cette classe administre le jeu de Morpion (tic tac toe)
// pour deux applets clientes.
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.*;

public class ServeurMorpion extends JFrame {
private byte plateau[];
private boolean mouvementX;
private JTextArea sortie;
private Joueur joueurs[];
private ServerSocket serveur;
private int joueurCourant;

public ServeurMorpion()
{
super( "Serveur de Morpion" );

plateau = new byte[ 9 ];
mouvementX = true;
joueurs = new Joueur[ 2 ];
joueurCourant = 0;

// Définir le ServerSocket.
try {
serveur = new ServerSocket( 5000, 2 );
}
catch( IOException e ) {
e.printStackTrace();
System.exit( 1 );
}

sortie = new JTextArea();
getContentPane().add( sortie, BorderLayout.CENTER );
sortie.setText( "Le serveur attend les connexions\n" );

setSize( 300, 300 );
show();
}

// Attendre deux connexions pour que le jeu puisse commencer.
public void executer()
{
for ( int i = 0; i < joueurs.length; i++ ) {
try {
joueurs[ i ] =
new Joueur( serveur.accept(), this, i );
joueurs[ i ].start();
}
catch( IOException e ) {
e.printStackTrace();
System.exit( 1 );
}
}

// Le joueur X est mis en attente jusqu'à connexion du joueur O.
// Reprise du joueur X ensuite.
synchronized ( joueurs[ 0 ] ) {
joueurs[ 0 ].threadSuspendu = false;
joueurs[ 0 ].notify();
}

}

public void affichage( String s )
{
sortie.append( s + "\n" );
}

// Déterminer si un mouvement est valable.
// Cette méthode est synchronisée parce qu'un seul
// mouvement est autorisé à la fois.
public synchronized boolean mouvementValable( int empl,
int joueur )
{
boolean mouvementFait = false;

while ( joueur != joueurCourant ) {
try {
wait();
}
catch( InterruptedException e ) {
e.printStackTrace();
}
}

if ( !estOccupe( empl ) ) {
plateau[ empl ] =
(byte) ( joueurCourant == 0 ? 'X' : 'O' );
joueurCourant = ( joueurCourant + 1 ) % 2;
joueurs[ joueurCourant ].autreJoueurAJoue( empl );
notify(); // dire au joueur en attente de poursuivre.
return true;
}
else
return false;
}

public boolean estOccupe( int empl )
{
if ( plateau[ empl ] == 'X' || plateau [ empl ] == 'O' )
return true;
else
return false;
}

public boolean partieFinie()
{
// Placer du code ici pour tester un gagnant de la partie.

return false;
}

public static void main( String args[] )
{
ServeurMorpion jeu = new ServeurMorpion();

jeu.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);

jeu.executer();
}
}

// Classe Joueur destinée à gérer chaque Joueur comme un thread.
class Joueur extends Thread {
private Socket connexion;
private DataInputStream entree;
private DataOutputStream sortie;
private ServeurMorpion controle;
private int nombre;
private char marque;
protected boolean threadSuspendu = true;

public Joueur( Socket s, ServeurMorpion t, int num )
{
marque ( num 0 ? 'X' : 'O' );

connexion = s;

try {
entree = new DataInputStream(
connexion.getInputStream() );
sortie = new DataOutputStream(
connexion.getOutputStream() );
}
catch( IOException e ) {
e.printStackTrace();
System.exit( 1 );
}

controle = t;
nombre = num;
}

public void autreJoueurAJoue( int empl )
{
try {
sortie.writeUTF( "L'adversaire a joué" );
sortie.writeInt( empl );
}
catch ( IOException e ) { e.printStackTrace(); }
}

public void run()
{
boolean termine = false;

try {
controle.affichage( "Joueur " +
( nombre == 0 ? 'X' : 'O' ) + " connecté" );
sortie.writeChar( marque );
sortie.writeUTF( "Joueur " +
( nombre == 0 ? "X connecté\n" :
"O connecté, veuillez patienter\n" ) );

// Attendre l'arrivée d'un autre joueur.
if ( marque == 'X' ) {
sortie.writeUTF( "Attente d'un autre joueur." );

try {
synchronized( this ) {
while ( threadSuspendu )
wait();
}
}
catch ( InterruptedException e ) {
e.printStackTrace();
}

sortie.writeUTF(
"Autre joueur connecté. À vous de jouer." );
}

// Jouer au Morpion.
while ( !termine ) {
int emplacement = entree.readInt();

if ( controle.mouvementValable( emplacement, nombre ) ) {
controle.affichage( "empl: " + emplacement );
sortie.writeUTF( "Mouvement valable." );
}
else
sortie.writeUTF( "Mouvement interdit, réessayez." );

if ( controle.partieFinie() )
termine = true;
}

connexion.close();
}
catch( IOException e ) {
e.printStackTrace();
System.exit( 1 );
}
}
}



Et voici la Classe Client

// Client du jeux de Morpion (tic tac to).
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.*;

// La classe Client permet à un utilisateur de jouer au Morpion
// avec un autre utilisateur par le biais d'un réseau.
public class ClientMorpion extends JApplet
implements Runnable {
private JTextField id;
private JTextArea affichage;
private JPanel panneauPlateau, panneau2;
private Carre plateau[][], caseCourante;
private Socket connexion;
private DataInputStream entree;
private DataOutputStream sortie;
private Thread threadSortie;
private char maMarque;
private boolean monTour;

// Définir l'interface utilisateur et le plateau.
public void init()
{
affichage = new JTextArea( 4, 30 );
affichage.setEditable( false );
getContentPane().add( new JScrollPane( affichage ),
BorderLayout.SOUTH );

panneauPlateau = new JPanel();
GridLayout layout = new GridLayout( 3, 3, 0, 0 );
panneauPlateau.setLayout( layout );

plateau = new Carre[ 3 ][ 3 ];

// À la création d'un Carre, l'argument d'emplacement
// du constructeur est une valeur de 0 à 8, indiquant
// la position du Carré sur le plateau. Les valeurs 0, 1 et 2
// forment la 1re ligne, les valeurs 3, 4 et 5 la deuxième
// ligne et les valeurs 6, 7 et 8 la troisième ligne.
for ( int ligne = 0; ligne < plateau.length; ligne++ )
{
for ( int col = 0;
col < plateau[ ligne ].length; col++ ) {
plateau[ ligne ][ col ] =
new Carre( ' ', ligne * 3 + col );
plateau[ ligne ][ col ].addMouseListener(
new EcouteurCarre(
this, plateau[ ligne ][ col ] ) );

panneauPlateau.add( plateau[ ligne ][ col ] );
}
}

id = new JTextField();
id.setEditable( false );

getContentPane().add( id, BorderLayout.NORTH );

panneau2 = new JPanel();
panneau2.add( panneauPlateau, BorderLayout.CENTER );
getContentPane().add( panneau2, BorderLayout.CENTER );
}

// Établir la connexion au serveur et prendre les flux associés.
// Démarrer un thread séparé pour permettre à cette applet de
// mettre à jour en continu sa sortie dans la zone de texte affichée.
public void start()
{
try {
connexion = new Socket(
InetAddress.getByName( "127.0.0.1" ), 5000 );
entree = new DataInputStream(
connexion.getInputStream() );
sortie = new DataOutputStream(
connexion.getOutputStream() );
}
catch ( IOException e ) {
e.printStackTrace();
}

threadSortie = new Thread( this );
threadSortie.start();
}

// Tread de contrôle qui permet une mise à jour permanente
// de l'affichage de la zone de texte.
public void run()
{
// Tout d'abord détecter la marque du joueur (X ou O).
try {
maMarque = entree.readChar();
id.setText( "Vous êtes le joueur "" + maMarque + """ );
monTour ( maMarque 'X' ? true : false );
}
catch ( IOException e ) {
e.printStackTrace();
}

// Recevoir les messages envoyés au client.
while ( true ) {
try {
String s = entree.readUTF();
traiterMessage( s );
}
catch ( IOException e ) {
e.printStackTrace();
}
}
}

// Traiter les messages envoyés au client.
public void traiterMessage( String s )
{
if ( s.equals( "Mouvement valable." ) ) {
affichage.append( "Mouvement valable, veuillez patienter.\n" );
caseCourante.setMarque( maMarque );
caseCourante.repaint();
}
else if ( s.equals( "Mouvement interdit, réessayez." ) ) {
affichage.append( s + "\n" );
monTour = true;
}
else if ( s.equals( "L'adversaire a joué" ) ) {
try {
int empl = entree.readInt();

plateau[ empl / 3 ][ empl % 3 ].setMarque(
( maMarque == 'X' ? 'O' : 'X' ) );
plateau[ empl / 3 ][ empl % 3 ].repaint();

affichage.append(
"L'adversaire a joué. À vous.\n" );
monTour = true;
}
catch ( IOException e ) {
e.printStackTrace();
}
}
else
affichage.append( s + "\n" );

affichage.setCaretPosition(
affichage.getText().length() );
}

public void sendClickedSquare( int empl )
{
if ( monTour )
try {
sortie.writeInt( empl );
monTour = false;
}
catch ( IOException ie ) {
ie.printStackTrace();
}
}

public void setCarreCourant( Carre s )
{
caseCourante = s;
}
}

// Gérer un carré du plateau.
class Carre extends JPanel {
private char marque;
private int emplacement;

public Carre( char m, int empl)
{
marque = m;
emplacement = empl;
setSize ( 30, 30 );

setVisible(true);
}

public Dimension getPreferredSize() {
return ( new Dimension( 30, 30 ) );
}

public Dimension getMinimumSize() {
return ( getPreferredSize() );
}

public void setMarque( char c ) { marque = c; }

public int getEmplacementCarre() { return emplacement; }

public void paintComponent( Graphics g )
{
super.paintComponent( g );
g.drawRect( 0, 0, 29, 29 );
g.drawString( String.valueOf( marque ), 11, 20 );
}
}

class EcouteurCarre extends MouseAdapter {
private ClientMorpion applet;
private Carre carre;

public EcouteurCarre( ClientMorpion t, Carre c )
{
applet = t;
carre = c;
}

public void mouseReleased( MouseEvent e )
{
applet.setCarreCourant( carre );
applet.sendClickedSquare( carre.getEmplacementCarre() );
}
}

2 réponses

NHenry Messages postés 15025 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 26 novembre 2022 157
30 déc. 2011 à 13:27
Bonjour,

Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )

Je déplace dans la catégorie Java (faire attention quand même ... )

(Ne faisant pas de Java, et le code étant illisible, je ne peux pas aider)

---
Mon site
0
cs_burnit4mosta Messages postés 1 Date d'inscription mardi 20 janvier 2009 Statut Membre Dernière intervention 14 janvier 2012
14 janv. 2012 à 23:02
Bonjour, Je connais un professeur Algérien a l'université d'IGMO à Oran qui est très doué! tu peux le contacter :P
0