Level 3.1.1 - partyAgain | Karel Programmierung

preview_player
Показать описание
Vielen Dank für die kostenlose Bereitstellung des Programms :D

00:00 Intro
00:12 Einleitung
00:55 hangTheLampions
02:00 Zielvorgabe
02:40 Vorüberlegung
02:54 Erster Ansatz
03:46 Weitere Überlegung
05:50 Runter mit if
06:30 Zweiter Ansatz
08:17 Fehlerkorrektur
08:53 1. Code Erläuterung
09:15 Fehlerkorrektur
09:49 finale Code Erläuterung
10:58 Optimierung
11:10 finale Code Erläuterung
11:56 letzte Fehlermeldung
12:40 finaler Test
13:13 Verschönerung
14:13 Kommentierung
15:05 Schlussworte
16:39 Outro
Рекомендации по теме
Комментарии
Автор

Ich bin kein Profi-Programmierer, daher besonders stolz auf meine Lösung: Ich habe es mittels einer Rekursion gemacht.

void partyAgain(){
while (onBeeper()){
turnLeft();
if (frontIsClear()){
pickBeeper();
hangOneLampion();
turnLeft();}
else{
turnRight();}
if (beeperAhead()){
moveForward();}}}

/* Rekursion */

void hangOneLampion(){
moveForward();
if (frontIsClear()){
hangOneLampion();}
else{
dropBeeper();
turnAround();}
moveForward();}

ludwigantensteiner
Автор

krass zu sehen wie du (und auch die anderen in den Kommentaren) es gelöst haben^^
meine Lösung war Karel bei jedem Schritt zurück checken zu lassen, ob links ein Beeper ist und so herauszufinden wo der Boden anfängt. Also Lampion aufhängen, drehen, vorwärts, links drehen, wenn beeper vor ihm -> vorwärts und Lampionhängen. Sonst: weiter Checken.
Sah dann so aus mein Code:


void partyAgain(){
repeat(9){
Lampion();
CheckKeller();}
Lampion();

}

void CheckKeller(){
moveForward();
turnLeft();
if (beeperAhead()){
moveForward();

}
else if (!beeperAhead()){
turnRight();
CheckKeller();
}
}

void Lampion(){
turnLeft();
pickBeeper();
while (frontIsClear()){
moveForward();
}
dropBeeper();
turnAround();
}
void partyAgain(){
repeat(9){
Lampion();
CheckKeller();}
Lampion();

}





Hat den Vorteil, dass es auch bei niedrigeren Decken funktionieren würde, aber ist an sich schon bisschen umständlicher :D

floheit
Автор

Wieder mal Top gelöst! :-D
Hier mal meine Lösung, hatte bei der If Abfrage genau andersherum gedacht ;-)

void partyAgain() {
repeat(10){
turnLeft();pickBeeper();
repeat(5){moveForward();}







}
void
void
}

michaelhildebrandt
Автор

Dank dem Tipp in den Kommentaren mit der Rekursion, hab ich's nun auch geschafft:

void partyAgain()
{
while (onBeeper()){
turnLeft();
pickBeeper();
PlaceLamp();
if (!onBeeper()){
turnLeft();
if(frontIsClear()){
moveForward();}
}
}
}
void PlaceLamp()
{
moveForward();
if (frontIsClear()){
PlaceLamp();
}
else{
dropBeeper();
turnAround();}
moveForward();}

CASHPABLOG
Автор

habs ähnlich, ich habe ihn die Nebenfunktionen abchecken lassen, sodass er quasi zählen kann und dann immer weiß wie weit er zurücklaufen muss. geht zwar nur bis drei, weil das die Varianz in der Höhe des Daches ist aber naja...was besseres ist mir nicht eingefallen. Ist aber recht schöner code finde ich.

void partyAgain(){
while (onBeeper()){
turnLeft();
pickBeeper();
count1();
turnLeft();
if (frontIsClear()){
moveForward();
}
}
}

void count1(){
repeat(5){
moveForward();
}
if (!frontIsClear()){
dropBeeper();
turnAround();
repeat(5){
moveForward();
}
}
else{
count2();
}
}

void count2(){
moveForward();
if (!frontIsClear()){
dropBeeper();
turnAround();
repeat(6){
moveForward();
}
}
else{
count3();
}
}

void count3(){
moveForward();
dropBeeper();
turnAround();
repeat(7){
moveForward();
}
}

adamwetzli
Автор

Du kannst auch bei "repeat" eine zuvor erstellte variable als Bedingung übergeben [repeat(x)].
Dann kannst du beim Hinweg bei jedem Schritt nach vorne die Variable vergrößern.
Beim Rückweg musst du nur noch x Schritte zurück gehen. ;D

zuckerwatte
Автор

Hallo Christian,
hier meine Lösung:
void partyAgain()
{
while(onBeeper())
{
turnLeft();
pickBeeper();

run();
turnLeft();
if(frontIsClear())
{
moveForward();
}
}
}
void run()
{
if(frontIsClear())
{
moveForward();
run();
if(!frontIsClear())
{
dropBeeper();
turnAround();
}
moveForward();
}
}

tirolrider