Labyrinter Algoritmer och datastrukturer Obligatorisk Laboration nr 6

Relevanta dokument
Arv och polymorfism i Java

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

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

Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad. Skriv ditt idnummer på varje blad (så att vi inte slarvar bort dem).

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

Trädstrukturer och grafer

Lab5 för prgmedcl04 Grafik

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

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning 5-6 Innehåll

Objektsamlingar i Java

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Objektorienterad programmering D2

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

Tentamen i Objektorienterad modellering och design Helsingborg

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

CHALMERS TENTAMEN. 2012/2013, lp 1 DAT042. Uno Holmer. Java API (utdelas av skrivningsvakten) Erland Holmström tel besöker tentamen

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

PROGRAMMERINGSTEKNIK TIN212

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Laboration 1: Figurer i hierarki

Objektorienterad Programkonstruktion. Föreläsning jan 2016

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

Tentamen. 2D4135 vt 2004 Objektorienterad programmering, design och analys med Java Torsdagen den 3 juni 2004 kl

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

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

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

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

Tentamen, Algoritmer och datastrukturer

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

DAT043 - Föreläsning 7

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

Tentamen i Objektorienterad programmering

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Föreläsning 15: Repetition DVGA02

Föreläsning 13 Innehåll

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

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Tentamen i EDAF25. 1 juni Skrivtid: Skriv inte med färgpenna enda tillåtna färg är svart/blyerts.

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

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

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

Tentamen Datastrukturer, DAT037 (DAT036)

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

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

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

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

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

TENTAMEN I DATAVETENSKAP

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 2

Länkade listor och automatisk testning

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

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

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Föreläsning 6. Rekursion och backtracking

Algoritmer och datastrukturer, föreläsning 11

Tentamen i Objektorienterad modellering och design

Objektorienterad Programkonstruktion. Föreläsning 7 24 nov 2015

Lösningar till tentamen i EDAF25

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Introduktion till arv

Imperativ programmering. Föreläsning 4

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Administrativt. Programmeringsteknik för I1. Dagens program. Objektorienterad programmering

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

Fyra i rad Javaprojekt inom TDDC32

Laboration 3 GUI-programmering

Lycka till! TENTAMEN: Objektorienterade applikationer. Läs detta! 1 (6) Tentamen

TUTORIAL: KLASSER & OBJEKT

Att prova på en enkel Applet och att lära sig olika sätt att hämta data från tangentbordet. Du får även prova på att skapa din första riktiga klass.

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

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

Tentamen TEN1 HI

1 Comparator & Comparable

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

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

Grafer, traversering. Koffman & Wolfgang kapitel 10, avsnitt 4

5. En metod som anropar sig själv a) får inte förekomma i Java-program b) kallas destruktiv c) kallas iterativ d) kallas rekursiv 6. Vilka värden har

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Föreläsning REPETITION & EXTENTA

Lösningsförslag tentamen FYTA11 Java

Datastrukturer och Algoritmer D0041D

Teoretisk del. Facit Tentamen TDDC (6)

Programmeringsteknik II - HT18. Föreläsning 6: Grafik och händelsestyrda program med användargränssnitt (och Java-interface) Johan Öfverstedt

Tentamen i Algoritmer & Datastrukturer i Java

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Grundläggande programmering med C# 7,5 högskolepoäng

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

Presentation av trafiksimuleringsprojektet

Transkript:

1 (8) Labyrinter Algoritmer och datastrukturer Obligatorisk nr 6 Syfte Att ge träning i tillämpning av bekanta datastrukturer. instudering och tillämpning av en ej tidigare bekant datastruktur. Mål Arbetet skall resultera i ett program för konstruktion och genomsökning av labyrinter. Programmet skall ha ett grafiskt användargränssnitt. Ett färdigt sådant finns så att arbetet kan inriktas på programmets interna logik. Litteratur Ett centralt moment i laborationen är att på egen hand instudera en datastruktur som ej behandlats tidigare i kursen och tillämpa denna på ett problem. Datastrukturen i fråga kallas disjoint set och beskrivs i Weiss kap. 23.1-2. Kap. 13.1-3 behandlar grafer. Programkod Givna kodavsnitt finns på kursens hemsida. Genomförande och redovisning Uppgifterna är obligatoriska. Redovisning sker i grupper om två personer inte färre, inte fler. Varje grupp skall självständigt utarbeta sin egen lösning. Samarbete mellan grupperna om övergripande principer är tillåtet, men inte plagiering. Redovisa filerna Maze.java, ExtendedGraph.java, Gui.java samt BoardDispplay.java. med dina lösningar, samt README.txt med allmänna kommentarer om lösningen. Senaste redovisningsdag, se Fire.

