projet jeu awele [presque résolu]

COLOMBAT
projet jeu awele [presque résolu]

Bonjour,
Je travaille actuellement sur la réalisation d'une application en Java sur le jeu d'awele dont les règles se trouvent ici :
http://fr.wikipedia.org/wiki/Aw%C3%A9l%C3%A9
J'ai quelques problèmes notamment pour sélectionner un trou.
Merci d'avance pour votre aide :wink:
Guillaume

bast2

Bonsoir,

Pour que quelqu'un puisse te répondre, je t'invite à préciser ton problème. Décris les erreurs que tu rencontre, présente les extraits de code concernés, n'hésite pas à être complet.

COLOMBAT

C'est un peu compliqué car il y a beaucoup de fichiers.
J'ai fait pour l'instant une application qui ressemble à ça :

Le plus simple serait que les personnes intéressées me laissent un MP avec un mail pour que je puisse ensuite envoyer une archive avec toutes les sources.

Voici la fonction qui pose problème :
// interface graphique pour un trou
public void paint(Graphics g)
{
String s ;
BufferedImage i=null ;
File temp_file;
if ( show_result == false )
{
//s = "C:/Documents and Settings/Guillaume COLOMBAT/Bureau/Awalejava/tp2/images/seeds" + nbseeds + ".gif" ;
// 4 graines dans un trou au depart
s = "C:/Documents and Settings/Guillaume COLOMBAT/Bureau/Awalejava/tp2/images/seeds4.gif" ;
temp_file = new File(s);
try
{
i = ImageIO.read(temp_file);}
catch(IOException e)
{System.err.println(e);}
}
else
{
s = "C:/Documents and Settings/Guillaume COLOMBAT/Bureau/Awalejava/tp2/images/result_move/seedsred" + nbseeds + ".gif" ;
temp_file = new File(s);
try
{
i = ImageIO.read(temp_file);}
catch(IOException e)
{System.err.println(e);}
}

g.drawImage(i,0,0,this);

Merci d'avance :wink:

bast2

COLOMBAT wrote:
Le plus simple serait que les personnes intéressées me laissent un MP avec un mail pour que je puisse ensuite envoyer une archive avec toutes les sources.

Le principe d'un forum est que tout le monde puisse participer, t'aider, et voir la solution du problème ensuite. Le mieux est que tu expose tout ton problème sur le forum plutôt que par mail

COLOMBAT wrote:

Voici la fonction qui pose problème :

Et quel est le problème en fait ?

COLOMBAT

Il me manque quelque chose pour sélectionner un trou et ajouter une graine à chaque trou suivant.

Il y a aussi cette fonction qui pose problème.
class HoleHandler extends MouseAdapter
{
public Awale ap ; // lien vers l'application
public Hole current_hole ; // lien pour la sélection d'un trou

// constructeur
public HoleHandler(Awale app,Hole c_hole)
{
ap = app ;
current_hole = c_hole ;
}

// clic de la souris sur le trou
public void mousePressed(MouseEvent evt)
{
ap.hole_selected(current_hole.number) ;
}

// entrée de la souris dans le trou
public void mouseEntered(MouseEvent evt)
{
ap.enter_hole(current_hole.number) ;
}

// sortie de la souris du trou
public void mouseExited(MouseEvent e)
{
ap.exit_hole() ;
}
}

fredericmazue

Quote:
C'est un peu compliqué car il y a beaucoup de fichiers.

Dans ce cas, il faut essayer d'isoler le code à problème te poster un extrait.
Dans le premier bout de code, ce n'est pas raisonnable de charger l'image sur disque à chaque fois que la fenêtre est painte. Tu devrais charger là ou les images au départ du programme.

Quant au deuxième bout de code.. il n'y a qu'à.. le compléter. Ce que toi seul peut faire puisque toi seul à l'ensemble du code.

Heu je ne veux pas dire que tu devrais poster tout ton code ici. Je ne pense pas que quelqu'un le complète.

Pose des questions précises. Je vois bienque tu as du mal à manipuler les événements en Java. Pose des questions à ce sujet, avec des bouts de code éventuellement indépendants de ton application et tu trouveras sans doute de l'aide.

COLOMBAT

Effectivement, il faut que je complète le programme mais un peu d'aide extérieure me serait vraiment utile.
Néanmoins, je ne sais pas précisément ce qu'il faut ajouter dans mon programme pour pouvoir sélectionner un trou.
Merci quand même pour tes précisions :wink:

fredericmazue

Pour ajouter un trou comme tu dis, il faut déjà savoit que l'utilisateur a cliqué dessus.
Quant l'utilisateur clique, mousepressed va être appelé. Dans evt, tu vas avoir les coordonnées x,y du pointeur au moment du clic.
La tu dois analyser les valeurs pour savoir dans quel trou ça tombe. Et après tu dois agir en conséquence.
Evidemment cela suppose que le plateau de jeu est découpé en rectangles (imaginaires). Et à chaque rectangle correspond un trou. Donc tu dois voir si les x,y tombent dans un de ces rectangles.

A toi de jouer :)

