Meme principe que le premier, mais le probleme est résolu.

Je n'ai pas eu le temps de programmer des robots intelligents, et ce ne sera possible que lorsque j'aurai realise l'image radar dans Arene.java


Arene.java

import java.awt.*;
import java.applet.*;
import java.awt.image.ImageObserver;
public class Arene extends Applet implements Runnable{
        ImageObserver iob;
        Thread th;
        private int periode=50;
        private int nb_robots=2;
        private Object[] t=new Object[nb_robots];
        int largeur=400;
        int hauteur=400;
        private int t_compte=0;//sert a verifier que chqjoueur ne faitqu'une action par tour.
        private boolean[] vivants=new boolean[nb_robots];
        public void init(){
                this.setBackground(Color.black);
                t[0]=new Robot1();
                t[1]=new Robot2();
                for(int i=0;i<nb_robots;i++){
                        vivants[i]=true;
                        Robot r=(Robot)(t[i]);
                        r.donneCarte(largeur,hauteur);//fournit des renseignements preliminaires aux robots
                        r.init();
                }
        }
        public void start() {
            th = new Thread(this);
            th.start();
        }
        
        public void stop() {
            th = null;
        }
        public void run(){
                Thread me=Thread.currentThread();
            while(th==me){
                        pause(periode);
                        try{tops();}
                        catch(NullPointerException e){}
            }
        }

        private void tops(){
                //this.setBackground(new Color((int)(255*Math.random()),(int)(255*Math.random()),(int)(255*Math.random())));
                t_compte++;
                Image buffer=this.createImage(largeur,hauteur);
                for(int i=0;i<nb_robots;i++){
                        showStatus("joueur "+iS(i)+" "+bS(vivants[i]));
                        //pause(500);
                        Robot r=(Robot)(t[i]);
                        if(vivants[i]){
                                r.signalRadar(chercheImageRadar(r));//prb : qui est modifié: r et t[i] ou seulement r ?
                                r.top0();//accorde la permission de tirer une fois et bouger une fois par mvt possible
                                r.top();//c'est là que la programmation du joueur intervient
                                dessineRobot(buffer.getGraphics(),r.x,r.y,r.arobot,r.aradar,r.acanon,r.couleur);
                                if(r.jeveuxparler){showStatus(r.jeparle);}//affichage msg, debogage du joueur
                                if(t_compte!=r.t_compte){tue(i);}//methode Bush pour les tricheurs
                                vivants[i]=(r.etat>=0);
                        }
                }
                this.getGraphics().drawImage(buffer,0,0,iob);
        }

        
        private ImageRadar chercheImageRadar(Robot r){//renvoie un objet caracterisant les donnees reçues par le radar: nature et distance de l'objet en face du radar, s'il y en a un.
                //calculer
                return new ImageRadar(false,0,"");
        }
        
        private void dessineRobot(Graphics g,int x,int y,double arobot,double aradar,double acanon,Color couleur){
                g.setColor(couleur);
                //corps
                F.cercle(g,x,y,3);
                //chenilles <=> direction du robot
                int ce=4;//moitié de l'ecartement des chenilles
                int cl=5;//moitié de la longueur des chenilles
                g.drawLine(x-(int)(cl*Math.cos(arobot))-(int)(ce*Math.sin(arobot)),
                                   y-(int)(cl*Math.sin(arobot))+(int)(ce*Math.cos(arobot)),
                                   x+(int)(cl*Math.cos(arobot))-(int)(ce*Math.sin(arobot)),
                                   y+(int)(cl*Math.sin(arobot))+(int)(ce*Math.cos(arobot)));
                g.drawLine(x-(int)(cl*Math.cos(arobot))+(int)(ce*Math.sin(arobot)),
                                   y-(int)(cl*Math.sin(arobot))-(int)(ce*Math.cos(arobot)),
                                   x+(int)(cl*Math.cos(arobot))+(int)(ce*Math.sin(arobot)),
                                   y+(int)(cl*Math.sin(arobot))-(int)(ce*Math.cos(arobot)));
                //canon
                g.drawLine(x,y,x+(int)(7*Math.cos(acanon)),y+(int)(7*Math.sin(acanon)));
                //radar
        }
        
        private void tue(int i){
                vivants[i]=false;
                Robot r=((Robot)t[i]);
                Graphics g=this.getGraphics();
                g.setColor(Color.red);
                F.cercle(g,r.x,r.y,15);
                pause(1000);
        }
        private void pause(int temps){
                try{Thread.currentThread().sleep(temps);}
                catch(InterruptedException e){}
        }
        String iS(int i){return new Integer(i).toString();}
        String bS(boolean b){return new Boolean(b).toString();}
}