2 (8) Inledning Uppgiften går ut på att konstruera och genomsöka tvådimensionella labyrinter som exemplet i bilden nedan visar. Labyrinterna skall vara rektangulära och ha slumpmässigt valda förbindelser mellan rummen (cellerna). Labyrint och genomsökning skall visas grafiskt i ett ritfönster. Konstruktionsproblemet beskrivs översiktligt i Weiss avsnitt 23.2.1. Det krävs att du är väl insatt i problemet innan programmeringsarbetet påbörjas. Krav En korrekt konstruerad labyrint skall uppfylla följande: 1. Det skall finns exakt en ingång längst upp till vänster och en utgång längst ner till höger som bilden ovan visar. 2. Varje cell skall kunna nås från vilken annan cell som helst. 3. Det får inte finnas några cykliska vägar. 4. Labyrinten skall presenteras grafiskt som exemplet visar. Modell En grundmodell för programmet bör bygga på en separation av de underliggande klasserna som används vid konstruktion och genomsökning av labyrinten från den grafiska presentationen av labyrinten på skärmen. Såväl konstruktionen som den grafiska presentation bygger dock på grundförutsättningarna att en labyrint har en viss given bredd och höjd, samt en relation mellan en cells löpnummer och dess rad- och kolumnindex. För att både datastrukturdelen och grafikdelen skall kunna ha denna kunskap finns den givna klassen Board som definierar grundläggande dimensions- och koordinategenskaper. Modellen för programmet ges av följande UML-diagram:

3 (8) För att isolera den del av programmet som innehåller själva logiken för konstruktion och genomsökning av labyrinten från det grafiska användargränssnittet skall applikationen tillämpa designmönstret Observer (se sid. 5). I algoritmerna är det oftast bekvämast att identifiera cellerna med ett löpnummer. För den grafiska presentationen är det däremot enklare att ange koordinater med rad- och kolumnindex. Sambandet mellan dem framgår av följande exempel. Den gråmarkerade cellen har t.ex. cellid = 6, radindex = 1 och kolumnindex = 2. 0 1 2 3 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11 Metoder för konvertering mellan cellid och koordinater finns i klassen Board. Alla klasser är färdiga utom Maze och ExtendedGraph. De färdiga klasserna beskrivs närmare i bilagan sist i PM. Implementering Programkod Given programkod finns på kursens hemsida. Ett påbörjat BlueJ-projekt innehåller ett färdigt grafiskt användargränssnitt samt en del hjälpklasser. Metoden main finns i klassen Gui. Projektet är kompiler- och exekverbart och visar gränssnittet på skärmen. Arbetsgång 1. Läs in de angivna litteraturavsnitten. 2. Testa några av de givna komponenterna. Det kan underlätta lösningen av uppgiften. 3. Konstruera labyrintprogrammet. Bygg ut stegvis och testa noga i varje steg.

