Level 3.2.1 - secureTheCave | Karel Programmierung

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

00:00 Intro
00:10 Vorworte
00:55 Zielvorgabe
02:03 erster Ansatz
10:35 Testen
10:51 Optimierung
11:17 Kommentierung
11:44 Testen
12:12 Erläuterung
14:21 Unterprogramme?
15:38 while?
16:22 Schlussworte
17:16 Outro
Рекомендации по теме
Комментарии
Автор

Hab glaube eine schöne Lösung, mit nur einem Unterprogramm.
void secureTheCave()
{
repeat (10)
{
turnLeft();
while (frontIsClear())
{
moveForward();
}
turnAround();
breakStalactite();
turnRight();
if (frontIsClear())
{
moveForward();
}
}
}

void breakStalactite()
{
pickBeeper();
moveForward();
if (onBeeper())
{
breakStalactite();
}
else
{
while (frontIsClear())
{
moveForward();
}
turnAround();
}
dropBeeper();
moveForward();
}

niklasschulz
Автор

Oh, das war mal wieder eine Übung, um zu verstehen, dass Problemanalyse wichtiger ist, als Problemlösung. Ich habe die Aufgabe auch gelöst, aber anders und viel schwerer... ich habe Kali auf dem Weg hin zur Mauer die Beeper aufsammeln lassen und auf den Weg zurück wieder hinlegen lassen, dabei soll Kali immer bis zur Mauer laufe und dann sammeln oder droppen.... Ich habe also eine extrem verschachtelte if/else Funktion... ich habe sie mehrfach getestet und sie funktioniert. Wer interesse hat: :)

void secureTheCave(){
repeat (10){
turnLeft();
repeat (3){
moveForward();
}
if (beeperAhead()){
repeat (3){
moveForward();
pickBeeper();
}
turnAround();
repeat (4){
moveForward();
}
dropThree();
}
else{
moveForward();
if (beeperAhead()){
repeat (2){
moveForward();
pickBeeper();
}
if (!frontIsClear()){
turnAround();
repeat (5){
moveForward();
}
dropTwo();
}
else{
moveForward();
pickBeeper();
turnAround();
repeat (5){
moveForward();
}
dropThree();

}

}
else{
moveForward();
if (beeperAhead()){
moveForward();
pickBeeper();
if (!frontIsClear()){
turnAround();
repeat (6){
moveForward();
}
dropOne();
}
else{
moveForward();
pickBeeper();
if (!frontIsClear()){
turnAround();
repeat (6){
moveForward();
}
dropTwo();
}
else{
moveForward();
pickBeeper();
turnAround();
repeat (6){
moveForward();
}
dropThree();
}
}
}
else{
moveForward();
if (beeperAhead()){
moveForward();
pickBeeper();
if (!frontIsClear()){
turnAround();
repeat (7){
moveForward();
}
dropOne();
}
else{
moveForward();
pickBeeper();
turnAround();
repeat (7){
moveForward();
}
dropTwo();
}
}
else{
moveForward();
moveForward();
pickBeeper();
turnAround();
repeat (8){
moveForward();
}
dropOne();
}
}
}

}
turnLeft();
if (frontIsClear()){
moveForward();
}
}
}


void dropOne(){
dropBeeper();
}

void dropTwo(){
dropBeeper();
moveForward();
dropBeeper();
}

void dropThree(){
dropBeeper();
moveForward();
dropBeeper();
moveForward();
dropBeeper();
}

FloydDiamond
Автор

Ich glaub meine Lösung ist auch ganz gut ;)

void secureTheCave() {
repeat(10) {
turnLeft();
toCaveAndBack();
secure();
turnRight();
if (frontIsClear()) {
moveForward();
}
}
}



void secure()
{
if (onBeeper()) {
pickBeeper();
moveForward();
if (!onBeeper()) {
toCaveAndBack();
}
secure();
dropBeeper ();
moveForward();
}
}







void toCaveAndBack()
{
while (frontIsClear()) {

moveForward();
}
turnAround();
}

ichbindumm
Автор

Hallo Christian, meine Lösung bevorzugt das arbeiten mit einer Schleife innerhalb der Schleife.
void secureTheCave()
{
while(frontIsClear())
{
reihe();
moveForward();
}
reihe();
}
void reihe()
{
turnLeft();
gehUndNehme();
nehmeBeeper();
turnRight();
}
void gehUndNehme()
{
moveForward();
if(frontIsClear())
{
gehUndNehme();
}
else
{
turnAround();
}
}
void nehmeBeeper()
{
if(onBeeper())
{
pickBeeper();
moveForward();
nehmeBeeper();
dropBeeper();
moveForward();
}
else
{
gehUndNehme();
}
}