COLOMBAT

C'est bon.
J'ai trouvé comment faire.
Merci pour ton aide. :wink:

jerome01
Besoin des codes

Bonjour,

Peut tu m'envoyer les codes sources par mail je doit réalisé un projet qui ressemble un peu au jeu awele.

Je voudrais me basé sur ton jeu.

Envoi moi par mail : eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%7a%65%6e%62%6f%75%74%65%40%68%6f%74%6d%61%69%6c%2e%63%6f%6d%22%3e%7a%65%6e%62%6f%75%74%65%40%68%6f%74%6d%61%69%6c%2e%63%6f%6d%3c%2f%61%3e%27%29%3b'))

Merci beaucoup

COLOMBAT

J'ai presque terminé mon projet de jeu d'awale sauf que je dois faire une application de mise en réseau du jeu.
On m'a donné un programme mais je n'arrive pas à l'utiliser.
Est-ce qu'une âme charitable spécialiste de réseau en Java serait capable de m'aider?
Merci d'avance

fredericmazue

Quote:
On m'a donné un programme

De quel "programme" s'qgit-il ?
COLOMBAT

C'est un programme permettant de jouer en réseau au jeu que l'on m'a fourni, que je n'ai pas touché d'ailleurs, mais que je n'arrive pas à faire marcher.
Si tu veux m'aider, je t'en dirai un peu plus par MP. :wink:

fredericmazue

Quote:
Si tu veux m'aider, je t'en dirai un peu plus par MP

Non pas en privé, je n'ai pas le temps.

Pour en revenir à ton jeu d'awale. Ce n'est pas difficile de le faire jouer en réseau.
1 tu dois savoir manipuler les sockets en Java ce qui ne présente aucune difficulé.
2 tu dois définir un protocole pour l'échange des informations. Par exemple si le joueur met une graine dans la case 2, tu constitue une chaîne comme "J-1-2" et tu envoies la chaîne au jeu à travaers le socket. Du côté du jeu, celui-ci reçoit donc "J-1-2", analyse la chaîne et déduit comment répercuter le coup du jeu sur le plateau de jeu.

Tout ça est en fait très simple sur le principe. Tu dois bien réfléchir à ce que doivent être les données à échanger dans tous le scas de figure, puis tu établis ton procole, puis tu le codes :)

COLOMBAT

Je ne suis pas vraiment un expert en réseau en Java.
C'est la première fois que je fais ce genre de chose.
J'ai fait quelque chose dessus aujourd'hui mais ça ne fonctionne toujours pas.
L'idéal serait que je t'envoie les sources par mail et que tu m'aides à résoudre ce problème. :wink:
Merci d'avance pour ton aide.

fredericmazue

Non pas en privé.
(Non étant le contraire de oui n'est-ce pas ?)
Pas besoin d'être expert en Java ni en réseau pour ça pour ce que tu veux faire, loin de là.
Essaie d'exposer ici clairement, bouts de codes à l'appui, tes difficultés et sans doute tu auras de l'aide. Si ce n'est pas moi (car après tout pourquoi est-ce que ça ne devrait être que moi :) ) quelqu'un d'autre t'aidera probablement.

COLOMBAT

Voici ma fonction qui s'appelle NetAwale :

package awele;

import java.net.*;
import java.io.*;
public class NetAwale {
	public Awale awale;	// lien vers le jeu awale
	private byte req_size = 14; // taille des messages
	private Socket s;	// socket, ?o/c !c
	private BufferedInputStream in;	// flux entrant encapsulé dans un buffer
	private BufferedOutputStream out; // flux sortant encapsulé dans un buffer
	private byte[] b = new byte[req_size]; // jeu courant et commande de passage
	private byte lui = 0,moi = 0;  // pion ramassé
	private float LastSend;				// calcul du temps d'execution
	private String[] endmessages = { // messages envoyés à la fin
			"none",	// ne pas utiliser
			"perdu! :-/",
			"gagné! :-D",
			"draw",
			"Jeux différents",
			"timeout",
			"coup sur case vide",
			"coup invalide",
			"abandon"
	};

