{"id":2260,"date":"2020-04-10T14:04:01","date_gmt":"2020-04-10T14:04:01","guid":{"rendered":"http:\/\/swisscoderdojo.org\/?page_id=2260"},"modified":"2020-05-09T15:03:52","modified_gmt":"2020-05-09T15:03:52","slug":"code-snippets","status":"publish","type":"page","link":"https:\/\/swisscoderdojo.org\/de\/code-snippets","title":{"rendered":"Code St\u00fccke"},"content":{"rendered":"\n<p>Diese Seite enth\u00e4lt Code St\u00fccke die wir f\u00fcr die 2020 Fr\u00fchlings Heim Challenge verwendet haben.<\/p>\n\n\n\n<h3>Robocode<\/h3>\n\n\n\n<p>Die Roboter, die wir f\u00fcr die Herausforderung verwenden, basieren auf dem <strong>JuniorRobot<\/strong>,<br><strong><code>public class Day2 extends JuniorRobot<\/code><\/strong><br>Alle Methoden und Variablen, die im &nbsp;<strong>JuniorRobot <\/strong>verf\u00fcgbar sind, sind auf <a rel=\"noreferrer noopener\" href=\"https:\/\/robocode.sourceforge.io\/docs\/robocode\/robocode\/JuniorRobot.html\" target=\"_blank\">https:\/\/robocode.sourceforge.io\/docs\/robocode\/robocode\/JuniorRobot.html<\/a><br>dokumentiert, bitte verwende diese Seiten als Referenz<\/p>\n\n\n\n<h4>Wie kann man die Farbe eines Roboters einstellen?<\/h4>\n\n\n\n<p>Robocode verwendet die <code>setColors  <\/code>Methode, um Farben des <code>JuniorRobot <\/code>den wir f\u00fcr die Herausforderung verwenden, zu definieren, Wir setzen die Farben in der<code> run() <\/code>Methode, damit sind die Farben beim Erstellen des Roboters festgelegt:<\/p>\n\n\n\n<div class=\"wp-container-1 wp-block-group\"><div class=\"wp-block-group__inner-container\">\n<pre class=\"wp-block-preformatted\">\/\/ Vordefinierte Farben (in Englisch): \n\/\/ blue, yellow, black, white, red, \n\/\/ blau, gelb, schwarz, weiss, rot\n\/\/ pink, brown, grey, orange\u2026\n\/\/ rosa, braun, grau, orange\n\/\/ Sets these colors (robot parts): body, gun, radar, bullet, scan_arc\n\/\/ Die Farben werden f\u00fcr verschiedene Teile des Roboters gesetzt\n\/\/ K\u00f6rper, Kanone, Radar, Kugel, Radar-Bogen\nsetColors(orange, blue, white, yellow, black);<\/pre>\n<\/div><\/div>\n\n\n\n<h4>Wie kann ich meinen Roboter gegen den von mir gescannten Roboter drehen?<\/h4>\n\n\n\n<p>Sehr \u00e4hnlich wie wir den <code>Day3 <\/code>Roboter gemacht haben, schau bitte<a href=\"http:\/\/projects.swisscoderdojo.org\/2020ChallengePdfFiles\/Robocode%20-%20the%20final%20lesson.pdf\"> <\/a><a href=\"http:\/\/projects.swisscoderdojo.org\/2020ChallengePdfFiles\/Robocode%20-%20die%20letzte%20Lektion.pdf\">auch dieses Dokument<\/a> als Referenz an.<\/p>\n\n\n\n<p>Um den Roboter in Richtung eines gescannten Feindes zu drehen, m\u00fcssen wir die <code>onScannedRobot()<\/code><strong> <\/strong>\u00e4ndern und die <code>turnTo(degrees) <\/code>Methode&nbsp;verwenden.&nbsp; Es steht Dir eine Variable namens&nbsp; <code>scannedAngle<\/code> zur Verf\u00fcgung, die auf die Richtung (in Grad) gesetzt ist, in der ein Gegner erkannt wird. Die&nbsp; variable <code>scannedAngle <\/code>wird direkt vor dem Aufruf der <code>onScannedRobot() <\/code>Methode&nbsp; gesetzt,&nbsp; aber sie wird zur\u00fcckgesetzt, sobald sich die Kanone &nbsp;oder der Roboter zu drehen beginnt. Dies ist wichtig, da du den Roboter in Richtung des Feindes drehen willst, und dann sicherstellen musst, dass die Kanone auf den Feind zeigt, nachdem Dein Roboter gedreht wurde. Andernfalls wird Dein Roboter auf den Feind gerichtet, aber da die Kanone mit dem K\u00f6rper gedreht wurde, zeigt die Waffe nicht mehr auf den gescannten Roboter.<br>Also definieren wir eine lokale Variable, um den&nbsp; gescannten Winkel (<code>scannedAngle<\/code> ) zu speichern, so dass Du sowohl den Roboter als auch die Waffe in Richtung des Feindes drehen kannst. So sollte die<code> onScannedRobot() <\/code><strong>&#8211; <\/strong>Methode&nbsp; aussehen:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">public void onScannedRobot() {\n    \/\/ store the angle the enemy is scanned\n    \/\/ speichere den Winken auf dem wir den Feind gesehen haben\n    int iScanAngle = scannedAngle; \n&nbsp;&nbsp;&nbsp;&nbsp;turnTo(iScanAngle); \/\/ turn the body - drehe den Roboter\n&nbsp;&nbsp;&nbsp;&nbsp;turnGunTo(iScanAngle); \/\/ turn the gun - drehe die Kanone\n}<\/pre>\n\n\n\n<h4>Wie kann ich meinen Roboter an einer Wand sitzen lassen und sein Radar um 180 Grad nach links und rechts drehen lassen?<\/h4>\n\n\n\n<p>Wir zeigen Dir, wie Du dies auf Norden (d.h. der oberen Wand) machst, aber Du kannst den Code bearbeiten, um an eine der vier W\u00e4nde zu fahren. Zuerst m\u00fcssen wir die Richtungen verstehen. Der obere Rand der Karte ist in Richtung von 0 Grad, rechts ist 90 Grad, unten ist 180 Grad und links ist 270 Grad. Also muss der Tank nach oben (Richtung 0 Grad) fahren, bis er die Wand ber\u00fchrt. Biege dann nach links ab (270 Grad). Dann drehe das Radar zwischen 90 Grad (rechts) und 270 Grad (links). Einfach! Hier ist der ganze Code mit Kommentaren, die erkl\u00e4ren, was passiert:<\/p>\n\n\n<pre class=\"wp-block-preformatted\">package HomeChallenge; \nimport robocode.*; \n  \npublic class WallCrawler extends JuniorRobot {                \n    \/\/ tells us to move forwards or backwards<br \/>    \/\/ sagt uns ob wir uns vorw\u00e4rts oder r\u00fcckw\u00e4rts bewegen\n    \/\/ tells us to sweep our gun left or right<br \/>    \/\/ sagt uns ob wir die Kanone links oder rechts herum drehen               \n    private boolean bSweepLeft = true; \n    \/\/ tells us if we are on a wall <br \/>    \/\/ sagt uns wenn wir an der Wand sind              \n    private boolean bOnWall = false; \n                                \n    public void run() {                              \n        \/\/ if the tank is on the wall, then do the sweeping<br \/>        \/\/ der Roboter ist an der Wand - beginne zu suchen                             \n        if (bOnWall) {                                           \n            if (bSweepLeft) {                                                           \n                \/\/ sweep the gun left (from 270 degrees to 90 degrees)<br \/>                \/\/ drehe die Kanone links (von 270 Grad zu 90 Grad)                                                      \n                turnGunLeft(2);\n                \/\/ if gun is all the way to the right, \n                \/\/ then sweep the other way <br \/>                \/\/ falls die Kanone ganz nach rechts zeigt <br \/>                \/\/ drehen wir sie in die andere Richtung                                                             \n                if (gunHeading &lt;= 90) \n                    bSweepLeft = false;  \n            } \n            \/\/ sweep the gun right (from 90 degrees to 270 degrees)<br \/>            \/\/ drehe die Kanone rechts (von 90 Grad zu 270 Grad)\n            else { \n                turnGunRight(2);\n                \/\/ if gun is all the way to the right\n                \/\/ then sweep the other way <br \/>                \/\/ falls die Kanone ganz nach rechts zeigt <br \/>                \/\/ drehen wir sie in die andere Richtung                                                            \n                if (gunHeading &gt;= 270) \n                    bSweepLeft = true;                                           \n            } \n            \/\/ move along the wall<br \/>            \/\/ fahre der Wand entlang\n            if (bGoForward) {\n                 ahead(10);\n             }\n             else {\n                 back(10);\n             }                            \n        }                             \n                                     \n        else { \/\/ the tank is not at a wall<br \/>            \/\/ der Tank ist nicht an der Wand                                         \n            \/\/ turn north - drehen nach Norden\n            turnTo(0);   \n            \/\/ and move - with 1000 we will hit the top wall<br \/>            \/\/ und fahre - mit 1000 bis zur oberen Wand                                  \n            ahead(1000);                               \n        }              \n     }                 \n\n     public void onScannedRobot() {                              \n        \/\/ Big Bullets - Grosse Kugeln\n        fire(3);              \n     }                 \n\n     public void onHitByBullet() { \n        \/\/ Stationary Target - turn to where we were hit from <br \/>        \/\/ Ziel ist station\u00e4r - wir drehen zum Ziel                             \n        turnGunTo(hitByBulletAngle);                              \n        \/\/ Big Bullets  - Grosse Kugeln                            \n        fire(3);               \n     } \n                                   \n     public void onHitWall() {                             \n        if (bOnWall) {\n            \/\/ we are on the wall - change direction <br \/>            \/\/ wir sind an der Wand - \u00e4ndere die Richtung                                          \n            bGoForward = !bGoForward;                            \n        }                                                      \n        else { \/\/ we have just hit the North wall  <br \/>               \/\/ wir sind das erste mal an der Nordwand                                        \n            bOnWall = true;\n            \/\/ Turn to face left  - drehe um gegen links zu schauen                                         \n            turnTo(270);  \n            \/\/ Turn the gun to face left - auch die Kanone nach links                                        \n            turnGunTo(270);                              \n        }               \n    }             \n}<\/pre>\n\n\n<h3>Wie find ich die n\u00e4chste Wand und fahre zu dieser Wand?<\/h3>\n\n\n\n<p>Erweitere den <code>WallCrawler<\/code>, indem Du zur n\u00e4chsten Wand f\u00e4hrst. Wie findest Du die n\u00e4chste Wand und f\u00e4hrst zu dieser?<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ die Anfangs Richtung des Roboters an einer Wand\n\/\/ Index                                                                                                                \n\/\/ 0 == oben - fahre links - 270 Grad                                                                                   \n\/\/ 1 == links - fahre nach unten - 180 Grad                                                                             \n\/\/ 2 == unten - fahre nach rechts - 90 Grad                                                                             \n\/\/ 3 == rechts - fahre nach oben - 0 Grad                                                                               \nprivate int[] iInitDir = { 270, 180, 90, 0 };    \n\/\/ das erste Mal wenn wir in der run() Methode sind                                                                             \nprivate int iWhatWall = -1;                 \n                                                                                                                                                                          \n                                                              \n\npublic void run()                                                                                                       \n{                                                                                                                      \n  \/\/ nicht initialisiert - das erste Mal                                                                                  \n  if (iWhatWall == -1)                                                                                                    \n  {                                                                                                                       \n    int iVertDist, iHorzDist, iWhereNext;                                                                                   \n    \/\/ finde die n\u00e4chste Wand                                                                                               \n    \/\/ Zur Erinnerung, das Koordinaten System 0,0 ist unten rechts                                                          \n    \/\/ robotX , robotY - Position dieses Roboters                                                                     \n    \/\/ fieldWidth, fieldHeight - Gr\u00f6sse des Feldes \n    if (robotY &lt; (fieldHeight\/2)) \/\/ untere oder obere H\u00e4lfte \n     iVertDist = robotY;  \/\/ Distanz von unten \n    else \n     iVertDist = fieldHeight-robotY; \/\/ Distanz von oben                                           \n    \n    \/\/ linke oder rechte H\u00e4lfte? \n    if (robotX &lt; (fieldWidth\/2)) \n      iHorzDist = robotX; \/\/ Distanz von links \n    else \n      iHorzDist= fieldWidth-robotX; \/\/ Distanz von rechts \n    \n    if (iVertDist &lt; iHorzDist) \/\/ Vertikal ist n\u00e4her \n    { \n      if (robotY &lt; (fieldHeight\/2)) \n        iWhereNext = 2; \/\/ Fahre zur unteren Wand \n      else \n        iWhereNext = 0; \/\/ Fahre zur oberen Wand \n    } else { \/\/ horizontal \n      if (robotX &lt; (fieldWidth\/2)) \n        iWhereNext = 1; \/\/ Fahre zur linken Wand \n      else \n        iWhereNext = 3; \/\/ Fahre zur rechten Wand \n    } \n\n    iWhatWall = (iWhereNext+3)%4; \n    \/\/ Richtung zu der Wand \n    turnTo(iInitDir[iWhatWall]);\n     \/\/ Anfangs Richtung bearGunTo(270); \n     \/\/ relative zum Roboter - 90 Grad linke Seite \n     \/\/ nun fahre - Maximale Distanz zur Wand                                    \n     ahead(Math.max(iVertDist , iHorzDist)); \n     } \n     else \u2026.                                                                      \n  \/\/ normale run Methode   \n}                                                                                               ~                                                                          <\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Diese Seite enth\u00e4lt Code St\u00fccke die wir f\u00fcr die 2020 Fr\u00fchlings Heim Challenge verwendet haben. Robocode Die Roboter, die wir f\u00fcr die Herausforderung verwenden, basieren auf dem JuniorRobot,public class Day2 &#8230;<\/p>\n","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":3,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"translation":{"provider":"WPGlobus","version":"3.0.1","language":"de","enabled_languages":["en","de"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false}}},"_links":{"self":[{"href":"https:\/\/swisscoderdojo.org\/de\/wp-json\/wp\/v2\/pages\/2260"}],"collection":[{"href":"https:\/\/swisscoderdojo.org\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/swisscoderdojo.org\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/swisscoderdojo.org\/de\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/swisscoderdojo.org\/de\/wp-json\/wp\/v2\/comments?post=2260"}],"version-history":[{"count":19,"href":"https:\/\/swisscoderdojo.org\/de\/wp-json\/wp\/v2\/pages\/2260\/revisions"}],"predecessor-version":[{"id":2496,"href":"https:\/\/swisscoderdojo.org\/de\/wp-json\/wp\/v2\/pages\/2260\/revisions\/2496"}],"wp:attachment":[{"href":"https:\/\/swisscoderdojo.org\/de\/wp-json\/wp\/v2\/media?parent=2260"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}