Objektorienterad programmering

Relevanta dokument
Mer om metoder och abstraktioner

Laboration 2. returnerar true om det är omöjligt för roboten att göra move() utan att. exekveringsfel erhålls, annars returnera false.

Programmering = modellering

Föreläsning 4. Föreläsning 4

Föreläsning 4. Top-Down Design Metoder Parameteröverföring. Metoder Parameteröverföring

Laboration 2. Objektorienterad programmering. Syfte

Föreläsning 1, vecka 6: Abstraktion genom objektorientering

Objektorienterad programmering

Metoder och top-down design

Programmeringsteknik F1/TM1

Objektorienterad programmering Föreläsning 8. Copyright Mahmud Al Hakim Agenda (halvdag)

Föreläsning 1: Introduktion

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

1 Comparator & Comparable

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Föreläsning 12: Exempel och problemlösning

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 3: Booleans, if, switch

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Programmering. hh.se/db2004. SuperKarel, Nedbrytning & Styrsatser. Verónica Gaspes www2.hh.se/staff/vero www2.hh.se/staff/vero/programmering

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander

Repetition av OOP- och Javabegrepp

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

Att utvidga klasser. Programmering. Att utvidga klasser. Förvirring. hh.se/db2004

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Tentamen, EDAA10 Programmering i Java

Repetition av OOP- och Javabegrepp

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Sökning och sortering

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Tentamen i Objektorienterad programmering

Typkonvertering. Java versus C

Detta dokument är ett exempel, cirka hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Den som bara har en hammare tror att alla problem är spikar

OOP Objekt-orienterad programmering

Objektsamlingar i Java

Tentamen i EDAF oktober Skrivtid: Skriv bara på ena sidan av pappret tentorna kommer att scannas in, och endast framsidorna rättas.

Mer om klasser och objekt

Objektinteraktion. Objektorienterad programmering Laboration 2. Syfte Att konstruera ett litet objektorienterat program med flera samverkande objekt.

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Inlämningsuppgift MiniPlotter

Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

Lösningsförslag övning 2.

Objektorienterad programutveckling, fk

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Tentamen i Introduktion till programmering

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Del A (obligatorisk för alla)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 11 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Quicksort. Koffman & Wolfgang kapitel 8, avsnitt 9

OOP Objekt-orienterad programmering

Överlagring, static, testning, formella metoder och undantag! Förelasning 13!! TDA540 Objektorienterad Programmering!

Enkla variabler kontra referensvariabel

DAT043 Objektorienterad Programmering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

DD2385 Programutvecklingsteknik Några bilder till föreläsning 1 24/ Kursöversikt Javarepetition/Javaintroduktion

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Exempel: Förel Rekursion III Nr 14. Uno Holmer, Chalmers,

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Kurskod D0010E Datum Skrivtid 5tim

Metoder (funktioner) Murach s: kap Winstrand Development

Classes och Interfaces, Objects och References, Initialization

Programmering för språkteknologer II, HT2014. Rum

Lösningsförslag: Instuderingsfrågor, del D

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

Tentamen i Objektorienterad programmering

Föreläsning 15: Repetition DVGA02

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

Institutionen för TENTAMEN CTH HT-14 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

TDDD78 Viktiga begrepp, del 2

Laboration 3 GUI-programmering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 3. Stack

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Föreläsning 2. Länkad lista och iterator

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Obligatorisk uppgift 5

Objektorienterad Programmering (TDDC77)

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

OOP Objekt-orienterad programmering

Vad är ett objekt? Tillstånd och beteende. Vad är ett objekt? Exempel

Transkript:

Objektorienterad programmering Föreläsning 5: mer om metoder och abstraktioner Dr. Alex Gerdes Dr. Carlo A. Furia Hösttermin 2016 Chalmers University of Technology

Några meddelande Man får inte ändra klassen Robot, Location, osv i lab 2 Handledarna rättar efter deadlinen

Sammanfattning föreläsning 4 Abstraktion, top-down design Gränssnitt av en metod Parameteröverföring För- och eftervillkor Kopiera/klistra -> larm!

Abstraktion

