Level 3.1.2 - fetchTheStars | Karel Programmierung

preview_player
Показать описание
Leider habe ich während der Aufnahme "dropBeeper()" völlig vergessen, daher hier noch eine verbesserte Version des Codes:
void fetchTheStars(){
repeat(10){
turnLeft();
//Abheben
repeat(5){
moveForward();
}
//Nach 5 Schritten schon am Stern?
if(onBeeper()){
pickBeeper();
turnAround();
repeat(5){
moveForward();
}
dropBeeper(); //Hier vergessen ^^
turnLeft();
if(frontIsClear()){
moveForward();
}
}
else {
moveForward();
//Nach 6 Schritten schon am Stern?
if(onBeeper()){
pickBeeper();
turnAround();
repeat(6){
moveForward();
}
dropBeeper(); //Auch hier vergessen ^^
turnLeft();
if(frontIsClear()){
moveForward();
}
}
//Wenn nach 6 Schritten nicht am Stern, dann nach 7 Schritten
else {
moveForward();
pickBeeper();
turnAround();
repeat(7){
moveForward();
}
dropBeeper(); //Und hier vergessen ^^
turnLeft();
if(frontIsClear()){
moveForward();
}
}
}
}
}

Vielen Dank für die kostenlose Bereitstellung des Programms :D

00:00 Intro
00:11 Vorworte
00:52 Vorüberlegung
01:11 gleicher Ansatz
04:27 Testen
04:44 Überarbeiten
06:10 Testen
06:28 Code-Erläuterung
08:11 Kommentierung
09:46 Schlussworte
10:36 Outro
Рекомендации по теме
Комментарии
Автор

Tolle Videos!! Danke!! Hier meine Lösung ohne while-Schleife und ohne repeat aber stattdessen mit 2 methodeninterne Schleifen.


void fetchTheStars(){
turnLeft(); //Startposition nehmen
whereIsTheStar(); //Suche den Stern und bringe ihn zurück--> Rekursion
dropBeeper(); //lass Stern fallen
turnLeft(); // dreh dich nach links
if(frontIsClear()){ //wenn links frei (um nach den letzten Stern zu stoppen)
moveForward(); // eins nach vorne
fetchTheStars(); // und starte diese Methode erneut
}
}

//Rekursion

void whereIsTheStar(){
moveForward(); //einmal nach vorn
if(!onBeeper()){ //wenn nicht auf Stern...
whereIsTheStar(); //...starte erneut von Anfang
}
else{ //wenn auf Stern
pickBeeper(); //nimm
turnAround(); //drehe um
}
moveForward();
}
/*
Der letzte moveForward wird erst dann ausgeführt, wenn Karel
den Stern gefunden, genommen und sich gedreht hat.
Das passiert weil die Methode davor nie zu Ende ausgeführt wurde
und von der "if-Schleife" unterbrochen wurde.
Karel kann also seine Schritte "zählen" in dem er
die Unterbrechungen zählt und den letzten "moveForward" als letztes
und so oft ausführt, wie die Methode unterbrochen wurde.
*/

iliassarpekidis
Автор

Wow schon 60 Abos! Weiß noch als du gerade die 10 Abos hattest und ich deinen Kanal entdeckt hab ^^ einfach Respekt dass du das mit dem programmieren weiterhin so durchziehst

Lara-nxut
Автор

Hallo Christian, das sind schöne Videos und die Aufgaben eignen sich auch gut, um programmieren zu lernen. Ich konnte nicht widerstehen meine eigene Implementierung für dieses Level zu machen, mit einer rekursiven Funktion. Das spart die if/else Parade für die verschiedenen Fälle.


void fetchTheStars()
{
// handle first column
turnLeft();
go();
dropBeeper();
turnLeft();
while(frontIsClear()) // check if we're in the last column
{
// inter-column move logic
moveForward();
turnLeft();
go();
dropBeeper();
turnLeft();
}
}

/* recursive implementation:
check if we are at the target:
- pick up
- turn around
else
- go one forward
--- recursive call
- go one forward (which is backwards now
*/
void go()
{
if(onBeeper())
{
pickBeeper();
turnAround();
}
else
{
moveForward();
go();
moveForward();
}
}

simonottenhaus
Автор

