JAVA probleme fonction et tableau

moustik
JAVA probleme fonction et tableau

bonjour,

je programme un jeu de bataille en java et j'ai un probleme avec ma fonction qui trie un tableau ou sont stockés mes cartes en cas d'egalite et son appel.
Le tableau est partiellement voir totalement rempli

mon code est le suivant :

 
public void trierTableau(int tbl[]){ 
  int i,j,taille,tmp; 
  taille=tbl.length; 
  
   while(taille>1) 
   { 
    for(i=0; i<taille-1; i++){ 
     if(tbl[i]>tbl[i+1]){ 
      tmp=tbl[i]; 
      tbl[i]=tbl[i+1]; 
      tbl[i+1]=tmp; 
     }  
    } 
    taille=taille-1; 
   } 
   
 } 
 
 

et mon appel :
egalite.trierTableau(egalite[]); 
 


l'erreur est :

Jeu.java:242: '.class' expected
egalite.trierTableau(egalite[]);
Jeu.java:242: ')' expected
egalite.trierTableau(egalite[]);
a savoir que la ligne 242 est celle de l'appel de la fonction


merci d'avance à qui m'aidera
fredericmazue

Bonjour,

Dans ta ligne:

Quote:

egalite.trierTableau(egalite[]);

Tu as au moins deux erreurs. La première est signalée par le compilateur:
Quote:

Jeu.java:242: '.class' expec