LG Michael

tirolrider
Автор

Hier ist meine Lösung (durch die Rekursion etwas eleganter als die ganzen if- else Verknüpfungen :) )

void secureTheCave()
{
while (frontIsClear())
{
turnLeft();
moveToWall();
turnAround();
pickBeeper();
moveForward();
fetchOneRow();
turnRight();
moveForward();
}
turnLeft();
moveToWall();
turnAround();
pickBeeper();
moveForward();
fetchOneRow();
turnRight();
}
void fetchOneRow()
{
if (onBeeper())
{
pickBeeper();
moveForward();
fetchOneRow();
}
else
{
moveToWall();
turnAround();
}
dropBeeper();
moveForward();
}
void moveToWall()
{
while (frontIsClear())
{
moveForward();
}
}

nielsgoedicke
Автор

mein Lösungsansatz als while-Schleife mit sauberem Abschluss:
void secureTheCave(){
turnLeft();
while (frontIsClear() || onBeeper()){
if (onBeeper()){
safe();
}
else {
move();
}
nextRow();
}
}

void safe(){
if (frontIsClear()){
if (onBeeper()){
pickBeeper();
moveForward();
safe();
}
else {
move();
}
}

if (! frontIsClear()){
turnAround();
}
else {
dropBeeper();
moveForward();
}
}


void move(){
while (frontIsClear()){
moveForward();
}
}

void nextRow(){
if (! onBeeper()){
turnRight();
if (frontIsClear()){
moveForward();
turnLeft();
}
}
}

bitcointroll
Автор

bin viel zu stolz auf meine eigene lösung xd
void secureTheCave() //100% SELFMADE
{
turnLeft();
while (frontIsClear())
{
while (frontIsClear())
{
moveForward();
}
turnAround();
pickBeeper();
moveForward();
if (onBeeper())
{
pickBeeper();
moveForward();
if (onBeeper())
{
pickBeeper();
moveForward();
while (frontIsClear())
{
moveForward();
}
turnAround();
dropBeeper();
moveForward();
dropBeeper();
moveForward();
dropBeeper();
moveForward();
turnRight();
if (frontIsClear())
{moveForward();
turnLeft();}
}
else
{
while (frontIsClear())
{
moveForward();
}
turnAround();
dropBeeper();
moveForward();
dropBeeper();
moveForward();
turnRight();
if (frontIsClear())
{moveForward();
turnLeft();}
}
}
else
{
while (frontIsClear())
{
moveForward();
}
turnAround();
dropBeeper();
moveForward();
turnRight();
if (frontIsClear())
{moveForward();
turnLeft();}
}
}
}

floriankupper
Автор

Ich habs so:

void secureTheCave(){
repeat (9){turnLeft();
while (frontIsClear()){
moveForward();
}
turnAround();
secure ();
turnRight();
moveForward();

}
turnLeft();
while (frontIsClear()){
moveForward();
}
turnAround();
secure ();
turnRight();

}

void secure (){
pickBeeper();
moveForward();
if (onBeeper()){
secure();
dropBeeper();
moveForward();
}
else {
while (frontIsClear()){
moveForward();

}
turnAround();
dropBeeper();
moveForward();
}
}
Einziges Problem ist noch, dass ich das letzte extra ausführen muss, da ich das nach vorne laufen nicht sinnvoll an den Anfang der Extra-Funktion bringen konnte...

margueritedepompadour
Автор

Ich denke ich hab auch eine hübsche Lösung bekommen

void secureTheCave(){
repeat(10){
turnLeft();
goToLine();

if(onBeeper()){
pickBeeper();
moveForward();
if(onBeeper() && beeperAhead()){
pickBeeper();
moveForward();
pickBeeper();
goToLine();
breakThree();
}else if(onBeeper() && !beeperAhead()){
pickBeeper();
goToLine();
breakTwo();
}else{
goToLine();
breakOne();
}
}
if(frontIsClear()){
moveForward();
}
}

}

void goToLine(){
while(frontIsClear()){
moveForward();
}
turnAround();
}
void breakOne(){

dropBeeper();
moveForward();
turnRight();


}

void breakTwo(){

repeat(2){
dropBeeper();
moveForward();
}
turnRight();

}

void breakThree(){

repeat(3){
dropBeeper();
moveForward();
}
turnRight();


}

patrickendicott