	// creation de l'application réseau, prend awale en param
	public NetAwale(Awale awale) {
		super();
		this.awale = awale;
	}
	
	// création serveur
	public void listen(int port){
		try{ 
                                               // on tente de prendre le port	
			listening(new ServerSocket(port));
		}
		catch(IOException e){ 
		log("pb écoute au port "+e.getMessage());	
		}		
	}
	// attente de clients
	private void listening(ServerSocket ss){
		log("Ecoute au port "+ss.getLocalPort());
		try
                                {			
		s = ss.accept(); // on attend un client / bloquant
		log("nouveau client : "+s.getInetAddress().getHostAddress()+":"+s.getPort());
			accepted((byte)0);
		}
		catch(IOException e){
			log("pb écoute au port "+e.getMessage());
			listening(ss);
		}	
	}

	// connexion à un serveur
	public boolean connect(String addr,int port){
		try{
		s = new Socket(addr,port);
		if( s.isConnected() ){
		log("serveur : "+s.getInetAddress().getHostAddress()+":"+s.getPort());
		accepted((byte)1);
		return true;
			}
		}
		catch(IOException e){
		log("pb connexion à "+addr+":"+port+" "+e.getMessage());			
		}
		return false;
	}
	
	// notification de la connexion d'un client ou à un serveur
	private void accepted(byte k){
		
		try{ // on récupère les streams
			in = new BufferedInputStream(s.getInputStream());
			out = new BufferedOutputStream(s.getOutputStream());
		}
		catch(IOException e){
			log("pb accepté "+e.getMessage());
			return;
		}
		// initialisation 1444444K (K=1 client)
		b[0] = 1; // commande
		b[13] = k; // param
		for(int i=1;i<13;i++)	
			b[i] = 4;	// tous les trous à 4
		if( k == 1 ){ 
			send(1,k); // trame d'initialisation
			log("trame d'initialisation envoyée, attente du serveur...");
			printgame(b);
		}
		receive(); // écoute du jeu
	}
	// envoyer un message
	private boolean send(int cmd,int arg){ // int pour ne pas fatiguer mon clavier :/
		b[13] = (byte)arg; // param
		b[0] = (byte)cmd; // cmd
		if( cmd == 3 ){
			if( arg > 0 && arg < endmessages.length )
				log("end message, envoi de ["+endmessages[arg]+"]");
			if( arg == 1 )
				log("VOUS AVEZ GAGNE!! Score : "+moi+" / "+lui);
			else if( arg == 2 )
				log("VOUS AVEZ PERDU.. Score : "+moi+" / "+lui);
			else if( arg == 3 )
				log("DRAW.. Score : "+moi+" / "+lui);
		}
		
		// fin explicite
		// !todo le reste du tableau est à maj dans les 2 sens
		// for(int i=0;i<b.length;i++)	log("b["+i+"]="+b[i]);
		try{
			out.write(b,0,req_size);
			out.flush();
			LastSend = System.nanoTime();
			return true;
		}
		catch(IOException e){
			log("pb send; "+e.getMessage());
			return false;
		}	
	}
	// recevoir un message
	private void receive(){
		try{
			byte[] response = new byte[req_size];
			in.read(response,0,req_size);
			if( LastSend > 0 ){
				log("Temps d'exécution adverse ["+(System.nanoTime()-LastSend)+" ns]");
				LastSend = 0;
			}
			switch( response[0] ){
				case (byte)1: // ini
					if( checkGame(response) ){
						if( response[13] == 1 ) // le serveur commence à jouer (reçu le 1 du client)
							play(response);	// appel de l'IA ou humain ici
						else
							log("initialisation : trame suspecte");
					}
				break;
				case (byte)2: // play
					if( updateGame(response) )
						play(response);	// appel de l'IA ou humain ici
				break;
				case (byte)3: // stop
					if( response[13] > 0 && response[13] < endmessages.length )
						log("end message de l'adversaire : "+endmessages[response[13]]);
					endGame(true);
				break;
				default:
					log("pb switch #1 "+response[0]);
				break;
			}
		}
		catch(IOException e){
			log("pb receive "+e.getMessage());
		}
	}
	// verifie le jeu
	private boolean checkGame(byte[] a){
		if( a.length != req_size ){
			send(3,7);// coup invalide
			return false;
		}
		for(int i=1;i<13;i++)
			if( (i < 7 && a[i+6] != b[i]) || (i > 8 && a[i-6] != b[i]) ){
				send(3,4); // jeux différents
				log("jeu adverse:");
				printgame(a);
				log("mon jeu:");
				printgame(b);
				return false;
			}
		return true;
	}
	
	
	// mise à jour par rapport à ses propres coups
	public void play(byte[] a){
		if( a.length != req_size ||  a[13] < 1 ||  a[13] > 6  )
			send(3,7); // coup invalide
		else{	
			b[13] = a[13]; // on récupère le coup de l'adversaire
			byte coup = play2(b);
			if( coup < 1 || coup > 6 || b[coup] == 0 )
				send(3,8); // give up
			else{
				// algo de semaison
				byte c = coup,d = b[coup];
				b[coup] = 0;
				while( d > 0 ){
					c++;
					if( c == coup )	c++;
					if( c > 12 ){
						if( coup != 1 )	c = 1;
						else			c = 2;
					}
					b[c]++;
					d--;		
				}	
				// algo de récolte
				while( b[c] > 1 && b[c] < 4 && c > 6 && c < 13 ){
					moi += b[c];
					b[c] = 0;
					c--;
				}	
				// famine
				if( (b[12]+b[11]+b[10]+b[9]+b[8]+b[7]) == 0 ){
					lui += (b[1]+b[2]+b[3]+b[4]+b[5]+b[6]);
					b[1]=0;b[2]=0;b[3]=0;b[4]=0;b[5]=0;b[6]=0;
					log("famine!");
				}	
				printgame(b);
				send(2,coup);
				if( !endGame(false) )
					receive();
			}
		}
	}
	
