Programmeerimise algkursus Harjutus 3: erinevus redaktsioonide vahel

Allikas: Lambda
Mine navigeerimisribale Mine otsikasti
Anttix (arutelu | kaastöö)
Resümee puudub
 
Anttix (arutelu | kaastöö)
Resümee puudub
1. rida: 1. rida:
Esimene töö: valida siga, mis on meile kõige lähemal.
== Esimene töö: valida siga, mis on meile kõige lähemal. ==


Selleks teeme radariga tiiru ära ja märgime tiiru jooksul
Idee: teeme radariga tiiru ära ja märgime tiiru jooksul leitud sigadest kõige lähemal olnu kauguse ja peilungi ära. Peale tiiru lõpetamist keerame tuki sea suunas ja anname tina!
kõige lähemal olnud sea kauguse ja peilungi muutujatesse sea_kaugus ja siga_sihikul.


Tuki keeramine ja laskmine toimuvad peale radari "scan"-i.
Algatuseks peame onScannedRobot sündmuse üleliigsest kõntsast koristama. Seal istub praegu keeramisnurga arvutamise kood, millest teeme eraldi funktsiooni (meil läheb seda hiljem niikuinii vaja):
 
<pre>
    public double arvutaKeeramisnurk(double vastase_peilung) {
        double tuki_suund = getGunHeading();
        double minu_suund = getHeading();
 
        double vastase_suund = minu_suund + vastase_peilung;
        double keeramisnurk = vastase_suund - tuki_suund;
 
        return normalRelativeAngle(keeramisnurk);
    }
</pre>
 
Teeme globaalmuutujad sea_kaugus ja siga_sihikul. Selleks lisame kaks uut rida oma roboti klassi algusesse:
 
<pre>
public class LollRobot extends Robot {
 
    double siga_sihikul;
    double sea_kaugus;
 
...
 
</pre>
 
Tuki keeramine ja laskmine hakkavad toimuma peale radari "scan"-i. Modifitseerime run meetodit vastavalt:


<pre>  
<pre>  
10. rida: 35. rida:


     double laksuTugevus = 2.0;
     double laksuTugevus = 2.0;
    double siga_sihikul;
    double sea_kaugus;


     public void run() {
     public void run() {
         // Ära keera tukki koos kerega!
         // Ära keera tukki koos kerega ega radarit koos tukiga!
 
         setAdjustGunForRobotTurn(true);
         setAdjustGunForRobotTurn(true);
        // Ära keera radarit koos tukiga
         setAdjustRadarForGunTurn(true);
         setAdjustRadarForGunTurn(true);


         while(true) {
         while(true) {
             // Otsimise alustamisel on sea kaugus teadmata
             // Enne otsimist on lähim siga lõpmata kaugel
             sea_kaugus = Double.MAX_VALUE;
             sea_kaugus = Double.MAX_VALUE;


            // Radari scan
             turnRadarLeft(360);
             turnRadarLeft(360);
            // Keerame tuki sea suunda ja anname tina!
             double keeramisnurk = arvutaKeeramisnurk(siga_sihikul);
             double keeramisnurk = arvutaKeeramisnurk(siga_sihikul);
             turnGunRight(keeramisnurk);
             turnGunRight(keeramisnurk);
             fire(laksuTugevus);
             fire(laksuTugevus);
34. rida: 55. rida:
     }
     }


    public void onScannedRobot(ScannedRobotEvent e) {
        double vastase_kaugus = e.getDistance();
        double vastase_peilung = e.getBearing();
        // Otsime kõige lähemal paiknevat vastast
        if(vastase_kaugus < sea_kaugus) {
            sea_kaugus = vastase_kaugus;
            siga_sihikul = vastase_peilung;
        }
    }
    public double arvutaKeeramisnurk(double vastase_peilung) {
        double tuki_suund = getGunHeading();
        double minu_suund = getHeading();
        double vastase_suund = minu_suund + vastase_peilung;
        double keeramisnurk = vastase_suund - tuki_suund;
        return normalRelativeAngle(keeramisnurk);
    }
...
...
</pre>
</pre>

Redaktsioon: 1. oktoober 2008, kell 12:10

Esimene töö: valida siga, mis on meile kõige lähemal.

Idee: teeme radariga tiiru ära ja märgime tiiru jooksul leitud sigadest kõige lähemal olnu kauguse ja peilungi ära. Peale tiiru lõpetamist keerame tuki sea suunas ja anname tina!

Algatuseks peame onScannedRobot sündmuse üleliigsest kõntsast koristama. Seal istub praegu keeramisnurga arvutamise kood, millest teeme eraldi funktsiooni (meil läheb seda hiljem niikuinii vaja):

    public double arvutaKeeramisnurk(double vastase_peilung) {
        double tuki_suund = getGunHeading();
        double minu_suund = getHeading();

        double vastase_suund = minu_suund + vastase_peilung;
        double keeramisnurk = vastase_suund - tuki_suund;

        return normalRelativeAngle(keeramisnurk);
    }

Teeme globaalmuutujad sea_kaugus ja siga_sihikul. Selleks lisame kaks uut rida oma roboti klassi algusesse:

public class LollRobot extends Robot {

    double siga_sihikul;
    double sea_kaugus;

...

Tuki keeramine ja laskmine hakkavad toimuma peale radari "scan"-i. Modifitseerime run meetodit vastavalt:

 
...

    double laksuTugevus = 2.0;

    public void run() {
        // Ära keera tukki koos kerega ega radarit koos tukiga!
        setAdjustGunForRobotTurn(true);
        setAdjustRadarForGunTurn(true);

        while(true) {
            // Enne otsimist on lähim siga lõpmata kaugel
            sea_kaugus = Double.MAX_VALUE;

            // Radari scan
            turnRadarLeft(360);

            // Keerame tuki sea suunda ja anname tina!
            double keeramisnurk = arvutaKeeramisnurk(siga_sihikul);
            turnGunRight(keeramisnurk);
            fire(laksuTugevus);
        }
    }

...