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

Signaler
Messages postés
2
Date d'inscription
dimanche 25 décembre 2011
Statut
Membre
Dernière intervention
30 décembre 2011
-
Messages postés
1
Date d'inscription
mardi 20 janvier 2009
Statut
Membre
Dernière intervention
14 janvier 2012
-
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

Messages postés
14828
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 novembre 2021
157
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
Messages postés
1
Date d'inscription
mardi 20 janvier 2009
Statut
Membre
Dernière intervention
14 janvier 2012

Bonjour, Je connais un professeur Algérien a l'université d'IGMO à Oran qui est très doué! tu peux le contacter :P