2D1387 Programsystemkonstruktion med C++



Relevanta dokument
2D1387 Programsystemkonstruktion med C++ Projektuppgift: Äventyrsspel 31 augusti 2006

DD2387 Programsystemkonstruktion med C++ Projektuppgift: Äventyrsspel 20 oktober 2009

DD2387 Programsystemkonstruktion med C++

Programmering B med Visual C

2D1387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 31 augusti 2005

Laboration 1: Figurer i hierarki

Det ska endast finnas två bilder av samma typ på spelplanen.

2D1387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 2 september 2006

Övning 4. Arv och andra relationer

Introduktion till arv

Nätverksprogrammering, EDA095

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

TDDC76 Programmering och datastrukturer

Kravspecifikation. TDP005 Projekt: objektorienterade system. Version 4.0 Datum Anna Ahlberg Johan Almberg

54 kort: 10 plockarkort 10 trädgårdsmästarkort 10 extra arbetarkort 24 fruktträdskort

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Övriga byggstenar. Övriga byggstenar. Några tips under programutveckling. Beroenden Pekare till funktioner Typkonvertering

Detaljbeskrivning av Player

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

PROJEKTRAPPORT EDA095 NÄTVERKSPROGRAMMERI

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

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

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

3. Välj den sprajt (bild) ni vill ha som fallande objekt, t ex en tårta, Cake. Klicka därefter på OK.

Designspecifikation den 13 december 2007

Instruktioner för dig som ska söka till Mattekollo 2016

KARLSTADS UNIVERSITET 12/8/09 informatik & datavetenskap Johan Öfverberg, Kerstin Andersson Laboration 4, ISG A04 och DVG A08 HT-09

Klasser och objekt. Henrik Johansson. August 20, 2008

eller Övningar i filhantering Tema: Mappar och filer i Windows samt Lagringsenheterna OBS! Endast för medlemmar i SeniorNet, Klubb Södertälje!

DD1311 Programmeringsteknik för CL1 Laborationer läsåret

Tentaupplägg denna gång

Objektorienterad programmering i Java I

getsmart Grå Regler för:

Kapitel 1 Hej! Jag heter Jessica Knutsson och jag går på Storskolan. Jag är nio år. Jag har blont hår och små fräknar. Jag älskar att rida.

Objektorienterad programmering D2

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

Praktikum i programmering

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

Planering Programmering grundkurs HI1024 HT data

TDDC76 - Programmering och Datastrukturer

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

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

Tentaupplägg denna gång

Börja med git och GitHub - Windows

Fyra i rad Javaprojekt inom TDDC32

Linjär algebra med tillämpningar, lab 1

Objektorienterad Programkonstruktion

Handbok Potatismannen. Éric Bischoff Paul E. Ahlquist, Jr. Eugene Trounev Granskare: Lauri Watts Översättare: Stefan Asserhäll

Kapitel 6 - Undantag

Projektrapport EDA095

Komma igång med Learnify - snabbmanual

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

Chapter 4: Writing Classes/ Att skriva egna klasser.

Legorobot. Lär dig programmera en legorobot. Teknikåttan Ola Ringdahl Lena Kallin Westin

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Game of 40. Regler och om sidan är in princip samma sak. Det som skiljer dem åt är att de inte har samma text.

Erik står i mål Lärarmaterial

Inledande programmering med C# (1DV402) Ditt första C#-program med Visual Studio

System.out.println("Jaså du har "+ antaldollar + " stycken.");

Den magiska dörren. Kapitel 1

TDDC74: Projekttitel

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

Kapitel 1 Vad händer? Kapitel 2 Brevet. Konstigt.

Komma igång med Learnify - snabbmanual

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

Arv bakgrund (kap. 9)

Alla filer som bearbetar PHP script ska avslutas med ändelsen.php, exempelvis ska en indexsida till en hemsida heta index.php

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

Lab5 för prgmedcl04 Grafik

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

Dödskallar, dukade bord och andra saker Tema 1: Kan saker betyda något?

Problemet. Vi har sett att vi kan ersätta de metoder vi ärver från överklassen med egen funktionalitet (polymorfism)