Le compilateur te dit que si tu appelles triertableau par egalite.trierTableau, alors egalite doit être une classe. (class expec veut dire que le compilateur s'attend à trouver une classe là). Alors que si je comprends bien ta question, egalite est un tableau, ou au moins il existe un tableau local nommé egalite qui masque (sinon pour le compilateur, au moins pour toi :-) ) une instance de classe nommée elle aussi egalite. Enfin je suppose parce que ne montres pas assez de code pour être sûr.

Quand tu auras corrigé cette erreur le compilateur t'en signalera une autre pour la même ligne. L'argument d'appel de la fonction n'est pas correct:

egalite[] ne veut rien dire. En suposant qu'un tableau egalite existe bien quelque part et soit correctement déclaré, par exemple:

int[] egalite = {1, 2, 3};

alors l'appel correct serait:
la_bonne_instance.trierTableau(egalite);

Et si tu n'as pas de chance, quand tu auras tout corrigé, le compilateur te sortira un nouveau message d'erreur pour la même ligne.
Affaire à suivre, tiens nous au courant.
moustik

tout d'abord merci fred pour la reponse

quand je mets egalite.trierTableau(egalite) comme tu me le conseille l'erreur change et devient :

Jeu.java:242: cannot find symbol
symbol : method trierTableau(int[])
location: class int[]
egalite.trierTableau(egalite);

voici l'integralité de mon code, si ca peut t'aider pour m'aider!


public class Jeu extends Main{
	private Main J1, J2;
	private int jeudistribue;

/** constructeur */
    public Jeu(Main M1, Main M2) {
    	this.J1=M1;
    	J2=M2;
    	jeudistribue=0 ;/** pour qu'on ne puisse pas commencer a jouer sans avoir distribué ! */
    }
    
    public Jeu(){
    	this.J1=new Main();
    	J2=new Main();
    	jeudistribue=0;
    }
public Jeu distribuer_hasard(){
		int[]T;
		int n=20;
		T=new int[n];

		/** on crée le sabot qui est trié */
		int i,a;
		for(i=0;i<4;i++)
			T[i]=1;
		for(i=4;i<8;i++)
			T[i]=2;
		for(i=8;i<12;i++)
			T[i]=3;
		for(i=12;i<16;i++)
			T[i]=4;
		for(i=16;i<20;i++)
			T[i]=5;

		/** on crée les 2 joueurs et leurs mains de 10 cartes */
		Main J1=new Main(); /** on cree la file de taille 20, car si le joueur gagne il aura alors 20 cartes en main */
		Main J2=new Main();
		Jeu J1J2;
		J1J2=new Jeu(J1,J2); /** J1J2 est le regroupement des 2 mains distribuées pour le retour */
	
		i=0;
		while(i!=10) /** tant que la file n'est pas entierement rempli*/
		{
			a=(int)(Math.random()*20);  /** on utilise random pour reproduire le hasard*/
				if(T[a]!=0)
				{
					System.out.print(" a="+a); // verif de a
					System.out.print(" T[a]="+T[a]); // verif de la carte a enfiler
					J1.enfiler(T[a]);
					T[a]=0;/** pour qu'une carte ne soit utilisée qu'une fois*/
					
					i++;
					
				}
			
		}
		System.out.println("\n");
		/** on met les cartes restantes du sabot a J2 en parcourant le tableau est en enfilant si T[i] est diff de null*/
		i=0;
		
		while(i!=10) /** tant que la file n'est pas entierement rempli*/
		{
			a=(int)(Math.random()*20);  /** on utilise random pour reproduire le hasard */
				if(T[a]!=0)
				{
					System.out.print(" a="+a); // verif de a
					System.out.print(" T[a]="+T[a]); // verif de la carte a enfiler
					J2.enfiler(T[a]);
					T[a]=0; /** pour qu'une carte ne soit utilisée qu'une fois */
					i++;
					
				}
			
		}
		System.out.println(" \n");
		jeudistribue=1;
	return J1J2;
	}// fin de la distribution

public void trierTableau(int tbl[]){
		int i,j,taille,tmp;
		taille=tbl.length;
	
			while(taille>1)
			{
				for(i=0; i<taille-1; i++){
					if(tbl[i]>tbl[i+1]){
						tmp=tbl[i];
						tbl[i]=tbl[i+1];
						tbl[i+1]=tmp;
					}	
				}
				taille=taille-1;
			}
		
	}
	
	
	public void jouonstout(){ /** jeu ou on voit tout le deroulemnt de la partie */
		
		int[] egalite=new int[20]; /** on crée un tableau spécial pour les cas d'egalité, de taille 20 au cas ou tous les tours sont égaux 
		on utilise un tableau pour pouvoir le parcourir afin de ranger ensuite les cartes dans l'ordre des valeurs*/
		int e=0;
		if(jeudistribue==0) /** on ne peut jouer que si les cartes ont été distribuées */
			System.out.println("le jeu n\'a pas été distribué");
			
		else
		{
			while((J1.estVide()!=true)&&(J2.estVide()!=true)){ /** tant que les deux mains ont des cartes, on joue. Si un joueur a sa main vide, on stoppe le jeu */
				System.out.print("le joueur 1 pose : "+J1.tete());
				System.out.println("le joueur 2 pose : "+J2.tete());
				
				/** on "pose" la tete de la file representant la main */
				
				if(J1.tete()==J2.tete()){ /** on teste en premier l'egalité des cartes en jeu */
					/** il faut stocker les cartes en attente du prochain tour */
					egalite[e]=(J1.tete());
					J1.defiler();
					e++;
					egalite[e]=(J2.tete());
					J2.defiler();
					e++;					
					
				}
				else{
					if(J1.tete()>J2.tete()){ /** joueur 1 mène */
					
						if(e!=0){ /** si le tableau "egalité" contient qqch il faut le vider dans la main du gagnant de ce tour, ici le joueur 1 */
							
							egalite[e]=J1.tete();
							J1.defiler();
							e++;
							egalite[e]=J2.tete();
							J2.defiler();
							e++;
							
							egalite.trierTableau(egalite); /** on trie le tableau dans l ordre croissant */
							
							while(e>=0){
								J1.enfiler(egalite[e]);
								e--;
							}
						}
						
					
						else{ /** dans le cas simple ou il n'y a pas eu d'egalité precedemment */
							System.out.println("le joueur 1 remporte le tour");
							J1.enfiler(J1.tete()); /** on met dans la file la carte la plus forte en premier */
							J1.defiler(); /** on la retire de la file */
							J1.enfiler(J2.tete()); /** puis on met la plus faible */
							J2.defiler();
						}
						

					} // fin du "si le premier joueur gagne
					else { 
/** joueur 2 mene : */						
					
						if(e!=0){ /** si le tableau "egalité" contient qqch il faut le vider dans la main du gagnant de ce tour, ici le joueur 2 */
							
							egalite[e]=J1.tete();
							J1.defiler();
							e++;
							egalite[e]=J2.tete();
							J2.defiler();
							e++;
							
							egalite.trierTableau(egalite); /** on trie le tableau dans l ordre croissant */
							
							while(e>=0){
								J2.enfiler(egalite[e]);
								e--;
							}
						}					
					
					
						else{
						
							System.out.println("le joueur 2 remporte le tour");
							J2.enfiler(J2.tete()); /** on met dans la file la carte la plus forte en premier */
							J2.defiler(); /** on la retire de la file (on la retire apres sinon on ne pourrait pas l'enfiler)*/
							J2.enfiler(J1.tete()); /** puis on met la plus faible */
							J1.defiler();
						}
					}
				}// fin du else allant au if d'egalité
			}// fin du while
			
			if ((J1.estVide()==true) && (J2.estVide()==true) ) /** si on sort de la boucle while ac les 2 mains vides */
				System.out.println ( "\n les deux joueurs ont perdu la partie ");
				
			else {
				if(J1.estVide()==true) /** si on sort de la boucle while avec le joueur 1 ayant une main vide */
					System.out.println("\n Le Joueur 2 est le vainqueur de cette partie");
				else
					System.out.println("\n Le Joueur 1 est le vainqueur de cette partie");
			}
		}// fin du else
	} /** fin du jouonstout */

desolé pour la longueur !

je reste a dispo et connecter pour plus d'information

encore merci

Moustik

fredericmazue

Quote:

quand je mets egalite.trierTableau(egalite) comme tu me le conseille l'erreur change et devient :

Ce n'est ce que j'ai dit :twisted:

Oui ton code est assez long ;)
On y voit bien

int[] egalite=new int[20];

Donc il est maintenant très clair que egalite est un tableau dans ton code

J'ai dit que la PREMIERE erreur est que egalite n'est pas une classe qui comporte une methode trierTableau mais un tableau. Donc ça ne peut pas aller. Un tableau n'a pas de methode trierTableau et le compilateur va forcément rejeter l'appel egalite.trierTableau(/* .. */)
Corriger la deuxième erreur ne corrigera pas la première....

moustik

je dois donc creer une nouvelle classe Tableau?
il n'y a pas d'autre moyen?

je voulais juste appeler une fonction toute simple triant mon tableau

fredericmazue

Quote:

je voulais juste appeler une fonction toute simple triant mon table

Oui mais cett fonction n'existe pas.
Avant d'inventer une classe. Que dirais tu d'essayer simplement

trierTableau(egalite),

C'est à dire SANS le egalite. devant

moustik

merci merci beaucoup, je n'ai plus de probleme a la compilation, ca a donc l'air de marcher :)
c'est tres gentil de m'avoir aidé.