4 (8) Testa komponenter Testa grafikklassen BoardDisplay. Skriv t.ex. en metod som slår ut ett antal slumpvis valda väggar med knockdownwall. Testa även fillcell, som ritar en röd punkt i en cell. Fyll t.ex. en diagonal av celler med punkter. Utnyttja basklassens metoder för hantering av positioner. Provkör gärna Weiss:s testprogram för klassen DisjointSets för att öka din förståelse för klassen. Konstruera labyrintprogrammet Vi skall lösa problemet i två steg. Det första resulterar i ett program som kan rita upp en slumpmässig labyrint på skärmen, men inget mer. I det andra steget lägger vi till funktionalitet så att den kortaste vägen genom labyrinten beräknas och visas på skärmen. Steg 1 Konstruktion av slumpmässig labyrint Grundprinciperna för labyrintkonstruktion beskrivs i Weiss 23.2.1. Den beskrivna metoden räcker för att konstruera en labyrint på skärmen, så vi börjar med det. Man ritar upp ett rutnät av väggar och tar sen bort väggar under beräkningens gång. All kommunikation mellan programmets logik och det grafiska användargränssnittet skall ske med Observer-mönstret (se nästa sida). Först inför vi klassen Maze som skall vara en subklass till Board: public class Maze extends Board { public void create() Skapar en labyrint på skärmen enligt metoden i kursboken. } public void search() Tar reda på kortaste vägen genom labyrinten från ingång till utgång med lämplig grafalgoritm, samt presenterar vägen grafiskt i ritfönstret. Skriv create först, search utvecklas i steg 2. Fortsätt inte med nästa steg förrän labyrinten ritas upp korrekt på skärmen. Testa noga, både små och stora labyrinter, minst 400 x 400, men även specialfall som 2 x 1, 1 x 2, 2 x 2, 1 x 10, 10 x 2, o.s.v. Steg 2 Beräkning av väg genom labyrinten För sökning efter en väg genom labyrinten behövs ytterligare en datastruktur. En metod är att samtidigt med den grafiska labyrintkonstruktionen i create bygga en motsvarande oriktad graf. Varje cell i labyrinten motsvaras av en nod i grafen och en utslagen vägg mellan två celler av en båge mellan motsvarande noder. Om alla labyrintceller är nåbara från varandra, och labyrinten saknar cykler, så kommer grafen att bli ett orotat träd. Den givna grafklassen är avsedd för riktade grafer, men oriktade bågar kan lätt simuleras genom att alltid göra två parvis motriktade bågar. Utvidga grafklassen genom att definiera följande subklass: public class ExtendedGraph extends Graph { public List<Integer> getpath( int destname ) {... } private List<Integer> getpath( Vertex dest ) {... } } Metoden getpath skall returnera en lista innehållande den senaste vägen från start- till destinationsnod som hittades med grafsökningsalgoritmen. Metoden behövs för att senare kunna rita en väg genom labyrinten på skärmen. Den privata metoden skall vara rekursiv och fungera självständigt utan hjälp av extra instans- eller klassvariabler. Tips: i basklassen finns funktionen printpath som delvis kan användas som förebild. Testa genom att konstruera någon av graferna i kursboken, anropa sökalgoritm för kortaste väg mellan två noder, hämta vägen med getpath, och skriv ut den.

5 (8) Labyrintgrafen analyseras sedan med lämplig grafsökningsalgoritm. Presentation av den funna vägen kan göras med fillcell som ritar röda punkter i labyrinten på skärmen (se nästa sida). Observer-mönstret När labyrinten konstrueras beräknas i varje steg vilken vägg som skall tas bort. Denna kan beskrivas med en cellposition och en riktning, t.ex. betyder cell nr 123 och riktning UP att den vågräta väggen ovanför cell nr 123 skall tas bort. Under den efterkommande sökfasen beräknas i varje steg en position på den funna vägen genom labyrinten som skall markeras med en röd punkt. För att update i BoardDisplay skall kunna veta vilket fall som inträffat kan man skicka med en parameter till notifyobservers som beskriver detta. Parametern skickas vidare till update som anropas automatiskt av notifyobservers. I det första fallet skall parametern ha typen Pair<Integer,Point.Direction> och i det andra Integer. Ett sekvensdiagram beskriver det hela: Maze BoardDisplay Canvas beräkna data setchanged(); notifyobservers(x); update(x); presentera grafiskt Utvecklingsmöjligheter Den föreslagna uppgiften har väl sina begränsningar. Man kan tänka sig en mängd utvidgningar av programmet, t.ex. någon form av labyrintspel: Låt användaren söka manuellt, t.ex. med piltangenterna, i labyrinten och ge poäng baserat på antal besökta rum, tidsåtgång etc. Presentera labyrintens rum på skärmen först när de besöks för att begränsa spelarens överblick. Presentera lösningen (som i basuppgiften). Logga poäng i fil. Tillåt cykliska vägar. Dörrar kan slå igen och nya öppnas. Monster kan dyka upp. Egna idéer?