	public byte play2(byte[] b){
		boolean manuel = false;
		printgame(b);
		if( manuel ){
			log("coup:");
			try{
				BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
				byte coup = Integer.decode(in.readLine()).byteValue();
				if( coup < 1 || coup > 6 || b[coup] == 0 ){
					log("coup errone");
					return play2(b);
				}
				return coup;
			}
			catch(IOException e){ 
				log("pb clavier #2, "+e.getMessage());
				return 0;
			}
		}
		//else
			//return Awale.IA(b); // on interroge l'ia
		return req_size;
	}

	
	// mise à jour par rapport aux coups adverses
	public boolean updateGame(byte[] a){
		if( a.length != req_size ||  a[13] < 1 ||  a[13] > 6  ){
			log("updateGame, taille incorrecte "+a[13]+" "+a.length);
			send(3,7); // cheat
			return false;
		}
		// on inverse le coup (6 devient 12, 5 devient 11,... 1 devient 7)
		byte coup = (byte)(a[13]+6);
		if( b[coup] == 0 ){
			log("case vide, paramètre incorrect #3 "+a[1]);
			send(3,6); // cas vide
			return false;
		}
		log("l'adversaire a joué : "+coup);
		// algo de semaison
		byte c = coup,d = b[coup];
		b[coup] = 0;
		while( d > 0 ){
			c++;
			if( c == coup )	c++;
			if( c > 12 ){
				if( coup != 1 )	c = 1;
				else			c = 2;
			}
			b[c]++;
			d--;		
		}	
		// algo de récolte
		while( b[c] > 1 && b[c] < 4 && c < 7 && c > 0 ){
			lui += b[c];
			b[c] = 0;
			c--;
		}
		// famine
		if( (b[1]+b[2]+b[3]+b[4]+b[5]+b[6]) == 0 ){
			moi += (b[12]+b[11]+b[10]+b[9]+b[8]+b[7]);
			b[12]=0;b[11]=0;b[10]=0;b[9]=0;b[8]=0;b[7]=0;
			log("famine!");
		}	
		return (!endGame(false) && checkGame(a));
	}
	private boolean endGame(boolean bAnnounced){
		// lui/moi > 24
		if( moi > 24 )
			send(3,1); // you've lose!
		else if( lui > 24 )
			send(3,2); // you've won!
		else if( lui == 24 && moi == 24 )
			send(3,3); // draw	
		else if( bAnnounced )
			log("fin inattendu, vous avez gagné");
		else
			return false;
		return true;
	}
	// printgame() affiche le jeu en cours
	private void printgame(byte[] b){
		log("===== JEU EN COURS =====");
		log("\t"+b[12]+"\t"+b[11]+"\t"+b[10]+"\t"+b[9]+"\t"+b[8]+"\t"+b[7]);
		log("\t"+b[1]+"\t"+b[2]+"\t"+b[3]+"\t"+b[4]+"\t"+b[5]+"\t"+b[6]);
		log("===== score: "+moi+" / "+lui);
	}
	
