Results 1 to 10 of 10
  1. #1
    newbie79 is offline Member
    Join Date
    Oct 2010
    Posts
    16
    Rep Power
    0

    Default artificial intelligence for a tank

    I have te do this this program in wich the tank has to go get a flag and retrun it to bas as many times as possible and if it sees another tank, it must shoot it, the game is only won if the tank has collected more falg than the openent, the teacher gave us the Tank examples in wich there are no intelligence so I have been trying to program it but its not working, i was woundering if somebody could help me,

    XML Code:
    /** Template pour creer un Tank */
    class FranckTheTank extends Tank
    {
    
    	boolean drapeauVu;
    	int drapeauPosX;
    	int drapeauPosY;
    
    	boolean tankVu;
    	int tankPosX;
    	int tankPosY;
    
    	boolean baseVu;
    	int basePosX;
    	int basePosY;
    
    	int[][] tableauXY;
    
    	String messageEnvoyer;
    
    	private final static int penalite = 9;		// on doit avoir une penalite sur chaque noeud source: http://www.codeproject.com/KB/recipes/mazesolver.aspx
    	public NoeudChemin [] ListeNoeud;
       	public int ListeIndex = 0;		// Marque notre position dans notre liste
       	private int LargeurTableau;
       	private int HauteurTableau;
    	private int[][] tableau;
    
        /** initialisation */
        void init() 
    	{
    		messageEnvoyer = "Pizza";
    
    		tableauXY = new int[getDimX()][getDimY()];
    		for(int i=0;i < getDimX();i++)
    		{
    			for(int j=0;j < getDimY();j++)
    			{
    				tableauXY[i][j] = -1;
    			}
    		}
    
    		drapeauVu = false;
    		drapeauPosX = drapeauPosY = -1;
    
    		tankVu = false;
    		tankPosX = tankPosY = -1;
    
    		baseVu = false;
    		basePosX = basePosY = -1;
    	}
        // Methodes d'input 
        /**
         * Cette methode est appele a chaque debut de tour... 
         * Si vous avez des variables a initialiser a chaque tour, 
         * c'est la que ca se passe!!!
         */
        void debutTour()
    	{
    		tankVu = false;//Le tank bouge
    		messageEnvoyer = "Pizza";//Reinitialise le message
    	}
        
         
        /**
           Recoit un message de la part d'un tank autre tank
           (pas necessairement de la meme equipe
    	**/
    
        void processTankMessage( String message ) {}
    
        /**
           Recoit un message du serveur. Par exemple
           Tank 7 from team 2 dead
           Flag returned to base 1
           Team 1 wins
        */
        void processGameMessage( String gameMessage ) {}
        
        /**
           Voit un morceau de map statique (vide, mur, drapeau).
           Trois valeurs possibles pour elementType:
           WALL , EMPTY ou FLAG
        */
        void seeBoardElement( int elementType , int x , int y ) 
    	{
    		if(elementType == WALL) 
    		{
    			if(tableauXY[x][y] == -1)//effectue l'action seulement s'il n'est pas deja en memoire
    			{
    				tableauXY[x][y] = WALL;
    				if(messageEnvoyer.length() <= 50)//Garde de l'espace pour si on voit un tank
    				{
    					messageEnvoyer = messageEnvoyer +"";//******
    				}
    			}
    		}else if(elementType == FLAG) 
    		{
    			if(tableauXY[x][y] == -1)//effectue l'action seulement s'il n'est pas deja en memoire
    			{
    				tableauXY[x][y] = FLAG;
    				drapeauVu=true;
    				drapeauPosX=x;
    				drapeauPosY=y;
    				if(messageEnvoyer.length() <= 50)//Garde de l'espace pour si on voit un tank
    				{
    					messageEnvoyer = messageEnvoyer +"";//******
    				}
    			}
    		}else if(elementType == EMPTY) 
    		{
    			if(tableauXY[x][y] == -1)//effectue l'action seulement s'il n'est pas deja en memoire
    			{
    				tableauXY[x][y] = EMPTY;
    				if(messageEnvoyer.length() <= 50)//Garde de l'espace pour si on voit un tank
    				{
    					messageEnvoyer = messageEnvoyer +"";//******
    				}
    			}
    		}
    	}
        
        /** Voit le tank d'id unique specifie d'equipe specifiee en position absolue (x,y) */
        void seeTank( int seenTankId , int seenTankTeamId , int x , int y ) 
    	{
    		if(seenTankTeamId != getTeamId()) 
    		{
    			tankVu = true;
    			tankPosX=x;
    			tankPosY=y;
    			messageEnvoyer = messageEnvoyer +"";//******
    		}
    	}
    
        /** voit la base de l'equipe specifiee */
        void seeBase( int teamId , int x , int y ) 
    	{
    		if(teamId != getTeamId()) 
    		{
    			baseVu = true;
    			basePosX = x;
    			basePosY = y;
    		}
    	}
        
        // Methode d'ouput 
        Action makeAction()
        {
    		Action action=null;
    		int direction = 0;
    		int dxBut, dyBut;
            if(tankVu == true)
            {
    			action = new FireAction(tankPosX,tankPosY,messageEnvoyer);
            }
    		
    		else
    		{
    			Point initial = new Point(getX(),getY());
    			Point destination = new Point(10,10);
    			Point suivant = TrouverPointPremier(initial,destination);
    			dxBut = suivant.getX();
    			dyBut =	suivant.getY();
    
    			if(dxBut-initial.getX() >= 1 && dyBut-initial.getY() == 0)
    			{
    				direction = EAST;
    			}
    
    			if(dxBut-initial.getX() < 1 && dyBut-initial.getY() == 0)
    			{
    				direction = WEST;
    			}
    
    			if(dyBut-initial.getY() >= 1 && dxBut-initial.getX() == 0)
    			{
    				direction = NORTH;
    			}
    
    			if(dyBut-initial.getY() < 1 && dxBut-initial.getX() == 0)
    			{
    				direction = SOUTH;
    			}
    
    			if(dxBut == initial.getX() && dyBut == initial.getY())
    			{
    				direction = 0;	
    			}
    
    		action = new MoveAction(direction,messageEnvoyer);
    
    		}
    
    		return action;
        }
    
    	private NoeudChemin RechercheListeNoeud(Point p)		// Rechcher si le Noeud a la postion x,y existe
       	{
    		int IndexListe = 0;
          	NoeudChemin NoeudRecherche = null;
    
          	while(NoeudRecherche == null && IndexListe < ListeIndex)		// Tant qu'on a pas trouve un noeud recherche ou qu'on a parcouru tous les noeuds sans resultat.
          	{
             	if(ListeNoeud[IndexListe].courrant.CompareA(p))
    			{
               		NoeudRecherche = ListeNoeud[IndexListe];
    			}
    
             	else
    			{		
                	IndexListe++;
    			}
          	}
    
          	return NoeudRecherche;
    	}
    
    	private int SommeNoeudOuvert()		// Calcul la somme des noeuds ouverts les noeuds ouverts. S'il n'en reste plus aucun il n'y a plus d'options possible
       	{
          	int somme = 0;
          	for(int i = 0;i < ListeIndex;i++)
    		{
    
            	if(ListeNoeud[i].estVisite == false)		// Noeuds vistes ignores
    			{
               	 somme++;
    			}
    		}
    
          return somme;
       	}
    
    	private NoeudChemin RechercherNoeudDepenseMin()	// Noeud ouvert qui a la depense la plus faible
       	{
          	NoeudChemin NoeudDepenseMin = null;
    
          	for(int i = 0; i < ListeIndex;i++)
    		{
             	if(!ListeNoeud[i].estVisite && (NoeudDepenseMin == null || ListeNoeud[i].getDepenseF() < NoeudDepenseMin.getDepenseF()))		// Si depense plus petite que precedement
    			{
                	NoeudDepenseMin = ListeNoeud[i];
    			}
    		}
    
          return NoeudDepenseMin;
       }
    
       private void AjouteNoeudOuvertListe(NoeudChemin n)		// Ajoute un noeud ouvert.
       {
          n.estVisite = false;
          ListeNoeud[ListeIndex] = n;
          ListeIndex++;
       }
    
    	private int CalculHeuristique(NoeudChemin n, Point arrivee)
       	{
         	int heuristique = (int) arrivee.Distance(arrivee, n.courrant, false);		// manhattan method
    		int SommePenalite = 0;
    
          	for(int x = n.courrant.x - penalite; x <= n.courrant.x + penalite;x++)
    		{
             	for(int y = n.courrant.y - penalite; y <= n.courrant.y + penalite;y++)
    			{
                	if(x < LargeurTableau && y < HauteurTableau && x >= 0 && y >= 0)		// Out of bounds?
    				{
                   		if(tableau[y][x] == TANK)
                   		{
                      		SommePenalite = penalite - (int)n.courrant.Distance(n.courrant, new Point(x,y), false);
    	
                      		if (SommePenalite < 0) SommePenalite = 0;		// penalite aux distances entre le noeud et les ennemis
    						{
                      			SommePenalite += SommePenalite*100;
                   			}
    					}
    				}
    			}
    		}
    
          return heuristique;
       	}
    
    	public Point TrouverPointPremier(Point initial, Point destination)		// Retourne le prochain Point
      	{
          	if(initial.CompareA(destination))		// Si les deux sont pareils, on retourne le point de depart.
    		{
             	return initial;
    		}
    	
    		else
    		{
    			NoeudChemin chemin = RechercheChemin(initial, destination);
          		Point PointPremier = null;
    
          		while(chemin != null)
          		{
             		if(chemin.origine.origine == null)
    				{
                		PointPremier = chemin.courrant;
    				}
    
             		chemin = chemin.origine;
          		}
    			
    			return PointPremier;
    		}
    	}
    	
    	public NoeudChemin RechercheChemin(Point initial, Point destination)		// Retourne Le noeud contenu a la position d'arrivee ou null s'il n'y a aucun trajet. Si on va d'origine a origine, on obtiendra le trajet complet
       	{
    		boolean recherche = false;
          	int indexListe = 0;		// On reintialise l'index de la liste
          	ListeNoeud = new NoeudChemin[this.LargeurTableau * this.HauteurTableau];
          	NoeudChemin NoeudInitial = new NoeudChemin(initial);		// Premier noeud
          	NoeudChemin NoeudRecherche = null;		// Sauvegarder dasn NoeudRecherche
          	AjouteNoeudOuvertListe(NoeudInitial);		// ajoute le noeud premier a la liste de noeuds "ouverts"
    
          	while(!recherche && SommeNoeudOuvert() > 0)		 // Boucle tant qu'on est pas arrive a destination ou que tous les noeuds ont ete visites
          	{
             	NoeudChemin NoeudActuel = RechercherNoeudDepenseMin();		// On recherche le noeud ouvert aillant la depense la plus faible dans la liste
             	if(NoeudActuel.courrant.CompareA(destination))		// si ce noeud egal destination, on sort de la boucle et on retourne le noeud
             	{
                	NoeudRecherche = NoeudActuel;
                	recherche = true;
    
               	 continue;
             	}
    
             // Sinon on regarde les 4 noeud adjacents
            	NoeudActuel.estVisite = true;   
                                                   
            	for(int x = NoeudActuel.courrant.x-1; x <= NoeudActuel.courrant.x+1; x++)		// [x][A][x] "[A]" est la position actuelle	Rappel: les mouvements diagonaux sont  illegaux
    			{
                	for(int y = NoeudActuel.courrant.y-1; y<= NoeudActuel.courrant.y+1;y++)   // [-][E][-] [E] sont les noeuds a explorer
             		{	 
    					if(tableau[y][x] != WALL)		// et si pas sur un mur
    					{
    						if((x !=  NoeudActuel.courrant.x-1 || y != NoeudActuel.courrant.y-1) && (x !=  NoeudActuel.courrant.x-1 || y != NoeudActuel.courrant.y+1))		// les mouvements ne sont pas diagonaux droites
    						{
    							
    							if((x !=  NoeudActuel.courrant.x+1 || y != NoeudActuel.courrant.y-1) && (x !=  NoeudActuel.courrant.x+1 || y != NoeudActuel.courrant.y+1))		// les mouvements ne sont pas diagonaux gauches
    							{    
                   					if(y < HauteurTableau && x < LargeurTableau && y >= 0 && x >= 0)		// Si le noeud n'est pas en dehors de la carte			
    								{		
    									if(x != NoeudActuel.courrant.x || y != NoeudActuel.courrant.y)		// et si le noeud n'est l'actuel
    									{
                      						Point NoeudAdjacent = new Point(x,y);		 // On verifie si le noeud est deja la
                     						NoeudChemin NoeudTmp = RechercheListeNoeud(NoeudAdjacent);
                      
                      						if(NoeudTmp == null)		// Si non, on l'ajoute en calculant l'heuristique et la depense                  					
    										{
                         						NoeudTmp = new NoeudChemin(new Point(x,y));
                         						NoeudTmp.origine = NoeudActuel;
    
                         						NoeudTmp.setDepenseG(NoeudTmp.origine.getDepenseG() + 10); // On ajoute dix a la depense du noeud origine source: http://www.policyalmanac.org/games/aStarTutorial.htm
    
                         						NoeudTmp.setDepenseH(CalculHeuristique(NoeudActuel, destination)); 
    
                         						AjouteNoeudOuvertListe(NoeudTmp); // On ajoute le noeud a la liste des noeuds "ouverts"		note: Si le noeud egal destination on sort de la boucle 
    
                         						if(NoeudTmp.courrant.CompareA(destination))
                         						{
                            						NoeudRecherche = NoeudTmp;
                            						recherche = true;
                         						}
                      						}
    
                     						else if(!NoeudTmp.estVisite && NoeudTmp.getDepenseG() > NoeudActuel.getDepenseG())		// S'il existe et qu'il a deja ete visite et que la depense initiale plus grande que celle actuelle
                      						{
                         						NoeudTmp.origine = NoeudActuel;
                        						NoeudTmp.setDepenseG(NoeudActuel.getDepenseG() + 10);
    					                	}
    									}
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    
          	return NoeudRecherche;
       	}
    }
    
    class Point
    {	
    	public int x,y;
    	
    	public Point(int x, int y)
    	{
    		this.x = x;
    		this.y = y;
    	}
    
    	public int getX()
    	{
    		return this.x;
    	}
    	
    	public int getY()
    	{
    		return this.y;
    	}
    
    	boolean CompareA(Point p)
    	{
    		return ((this.x == p.x) && (this.y == p.y));
    	}
    	
    	public static int Distance(Point p1, Point p2, boolean pareil)
    	{
    		pareil = p1.CompareA(p2);
    
    		if (pareil)
    		{
    			return 1;
    		}
    		
    		return (int) Math.sqrt((Math.pow((p2.x - p1.x), 2) + Math.pow((p2.y - p1.y), 2)));
    	}
    }
    
    class NoeudChemin		//	Chaque noeud contient la depense total du noeud (l'Algorithme A* : F = H + G)
    {
    	private int depenseF;	 	// Depense total du noeud (depense + depense heuristique)
    	private int depenseG;		 // depense d'un deplacement du point de depart jusqu'a un autre point donne
       	private int depenseH;		 // Estimation de la depense du point initial au point donne (heuristique)
    	public boolean estVisite;		// Indique si le noeud a deja ete visite.
    	public Point courrant;		// Les coordonnes x et y du noeud
        public NoeudChemin origine;		 // Le noeud origine nous permmettra de retracer notre chemin jusqu'a notre base
       
      	public NoeudChemin(Point p)
       	{
         	 courrant = p;
       	}
    
    	public int getDepenseG()
    	{
    		return depenseG;
    	}
       	public int getDepenseH()
    	{
    		return depenseH;
    	}
       	public int getDepenseF()
    	{
    		return depenseF;
    	}
    
      	public void setDepenseG(int g)		// Permet de changer la depense d'un deplacement entre le point initial et le noeud courrant
       	{
         	depenseG = g;
          	depenseF = depenseG + depenseH; 
       	}
    
       	public void setDepenseH(int h)		// Permet de mettre a jour l'estimation de la depense pour passer du noeud courrant au point donne
       	{
         	depenseH = h;
          	depenseF = depenseG + depenseH; 
       	}
    }
    basically I tried using the A* algorithm for the shortest path to the flag (which we do not know were it is)

    Thks

  2. #2
    newbie79 is offline Member
    Join Date
    Oct 2010
    Posts
    16
    Rep Power
    0

    Default

    everything is compiling but the tanks arent moving

  3. #3
    newbie79 is offline Member
    Join Date
    Oct 2010
    Posts
    16
    Rep Power
    0

    Default

    everytime I run the program it keeps saying:

    java.lang.ArrayIndexOutOfBoundsException: 0
    at FranckTheTank.AjouteNoeudOuvertListe(FranckTheTank .java:250)
    at FranckTheTank.RechercheChemin(FranckTheTank.java:3 14)
    at FranckTheTank.TrouverPointPremier(FranckTheTank.ja va:290)
    at FranckTheTank.makeAction(FranckTheTank.java:160)
    at Game.callMakeAction(Game.java:714)
    at Game.logicPlayerTurn(Game.java:284)
    at Game.playerTurn(Game.java:253)
    at Game.run(Game.java:148)
    at java.lang.Thread.run(Thread.java:636)
    ########## No action completed. Continuing game.
    ########## Exception in Tank{no=3,team=1,class=FranckTheTank}:


    thks again

  4. #4
    Zack's Avatar
    Zack is offline Senior Member
    Join Date
    Jun 2010
    Location
    Destiny Islands
    Posts
    692
    Rep Power
    5

    Default

    As far as I can tell, this is line 250:
    Java Code:
       private void AjouteNoeudOuvertListe(NoeudChemin n)		// Ajoute un noeud ouvert.
       {
          n.estVisite = false;
          [b]ListeNoeud[ListeIndex] = n;[/b]
          ListeIndex++;
       }
    (Not totally sure as I don't think you pasted the whole files; since there are no import statements up top.)

    That being the case, it is simply a matter of ListeIndex being greater than or equal to the length of the ListeNoeud array. Try adding some println statements in that method to detect its length as well as the value of ListeIndex each time it executes.

  5. #5
    Eranga's Avatar
    Eranga is offline Moderator
    Join Date
    Jul 2007
    Location
    Colombo, Sri Lanka
    Posts
    11,371
    Blog Entries
    1
    Rep Power
    20

    Default

    Quote Originally Posted by newbie79 View Post
    everytime I run the program it keeps saying:

    java.lang.ArrayIndexOutOfBoundsException: 0
    at FranckTheTank.AjouteNoeudOuvertListe(FranckTheTank .java:250)
    at FranckTheTank.RechercheChemin(FranckTheTank.java:3 14)
    at FranckTheTank.TrouverPointPremier(FranckTheTank.ja va:290)
    at FranckTheTank.makeAction(FranckTheTank.java:160)
    at Game.callMakeAction(Game.java:714)
    at Game.logicPlayerTurn(Game.java:284)
    at Game.playerTurn(Game.java:253)
    at Game.run(Game.java:148)
    at java.lang.Thread.run(Thread.java:636)
    ########## No action completed. Continuing game.
    ########## Exception in Tank{no=3,team=1,class=FranckTheTank}:


    thks again
    As your error message notified to you, in an array you are accessing an invalid index. Check it.

  6. #6
    newbie79 is offline Member
    Join Date
    Oct 2010
    Posts
    16
    Rep Power
    0

    Default

    thks evryone, i I think I corrected the index problem however, now the game doesnt execute and this is my error message:

    java.lang.ClassNotFoundException: Yo
    at java.net.URLClassLoader$1.run(URLClassLoader.java: 217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.j ava:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:3 21)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launche r.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:2 66)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:186)
    at TankApplet.init(TankApplet.java:66)
    at TankApplet.createAndShowGUI(TankApplet.java:211)
    at TankApplet.access$000(TankApplet.java:10)
    at TankApplet$1.run(TankApplet.java:192)
    at java.awt.event.InvocationEvent.dispatch(Invocation Event.java:226)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java: 602)
    at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:275)
    at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:200)
    at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:190)
    at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:185)
    at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:177)
    at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:138)
    Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException
    at TankApplet.init(TankApplet.java:77)
    at TankApplet.createAndShowGUI(TankApplet.java:211)
    at TankApplet.access$000(TankApplet.java:10)
    at TankApplet$1.run(TankApplet.java:192)
    at java.awt.event.InvocationEvent.dispatch(Invocation Event.java:226)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java: 602)
    at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:275)
    at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:200)
    at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:190)
    at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:185)
    at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:177)
    at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:138)

    I am not really familiar with those erors

    here is my revised code in its entirety:

    XML Code:
    /** Template pour creer un Tank */
    class FranckTheTank extends Tank
    {
    
    	boolean drapeauVu;
    	int drapeauPosX;
    	int drapeauPosY;
    
    	boolean tankVu;
    	int tankPosX;
    	int tankPosY;
    
    	boolean baseVu;
    	int basePosX;
    	int basePosY;
    
    	int[][] tableauXY;
    
    	String messageEnvoyer;
    
        /** initialisation */
        void init() 
    	{
    		messageEnvoyer = "Pizza";
    
    		tableauXY = new int[getDimX()][getDimY()];
    		for(int i=0;i < getDimX();i++)
    		{
    			for(int j=0;j < getDimY();j++)
    			{
    				tableauXY[i][j] = -1;
    			}
    		}
    
    		drapeauVu = false;
    		drapeauPosX = drapeauPosY = -1;
    
    		tankVu = false;
    		tankPosX = tankPosY = -1;
    
    		baseVu = false;
    		basePosX = basePosY = -1;
    	}
        // Methodes d'input 
        /**
         * Cette methode est appele a chaque debut de tour... 
         * Si vous avez des variables a initialiser a chaque tour, 
         * c'est la que ca se passe!!!
         */
        void debutTour()
    	{
    		tankVu = false;//Le tank bouge
    		messageEnvoyer = "Pizza";//Reinitialise le message
    	}
        
         
        /**
           Recoit un message de la part d'un tank autre tank
           (pas necessairement de la meme equipe
    	**/
    
        void processTankMessage( String message ) {}
    
        /**
           Recoit un message du serveur. Par exemple
           Tank 7 from team 2 dead
           Flag returned to base 1
           Team 1 wins
        */
        void processGameMessage( String gameMessage ) {}
        
        /**
           Voit un morceau de map statique (vide, mur, drapeau).
           Trois valeurs possibles pour elementType:
           WALL , EMPTY ou FLAG
        */
        void seeBoardElement( int elementType , int x , int y ) 
    	{
    		if(elementType == WALL) 
    		{
    			if(tableauXY[x][y] == -1)//effectue l'action seulement s'il n'est pas deja en memoire
    			{
    				tableauXY[x][y] = WALL;
    				if(messageEnvoyer.length() <= 50)//Garde de l'espace pour si on voit un tank
    				{
    					messageEnvoyer = messageEnvoyer +"";//******
    				}
    			}
    		}else if(elementType == FLAG) 
    		{
    			if(tableauXY[x][y] == -1)//effectue l'action seulement s'il n'est pas deja en memoire
    			{
    				tableauXY[x][y] = FLAG;
    				drapeauVu=true;
    				drapeauPosX=x;
    				drapeauPosY=y;
    				if(messageEnvoyer.length() <= 50)//Garde de l'espace pour si on voit un tank
    				{
    					messageEnvoyer = messageEnvoyer +"";//******
    				}
    			}
    		}else if(elementType == EMPTY) 
    		{
    			if(tableauXY[x][y] == -1)//effectue l'action seulement s'il n'est pas deja en memoire
    			{
    				tableauXY[x][y] = EMPTY;
    				if(messageEnvoyer.length() <= 50)//Garde de l'espace pour si on voit un tank
    				{
    					messageEnvoyer = messageEnvoyer +"";//******
    				}
    			}
    		}
    	}
        
        /** Voit le tank d'id unique specifie d'equipe specifiee en position absolue (x,y) */
        void seeTank( int seenTankId , int seenTankTeamId , int x , int y ) 
    	{
    		if(seenTankTeamId != getTeamId()) 
    		{
    			tankVu = true;
    			tankPosX=x;
    			tankPosY=y;
    			messageEnvoyer = messageEnvoyer +"";//******
    		}
    	}
    
        /** voit la base de l'equipe specifiee */
        void seeBase( int teamId , int x , int y ) 
    	{
    		if(teamId != getTeamId()) 
    		{
    			baseVu = true;
    			basePosX = x;
    			basePosY = y;
    		}
    	}
        
        // Methode d'ouput 
        Action makeAction()
        {
    		Action action=null;
    		int direction = 0;
    		int dxBut, dyBut;
            if(tankVu == true)
            {
    			action = new FireAction(tankPosX,tankPosY,messageEnvoyer);
            }
    		
    		else
    		{
    			Point initial = new Point(getX(),getY());
    			Point destination = new Point(10,10);
    			CheminLePlusCourt trajet = new CheminLePlusCourt(tableauXY);
    			Point suivant = trajet.TrouverPointPremier(initial,destination);
    			dxBut = suivant.getX();
    			dyBut =	suivant.getY();
    
    			if(dxBut-initial.getX() >= 1 && dyBut-initial.getY() == 0)
    			{
    				direction = EAST;
    			}
    
    			if(dxBut-initial.getX() < 1 && dyBut-initial.getY() == 0)
    			{
    				direction = WEST;
    			}
    
    			if(dyBut-initial.getY() >= 1 && dxBut-initial.getX() == 0)
    			{
    				direction = NORTH;
    			}
    
    			if(dyBut-initial.getY() < 1 && dxBut-initial.getX() == 0)
    			{
    				direction = SOUTH;
    			}
    
    			if(dxBut == initial.getX() && dyBut == initial.getY())
    			{
    				direction = 0;	
    			}
    
    		action = new MoveAction(direction,messageEnvoyer);
    
    		}
    
    		return action;
        }
    }
    
    class CheminLePlusCourt extends Tank
    {
    	private final static int penalite = 9;		// on doit avoir une penalite sur chaque noeud source: http://www.codeproject.com/KB/recipes/mazesolver.aspx
    	public NoeudChemin [] ListeNoeud;
       	public int ListeIndex = 0;		// Marque notre position dans notre liste
       	private int LargeurTableau;
       	private int HauteurTableau;
    	private int[][] tableau;
    
    	CheminLePlusCourt(int[][] carte)
       	{
        	tableau = carte;
    		LargeurTableau = carte[carte.length -1].length;
        	HauteurTableau = carte.length;
       	}
    
    	private NoeudChemin RechercheListeNoeud(Point p)		// Rechcher si le Noeud a la postion x,y existe
       	{
    		int index = 0;
          	NoeudChemin NoeudRecherche = null;
    
          	while(NoeudRecherche == null && index < ListeIndex)		// Tant qu'on a pas trouve un noeud recherche ou qu'on a parcouru tous les noeuds sans resultat.
          	{
             	if(ListeNoeud[index].courrant.CompareA(p))
    			{
               		NoeudRecherche = ListeNoeud[index];
    			}
    
             	else
    			{		
                	index++;
    			}
          	}
    
          	return NoeudRecherche;
    	}
    
    	private int SommeNoeudOuvert()		// Calcul la somme des noeuds ouverts les noeuds ouverts. S'il n'en reste plus aucun il n'y a plus d'options possible
       	{
          	int somme = 0;
          	for(int i = 0;i < ListeIndex;i++)
    		{
    
            	if(ListeNoeud[i].estVisite == false)		// Noeuds vistes ignores
    			{
               	 somme++;
    			}
    		}
    
          return somme;
       	}
    
    	private NoeudChemin RechercherNoeudDepenseMin()	// Noeud ouvert qui a la depense la plus faible
       	{
          	NoeudChemin NoeudDepenseMin = null;
    
          	for(int i = 0; i < ListeIndex;i++)
    		{
             	if(!ListeNoeud[i].estVisite && (NoeudDepenseMin == null || ListeNoeud[i].getDepenseF() < NoeudDepenseMin.getDepenseF()))		// Si depense plus petite que precedement
    			{
                	NoeudDepenseMin = ListeNoeud[i];
    			}
    		}
    
          return NoeudDepenseMin;
       }
    
       private void AjouteNoeudOuvertListe(NoeudChemin n)		// Ajoute un noeud ouvert.
       {
          n.estVisite = false;
          ListeNoeud[ListeIndex] = n;
          ListeIndex++;
       }
    
    	private int CalculHeuristique(NoeudChemin n, Point arrivee)
       	{
         	int heuristique = (int) arrivee.Distance(arrivee, n.courrant, false);		// manhattan method
    		int SommePenalite = 0;
    
          	for(int x = n.courrant.x - penalite; x <= n.courrant.x + penalite;x++)
    		{
             	for(int y = n.courrant.y - penalite; y <= n.courrant.y + penalite;y++)
    			{
                	if(x < LargeurTableau && y < HauteurTableau && x >= 0 && y >= 0)		// Out of bounds?
    				{
                   		if(tableau[y][x] == TANK)
                   		{
                      		SommePenalite = penalite - (int)n.courrant.Distance(n.courrant, new Point(x,y), false);
    	
                      		if (SommePenalite < 0) SommePenalite = 0;		// penalite aux distances entre le noeud et les ennemis
    						{
                      			SommePenalite += SommePenalite*100;
                   			}
    					}
    				}
    			}
    		}
    
          return heuristique;
       	}
    
    	public Point TrouverPointPremier(Point initial, Point destination)		// Retourne le prochain Point
      	{
          	if(initial.CompareA(destination))		// Si les deux sont pareils, on retourne le point de depart.
    		{
             	return initial;
    		}
    	
    		else
    		{
    			NoeudChemin chemin = RechercheChemin(initial, destination);
          		Point PointPremier = null;
    
          		while(chemin != null)
          		{
             		if(chemin.origine.origine == null)
    				{
                		PointPremier = chemin.courrant;
    				}
    
             		chemin = chemin.origine;
          		}
    			
    			return PointPremier;
    		}
    	}
    	
    	public NoeudChemin RechercheChemin(Point initial, Point destination)		// Retourne Le noeud contenu a la position d'arrivee ou null s'il n'y a aucun trajet. Si on va d'origine a origine, on obtiendra le trajet complet
       	{	
    		int indexListe = 0;		// On reintialise l'index de la liste
    		boolean recherche = false;
          	ListeNoeud = new NoeudChemin[this.LargeurTableau * this.HauteurTableau];
          	NoeudChemin NoeudInitial = new NoeudChemin(initial);		// Premier noeud
          	NoeudChemin NoeudRecherche = null;		// Sauvegarder dasn NoeudRecherche
          	AjouteNoeudOuvertListe(NoeudInitial);		// ajoute le noeud premier a la liste de noeuds "ouverts"
    
          	while(!recherche && SommeNoeudOuvert() > 0)		 // Boucle tant qu'on est pas arrive a destination ou que tous les noeuds ont ete visites
          	{
             	NoeudChemin NoeudActuel = RechercherNoeudDepenseMin();		// On recherche le noeud ouvert aillant la depense la plus faible dans la liste
             	if(NoeudActuel.courrant.CompareA(destination))		// si ce noeud egal destination, on sort de la boucle et on retourne le noeud
             	{
                	NoeudRecherche = NoeudActuel;
                	recherche = true;
    
               	 continue;
             	}
    
             // Sinon on regarde les 4 noeud adjacents
            	NoeudActuel.estVisite = true;   
                                                   
            	for(int x = NoeudActuel.courrant.x-1; x <= NoeudActuel.courrant.x+1; x++)		// [x][A][x] "[A]" est la position actuelle	Rappel: les mouvements diagonaux sont  illegaux
    			{
                	for(int y = NoeudActuel.courrant.y-1; y<= NoeudActuel.courrant.y+1;y++)   // [-][E][-] [E] sont les noeuds a explorer
             		{	 
    					if(tableau[y][x] != WALL)		// et si pas sur un mur
    					{
    						if((x !=  NoeudActuel.courrant.x-1 || y != NoeudActuel.courrant.y-1) && (x !=  NoeudActuel.courrant.x-1 || y != NoeudActuel.courrant.y+1))		// les mouvements ne sont pas diagonaux droites
    						{
    							
    							if((x !=  NoeudActuel.courrant.x+1 || y != NoeudActuel.courrant.y-1) && (x !=  NoeudActuel.courrant.x+1 || y != NoeudActuel.courrant.y+1))		// les mouvements ne sont pas diagonaux gauches
    							{    
                   					if(y < HauteurTableau && x < LargeurTableau && y >= 0 && x >= 0)		// Si le noeud n'est pas en dehors de la carte			
    								{		
    									if(x != NoeudActuel.courrant.x || y != NoeudActuel.courrant.y)		// et si le noeud n'est l'actuel
    									{
                      						Point NoeudAdjacent = new Point(x,y);		 // On verifie si le noeud est deja la
                     						NoeudChemin NoeudTmp = RechercheListeNoeud(NoeudAdjacent);
                      
                      						if(NoeudTmp == null)		// Si non, on l'ajoute en calculant l'heuristique et la depense                  					
    										{
                         						NoeudTmp = new NoeudChemin(new Point(x,y));
                         						NoeudTmp.origine = NoeudActuel;
    
                         						NoeudTmp.setDepenseG(NoeudTmp.origine.getDepenseG() + 10); // On ajoute dix a la depense du noeud origine source: http://www.policyalmanac.org/games/aStarTutorial.htm
    
                         						NoeudTmp.setDepenseH(CalculHeuristique(NoeudActuel, destination)); 
    
                         						AjouteNoeudOuvertListe(NoeudTmp); // On ajoute le noeud a la liste des noeuds "ouverts"		note: Si le noeud egal destination on sort de la boucle 
    
                         						if(NoeudTmp.courrant.CompareA(destination))
                         						{
                            						NoeudRecherche = NoeudTmp;
                            						recherche = true;
                         						}
                      						}
    
                     						else if(!NoeudTmp.estVisite && NoeudTmp.getDepenseG() > NoeudActuel.getDepenseG())		// S'il existe et qu'il a deja ete visite et que la depense initiale plus grande que celle actuelle
                      						{
                         						NoeudTmp.origine = NoeudActuel;
                        						NoeudTmp.setDepenseG(NoeudActuel.getDepenseG() + 10);
    					                	}
    									}
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    
          	return NoeudRecherche;
       	}
    }
    
    class Point
    {	
    	public int x,y;
    	
    	public Point(int x, int y)
    	{
    		this.x = x;
    		this.y = y;
    	}
    
    	public int getX()
    	{
    		return this.x;
    	}
    	
    	public int getY()
    	{
    		return this.y;
    	}
    
    	boolean CompareA(Point p)
    	{
    		return ((this.x == p.x) && (this.y == p.y));
    	}
    	
    	public static int Distance(Point p1, Point p2, boolean pareil)
    	{
    		pareil = p1.CompareA(p2);
    
    		if (pareil)
    		{
    			return 1;
    		}
    		
    		return (int) Math.sqrt((Math.pow((p2.x - p1.x), 2) + Math.pow((p2.y - p1.y), 2)));
    	}
    }
    
    class NoeudChemin		//	Chaque noeud contient la depense total du noeud (l'Algorithme A* : F = H + G)
    {
    	private int depenseF;	 	// Depense total du noeud (depense + depense heuristique)
    	private int depenseG;		 // depense d'un deplacement du point de depart jusqu'a un autre point donne
       	private int depenseH;		 // Estimation de la depense du point initial au point donne (heuristique)
    	public boolean estVisite;		// Indique si le noeud a deja ete visite.
    	public Point courrant;		// Les coordonnes x et y du noeud
        public NoeudChemin origine;		 // Le noeud origine nous permmettra de retracer notre chemin jusqu'a notre base
       
      	public NoeudChemin(Point p)
       	{
         	 courrant = p;
       	}
    
    	public int getDepenseG()
    	{
    		return depenseG;
    	}
       	public int getDepenseH()
    	{
    		return depenseH;
    	}
       	public int getDepenseF()
    	{
    		return depenseF;
    	}
    
      	public void setDepenseG(int g)		// Permet de changer la depense d'un deplacement entre le point initial et le noeud courrant
       	{
         	depenseG = g;
          	depenseF = depenseG + depenseH; 
       	}
    
       	public void setDepenseH(int h)		// Permet de mettre a jour l'estimation de la depense pour passer du noeud courrant au point donne
       	{
         	depenseH = h;
          	depenseF = depenseG + depenseH; 
       	}
    }

    tks again for ur help

  7. #7
    newbie79 is offline Member
    Join Date
    Oct 2010
    Posts
    16
    Rep Power
    0

    Default

    K I have fixed my out of bound problems and null pointer ones, however, now my tanks are only going north and they get stuck on a wall because I initialize direction = 0 and 0= one movement upwards

    Revised code:

    XML Code:
    /** Template pour creer un Tank */
    class FranckTheTank extends Tank
    {
    
    	boolean drapeauVu;
    	int drapeauPosX;
    	int drapeauPosY;
    
    	boolean tankVu;
    	int tankPosX;
    	int tankPosY;
    
    	boolean baseVu;
    	int basePosX;
    	int basePosY;
    
    	int[][] tableauXY;
    
    	String messageEnvoyer;
    
        /** initialisation */
        void init() 
    	{
    		messageEnvoyer = "Pizza";
    
    		tableauXY = new int[getDimX()][getDimY()];
    		for(int i=0;i < getDimX();i++)
    		{
    			for(int j=0;j < getDimY();j++)
    			{
    				tableauXY[i][j] = -1;
    			}
    		}
    
    		drapeauVu = false;
    		drapeauPosX = drapeauPosY = -1;
    
    		tankVu = false;
    		tankPosX = tankPosY = -1;
    
    		baseVu = false;
    		basePosX = basePosY = -1;
    	}
        // Methodes d'input 
        /**
         * Cette methode est appele a chaque debut de tour... 
         * Si vous avez des variables a initialiser a chaque tour, 
         * c'est la que ca se passe!!!
         */
        void debutTour()
    	{
    		tankVu = false;//Le tank bouge
    		messageEnvoyer = "Pizza";//Reinitialise le message
    	}
        
         
        /**
           Recoit un message de la part d'un tank autre tank
           (pas necessairement de la meme equipe
    	**/
    
        void processTankMessage( String message ) {}
    
        /**
           Recoit un message du serveur. Par exemple
           Tank 7 from team 2 dead
           Flag returned to base 1
           Team 1 wins
        */
        void processGameMessage( String gameMessage ) {}
        
        /**
           Voit un morceau de map statique (vide, mur, drapeau).
           Trois valeurs possibles pour elementType:
           WALL , EMPTY ou FLAG
        */
        void seeBoardElement( int elementType , int x , int y ) 
    	{
    		if(elementType == WALL) 
    		{
    			if(tableauXY[x][y] == -1)//effectue l'action seulement s'il n'est pas deja en memoire
    			{
    				tableauXY[x][y] = WALL;
    				if(messageEnvoyer.length() <= 50)//Garde de l'espace pour si on voit un tank
    				{
    					messageEnvoyer = messageEnvoyer +"";//******
    				}
    			}
    		}else if(elementType == FLAG) 
    		{
    			if(tableauXY[x][y] == -1)//effectue l'action seulement s'il n'est pas deja en memoire
    			{
    				tableauXY[x][y] = FLAG;
    				drapeauVu=true;
    				drapeauPosX=x;
    				drapeauPosY=y;
    				if(messageEnvoyer.length() <= 50)//Garde de l'espace pour si on voit un tank
    				{
    					messageEnvoyer = messageEnvoyer +"";//******
    				}
    			}
    		}else if(elementType == EMPTY) 
    		{
    			if(tableauXY[x][y] == -1)//effectue l'action seulement s'il n'est pas deja en memoire
    			{
    				tableauXY[x][y] = EMPTY;
    				if(messageEnvoyer.length() <= 50)//Garde de l'espace pour si on voit un tank
    				{
    					messageEnvoyer = messageEnvoyer +"";//******
    				}
    			}
    		}
    	}
        
        /** Voit le tank d'id unique specifie d'equipe specifiee en position absolue (x,y) */
        void seeTank( int seenTankId , int seenTankTeamId , int x , int y ) 
    	{
    		if(seenTankTeamId != getTeamId()) 
    		{
    			tankVu = true;
    			tankPosX=x;
    			tankPosY=y;
    			messageEnvoyer = messageEnvoyer +"";//******
    		}
    	}
    
        /** voit la base de l'equipe specifiee */
        void seeBase( int teamId , int x , int y ) 
    	{
    		if(teamId != getTeamId()) 
    		{
    			baseVu = true;
    			basePosX = x;
    			basePosY = y;
    		}
    	}
        
        // Methode d'ouput 
        Action makeAction()
        {
    		Action action=null;
    		int direction = 0;
    		int dxBut, dyBut;
            if(tankVu == true)
            {
    			action = new FireAction(tankPosX,tankPosY,messageEnvoyer);
            }
    		
    		else
    		{
    			Point initial = new Point(getX(),getY());
    			Point destination = new Point(10,10);
    			CheminLePlusCourt trajet = new CheminLePlusCourt(tableauXY);
    			Point suivant = trajet.TrouverPointPremier(initial,destination);
    			dxBut = suivant.getX();
    			dyBut =	suivant.getY();
    
    			if(dxBut-initial.getX() >= 1 && dyBut-initial.getY() == 0)
    			{
    				direction = EAST;
    			}
    
    			if(dxBut-initial.getX() < 1 && dyBut-initial.getY() == 0)
    			{
    				direction = WEST;
    			}
    
    			if(dyBut-initial.getY() >= 1 && dxBut-initial.getX() == 0)
    			{
    				direction = NORTH;
    			}
    
    			if(dyBut-initial.getY() < 1 && dxBut-initial.getX() == 0)
    			{
    				direction = SOUTH;
    			}
    
    			if(dxBut == initial.getX() && dyBut == initial.getY())
    			{
    				direction = 0;	
    			}
    
    		action = new MoveAction(direction,messageEnvoyer);
    
    		}
    
    		return action;
        }
    }
    
    class CheminLePlusCourt extends Tank
    {
    	private final static int penalite = 9;		// on doit avoir une penalite sur chaque noeud source: http://www.codeproject.com/KB/recipes/mazesolver.aspx
    	public NoeudChemin [] ListeNoeud;
       	public int ListeIndex = 0;		// Marque notre position dans notre liste
       	private int LargeurTableau;
       	private int HauteurTableau;
    	private int[][] tableau;
    
    	CheminLePlusCourt(int[][] carte)
       	{
        	tableau = carte;
    		LargeurTableau = carte[carte.length -1].length;
        	HauteurTableau = carte.length;
       	}
    
    	private NoeudChemin RechercheListeNoeud(Point p)		// Rechcher si le Noeud a la postion x,y existe
       	{
    		int index = 0;
          	NoeudChemin NoeudRecherche = null;
    
          	while(NoeudRecherche == null && index < ListeIndex)		// Tant qu'on a pas trouve un noeud recherche ou qu'on a parcouru tous les noeuds sans resultat.
          	{
             	if(ListeNoeud[index].courrant.CompareA(p))
    			{
               		NoeudRecherche = ListeNoeud[index];
    			}
    
             	else
    			{		
                	index++;
    			}
          	}
    
          	return NoeudRecherche;
    	}
    
    	private int SommeNoeudOuvert()		// Calcul la somme des noeuds ouverts les noeuds ouverts. S'il n'en reste plus aucun il n'y a plus d'options possible
       	{
          	int somme = 0;
          	for(int i = 0;i < ListeIndex;i++)
    		{
    
            	if(ListeNoeud[i].estVisite == false)		// Noeuds vistes ignores
    			{
               	 somme++;
    			}
    		}
    
          return somme;
       	}
    
    	private NoeudChemin RechercherNoeudDepenseMin()	// Noeud ouvert qui a la depense la plus faible
       	{
          	NoeudChemin NoeudDepenseMin = null;
    
          	for(int i = 0; i < ListeIndex;i++)
    		{
             	if(!ListeNoeud[i].estVisite && (NoeudDepenseMin == null || ListeNoeud[i].getDepenseF() < NoeudDepenseMin.getDepenseF()))		// Si depense plus petite que precedement
    			{
                	NoeudDepenseMin = ListeNoeud[i];
    			}
    		}
    
          return NoeudDepenseMin;
       }
    
       private void AjouteNoeudOuvertListe(NoeudChemin n)		// Ajoute un noeud ouvert.
       {
          n.estVisite = false;
          ListeNoeud[ListeIndex] = n;
          ListeIndex++;
       }
    
    	private int CalculHeuristique(NoeudChemin n, Point arrivee)
       	{
         	int heuristique = (int) arrivee.Distance(arrivee, n.courrant, false);		// manhattan method
    		int SommePenalite = 0;
    
          	for(int x = n.courrant.x - penalite; x <= n.courrant.x + penalite;x++)
    		{
             	for(int y = n.courrant.y - penalite; y <= n.courrant.y + penalite;y++)
    			{
                	if(x < LargeurTableau && y < HauteurTableau && x >= 0 && y >= 0)		// Out of bounds?
    				{
                   		if(tableau[y][x] == TANK)
                   		{
                      		SommePenalite = penalite - (int)n.courrant.Distance(n.courrant, new Point(x,y), false);
    	
                      		if (SommePenalite < 0) SommePenalite = 0;		// penalite aux distances entre le noeud et les ennemis
    						{
                      			SommePenalite += SommePenalite*100;
                   			}
    					}
    				}
    			}
    		}
    
          return heuristique;
       	}
    
    	public Point TrouverPointPremier(Point initial, Point destination)		// Retourne le prochain Point
      	{
          	if(initial.CompareA(destination))		// Si les deux sont pareils, on retourne le point de depart.
    		{
             	return initial;
    		}
    	
    		else
    		{
    			NoeudChemin chemin = RechercheChemin(initial, destination);
          		Point PointPremier = null;
    
          		while(chemin != null)
          		{
             		if(chemin.origine == null) 
    				{
                		PointPremier = chemin.courrant;
    				}
    
             		chemin = chemin.origine;
          		}
    			
    			return PointPremier;
    		}
    	}
    	
    	public NoeudChemin RechercheChemin(Point initial, Point destination)		// Retourne Le noeud contenu a la position d'arrivee ou null s'il n'y a aucun trajet. Si on va d'origine a origine, on obtiendra le trajet complet
       	{	
    		int indexListe = 0;		// On reintialise l'index de la liste
    		boolean recherche = false;
          	ListeNoeud = new NoeudChemin[this.LargeurTableau * this.HauteurTableau];
          	NoeudChemin NoeudInitial = new NoeudChemin(initial);		// Premier noeud
          	NoeudChemin NoeudRecherche = null;		// Sauvegarder dasn NoeudRecherche
          	AjouteNoeudOuvertListe(NoeudInitial);		// ajoute le noeud premier a la liste de noeuds "ouverts"
    
          	while(!recherche && SommeNoeudOuvert() > 0)		 // Boucle tant qu'on est pas arrive a destination ou que tous les noeuds ont ete visites
          	{
             	NoeudChemin NoeudActuel = RechercherNoeudDepenseMin();		// On recherche le noeud ouvert aillant la depense la plus faible dans la liste
             	if(NoeudActuel.courrant.CompareA(destination))		// si ce noeud egal destination, on sort de la boucle et on retourne le noeud
             	{
                	NoeudRecherche = NoeudActuel;
                	recherche = true;
    
               	 continue;
             	}
    
             // Sinon on regarde les 4 noeud adjacents
            	NoeudActuel.estVisite = true;   
                                                   
            	for(int x = NoeudActuel.courrant.x-1; x <= NoeudActuel.courrant.x+1; x++)		// 	Rappel: les mouvements diagonaux sont  illegaux
    			{
                	for(int y = NoeudActuel.courrant.y-1; y<= NoeudActuel.courrant.y+1;y++)   // les noeuds a explorer
             		{	 
    					if(x != NoeudActuel.courrant.x || y != NoeudActuel.courrant.y)		// et si le noeud n'est l'actuel
    					{
    						if((x !=  NoeudActuel.courrant.x-1 || y != NoeudActuel.courrant.y-1) && (x !=  NoeudActuel.courrant.x-1 || y != NoeudActuel.courrant.y+1))		// les mouvements ne sont pas diagonaux droites
    						{
    							
    							if((x !=  NoeudActuel.courrant.x+1 || y != NoeudActuel.courrant.y-1) && (x !=  NoeudActuel.courrant.x+1 || y != NoeudActuel.courrant.y+1))		// les mouvements ne sont pas diagonaux gauches
    							{    
                   					if(y < HauteurTableau && x < LargeurTableau && y >= 0 && x >= 0)		// Si le noeud n'est pas en dehors de la carte			
    								{
    									if(tableau[y][x] != WALL)		// et si pas sur un mur		
    									{
                      						Point NoeudAdjacent = new Point(x,y);		 // On verifie si le noeud est deja la
                     						NoeudChemin NoeudTmp = RechercheListeNoeud(NoeudAdjacent);
                      
                      						if(NoeudTmp == null)		// Si non, on l'ajoute en calculant l'heuristique et la depense                  					
    										{
                         						NoeudTmp = new NoeudChemin(new Point(x,y));
                         						NoeudTmp.origine = NoeudActuel;
    
                         						NoeudTmp.setDepenseG(NoeudTmp.origine.getDepenseG() + 10); // On ajoute dix a la depense du noeud origine source: http://www.policyalmanac.org/games/aStarTutorial.htm
    
                         						NoeudTmp.setDepenseH(CalculHeuristique(NoeudActuel, destination)); 
    
                         						AjouteNoeudOuvertListe(NoeudTmp); // On ajoute le noeud a la liste des noeuds "ouverts"		note: Si le noeud egal destination on sort de la boucle 
    
                         						if(NoeudTmp.courrant.CompareA(destination))
                         						{
                            						NoeudRecherche = NoeudTmp;
                            						recherche = true;
                         						}
                      						}
    
                     						else if(!NoeudTmp.estVisite && NoeudTmp.getDepenseG() > NoeudActuel.getDepenseG())		// S'il existe et qu'il a deja ete visite et que la depense initiale plus grande que celle actuelle
                      						{
                         						NoeudTmp.origine = NoeudActuel;
                        						NoeudTmp.setDepenseG(NoeudActuel.getDepenseG() + 10);
    					                	}
    									}
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    
          	return NoeudRecherche;
       	}
    }
    
    class Point
    {	
    	public int x,y;
    	
    	public Point(int x, int y)
    	{
    		this.x = x;
    		this.y = y;
    	}
    
    	public int getX()
    	{
    		return this.x;
    	}
    	
    	public int getY()
    	{
    		return this.y;
    	}
    
    	boolean CompareA(Point p)
    	{
    		return ((this.x == p.x) && (this.y == p.y));
    	}
    	
    	public static int Distance(Point p1, Point p2, boolean pareil)
    	{
    		pareil = p1.CompareA(p2);
    
    		if (pareil)
    		{
    			return 1;
    		}
    		
    		return (int) Math.sqrt((Math.pow((p2.x - p1.x), 2) + Math.pow((p2.y - p1.y), 2)));
    	}
    }
    
    class NoeudChemin		//	Chaque noeud contient la depense total du noeud (l'Algorithme A* : F = H + G)
    {
    	private int depenseF;	 	// Depense total du noeud (depense + depense heuristique)
    	private int depenseG;		 // depense d'un deplacement du point de depart jusqu'a un autre point donne
       	private int depenseH;		 // Estimation de la depense du point initial au point donne (heuristique)
    	public boolean estVisite;		// Indique si le noeud a deja ete visite.
    	public Point courrant;		// Les coordonnes x et y du noeud
        public NoeudChemin origine;		 // Le noeud origine nous permmettra de retracer notre chemin jusqu'a notre base
       
      	public NoeudChemin(Point p)
       	{
         	 courrant = p;
       	}
    
    	public int getDepenseG()
    	{
    		return depenseG;
    	}
       	public int getDepenseH()
    	{
    		return depenseH;
    	}
       	public int getDepenseF()
    	{
    		return depenseF;
    	}
    
      	public void setDepenseG(int g)		// Permet de changer la depense d'un deplacement entre le point initial et le noeud courrant
       	{
         	depenseG = g;
          	depenseF = depenseG + depenseH; 
       	}
    
       	public void setDepenseH(int h)		// Permet de mettre a jour l'estimation de la depense pour passer du noeud courrant au point donne
       	{
         	depenseH = h;
          	depenseF = depenseG + depenseH; 
       	}
    }

  8. #8
    newbie79 is offline Member
    Join Date
    Oct 2010
    Posts
    16
    Rep Power
    0

    Default

    thks guys I solved it, wehe is the solved tag???

    thks again

  9. #9
    Eranga's Avatar
    Eranga is offline Moderator
    Join Date
    Jul 2007
    Location
    Colombo, Sri Lanka
    Posts
    11,371
    Blog Entries
    1
    Rep Power
    20

    Default

    Quote Originally Posted by newbie79 View Post
    thks guys I solved it, wehe is the solved tag???

    thks again
    On top of the thread, you can see a menu. Click on Thread Tools.

  10. #10
    Eranga's Avatar
    Eranga is offline Moderator
    Join Date
    Jul 2007
    Location
    Colombo, Sri Lanka
    Posts
    11,371
    Blog Entries
    1
    Rep Power
    20

    Default

    And also please post the most specific code segment next time. Because most of the times, other members just read your code, not run ti actually. So reading a very long code like you've post here is really difficult task. :)

Similar Threads

  1. Artificial Intelligence knowledge base in java
    By ala_mages in forum Advanced Java
    Replies: 5
    Last Post: 12-06-2010, 11:44 AM
  2. Artificial intelligence coding problems
    By MuslimCoder in forum New To Java
    Replies: 1
    Last Post: 02-26-2010, 04:30 PM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •