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

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

Arv och polymorfism i Java

Objektsamlingar i Java

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

Objektorienterad programmering D2

TUTORIAL: KLASSER & OBJEKT

Länkade listor och automatisk testning

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

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

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

Malmö högskola 2008/2009 CTS

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

Malmö högskola 2007/2008 Teknik och samhälle

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

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

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Laboration 1 - Grunderna för OOP i Java

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

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Övningsuppgift. Repeterbara citat. Steg 2. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

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

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

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

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

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, EDA501/EDAA20 Programmering M MD W BK L

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

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

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

Tentamen OOP

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Objektorienterad programmering Föreläsning 5

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

JAVA Mer om klasser och objektorientering

Chapter 4: Writing Classes/ Att skriva egna klasser.

Föreläsning 1 & 2 INTRODUKTION

Java, klasser, objekt (Skansholm: Kapitel 2)

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Lab5 för prgmedcl04 Grafik

TENTAMEN OOP

Statistik över heltal

DAT043 Objektorienterad Programmering

Labyrinter Algoritmer och datastrukturer Obligatorisk Laboration nr 6

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

725G61 - Laboration 5 Grundläggande objektorientering. Johan Falkenjack

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Tentamen, EDAA10 Programmering i Java

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

TDDI82 - Projekt. Christoffer Holm. Institutionen för datavetenskap (IDA)

CHALMERS TENTAMEN. 2018/2019, lp 1 DAT050. Uno Holmer

OBJEKTORIENTERAD PROGRAMMERING för Z1 (TDA540) Ansvarig: Jan Skansholm, tel eller

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.

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

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

Modeller, Objekt och Klasser

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

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

Malmö högskola 2007/2008 Teknik och samhälle

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Tentamen. DD2385 Programutvecklingsteknik vt 2014 Måndagen den 2 juni 2014 kl Hjälpmedel: penna, suddgummi, linjal

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Namn: Personnr: 1 2D1310 Programmeringsteknik i Java för B,V (1p) 13 januari 2001, kl Hjälpmedel: En Javabok. För betyget godkänt krävs at

Design av en klass BankAccount som representerar ett bankkonto

Laboration A Objektsamlingar

Objektorienterad programmering. Telefonboken igen, en bättre version. En jämförelse. Föreläsning 4

Tentamen. DD2385 Programutvecklingsteknik vt Fredagen den 5 juni 2009 kl Inga hjälpmedel utom penna, sudd och linjal

Föreläsning 13 Innehåll

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

Anteckningar 1: Grundläggande saker

Imperativ programmering. Föreläsning 4

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

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

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

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

TENTAMEN OOP

Objektorienterad programmering i Java

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

Relationer mellan objekt

TUTORIAL: SAMLING & KONSOLL

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

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Del A (obligatorisk för alla)

Tentamen Datastrukturer, DAT037 (DAT036)

Objektorienterad Programmering DAT043

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.

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

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

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

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

TENTAMEN OOP

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

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

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Transkript:

(7) Objektinteraktion Objektorienterad programmering Syfte Att konstruera ett litet objektorienterat program med flera samverkande objekt. Mål Efter övningen skall du kunna konstruera ett program med flera klasser och där flera objekt samverkar för att lösa ett problem. Du skall förstå hur man kan koppla ihop objekt genom att konstruktorn i en klass sparar objektreferenser till andra objekt i klassens instansvariabler. Utvecklingsmiljö BlueJ på valfri plattform. Litteratur Kursboken kap -3. Färdig programkod Given programkod finns på kursens hemsida i zip-filen er->programkod för labbarna->sticks.zip. Labbgrupper Arbetet genomförs och redovisas i grupper om två personer. Redovisning Uppgifterna är obligatoriska. Senaste redovisningsdag, se kurs-pm samt Fire. Varje grupp skall självständigt utarbeta sin egen lösning. Samarbete mellan grupperna om övergripande principer är tillåtet, men inte plagiering. Länk till Fire-systemet finns på kurshemsidan. Ladda upp följande till Fire: o källtextfiler i java, alltså filer med namn som slutar på.java, för de klasser du utvecklat själv, d.v.s. Sticks.java, ComputerPlayer.java, HumanPlayer.java, samt GameEngine.java o README.txt med allmänna kommentarer om lösningen. Glöm inte att trycka på SUBMIT i Fire! lab.docx Objektorienterad programmering, DAT050, DAI, 8/9, lp Nr 5