F.java import java.awt.Graphics; import java.lang.Math; //fonctions utilisables par les robots //ils peuvent aussi importer n'importe quelle classe qui leur semblent utile. public final class F { public static void cercle(Graphics g,int x,int y,int rayon){ g.drawArc(x-rayon,y-rayon,2*rayon,2*rayon,0,360); } public static final double PI = 3.14159265358979323846; public static final double E = 2.7182818284590452354; public static int Si(String S){return Integer.parseInt(S);} public static String cS(char c){Character C=new Character(c);return C.toString();} public static double id(int i){return iI(i).doubleValue();} public static Double iD(int i){return new Double(id(i));} public static Integer iI(int i){return new Integer(i);} public static int di(double d){return new Double(d).intValue();} public static String iS(int i){return new Integer(i).toString();} }
ImageRadar.java public class ImageRadar extends Object{ boolean signal=false; int distance=0; String analyse=""; //on pourrait passer un Robot, plus dangereux ImageRadar(boolean signal_,int distance_, String analyse_){ signal=signal_; distance=distance_; analyse=analyse_; } void raz(){ signal=false; } }
Robot.java import java.awt.Color; abstract class Robot{ int x=100+(int)(50*Math.random()); int y=100+(int)(50*Math.random()); double arobot=0; double aradar=0; double acanon=0; ImageRadar imageRadar; int avance_max=5;//en pixel par top double tmax_robot=Math.PI/8;//increment angle maxi pendant une periode ( 1 top() ) double tmax_radar=Math.PI/8; double tmax_canon=Math.PI/8; int largeurCarte=0;//sera remplaçé int hauteurCarte=0;//sera remplaçé int dommageCanon=3; int nb_balles=10; Color couleur=Color.pink;//sera remplaçé private boolean t_robot=false;//empeche de tourner plus d'une fois a chq top (idem pour tirer) private boolean t_radar=false;//comment les remettre a false a chq top ? private boolean t_canon=false; private boolean t_tir=false; private boolean t_avance=false; int t_compte=0; int etat=20; // 20/20=parfait, 0/20=>mort boolean vivant=true; int score=0; abstract void init(); abstract void top(); public void top0(){//permet au robot d'effectuer une fois chaque mvt t_robot=false; t_radar=false; t_canon=false; t_tir=false; t_avance=false; t_compte++; } void tue(){vivant=false;}//comment empecher les autres robots de l'utiliser ? le tableau de robots est en private void donneCarte(int largeur_,int hauteur_){ largeurCarte=largeur_; hauteurCarte=hauteur_; } boolean jeveuxparler=false; String jeparle=""; void dit(String msg){ jeveuxparler=true; jeparle=msg; } void avance(int vitesse){ if(vitesse<=this.avance_max){ x+=vitesse*Math.cos(arobot); y+=vitesse*Math.sin(arobot); } } void tourneRobot(double d){ if(Math.abs(d)<=tmax_robot){ t_robot=true; arobot+=d; } } void tourneRadar(double d){ if(Math.abs(d)<=tmax_radar){ t_radar=true; arobot+=d; } } void tourneCanon(double d){ if(Math.abs(d)<=tmax_canon){ t_canon=true; arobot+=d; } } //public void place(int x,int y){//trop dangereux, il peut l'appeler pour se deplacer plus vite void signalRadar(ImageRadar imageRadar_){imageRadar=imageRadar_;}//methode appelée par l'Arene pour renseigner le Robot String nom="Albert";//ce nom ne sera pas gardé void nomme(String nom_){nom=nom_;} void colorie(Color couleur_){couleur=couleur_;} /////////// fonctions utilisables par les robots String iS(int i){return new Integer(i).toString();} }
Robot1.java Exemple basique du robot programme par un joueur en etendant la classe abstraite Robot import java.awt.Color; public class Robot1 extends Robot{ int c=0; void init(){ this.nomme("SuperWarrior (1)"); // ou super.nomme( ? this.colorie(Color.cyan); this.dit("Je connais la carte: (" +iS(largeurCarte)+"," +iS(hauteurCarte)+")"); } void top(){ c++; dit(iS(c)+" Ici "+this.nom+", je suis en ("+iS(x)+","+y+")."); this.tourneRobot(this.tmax_robot); if((x>avance_max)&true){ this.avance(avance_max); } } //etc... }
Robot2.java import java.awt.Color; public class Robot2 extends Robot{ void init(){ nomme("MegaMonkey (2)"); this.colorie(Color.green); dit("Je connais la carte: (" +iS(largeurCarte)+"," +iS(hauteurCarte)+")"); } void top(){ this.avance(this.avance_max); dit("Ici "+this.nom+", je suis en ("+iS(x)+","+y+")."); } }