Problem: FIL File Paths

Prova på-laboration i PHP Johan Sjöholm johsj@ida.liu.se Institutionen för datavetenskap, Linköpings universitet

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

LABORATION 4 OBJEKTORIENTERAD PROGRAMMERING I C++ I

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

OOP Objekt-orienterad programmering

Diagnostiskt Prov. Antaganden Om förutsättningar saknas I en uppgift skall rimliga antaganden göras och nedtecknas.

Regelsammandrag på Svenska Yu-Gi-Oh!

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

Receptsamling med fil

FLEXILAGER Ett hjälpmedel för anpassad lagerhantering. Original -version

Inledande programmering med C# (1DV402) Introduktion till C#

Vad händer när man kör ett program? Program och processer. Funktionsanrop. Avsluta programmet

Kapitel 3. Synlighet. Kapitel 3 - Klassanvändning, operatorer och pekare. Synlighet

Läsnyckel Amulett Bok fyra: Det sista rådet av Kazu Kibuishi översatt av Marie Helleday Ekwurzel

1 Börja samtalet med tjejerna idag! EnRigtigMand.dk. Äger alla rättigheter

kl Tentaupplägg

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

Trampolinen Steg för steg En guide för dig som ska handleda morgondagens arbetskraft in i din yrkesroll, ditt företag eller din bransch.

Lathund för Tibro Tennisklubbs bokningssystem

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

PEDAGOGMATERIAL till föreställningen Peka Trumma Dansa Urpremiär december 2014

Laboration 2: Designmönster

Vad roligt att ni har valt att bjuda varandra på den här timmen.

Transkript:

2D1387 Programsystemkonstruktion med C++ Projektuppgift: Äventyrsspel 20 juni 2002 Sista redovisningsdatum: onsdag 11 december 2002 (v.50) klockan 17.00 Bonuspoäng: 3p om redovisningen sker i tid I den här labben kommer du att lära dig att skriva ett lite större program med hjälp av arv, polymorfi och standardklasserna (STL). Ni får jobba i grupper om högst två personer. Vid redovisningen ska alla gruppmedlemmar kunna svara på frågor om alla delar av koden. Tips inför labben: Läs igenom hela lydelsen innan du börjar. För att uppgifterna ska kännas mindre lösryckta hänger de ofta ihop. Nyckelord som const, virtual, etc. ska användas på ett korrekt sätt. Din kod ska vara modulariserad i klasser och filer. Ditt program ska inte läcka minne, så var noga med dina konstruktorer och destruktorer. Förberedelser (Om du redan gjort följande behöver du inte göra det igen.) Skriv namn på labbkvittot. För att få rätt labbmiljö ska du skriva följande: datan> res checkin cprog02 datan> course join cprog02 Lycka till! Introduktion: Ett rollspel var från början ett brädspel där flera personer deltog. Spelet utspelade sig ofta i en fiktiv värld (fantasy) där spelarna mötte trollkarlar, krigare, drakar och andra varelser. Alla varelser i spelet hade egenskaper såsom styrka, uthållighet och magi. Spelet leddes av en spelledare som berättade för spelarna vem de mötte och vad som utspelade sig. Ett exempel på denna typ av brädspel är Drakar och Demoner (Dungeons & Dragons). Du ska i den här labben implementera ett fullskaligt äventyrsspel. Dina klasser kommer att representera troll, drakar m.m. Varelsernas egenskaper kommer att representeras av klassernas medlemmar. Spelledarens roll kommer att skötas av en kommandotolk, dvs ett textbaserat gränssnitt där du anger vad du vill göra. Efter du gjort ditt drag kommer spelledaren låta övriga varelser göra sitt. Om du inte gillar drakar och demoner kan du istället skriva ett valfritt äventyrsspel, t.ex. om hur du pallar äpplen av dina grannar på fredagskvällarna. 3.1 (arvsstruktur) I denna uppgift kommer du att definiera klasshierarkier och objekt. Sist i uppgiften kommer objekten samverka med varandra. 1