(7) Problembeskrivning Ett objektorienterat program blir intressant först när flera objekt tillsammans löser ett problem. Man kan då fråga sig hur de olika objekten kan känna till varandras existens. Ett objekt kan i princip använda ett annat objekt på två sätt. Antingen har (äger) objektet det andra objektet för sig själv och bestämmer helt över dess öde (aggregationsrelation), eller så delas det andra objektet mellan flera objekt. I det senare fallet säger man att ett eller flera objekt känner till eller är associerade till det gemensamma objektet. Kopplingen mellan två objekt kan vara enkeleller dubbelriktad. I ett klassdiagram i modelleringsspråket UML ritar man en har -relation med en diamantpil, och en association med ett streck. En pilspets anger att relationen är enkelriktad. Om pilen är oriktad (ingen pilspets) känner objekten till varandra ömsesidigt. I det vänstra klassdiagrammet nedan kan man utläsa att ett A-objekt har ett B-objekt och ett C-objekt, i det högra delar ett A- och ett D-objekt ett gemensamt B-objekt. A och D kan alltså påverka B oberoende av varandra. B kan vara någon form av gemensam resurs som flera objekt utnyttjar. B A A B D Hur implementerar man ovanstående relationstyper i Java? Det finns flera möjligheter, här följer två schematiska exempel. Antag att klasserna A, B, C och D är givna. Vi visar här bara de detaljer som har med relationerna att göra. Aggregation ( har ) I klassen A gör vi på följande sätt : class A { private B bref; private C cref; public A() { bref = new B(); cref = new C(); Om vi skapar ett A-objekt med new A() så kommer A:s konstruktor att skapa de två B-objekten automatiskt och vi får då en instans av ovanstående klassdiagram. Association ( känner till ) I klassen A gör vi på följande sätt : C class A { private B bref; bref syftar på inparametern bref public A(B bref) { this.bref = bref; this.bref syftar på instansvariabeln bref lab.docx Objektorienterad programmering, DAT050, DAI, 8/9, lp Nr 5

3 (7) och motsvarande i D class D { private B bref; public D(B bref) { this.bref = bref; Som vi ser ovan kan inga A- eller D-objekt skapas utan att ange referenser till ett B-objekt när objekten skapas. Eftersom A och D beror av B måste vi skapa B-objektet först, och sen A- och D-objekten i valfri ordning: B b = new B(); A a = new A(b); // koppla ihop a med b D d = new D(b); // koppla ihop d med b De skapade objekten och deras inbördes relationer kan visas i ett objektinstansdiagram: a :A bref b :B d :D bref Studera dessa exempel noga och förvissa dig om att du förstått innan du går vidare! Av klassdiagrammet framgår egentligen inte entydigt om A och D skall dela samma B-objekt, eller kunna vara associerade till var sitt B-objekt, och koden ovan tillåter givetvis även att A och D får var sitt B-objekt. Sådan information kan behöva preciseras i kommentarer i diagrammet för att man säkert skall veta hur det är tänkt. lab.docx Objektorienterad programmering, DAT050, DAI, 8/9, lp Nr 5

www.cse.chalmers.se/ /~holmer/ 4 (7) Uppgifter Vi skalll göra ett objektorienterat program som spelar tändsticksspelet. Spelet skalll spelas av två spelare, datorn och användaren. Man börjar med en hög av stickor. Varje spelare tar t i turordning bort en eller två stickor från högen. Den som tvingas ta den sista stickan förlorar. Användaren gör första draget. För vissa antal kvarvarande stickor finns en vinnande spelstrategi. Uppgift En vinnande spelstrategi för en spelare ärr en serie drag som leder till vinst oavsett motståndarens drag. Undersök matematiskt vid vilka antal kvarvarande stickor den som står i tur att göra sitt drag garanterat kan vinna omgången, förutsatt att dragen görs optimalt. Börja med att studera specialfall och generalisera sedan! För vilka a och b kan den vinnande spelaren, givett a stickor kvar, lämna b stickor kvar till motståndaren så att den förlorar till slut. Formulera generaliseringen i form av följande metod: private boolean iswinning gposition(int a) Den skall returnera true om a representerar ett antal stickor som ger spelaren i tur attt göra sitt drag möjlighet att vinna, false annars. Metoden får inte innehålla någon loop. Du skall senare placera metoden i klassen ComputerPlayer. Tips: Utnyttja Javaoperatornn %. Uppgift Nedan finns ett exempel som visar hur dialogen med användaren skall se ut. Följande klasser skall finnas i programmet (de beskrivs mer i detalj senare) ): Sticks Håller reda på stickorna. ComputerPlayer Spelar spelet för datorns räkning. HumanPlayer Sköter dialogen med användaren. Drar stickorr för användarens räkning. GameEngine Styr spelordningen mellan datorn och användaren. UserInterface Läser in heltal från tangentbordet. Skriver textmeddelanden på skärmen. Klassen är färdig. I BlueJ kommer projektet att se s ut så här Sticks left: Sticks left: 9 Sticks left: 6 Sticks left: 3 Sticks left: 0 Sticks left: 7 Sticks left: 4 Sticks left: lab.docx Objektorienteradd programmering, DAT050, DAI, 8/9, lp Nr 5

5 (7) BlueJ skiljer ej mellan de två relationstyperna vi pratat om utan ritar allt som associationer. GameEngine skall skapa och ha ett objekt av varje av de övriga klasserna. ComputerPlayer och HumanPlayer skall dessutom associeras till Sticks, samt HumanPlayer till UserInterface. Använd metodiken som beskrivits på föregående sidor. Allmänna krav på koden Lösningen skall uppfylla följande krav: Klasser som använder Sticks får aldrig dra ett otillåtet antal stickor. Inga utskrifter av typ System.out.println får göras i de egenutvecklade klasserna. För meddelanden till användaren och inläsning av tal skall UserInterface användas. Alla instansvariabler skall vara privata utan undantag! Inga slaskvariabler får deklareras som instansvariabler. De skall vara lokala i resp. metod där de används. Lämplig arbetsgång Börja med att implementera och testa klassen Sticks. Skapa ett objekt på objektbänken i BlueJ och kontrollera att objektet fungerar som det skall. Tänk igenom testfallen! Fortsätt med ComputerPlayer och HumanPlayer. Skriv metodstubbar i klasserna, d.v.s. tomma metoder. Detta räcker tills vidare för att kunna utveckla GameEngine. Implementera därefter GameEngine. Deklarera instansvariablerna och skriv konstruktorn. Kompilera och skapa ett objekt. När detta fungerar skriver du rungame. Utveckla loopen stegvis. Kompilera och testa ofta! När ovanstående kompilerar och exekverar felfritt kan du börja utveckla metoden move i ComputerPlayer och HumanPlayer, alltså en move-metod i vardera klassen. Om du gjort rätt skall nu spelet fungera felfritt! Klassbeskrivningar public class Sticks Håller reda på antalet kvarvarande stickor. private int maxnoofsticks; Ursprungligt antal stickor. private int sticksleft; Kvarvarande antal stickor. Konstruktorer public Sticks(int n) Skapar en tändstickshög med n stickor genom att initiera instansvariablerna på lämpligt sätt.. public Sticks() Skapar ett tändstickshög med stickor. public void newgame() Initierar/återställer objektet till ursprungligt antal stickor. En konstruktor kan anropa en annan med syntaxen this(parametrar); lab.docx Objektorienterad programmering, DAT050, DAI, 8/9, lp Nr 5

6 (7) public int sticksleft() Returnerar antalet kvarvarande stickor. public boolean cantake(int n) Om n och det finns minst n stickor kvar returneras true, annars false. public void take(int n) Minskar antalet stickor med n. Det är användarens ansvar att kontrollera att n anger ett tillåtet antal och att tillräckligt antal stickor finns innan denna metod anropas. public class ComputerPlayer Spelar spelet för datorns räkning. private Sticks sticks; Referens till objektet med tändstickshögen. Konstruktor public ComputerPlayer(Sticks sticks) Initierar instansvariabeln sticks med referensen i inparametern sticks. private boolean iswinningposition(int a) Se uppgift. public void move() Genomför datorns drag genom att dra ett lämpligt antal stickor från sticks. För vissa antal kvarvarande stickor finns en vinnande spelstrategi. Denna skall, om möjligt, tillämpas i metoden på ett generellt sätt. Lösningen får ej baseras på en uppräkning av specialfall. Se uppgift. public class HumanPlayer Sköter dialogen med användaren samt drar stickor från högen för användarens räkning. private Sticks sticks; Referens till objektet med tändstickshögen. private UserInterface ui; Referens till användargränssnittsobjektet. Konstruktorer public HumanPlayer(Sticks sticks,userinterface ui) Initierar instansvariablerna med de givna objekten. public void move() Frågar användaren efter ett antal stickor att dra. Felaktigt antal skall ge lämpligt felmeddelande och användaren ges en ny chans. Detta fortgår tills ett korrekt antal angivits. Därefter dras stickorna från högen. lab.docx Objektorienterad programmering, DAT050, DAI, 8/9, lp Nr 5

7 (7) public class GameEngine Styr spelordningen mellan datorn och användaren. private Sticks sticks; private ComputerPlayer computerplayer; private HumanPlayer humanplayer; private UserInterface ui; Konstruktor public GameEngine() Skapar objekt av samtliga övriga klasser och sparar referenser till dessa i instansvariablerna. Kopplar ihop ComputerPlayer-objektet med Sticks-objektet, samt HumanPlayer-objektet med Sticks-objektet och UserInterface-objektet. public void rungame() Låter upprepade gånger användaren och datorn göra var sitt drag drag. Användaren skall alltid göra första draget. Om något av dragen resulterar i en tom hög skall vinnaren utropas och spelet avslutas. public class UserInterface Klassen innehåller metoder för inläsning av heltal från tangentbordet, samt utskrifter av meddelanden i textfönstret. Denna klass är färdig. public int nextint() Läser ett heltal från tangentbordet. Talet returneras. Om felaktiga tecken förekommer i indataraden ignoreras resten av raden och 0 returneras. Meddelandemetoder som skriver olika meddelandetexter i textfönstret. public void sticksleftmsg(int n) public void howmanysticksmsg() public void illegalmovemsg() public void computerwinmsg() public void playerwinmsg() Lycka Till! lab.docx Objektorienterad programmering, DAT050, DAI, 8/9, lp Nr 5