Tu as l'air doué en Java, est ce que je peux encore abuser de ton aide?
je comprendrai si tu refuse, mais la je suis tombé sur une perle de forum !
personne ne m'avait aidé

mille merci

Morgane

fredericmazue

Bonjour

Quote:

Tu as l'air doué en Java,

Merci pour le compliment. C'est toujours agréable :)
Mais tu sais au risque de t'étonner, je n'aime pas ¤¤¤¤ Java.
Je lui préfère des langages plus consistants comme C++, Python, Haskell, Clean, et d'autres

Quote:

est ce que je peux encore abuser de ton aide?
je comprendrai si tu refuse, mais la je suis tombé sur une perle de forum !

Comme tu le dis, ici c'est un forum, alors tu peux venir y poser d'autres questions. Si j'en suis capable et si j'en ai le temps je t'aiderai, sinon quelqu'un d'autre t'aidera sans doute :)

moustik

toujours en référence au code posté, j'ai un probleme dans "jouonstout"
Je n'arrive pas à entrer dans la boucle while.
J'ai mis cette ligne de code en commentaire (juste pour tester la suite !) et j'ai un deuxieme souci avec mes J1.tete(); qui me retoune a chaque fois la valeur 0, qui est la valeur par defaut dans ma class file
je m'en suis apercu en changeant le code de ma file et en mettant -7 !

A cause de cela, tout mon code est faux -snif-

Merci a qui m'aidera de nouveau

voici le code de ma file (un peu long encore une fois )

class FileTabC {

 // partie statique
    private static final int capaDefaut = 100;

 // attributs (d'instance)
    private int nb, t; // nb est un compteur du nb de valeurs presentes dans le tableau
    private int[] tab;

 // constructeurs  
    public FileTabC(int capa){
	if (capa < 0) 
	        capa = 0;
	tab = new int[capa];
	nb = 0; 
	t = 0; 
    }
   
   public FileTabC(){
       this(capaDefaut);
   }

    public boolean estBornee(){
	return true;
    }

    public int capacite(){
	return tab.length;
    }
    public boolean estPleine(){
	return (nb == tab.length);
    }
    public boolean estVide(){
	return (nb == 0);
   }
    
 
 	public void enfiler(int o){
		if ( ! estPleine() ){
	    	tab[(t+nb)%tab.length] = o;
	    	nb++;
		}
    }
    
    public void defiler(){
	if ( ! estVide() ){
	       t = (t+1) % tab.length;
	       nb--;
	}
    }
    public int tete(){
	int o = 0; 
	if ( ! estVide())
	    o = tab[t];
	return o;
    }
} // fin de la classe FileTabC
moustik

pourtant tu m'as drolement aidé, encore merci

Je suis impressionnée par la liste des langage que tu connais
je ne connais que le java, le C et le html qui n'est pas vraiment un langage de programmation !

J'aime bien le java mais uniquement quand ca marche !!

fredericmazue

Bonsoir Morgane :)

J'ai bien vu ta question, mais il est tard, et pour un vieux comme moi il est l'heure de la tisane et au lit! Je regarderai demain matin si tu veux bien.

Quote:

pourtant tu m'as drolement aidé, encore merci

Je n'aime pas Java mais je le connais un peu quand même.

Quote:

Je suis impressionnée par la liste des langage que tu connais

Tu sais, j'ai 25 ans de programmation derrière moi, alors c'est normal qu'en tout ce temps j'ai appris de petites choses.

Quote:

J'aime bien le java mais uniquement quand ca marche !!

Hum alors tu vas vite t'en lasser ;)

A demain :)

moustik

a demain

Merci beaucoup

Morgane

fredericmazue

Bonjour Morgane,

Quote:

Je n'arrive pas à entrer dans la boucle while.

Euh j'ai regardé ton code et je dois dire que j'ai du mal à le comprendre. Et je ne sais pas jouer à la bataille ça ne m'aide pas.
Et tu ne précise pas clairement de quelle boucle while il s'agit.

Déjà si tu permets tu devrais structurer mieux ton code afin d'éviter trop de blocs else. Ca serait plus lisible.
Exemple:

public void jouonstout(){

      if(jeudistribue==0)  { 
         System.out.println("le jeu n\'a pas été distribué"); 
         return;
      }
      // simplement continuer ici si on peut jouer        

Autre exemple, quand tu déclares:

private int jeudistribue;

Java te garantit que jeudistribue vaudra 0 au moment de l'instanciation de la classe, avant même de rentrer dans un constructeur, donc mettre jeudistribue=0 dans les constructeurs ça ne sert à rien :)

Pour la boucle while j'ai vraiment du mal à savoir de laquelle tu parles. Peux tu préciser ta question ?

A propos de ta file, ne crois tu pas qu'il est astucieux d'utiliser des classes qui existent déjà et qui pourraient convenir plutôt que d'en écrire de A à Z ? Regarde la classe java.util.ArrayList et dis moi si par hasard elle ne fera pas l'affaire pour ce que tu appelles ta file :)

moustik

Bonsoir,

pour ce qui est de ma boucle while me posant probleme c'est la toute premiere :
while((J1.estVide()!=true)&&(J2.estVide()!=true))

je vais suivre ton conseil pour l'ecriture de mon premier bloc, c'est vrai que ca sera plus clair, et ca m'evitera d'avoir une foule d'accolade en fin de code.

