Programmeerimise algkursus Harjutus 2

Allikas: Lambda

Roboti anatoomia

Robotil on kolm osa: Kere, Tukk ja Radar[1].

Loe algatuseks: http://testwiki.roborumble.org/w/index.php?title=Robocode/Robot_Anatomy

Roboti juhtimiseks on abiks järgmised funktsioonid:

  • ahead(pikslit) - sõida edasi
  • back(pikslit) - sõida tagasi
  • turnLeft(kraadi) - keera roboti keret vasakule
  • turnRight(kraadi) - keera roboti keret paremale
  • turnGunRight(kraadi) - keera tukki paremale
  • turnGunLeft(kraadi) - keera tukki vasakule
  • turnRadarLeft(kraadi) - keera radarit vasakule
  • turnRadarRight(kraadi) - keera radarit paremale

Nurkade arvutamist aitavad:

  • getHeading() - tagastab roboti suuna kraadides
  • getGunHeading() - tagastab tuki suuna kraadides
  • e.getBearing() - tagastab sündmuse (olenevalt kontekstist kas avastatud vastane või Sind tabanud kuul) peilungi

Vastase sihikul hoidmine

Sihtimine käib suundade ja peilungite järgi. Peilung (bearing) tähendab robocode maailmas nurka roboti sõidusuuna suhtes. Suund tähendab absoluutkoordinaadistiku nurka. Loe: http://testwiki.roborumble.org/w/index.php?title=Robocode/Game_Physics

Lisa run meetodisse radariga ringiratast keerutamine:

        public void run() {
                while(true) {
                        turnRadarLeft(360);
                }
        }

Vastase avastamisel keera toru tema poole:

	public void onScannedRobot(ScannedRobotEvent e) {
		double vastase_peilung = e.getBearing();
		double tuki_suund = getGunHeading();
		double minu_suund = getHeading();

		double vastase_suund = minu_suund + vastase_peilung;
		double keeramisnurk = vastase_suund - tuki_suund;
		keeramisnurk = normalRelativeAngle(keeramisnurk);

		turnGunRight(keeramisnurk);

	}

NB! Et asi töötaks, tuleb oma robotisse juurde lisada ka see nurga arvutamise funktsioon:

	/**
	 * normalRelativeAngle:  Returns angle such that -180 < angle <= 180
	 */
	public double normalRelativeAngle(double angle) {
		if (angle > -180 && angle <= 180) {
			return angle;
		}
		double fixedAngle = angle;

		while (fixedAngle <= -180) {
			fixedAngle += 360;
		}
		while (fixedAngle > 180) {
			fixedAngle -= 360;
		}
		return fixedAngle;
	}

Edasi mõtle juba ise, kuidas vastast laskma hakata.

Vihje: kontrolli enne laskmist kas toru on ikka vastase poole. +- 3 kraadi on OK :)

Taibudele

Head lugemist :)