	/**
	 * affiche les messages
	 * peut être modifié pour afficher 
	 * autre part que dans la console...
	 */
	public void log(String text){
		System.out.println(text);
	}
}

Et voici ce que j'ai mis dans mon programme principal (fonction main) pour appeler NetAwale :

 
		    	  
		 	  //début fonction réseau
		    	  NetAwale na = new NetAwale(awale);
		  		try{
		  			BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		  			na.log("AWALE MODE [1=IA,2=HUMAIN,*=SORTIE]");
		  			switch(Integer.decode(in.readLine()).intValue()){
		  				case 1:		manuel = false;	break;
		  				case 2:		manuel = true;	break;		
		  				default:	na.log("sortie");	return;	
		  			}
		  			na.log("AWALE NET [1=SERVER,2=CLIENT,*=SORTIE]");
		  			int port;
		  			switch(Integer.decode(in.readLine()).intValue()){
		  				case 1:
		  					//na.log("Port local?");
		  					port = 2222;
		  					//port = Integer.decode(in.readLine()).intValue();
		  					na.listen(port);
		  				break;
		  				case 2:
		  					//na.log("Adresse?");
		  					String adresse = "192.168.1.10";
		  					//String adresse = in.readLine();
		  					//na.log("Port distant?");
		  					port = 2222;
		  					//port = Integer.decode(in.readLine()).intValue();
		  					na.connect(adresse,port);
		  				break;		
		  				default:
		  					na.log("sortie");
		  				break;
		  			}
		  		}
		  		catch(IOException e){ 
		  			na.log("pb clavier #1, "+e.getMessage());	
		  		}
				 }		
			 });
fredericmazue

Tu balances une montage de code, mais quel est le problème ?

Si tu crois que je vais tout lire, à la recherche de ce qui ne va éventuellement pas sans la moindre indication, tu te fourres le doigt dans l'oeil.
Ou alors faut que tu donnes une adresse où facturer :)
Mais peut être que quelqu'un d'autre sera tenté par l'exploration de ce beau code qui sait ?:)
Mais je pense quand même que si tu veux de l'aide, sur ce foruum ou sur n'importe quel forum, faut aussi que tu fasses un minimum d'effort sur tes questions tu ne crois pas ?

COLOMBAT

On m'a fourni la fonction NetAwale.
Mais lorsque je l'appelle, le réseau ne se fait pas et le programme se bloque.
Je ne sais pas ce qu'il faut modifier pour que ça fonctionne.

fredericmazue

Quote:
On m'a fourni la fonction NetAwale.

Ah....

La première chose à vérifier, avant de regarder dans le code, c'est qu'un pare-feu ne bloque pas le port du socket (ici 2222)
Ensuite qu'il autorise le traffic réseau en Intranet (classe d'adresse 192.168.x.x utilisée par le code)

Si le parefeu est de la partie (avec et sans jeu de mots) sur ta machine ou sur ton réseau Intranet, faut configurer le pare-feu avant toute autre chose..

Sinon, tu dois être conscient qu'avec une adresse en 192.168.x.x tu ne peux pas être en réseau sur Internet n'est-ce pas ?

Enfin.... (:lol:) je suppose que tu essaies d'abord en local sur ta machine. Quelle est donc l'adresse IP locale de ta bécane ? Est-ce bien 192.168.1.10 comme utilisé dans le code ? Parce que sans ça, ça va pas marcher tellement bien forcément :lol:

Tiens commences donc pas essayer de remplacer "192.168.1.10" par "localhost", si ça se trouve ça ira tout de suite mieux :lol:

Et essaie aussi d'acquérir quelque notions de base de réseau TCP/IP. De nos jours c'est indispensable en informatique.