Abstraktion = subtraktion Det är svårt att tänka på flera nivåer samtidigt Abstraktion är ett verktyg som underlättar Abstraktion = subtraktion - En abstraktion innebär att man bortser från vissa omständigheter och detaljer i det vi betraktar, för att bättre kunna uppmärksamma andra för tillfället mer väsentliga aspekter Abstraktioner hjälper oss att fokusera på de för tillfället viktiga egenskaperna

Black-box tänkande x sqrt x year leapyear true eller false a b average Medelvärdet av a och b Är ett sätt att uttrycka vissa steg i ett program på en högre abstraktionsnivå På en hög abstraktionsnivå är det vad som görs som är det intressanta, inte hur det görs Ger direkt stöd för stegvis förfining Varje abstraktion (black-box) skall endast göra en sak och göra denna bra

Black-box tänkande En black-box har en insida och en utsida: - Gränssnittet (interfacet) är det som binder insidan och utsidan - Gränssnittet har såväl syntax som semantik (specifikationen) "The interface of a black-box should be fairly straightforward, well defined, and easy to understand." "To use a black-box, you shouldn t need to know anything about its implementation; all you need to know is its interface." "The implementor of a black-box should not need to know anything about the larger systems in which the box will be used." - En black-box är ett sätt att uttrycka vissa steg i ett program på en högre abstraktionsnivå

Elimineringsspelet Mexico

Problemställning I tärningsspelet Mexico deltar minst två spelare och spelet är ett elimineringsspel. När spelet börjar har alla spelare lika mycket pengar att spela med (= startavgift, dvs de pengar som spelaren riskerar att förlora). En omgång går till på så sätt att varje spelare kastar två 6-sidiga tärningar. Spelaren som får lägst poängvärde förlorar omgången och måste lägga en i förväg fastställd insatsen i potten. Detta upprepas tills endast en av spelarna har pengar kvar. Denne är vinnaren och får hela potten. För att beräkna poängvärdet, beräknas först den sammanlagda tärningssumman. Detta görs genom att först multiplicera värdet på tärningen med högst poäng med 10 och sedan addera värdet på tärningen med lägst poäng. Har tärningarna poängen 3 och 4 erhålls tärningssumman 43, har tärningarna poängen 5 och 5 erhålls tärningssumman 55, osv. Tärningssumman ligger till grund för att beräkna poängvärdet. Tärningssummornas poängvärde från högsta till lägsta är enligt: 21, 66, 55, 44, 33, 22, 11, 65,, 61, 54,, 51, 43, 42, 41, 32, 31 Högsta poängvärdet är alltså tärningsvärdet 21 (som kallas Mexico ), följt av paren (i numerisk ordning), följt av övriga tärningsvärden (i numerisk ordning).

Uppgiften Du är med och utvecklar en datorversion av spelet Det behövs en metod som tar två tärningssummor och returnerar den tärningssumma som har lägsta poängvärdet Din uppgift är att utveckla en sådan metod! Vad är det första som du måste göra? Bestämma (specificera) gränssnittet för metoden!

Bestämma gränssnitt Har du tillräckligt med information för att specificera gränssnittet? Nej, du måste komma överens med den som beställt (skall använda) metoden om metodens namn, om metoden skall vara en klassmetod eller en instansmetod, samt metodens synlighet Låt oss säga att detta resulterar i att metoden skall ha namnet lowestscorevalue, samt vara en privat klassmetod: private static int lowestscorevalue(int score1, int score2) Vidare måste vi dokumentera vad metoden gör och eventuella föroch eftervillkor! // before: score1 and score2 are valid Mexico scores // after: returns the score with lowest score value private static int lowestscorevalue(int score1, int score2)

Det färdiga gränssnittet Nu är alla förutsättningar givna för att: - du skall kunna påbörja arbetet med att utveckla metoden - du eller andra utvecklare skall kunna skriva kod för att testa metoden - andra utvecklare kan nyttja metoden som en abstraktion i sitt utvecklingsarbete // before: score1 and score2 are valid Mexico scores // after: returns the score with lowest score value private static int lowestscorevalue(int score1, int score2)