Sinon à propos de la File, j'utilise ce code car je l'ai vu en cours l'année dernière !

Et enfin, la bataille est le jeu de carte le plus simple qu'il puisse exister. Il y a deux joueurs qui ont le meme nombre de cartes et on retourne la premiere carte de son tas, et on la confronte avec l'autre joueur, celui qui à la carte la plus forte gagne les 2 cartes et les met sous son tas.
En cas de bataille, c'est a dire d'égalité de valeur, on rejoue un tour jusqu'à ce que qu'une des 2 cartes engagés gagne sur l'autre.
Et le jeu se termine que un des joueurs n'a plus de cartes en main.

Je vais essayer de regarder la ArrayList que tu me conseilles.

Bonne soirée

Moustik'

fredericmazue

Quote:

pour ce qui est de ma boucle while me posant probleme c'est la toute premiere :

Ok, je vois, ce qui est une façon de dire que je ne vois pas ;)
En effet l'erreur ne dois pas être au sens strict dans le code que tu montres, mais en amont. Il faudrait connaître le code qui appelle jouonstout et aussi d'autres codes en amont.

Mais je vais te donner une indication importante. Je disais au sens strict parce ton code est très très curieux (pardonne moi) et contient des problèmes potentiels. Regarde, tu as une classe Jeu qui hérite de Main et en même temps elle détient deux membres Main. C'est un non-sens en programmation objet. Faut savoir si tu travailles avec l'héritage ou avec l'aggrégation. (Tiens à ce propos il va y avoir des articles sur les Design Pattern, principalement en Java, à partir de Programmez! 93, je te suggère de les lire ;) ) Tu sais hier je t'ai fait une remarque à propos de la redondance jeudistribue=0. Tu es bien consciente qu'avec ce que tu as fait, des variables jeudistribue tu en as au moins 3, une dans Jeu et une dans chaque main. Et comme tu affectes cette variable dans deux constructeurs, ça veut dire que jeudistribue=0 peut être (au moins potentiellement) exécuté ici ou là 6 fois au total ? Quand tu testes la variable pour savoir sur si peux jouer, tu es bien certaine de tester la bonne n'est-ce pas ?

Quote:

je vais suivre ton conseil pour l'ecriture de mon premier bloc, c'est vrai que ca sera plus clair, et ca m'evitera d'avoir une foule d'accolade en fin de code.

Oui, et maintenant suis mon autre conseil et réorganise ton code. tu vas sûrement y gagner. Essaie de voir ce qui se passe si tu déclares simplement public class Jeu { ...} au lieu de public class Jeu extends Main{ ... }
:)
Quote:

Sinon à propos de la File, j'utilise ce code car je l'ai vu en cours l'année dernière !

Je comprends. Mais celui qui pond un code comme ça moi je le fais écarteler en place de Grèves. Parce que quand le besoin est une liste on implémente une liste, pas un tableau.

Je crois que j'ai compris le principe du jeu de la bataille :)

Quote:

Je vais essayer de regarder la ArrayList que tu me conseilles.

Oui ça va raccourcir ton ton code, donc le clarifier.

A l'occasion poste un peu de code en amont de celui que tu as déjà donné. J'aimerais voir qui appelle jouonstout et comment.

fredericmazue

Salut,

Je reviens pour nuancer ce que j'ai dit dans mon post d'hier.

Je maintiens qu'il n'est à priori pas normal (disons au moins que c'est très bizarre) qu'une de tes classes dérive de Main et ait des membres de type Main.
Mais il ne doit pas y avoir tant de "jeudistribue" dans ton programme que je l'ai dit. J'ai été enduit d'erreur par le fait que tu nommes J1, J2 des vairables qui sont des instances de Main, alors que J1, J2 donnent à penser que ce sont des instances de Jeu quand on est plongé dans le code et que l'on a perdu de vue les déclarations intiales...

moustik

:D ca y est, victoire j'ai reussi a corriger mon code et il marche!

Pour info le problème venait de la fonction "distribuer" ou je recreait une main pour chaque joueur et un jeu !

Merci pour toute votre aide

Cordialement

Morgane