Das mit dem zählen des Weges, ist ja einfach. Doch leider, entspricht dass nicht dem Ziel. Der Roboter sollte ja nur mit den Sensoren die Aufgabe lösen. Also, er selbst sieht nur um sich herum. Den er selbst ist ja nicht in der Lage, von oben auf die Situation zu schauen. Stell dir vor du programmierst ein Roboter, der eine Aufgabe lösen muss, ohne das du weist wie es dort aussieht.

fototryhard
Автор

So ist es natürlich einfach, Ich dachte man soll dies so programmieren, dass es allgemein so eine Funktion hat.

hazinabiyev
Автор

Ich hatte Probleme hiermit und habe dann nach Lösungvorschlägen gesucht. Das Problem hierbei ist, dass er die Sterne zwar einsammelt, untern aber nicht wieder ablegt...

Letzteres habe ich so gelöst:

void fetchTheStars()
{
repeat (10) {
pickOneStar();
}
}



void pickOneStar()
{
turnLeft();
repeat (5) {
moveForward();
}
if (!frontIsClear()){
pickBeeper();
turnAround();
repeat (5) {
moveForward();
}
dropBeeper();
}
else {
moveForward();
if (!frontIsClear()){
pickBeeper();
turnAround();
repeat (6) {
moveForward();
}
dropBeeper();
}
else {
moveForward();
if (!frontIsClear()){
pickBeeper();
turnAround();
repeat (7) {
moveForward();
}
dropBeeper();
}
}
}
turnLeft();
if (frontIsClear()) {
moveForward();
}
}

MegaAngelx
Автор

Hey! Ich hab da einfach den Code von dem Level davor rein gesetzt, 3 Befehle verändert und fertig. Vor allem kannst du am Anfang einfach while (!onBeeper) schreiben. Wahrscheinlich fiel dir das nicht ein, weil du vergessen hast die Sterne unten wieder romantisch abzugeben ;-)
Ich hänge gerade beim vorletzten Level fest. Bin gespannt was dir da einfällt zu "reverse order".

void fetchTheStars()
{
while (!onBeeper())
{
turnLeft();
repeat(5)
{
moveForward();
}
if (!frontIsClear())
{
pickBeeper();
turnAround();
repeat(5)
{
moveForward();
}
dropBeeper();
turnLeft();
if (frontIsClear())
{
moveForward();
}
}
else
{
moveForward();
if (!frontIsClear())
{
pickBeeper();
turnAround();
repeat(6)
{
moveForward();
}
dropBeeper();
turnLeft();
if (frontIsClear())
{
moveForward();
}
}
else
{
moveForward();
pickBeeper();
turnAround();
repeat(7)
{
moveForward();
}
dropBeeper();
turnLeft();
if (frontIsClear())
{
moveForward();
}
}
}
}
}

stefanfinger
Автор

vom vorherigen Video bin ich auf die Rekursion gekommen, macht auch hier spass =D

void fetchTheStars()
{
while(frontIsClear())
{
turnLeft();
if (frontIsClear())
{
takeTheStar();
dropBeeper();
turnLeft();
}
else
{
turnRight();
}
if (frontIsClear())
{
moveForward();
}
}
turnLeft();
if (frontIsClear())
{
takeTheStar();
dropBeeper();
turnLeft();
}
}



/* Rekursion */

void takeTheStar()
{
moveForward();
if (frontIsClear())
{
takeTheStar();
}
else
{
pickBeeper();
turnAround();
}
moveForward();
}

Switchsyde
Автор

void fetchTheStars(){
turnLeft();
fetchOneLampion();
dropBeeper();
turnLeft();
if (frontIsClear()) {
moveForward();
fetchTheStars();
}

}

/* Rekursion */

void fetchOneLampion(){
moveForward();
if (frontIsClear()){
fetchOneLampion();}
else{
pickBeeper();
turnAround();}
moveForward();}


Meine kurze Lösung.

saikimtb
Автор

Meine Lösung:

void fetchTheStars()
{while(!onBeeper()){
turnLeft();run();
dropBeeper();
turnLeft();

}

void run()
{
moveForward();
if(frontIsClear()){
run();}
else{pickBeeper();
turnAround();}
moveForward();
}

PhilipSchmitz