Testdriven programutveckling Testdriven programutveckling innebär att man skriver testerna för koden innan koden skrivs När koden som skrivits går igenom testerna gör koden det den skall göra; koden kan dock behöva omstruktureras (refactoring) för att få koden snyggare och bättre (t.e. mer lättläst) Ett test beskriver vad som skall göras medan implementationen beskriver hur det ska göras; testerna blir därmed en del av specifikationen Eftersom testet skrivs innan implementationen blir designen av gränssnittet gjort utifrån en brukarens perspektiv Testerna blir verkligen skrivna, vilket inte alltid är fallet om man skriver dem efteråt Skriv en testmetod: private static void testlowestscorevalue() för att testa metoden lowestscorevalue

Testdriven programutveckling private static void testlowestscorevalue() { System.out.println(lowestScoreValue(21, 32) + " : should be 32"); System.out.println(lowestScoreValue(66, 21) + " : should be 66"); System.out.println(lowestScoreValue(43, 33) + " : should be 43"); System.out.println(lowestScoreValue(33, 55) + " : should be 33"); System.out.println(lowestScoreValue(65, 22) + " : should be 65"); System.out.println(lowestScoreValue(53, 54) + " : should be 53");

Testdriven programutveckling private static boolean testlowestscorevalues() { return testlowestscorevalue(21, 32, 32) && testlowestscorevalue(66, 21, 66) && testlowestscorevalue(43, 33, 43) && testlowestscorevalue(33, 55, 33) && testlowestscorevalue(65, 22, 65) && testlowestscorevalue(53, 54, 53); private static boolean testlowestscorevalue(int x, int y, int exp) { int result = lowestscorevalue(x, y); boolean passed = result == exp; if (passed) System.out.println("Ok!"); else System.out.println("Failed: " + result + " should be " + exp); return passed;

Implementation Börja med att ställa dig frågan: Har jag löst något liknande problem tidigare? // before: score1 and score2 are valid Mexico scores // after: returns the score with lowest score value private static int lowestscorevalue(int score1, int score2) public static int maxvalue(int a, int b) { int result; if (a > b) result = a; else result = b; return result; public static int minvalue(int a, int b) { int result; if (a < b) result = a; else result = b; return result;

Implementation Metoden lowestscorevalue skall bestämma det minsta av två numeriska värden. Dessa numeriska värden beräknas från score1 respektive score2. Specificera en abstraktion som beräknar dessa numeriska värden: // before: score is a valid Mexico score // after: returns the comparison value of score private static int scorevalue(int score) // before: score1 and score2 are valid Mexico scores // after: returns the score with lowest score value private static int lowestscorevalue(int score1, int score2) { int low; if (scorevalue(score1) < scorevalue(score2)) low = score1; else low = score2; return low;

Implementation Problemet vi har är att för varje tärningssumma 21, 66, 55, 44, 33, 22, 11, 65,, 61, 54,, 51, 43, 42, 41, 32, 31 beräkna ett numeriskt värde (heltal) p.s.s. att dessa värden överensstämmer med ovan givna ordning på tärningssummorna Någon idéer om hur detta skall gå till? // before: score is a valid Mexico score // after: returns the comparison value of score private static int scorevalue(int score) 21, 66, 55, 44, 33, 22, 11, 65,, 61, 54,, 51, 43, 42, 41, 32, 31 Inbörder rätt ordning Inbörder rätt ordning Sätt till 1000 Multiplicera med 10 1000, 660, 550, 440, 330, 220,110, 65,, 61, 54,, 51, 43, 42, 41, 32, 31

Implementation // before: score is a valid Mexico score // after: returns the comparison value of score public static int getscorevalue(int score) { int comparisonvalue; if (score == 21) comparisonvalue = 1000; else if (score / 10 == score % 10) comparisonvalue = score * 10; else comparisonvalue = score; return comparisonvalue;

Abstraktioner på en annan nivå

Behov av "större" svarta boxar än metoder Ett objekt har beteenden: - de operationer som kan göras på objektet - implementeras mha metoder Ett objekt har tillstånd ( värde ): - robotens riktning - robotens fysiska plats - robotens hastighet move() turnleft() makedark() makelight() ondark() robot frontisclear() atendofworld() getlocation() setdelay(int t)

Black-box tänkande Metod void move() boolean frontisclear() void turnleft() void makedark() void makelight() boolean ondark() int getdirection() void makedark() boolean atendofworld() Location getlocation() void setdelay(int t) Användning förflyttar sig ett steg framåt, om roboten hamnar utanför världen eller i en mur fås ett exekveringsfel returnerar true om det är möjligt för roboten att göra move() utan att ett exekveringsfel erhålls, annars returnera false vrider sig 90 åt vänster färgar rutan den står på till mörk, om rutan redan är mörk fås ett exekveringsfel färgar rutan den står på till ljus, om rutan redan är ljus fås ett exekveringsfel returnerar true om roboten står på en mörk ruta, annars returneras false returnerar robotens riktning färgar rutan den står på till ljus, om rutan redan är ljus fås ett exekveringsfel returnerar true om det är omöjligt för roboten att göra move() utan att hamna utanför världen, annars returneras false returnerar robotens position i världen som ett objekt av typen Location sätter hastigheten med vilken roboten rör sig

Swap

Problem I världen som skapas av klassen Swapper befinner sig roboten i ett scenario enligt den vänstra av de två figurerna bredvid. Roboten är placerad i början av en korridor och dess uppgift (som implementeras av metoden swapall) är att byta plats på färgerna på cellerna som finns på ömse sidor om korridoren (se högra bilden bredvid). Efter slutförd uppgift skall roboten återvända till sig ursprungliga startposition. Du skall bryta ner uppgiften i delproblem och utveckla kraftfullare abstraktioner (metoder) än de operationer som roboten tillhandahåller. Före Efter

Problem Roboten skall kunna utföra sin arbetsuppgift i en godtycklig värld med samma principiella uppbyggnad som världen i figurerna bredvid. Var noggrann med att beskriva vad varje metod gör och vilka för- respektive eftervillkor som gäller (t.ex. vilken riktning roboten måste ha innan metoden anropas, och vilken riktning roboten får efter anropet). Välj också med omsorg lämpliga och beskrivande namn på metoderna. När man löser ett problem är det sällan man finner den optimala lösningen direkt. När man väl har en lösning är det därför viktigt att reflektera över om det finns andra bättre lösningar. I det problem som ni just har blivit förelagda, kan antalet operationer som roboten behöver utföra vara ett mått på hur bra lösningen är. Ju färre operationer desto bättre.

Lös problemet swaptwocells(); Handfallen? Rådvill? Kommer inte igång? Förenkla problemet! Titta på en mindre instans av problemet! Fokusera på vad som skall göras, inte på hur det skall göras! Finn abstraktioner! swaptwocells(); robot.move(); swaptwocells(); swaptwocells(); robot.move(); swaptwocells(); robot.move(); swaptwocells();

Metoden swapall // Swapping colors on all across cells in the corridor. // before: the robot is located at the beginning of the corridor, // facing the corridor // after: the robot has the same location and facing the same direction public void swapall() { boolean finished = false; while (!finished) { swaptwocells(); if (!atendofcorridor()) robot.move(); else finished = true; returntostartposition(); // before: robot is at the end of the corridor, // facing the wall // after: robot is at the beginning of the // corridor, facing the corridor private void returntostartposition() // Swapping colors of two across cells. // before: robot is in the corridor // facing the corridor // after: robot is in the corridor facing // the corridor private void swaptwocells() // after: returns true if the robot is at the // end of the corridor, otherwise false public boolean atendofcorridor()

Metoden atendofcorridor // after: returns true if the robot is at the end of the // corridor, otherwise false public boolean atendofcorridor() { return!robot.frontisclear();

Metoden swaptwocells När behöver färgerna på cellerna bytas? När cellerna har olika färg! Kan uttryckas som leftcellisdark()!= rightcellisdark() Alternativt leftcellisdark() ^ rightcellisdark() // return: true if the cell on left side of the robot is dark, otherwise false // before: robot is in the corridor facing the corridor // after: robot is in the corridor facing the corridor private boolean leftcellisdark() // return: true if the cell on right side of the robot is dark, otherwise false // before: robot is in the corridor facing the corridor // after: robot is in the corridor facing the corridor private boolean rightcellisdark()

Metoden swaptwocells // Swapping colors of two across cells // before: robot is in the corridor facing the corridor // after: robot is in the corridor facing the corridor private void swaptwocells() { if (leftcellisdark()!= rightcellisdark()) changecolors(); // Return true if the cell on left side of the robot is dark, otherwise false // before: robot is in the corridor facing the corridor // after: robot is in the corridor facing the corridor private boolean leftcellisdark() // Return true if the cell on left side of the robot is dark, otherwise false // before: robot is in the corridor facing the corridor // after: robot is in the corridor facing the corridor private boolean leftcellisdark() // Change color of the cell on left side and of the cell on right side // before: robot is in the corridor facing the corridor // after: robot is in the corridor facing the corridor private void changecolors()

Metoden leftcellisdark // Returns true if the cell on left side of the robot is dark, otherwise false // before: robot is in the corridor facing the corridor // after: robot is in the corridor facing the corridor private boolean leftcellisdark() { robot.turnleft(); robot.move(); boolean isdark = robot.ondark(); turnaround(); robot.move(); robot.turnleft(); return isdark; // before: none // after: robot is facing the opposite direction private void turnaround()

Metoden turnaround // before: none // after: robot is facing the opposite direction private void turnaround() { robot.turnleft(); robot.turnleft();

Metoden rightcellisdark // Returns true if the cell on right side of the robot is dark, // otherwise false // before: robot is in the corridor facing the corridor // after: robot is in the corridor facing the corridor private boolean rightcellisdark() { turnright(); robot.move(); boolean isdark = robot.ondark(); turnaround(); robot.move(); turnright(); return isdark; // before: none // after: robot has turned 90 degree to right public void turnright()

Metoden turnright // before: none // after: robot has turned 90 degree to right public void turnright() { turnaround(); robot.turnleft();

Metoden swaptwocells // Change colors of the cells on left side and on right side of the robot // before: robot is in the corridor facing the corridor // after: robot is in the corridor facing the corridor private void changecolors() { changecolorofleftcell(); changecolorofrightcell(); // Change color of the cell on left side of the robot // before: robot is in the corridor facing the corridor // after: robot is in the corridor facing the corridor private void changecolorofleftcell() // Change color of the cell on right side of the robot // before: robot is in the corridor facing the corridor // after: robot is in the corridor facing the corridor private void changecolorofrightcell()

Metoden changecolorofleftcell // Change color of the cell on left side of the robot // before: robot is in the corridor facing the corridor // after: robot is in the corridor facing the corridor private void changecolorofleftcell() { robot.turnleft(); robot.move(); switchcolor(); turnaround(); robot.move(); robot.turnleft(); // Switch color of the cell // before: none // after: if the cell the robot is at was dark it has become light, // and if the cell was light it has become dark private void switchcolor()

Metoden changecolorofrightcell // Change color of the cell on right side of the robot // before: robot is in the corridor facing the corridor // after: robot is in the corridor facing the corridor private void changecolorofrightcell() { turnright(); robot.move(); switchcolor(); turnaround(); robot.move(); turnright();

Metoden switchcolor // Switch color of the cell // before: none // after: if the cell the robot is at was dark it has become // light, and if the cell was light it has become dark private void switchcolor() { if (robot.ondark()) robot.makelight(); else robot.makedark();

Metoden returntostartposition // before: robot is at end of the corridor, facing the wall // after: robot is at beginning of the corridor, facing the // corridor private void returntostartposition() { turnaround(); gotoendofcorridor(); turnaround(); // before: robot is in the corridor, facing the corridor // after: robot is at the end of the corridor, facing the wall private void gotoendofcorridor()

Metoden gotoendofcorridor // before: robot is in the corridor, facing the corridor // after: robot is at the end of the corridor, facing the wall private void gotoendofcorridor() { while (!atendofcorridor()) { robot.move();

Demo: Swapper