Börja med att välja ett lämpligt namn på den namnrymd som ska innehålla klasser och data i äventyrsspelet. a) Gör en klasshierarki för aktörerna i ett äventyrsspel med attribut och metoder: Skapa en klasshierarki för aktörerna. Låt några av klasserna vara instansierbara och representera aktörer i spelet. Exempel: en trollkarl är en människa som är en aktör. Låt varje aktörklass ha en egenskap (gärna fler) specifik för den aktör de representerar. Några av värdena för varje aktör ska variera över spelets gång. Exempel: en trollkarl har ett värde för magi som minskar då han trollar. Alla varelser har kroppspoäng (liv). Genom att äta spenat kan en människa få mer kroppspoäng, dock inte över ett maximalt värde. Alla varelser har styrka. Låt aktörerna ha en mängd val de kan göra då det är deras tur. Låt valen bero på var de är, vem de har i närheten och hur starka deras egenskaper är. Exempel: ett skadat troll letar mat, ett friskt troll springer runt slumpmässigt, ett troll i närheten av en människa blir argt. Förslag på funktioner i basklassen för aktörerna: type() returnerar namnet på arten, t.ex. trollkarl eller drake name() returnerar namnet på varelsen, t.ex. Merlin action() aktörens tur att agera go(direction) gå åt håll fight(character) slåss med pick_up(object) tauppsak drop(object) släpp sak på marken talk_to(character) konversera med b) Gör en klasshierarki för miljön med attribut och metoder: Skapa en klasshierarki som representerar miljön i ditt spel. Låt några av klasserna vara instansierbara och representera olika varianter på miljöer. Exempel: rum inomhusmiljö miljö, skog utomhustyp miljö, mur utomhustyp miljö, hav vatten utomhustyp miljö. Låt de olika typerna av miljöer ha utgångar åt olika håll. Ett miljöobjekt måste kunna svara på vilka riktningar som spelarna kan gå. Bortom varje utgång ska man komma till ytterligare ett miljöobjekt. Exempel: rum har bara fyra riktningar, skog har åtta. Vissa riktningar är blockerade av väggar, murar, berg och träd. Låt varje instans av en miljöklass ha en beskrivande text. Om du låter texten beskriva utgångar och föremål så blir spelet mer levande och roligare att spela. 2

Förslag på funktioner i basklassen för miljöerna: directions() returnera vilka utgångar som finns neighbor(direction) returnera granne (t.ex. referens till objekt) i given riktning description() returnera beskrivning av vad miljön innehåller, vilka föremål man kan ta och vilka aktörer som befinner sig på platsen. enter(character) aktör kommer till platsen leave(character) aktör går från platsen pick_up(object) någon tar upp ett föremål som finns på platsen drop(object) någon lägger ner ett föremål på platsen c) Gör en klasshierarki för föremål med attribut och metoder: Skapa en hierarki av klasser som representerar föremålen i ditt äventyrsspel. Exempel: börs behållare föremål, ring föremål Låt alla föremål ha egenskaper. Alla föremål måste kunna svara på frågor om deras egenskaper, såsom dess pris, vikt, volym etc. Exempel: En ryggsäck har plats för ett visst antal saker/viss volym och går sönder om man lastar den för tungt, en ring kostar 500 silverpengar, ett svärd väger 2kg. Förslag på funktioner i basklasserna för föremålen: weight() vikt volume() volym price() pris Förslag på funktioner för behållare: hold_weight() vikt innan behållaren går sönder hold_volume() volym innan behållaren blir full add(object) lägg objekt i behållaren remove(object) tabortobjektfrånbehållaren d) Sätt ihop en handfull miljöinstanser så att de bildar en liten spelplan. Instansiera några aktörer och lägg dem i en vektor Vector<Character *>. Lägg även ut instanser av föremål, varav någon behållare, i de olika miljöerna. Iterera över vektorn och låt varje aktör utföra funktionen action(). Låt aktörerna plocka upp objekt, lägga ned objekt, gå genom dörrar, prata med varandra, bli arga och slåss etc. Skriv ut information om hur spelet fortlöper, aktörernas namn och typ och vad de gör. 3