6 (8) Färdiga klasser Klasserna nedan är färdiga. Beträffande List, DisjSets, Graph m.fl. se kursboken. I projektet används en förenklad version av klassen Graph vilken bifogas. De givna klasserna får endast modifieras genom tillägg av kod som behövs för att lösa uppgiften. class Point Används för att representera punkter i det tvådimensionella planet. enum Direction {UP,RIGHT,DOWN,LEFT} Används för att representera riktningar. Objekt av klassen förekommer på ett flertal ställen i programmet. Metoder public Point(int r,int c) Konstruktor. Initierar objektet med rad- och kolumnindex. public Direction getdirection(point p) Returnerar den lod- eller vågräta riktningen till p. Funktionen ger bara korrekt information om den anropas för punkter som ligger i det anropande objektets våg- eller lodlinje. public void move(direction d) Ändrar punktens koordinater ett steg i riktning d. Instansvariabler private int row Punktens radindex. private int col Punktens kolumnindex. class Board Representerar grundläggande dimensionsdata om en labyrint. Basklass till Maze och BoardDisplay. Metoder public Board(int m,int n) Konstruktor. Initierar objektet med labyrintens dimensioner. public int getcellid(point p) Returnerar p:s cellid public int getrow() Returnerar p:s radindex. public int getcol()

7 (8) Returnerar p:s kolumnindex. public boolean isvalid(point p) Returnerar true om p är inom labyrintens gränser, false annars. Instansvariabler private int maxrow Maximalt antal rader numrerade 0..maxRow 1. private int maxcol Maximalt antal kolumner numrerade 0..maxCol 1. private int maxcell Maximalt antal celler numrerade 0..maxCell 1. Vairiabeln initieras i konstruktorn till maxrow*maxcol. class BoardDisplay Används för att rita ut labyrinten i ritfönstret, samt för att markera en väg genom labyrinten. Publik subklass till Board. Implementerar gränssnittet Observer. Har ett observerförhållande till Maze. Erhåller data från Maze som presenteras grafiskt i Canvas. OBS! Samtliga metoder utom update är med avsikt deklarerade som privata. Det är alltså meningen att de skall anropas från update inte från Maze! Metoder public BoardDisplay(Canvas canvas,int m,int n) Konstruktor. Initierar objektet med labyrintens dimensioner. Räknar även ut labyrintens positionering i ritfönstret. private void drawgrid() Ritar upp ett grundläggande rutmönster med alla väggar intakta i labyrinten. private void knockdownwall(int cellid,direction dir) Tar bort en cellvägg i ritfönstret. private void fillcell(int cellid) Ritar en besöksmarkering i angiven cell i ritfönstret. Används vid Presentation av en väg genom labyrinten. public void update( ) Tar emot data från Maze om vägg som skall rivas, eller position i labyrintsökning och presenterar dem grafiskt på lämpligt sätt. Metodstump finns. Instansvariabler Klassen har en mängd interna variabler som behövs för grafiken.

8 (8) class Pair<A,B> Används t.ex. för att representera cell/granncell-par vid genereringen av labyrinten. class Canvas Används av BoardDisplay för presentation av labyrinten i GUI:t. Klassen är en modifierad version av en liknande klass i Barnes och Köllings bok Objects first with Java. class Gui Skapar en Canvas för labyrintgrafiken. Skapar objekt av Maze och BoardDisplay. Gör BoardDisplay till observatör av Maze. Skapar det grafiska användargränssnittet. Observera att inmatningen av heltal i textfälten för bredd och höjd måste avslutas med Return i respektive fält. Viss indatakontroll av inmatade data sker. Lycka till!