Tips: Du kan behöva en slumpgenerator rand() och en slumpinitierare srand() (se man rand). Om man använder rand() utan srand() får man alltid samma slumptalsföljd, vilket kan vara användbart när man letar fel. 3.2 Du ska nu skapa ett riktigt, spelbart äventyrsspel för en spelare. Följande funktionalitet ska finnas: Ge en introduktion före spelet börjar där bakgrundshistorien berättas, målet står specificerat och några kommandon omnämns. Spelet ska ha en kommandotolk som sköter all inmatning till spelet. Speltolken tar ett kommando från tangentbordet och utför handlingen. Kommandotolken bör klara alla funktioner som aktörernas basklass specificerar. Exempel: pick up sword, go north, buy shield. Alternativt: visa spelplanen med teckengrafik. Låt användaren manövrera genom att hämta in ett tecken med getch. Låt eventuella strider ske i omgångar tills någon part flyr eller avlider. Striderna kan t.ex. styras med tärningar. Låt minst en händelse bero på yttre/tidigare omständigheter. Exempel: dörren öppnas bara du har rätt nyckel, lönndörren visar sig bara om du försöker gå i den riktningen, vakten släpper in dig bara om du tidigare talat med en speciell instans av en aktör, falluckan öppnar sig bara om du väger tillräckligt mycket. Spelet ska ha ett mål. När målet är uppfyllt ska spelet avslutas. Betygshöjande extrauppgifter Extrauppgift 3.1 (5p) Skriv kommandotolken med hjälp av funktionspekare och pekare till medlemsfunktioner. Skapa en std::map och låt namnet på varje kommando vara nyckel till en pekare till kommandot. Skapa ytterligare en std::map och låt namnet på en aktör vara nyckeln till det objekt aktören representeras av. När ett kommando verkar på en aktör, använd funktionspekaren genom objektet. Olika kommandon kan ge upphov till funktionspekare av olika typer. Hur ska du hantera detta? Vad blir typen på datat i std::map? Extrauppgift 3.2 (4p) Spelets position ska gå att spara till fil och ladda från fil. Använd strömmar (streams). Exempel: save my_game1, load game7. Tips: (För dig som inte gör extrauppgift 3.3) Tänk på att dina aktörer och miljöer är statiska eftersom de alltid skapas från main() på samma sätt. Utnyttja detta för att underlätta filhanteringen. Extrauppgift 3.3 (7p) Låt spelets karta och aktörer definieras av en fil. Ladda all information såsom miljöer, karta (miljöernas förhållande till varandra), aktörer och föremål från fil. Observera att det bara är objekten och deras egenskaper som ska läsas från filen medan objektens funktioner och beteenden ligger i klasserna de instansierar. Filformatet kan t.ex. se ut som 4

MIL1:Du står i ett liten grotta. En svag belysning avslöjar ett stort hål i golvet.:mil2:obj2:akt3 MIL2:Du befinner dig i en trång gång mellan två salar. Väggarna är våta och hala.:mil1,mil3:obj1: MIL3:Du är i ett stor sal där tre stora bord står dukade.:mil2::akt1,akt2 AKT1:TROLL:Gruff-Gruff:kroppspoäng=17,iq=3: OBJ4,OBJ5 OBJ1:BEHÅLLARE:OBJ6,OBJ7:en liten ryggsäck:10kg, 10liter,2daler OBJ2:PENGAR:en mängd daler:0kg,0liter,10daler OBJ3:ENHET:ett bredsvärd med förgylld egg:3kg, 1liter,350daler... Filen ska kollas så att den innehåller konsistenta användningar av objekt: utgångar måste vara till rum som finns, föremål som används ska vara definierade etc. Hur ska man hantera händelser som beror på yttre/tidigare omständigheter? Extrauppgift 3.4 (6p) Använd mallar för att undvika upprepning av kod i aktörshierarkin. Vi vill kunna korsa yrken (såsom trollkarl) med arter (såsom troll). Överväg för- och nackdelar med Wizard<Human> merlin resp. Human<Wizard> merlin. I exemplen ovan har Merlin både trollkarls- och människointerface, vilken teknik är lämpligast för att implementera detta? 5