COMPUTERSPIL 1. Opgave 1. Opgave 2

Relaterede dokumenter
COMPUTERSPIL 1. Opgave 1

DRONNINGER (QUEENS) Opgave 1

Forelæsning Uge 12 Mandag

Forelæsning Uge 12 Torsdag

Forelæsning Uge 10 Torsdag

Har kun én enkelt abstract metode De steder, hvor man skal bruge et objekt, hvis type er et funktionelt interface, kan man i stedet bruge en lambda

Forelæsning Uge 4 Torsdag

Forelæsning Uge 1 Torsdag

Forelæsning Uge 11 Torsdag

Forelæsning Uge 11. Nedarvning. Object klassen. Projektopgave om computerspil

BILLEDREDIGERING (IMAGES)

Forelæsning Uge 2 Torsdag

Forelæsning Uge 11. Nedarvning. Object klassen. Projektopgave om computerspil

Forelæsning Uge 1 Torsdag

Ugeseddel 4 1. marts - 8. marts

Forelæsning Uge 11 Mandag

Har kun én enkelt abstract metode De steder, hvor man skal bruge et objekt, hvis type er et funktionelt interface, kan man i stedet bruge en lambda

Forelæsning Uge 3 Mandag

Forelæsning Uge 4 Torsdag

Forelæsning Uge 4 Mandag

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

Forelæsning Uge 5 Mandag

Forelæsning Uge 2 Torsdag

Klasser og objekter. (Afsnit i manualen)

Forelæsning Uge 2 Mandag

Forelæsning Uge 2 Torsdag

Forelæsning Uge 5 Mandag

Forelæsning Uge 2 Mandag

DANMARKS TEKNISKE UNIVERSITET

Kommuniker: Gennem Valg

Fang Prikkerne. Introduktion. Scratch

Forelæsning Uge 10 Mandag

Forelæsning Uge 4 Mandag

DM507 Algoritmer og datastrukturer

Adobe Acrobat Connect brugergrænsefladen

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

DM507 Algoritmer og datastrukturer

Forelæsning Uge 2 Torsdag

Forelæsning Uge 4 Mandag

Forelæsning Uge 5 Mandag

Forelæsning Uge 4 Torsdag

Forelæsning Uge 2 Mandag

Sådan bruger du planlæggeren

Anvendelse af metoder - Programmering

Forelæsning Uge 5 Mandag

Forelæsning Uge 3 Mandag

Vejledning til Photo Story 3

Forelæsning Uge 6 Mandag

DMX styring med USB-interface

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

Vejledning KPK Online Prøverum

Brugervejledning til. Vejleder

Opgavestyring, op og download af mange filer

Individuelle pædagogiske handleplaner for Daginstitution/ Dagpleje. Tabulex Læreplaner

Forelæsning Uge 3 Torsdag

Forelæsning Uge 2 Mandag

Sådan arbejder du med din forside

KMD vejledning til Min Kørsel (Web APP)

Forelæsning Uge 3 Mandag

Vejledning til Formandsportalen

dintprog Manual Revision: 1241 August 24, 2010 I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4

Forelæsning Uge 3 Mandag

Vejledning til Photofiltre nr.204 Side 1 Opsætning af sang hvor der bruges både Libre Office Draw og Photofiltre

Vejledning og beskrivelse til kørselsappen Min Kørsel

Introduktion til ActionScript

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

Oktober Dokumentpakker

Vejledning til opgraderet version af Danmarks Arealinformation

Sådan bruger du planlæggeren

Indholdsfortegnelse. Indholdsfortegnelse.. side 2. Adgang til webgraf 3. Opslag adresse Styring af layout.. 5. Zoom funktioner..

Daglig brug af Jit-klient

Table of Contents. Prøveværktøj

Indhold. Tablet Guides

BRUGERVEJLEDNING FOR ELBAPRINT SERVICE

Opret prøve og tilpas dit fronter-rum Spørgsmålstyper og justering Oversigt over spørgsmålstyper...20 Justering af spørgsmål og sider...

Hent filoplysninger fra billeder og filer

Adgang til WebGraf. 1. Start Microsoft Internet Explorer. 2. Skriv:

Sådan opretter du en elektronisk aflevering

GoTalkNow. Beskrivelse:

Rationel VinduesDesigner TM Brugervejledning

Arkiv i SIMU World. Arkivet ligger i SIMU World, og gør det muligt at arkivere jeres sager direkte i SIMU World.

Forelæsning Uge 14 Mandag

Forelæsning Uge 3 Torsdag

Forelæsning Uge 3 Torsdag

DM507 Algoritmer og datastrukturer

SÅDAN BRUGER DU TEKST- BEHANDLING INTRODUKTION

Skriftlig eksamen i Datalogi

Hukommelsesspil. Introduktion. Scratch

Vejledning til brug af i-bogen Biologi i udvikling

Abstrakte datatyper C#-version

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Vejledning til brug af PwC-Portalen Indhold

Forelæsning Uge 2 Mandag

Brugers vejledning til indtastning af Naturdata på eksisterende 3- områder

Mediator 9. Materiale til elever. Version: August 2012

Kontaktpersoner. Indhold

Patientlister. Tilføj / rediger eksisterende lister. VEJLEDNING Patientlister

Vejledning. Vejledning til Trio Forvaltningsmodul

INTRO TIL GOOGLE DREV

1. Opbygning af et regneark

Transkript:

COMPUTERSPIL 1 I løbet af de kommende fem uger skal I programmere et computerspil, hvor spillerne rejser rundt mellem byer i forskellige lande og indsamler point. Der er en delaflevering hver uge, hvor I tilføjer nye ting til spillet ofte baseret på ting, der er gennemgået i de nærmest foregående forelæsninger (og kapitler i BlueJ-bogen). I denne første delaflevering skal I bl.a. modellere byerne og vejene imellem dem, samt de lande byerne ligger i. Når I er færdige, vil I have den første version af et computerspil, hvor den grafiske brugergrænseflade viser et netværk over udvalgte byer i Norden og vejene imellem dem. Der er forholdsvis meget at lave, men langt de fleste af tingene burde på nuværende tidspunkt være lette at implementere. For at spare tid må I (denne ene gang) rent undtagelsesvis vente med at dokumentere de klasser, konstruktører og metoder, som I skriver. I Computerspil 2 bliver der rig lejlighed til at indhente det forsømte. Start med at oprette et BlueJ projekt med navnet MyNordicTraveller. Opgave 1 Implementér klassen City, der repræsenterer en by, man kan besøge. En by har et navn, der er repræsenteret ved en tekststreng, samt en værdi, der er repræsenteret ved et heltal. Opret City klassen med tre feltvariabler name, value og initialvalue samt accessor metoder getname og getvalue for de to første. Herudover skal klassen have to mutator metoder: void changevalue(int amount) // Adderer amount til value void reset() // Resetter value til initialvalue Klassen skal have en konstruktør på formen: City(String name, int value) hvor den første parameter bruges til at initialisere feltvariablen name, mens den anden parameter bruges til at initialisere de to sidste feltvariabler. Klassen skal implementere interfacet Comparable<City>, dvs. at I skal lave en compareto metode, der definerer byernes sorteringsrækkefølge (alfabetisk efter navn). Opgave 2 Implementér Road klassen, der repræsenterer en vej mellem to byer. En vej har referencer til de to byer (City objekter) den forbinder. Den har også en længde (repræsenteret som et heltal), der angiver hvor lang tid, det tager at rejse mellem de to byer. Opret klassen Road med tre feltvariabler from, to og length samt accessor metoder getfrom, getto og getlength for disse. Der skal ikke være mutator metoder, idet Road objekter er immutable (uforanderlige). Klassen skal have en konstruktør på formen: Road(City from, City to, int length) Klassen skal implementere interfacet Comparable<Road>, dvs. at I skal lave en compareto metode, der definerer vejenes sorteringsrækkefølge. Først sorteres (alfabetisk) efter navnet på de byer, hvor vejene starter, og hvis to (eller flere) veje starter i samme by sorteres (alfabetisk) efter de byer, hvor vejene slutter. 1

Opgave 3 Implementér klassen Position, der repræsenterer en spillers position. Klassen har fire feltvariabler: from // Den by spilleren kommer fra to // Den by spilleren er på vej til distance // Den afstand der er tilbage total // Den totale afstand mellem de to byer og fem accessor metoder: City getfrom() City getto() int getdistance() int gettotal () boolean hasarrived() // Returnerer (distance == 0) Klassen skal have en konstruktør på formen: public Position(City from, City to, int distance) hvor parameteren distance også bruges til at initialisere feltvariablen total. Herudover har Position to mutator metoder, som nu skal implementeres: boolean move() // Tæller distance 1 ned hvis distance > 0 // Returværdien angiver om distance ændres void turnaround() // Vender spillerens bevægelsesretning uden at spilleren flyttes Opgave 4 Implementér klassen Country, der repræsenterer et land med et netværk af byer og veje, der modelleres via en feltvariabel af typen Map<City, List<Road>>. Hver by afbildes (mappes) i et element af typen List<Road>, dvs. en liste indeholdende de veje, der starter i den pågældende by. Opret klassen Country med to feltvariabler name og network der hhv. har typerne String og Map<City, List<Road>>. Klassen skal have en konstruktør på formen: Country(String name, Map<City, List<Road>> network) Implementér nedenstående accessor metoder (hvor algoritmeskabelonerne fra kurset første halvdel kan være nyttige): String getname() // Returnerer landets navn Map<City, List<Road>> getnetwork() // Returnerer værdien af network List<Road> getroads(city c) // Returnerer alle veje, der starter i c List<City> getcities() // Returnerer sorteret liste af alle byer i landet City getcity(string name) // Returnerer byen med det angivne navn Hvis byen c ikke findes i det pågældende land, skal getroads metoden returnere en tom liste. Analogt skal getcities returnere en tom liste, hvis landet ikke har nogen byer, og getcity skal returnere null, hvis den angivne by ikke findes i landet. Metoden containskey i interfacet Map kan være nyttig, når I skal undersøge om en by ligger i landet. Via konstruktørkaldet: new ArrayList<>(network.keySet()) 2

kan I skabe en arrayliste med alle landets byer. Dernæst sorteres den skabte arraylisten via klassemetoden Collections.sort (der anvender den compareto metode, som I skrev i opgave 1). Bemærk, at signaturerne for metoderne bruger typerne List og Map, der er interfaces og mere generelle end klasserne ArrayList og HashMap. Vi bruger kun de konkrete klasser, når vi instantierer et objekt, som i new ArrayList<Road>(). Herudover skal klassen have en mutator metode: void reset() // Resetter alle landets byer Når I skal afteste ovenstående metoder, har I behov for skabe Country objekter. Dette er lidt bøvlet, idet klassens konstruktør har en parameter af typen Map<City, List<Road>>. En første løsning er at bruge null som parameterværdi. I opgave 7 stilles en mere sofistikeret løsning til rådighed. Opgave 5 Når en spiller ankommer til en by, modtager hun en bonus, der er en del af byens værdi (som samtidigt formindskes tilsvarende). Bonussens størrelse udregnes i Country klassen, idet vi senere vil introducere lande, hvor udregningen foretages på en anden måde. Hver by skal derfor have en feltvariabel country, der fortæller, hvilket land byen ligger i. Introducér denne feltvariabel (sammen med en accessor metode getcountry) og tilføj en parameter til konstruktøren for City klassen, således at man kan angive, hvilket land en by ligger i: City(String name, int value, Country country) I Country klassen implementeres nedenstående metode: int bonus(int value) // Beregner størrelsen af den bonus, som spilleren modtager Hvis parameterværdien er positiv, returneres et tilfældigt heltal i intervallet [0, value]. Ellers returneres 0. I City klassen implementeres en metode: int arrive() // Fratrækker den udbetalte bonus fra byens værdi der kaldes (af Game klassen, der introduceres senere), hver gang en spiller ankommer til en by. Metoden kalder bonus metoden i det land, som byen tilhører (med en parameterværdi, der er lig med byens værdi). Derefter fratrækkes den beregnede bonus fra byens værdi. Bonussen returneres som returværdien af arrive metoden. Når I skal afteste ovenstående metoder, har I behov for skabe City objekter, hvilket igen kræver at I kan lave Country objekter. Som beskrevet i slutningen af opgave 4, kan dette gøres ved at bruge null som parameterværdi i Country klassens konstruktør. Opgave 6 Implementér nedenstående metoder i Country klassen: void addroads(city a, City b, int length) // Tilføjer veje mellem a og b Position position(city city) // Returnerer byens position Position readytotravel(city from, City to) // Gør klar til at påbegynde rejse Den første metode opretter kun veje der starter i det pågældende land. Hvis begge byer ligger i landet oprettes der veje i begge retninger. Hvis én af byerne ligger i landet oprettes kun den vej, der starter i landet. Hvis ingen af byerne ligger i landet oprettes der ingen veje. Metoden containskey i 3

interfacet Map kan være nyttig, når I skal undersøge om en by ligger i landet. De oprettede veje tilføjes til landets network. Den anden metode returnerer byens position, dvs. et Position objekt på formen new Position(city, city, 0) svarende til at spilleren står i byen city uden at have valgt en vej mod en anden by. Dette er også tilfældet, hvis byen slet ikke ligger i landet. Den tredje metode returnerer et Position objekt, der repræsenterer, at spilleren er klar til at påbegynde rejsen fra from til to (men stadig står i from). Hvis from og to er samme by (afgjort ved hjælp af equals), returneres byens position. Hvis der ikke er en direkte vej fra from til to returneres from s position. Dette er også tilfældet, hvis from slet ikke ligger i landet. Opgave 7 Brugen af null som parameterværdi i Country klassens konstruktør, begrænser de tests der kan laves uden at få en NullPointerException. For at omgå dette problem, har vi lavet en JUnit testklasse, CGTest, der indeholder en Test Fixture, med to Country objekter, syv City objekter og et antal Road objekter, der realiserer nedenstående netværk, hvor tallene i parenteserne angiverne byernes initiale værdi, mens tallene på vejene angiver deres længde: Klassens downloades zip og filen CGTest.java tilføjes til jeres projekt (mens BlueJ er lukket). Når I herefter kompilerer, dukker der en grøn klasse op med navnet CGTest. Bemærk, at CGTest bruger addroads metoden i Country klassen, og den vil derfor først virke, når opgave 6 er færdiggjort. Ved at højreklikke på den grønne CGTest klasse, kan I vælge kommandoen Test Fixture to Object Bench, hvorefter I får nedenstående 9 røde kasser, der repræsenterer Country og City objekterne i Test Fixturen. Brug ovenstående Test Fixture til at lave en mere omfattende aftestning af de metoder, som I har lavet for Country og City klasserne. 4

Opgave 8 Download BlueJ projektet NordicTraveller (zip) og tilføj de fire klasser, som I selv har lavet til projektet (CGTest ligger der allerede). Tilføjelsen gøres ved at kopiere filerne City.java, Road.java, Country.java og Position.java (fra jeres gamle projektfolder) ind i den nye projektfolder (mens BlueJ er lukket). Det nye projekt indeholder følgende klasser: Game styrer interaktionen mellem spillere, byer og lande. GUI indeholder den grafiske brugergrænseflade (hvor man kan se landene, byerne, vejene imellem dem og spillernes positioner). Generator skaber et Game objekt samt en række lande og byer, samt forbindelser mellem disse. Settings gemmer de forskellige options, som brugeren kan sætte. Player repræsenterer den spiller, der styres af brugeren via musen og den grafiske brugergrænseflade. RandomPlayer repræsenterer en computerstyret spiller, der altid vælger en tilfældig vej. GreedyPlayer repræsenterer en computerstyret spiller, der altid vælger den vej, hvor destinationsbyen har højest værdi. SmartPlayer repræsenterer en computerstyret spiller, der vælger den vej, der på sigt giver flest penge. CGTest indeholder en Test Fixture til konstruktion af et simpelt netværk (som beskrevet i foregående opgave). Test Fixturen er lidt forskellig fra den, som I brugte i opgave 7, idet den nu også indeholder et Game objekt. Tester indeholder en klassemetode til automatisk test af jeres kode. Ovenstående klasser må I kun modificere, når I får eksplicit besked herom. I skal nu modificere Country klassen. Tilføj en ny feltvariabel game af type Game og implementér nedenstående accessor og mutator metoder: Game getgame() void setgame(game game) Modificér dernæst bonus metoden, så de tilfældige værdier beregnes via det Random objekt, der er skabt af det Game objekt, som game refererer til. Dette kan fra Country klassen tilgås via metodekaldet: game.getrandom() Hvis I har kodet jeres fire klasser korrekt, kan det samlede projekt nu kompileres. Opgave 9 Kald klassemetoden creategameboard i GUI klassen. Metoden opretter de nødvendige lande, byer og veje, og I vil nu se nedenstående vindue med et kort over Norden (nogle af vejene er færgeruter). Man starter et spil ved at trykke på New game knappen. Spillet kan på ethvert tidspunkt pauseres ved at trykke på Pause game knappen. Teksten på knappen skifter så til Resume game, og et nyt tryk på knappen genoptager spillet. Spillet kan afbrydes ved at trykke på Abort game knappen. Spillets hastighed (dvs. hvor hurtigt spillerne bevæger sig) kan styres ved at klikke på Game speed knapperne i nederste højre hjørne. 5

De store cirkler repræsenterer byer. Farven i cirklen angiver byens værdi med følgende indkodning: Når musen placeres oven på en by, kan man (over Game speed knapperne) se navnet på byen, samt dens præcise værdi. Stregerne mellem byerne angiver veje (eller færgeruter), og man kan beregne længden af en vej ved at tælle antallet af prikker på vejen og lægge 1 til. De små cirkler angiver spillere. Ude til venstre kan man se nogle aflange rektangler, der angiver, hvor mange penge, hver spiller har indsamlet. Farverne på rektanglerne matcher farverne på spillernes cirkler. Det mørkeblå rektangel i øverste venstre hjørne viser, hvor meget tid, der er tilbage i spillet. Når tiden udløber, kan ingen spillere længere bevæge sig, og vinderen er den med flest penge. Den røde spiller (GUI Player) styres af den person, der spiller, mens de øvrige spillere styres af programmet. Man styrer den røde spiller ved at klikke på byer. Hvis den røde spiller befinder sig mellem to byer, vil et klik på en af disse byer, få spilleren til at bevæge sig mod den angivne by. Hvis den røde spiller befinder sig i en by, vil et klik på en naboby, få spilleren til at bevæge sig mod den angivne by (forudsat, at der findes en direkte vej mellem de to byer). 6

Options knappen i nederste højre hjørne åbner nedenstående dialogboks, hvori man kan foretage forskellige valg. De aktuelle valg huskes fra spil til spil (også selv om programmet lukkes ned i mellemtiden). Man kan blandt andet vælge, hvilke automatiske spillere man vil kæmpe imod. Random Player vælger en tilfældig vej, Greedy Player vælger den vej, hvor destinationsbyen har højest værdi, mens Smart Player vælger den vej, der på sigt giver flest penge. Man kan ikke trykke på Options knappen, mens et spil er i gang. Opgave 10 I skal nu afprøve, om de klasser, som I har programmeret, fungerer korrekt. Kald klassemetoden performtest i Tester klassen. Metoden: afvikler et spil (med høj hastighed og forudbestemte tilfældige valg, dvs. fast seed værdi), kontrollerer at alle byer og alle spillere har de rigtige værdier undervejs. Hvis alle værdier er korrekte returneres true, ellers returneres false. I sidstnævnte tilfælde udskrives den førstfundne fejl på terminalen. Hvis testmetoden returnerer false, skal I gennemgå jeres kode og rette den til, så testmetoden kommer til at returnere true. Bemærk, at performtest forudsætter, at I ikke laver unødvendige kald af metoderne i Random objektet. Hvis f.eks. bonus metoden laver to kald af nextint for a beregne bonussen, vil de pseudotilfældige tal komme ud af sync, og performtest vil fejle. I skal også teste jeres projekt ved hjælp af et automatisk debugningsværktøj, som vi har udviklet til formålet. Det udfører ovennævnte test, samt nogle forprogrammerede regressiontests. Hvis der er fejl i projektet, skal I forsøge at rette disse. Afprøv spillet Spil nogle spil og afprøv de forskellige faciliteter i spillet. Prøv at finde nogle gode strategier for at samle flest mulige penge sammen. I de næste afleveringer skal I: Dokumentere jeres klasser, konstruktører og metoder samt lave automatiske regression tests for alle konstruktører og metoder (Computerspil 2). Bruge nedarvning og dynamic method binding til at strukturere jeres kode, således at der er flere forskellige slags lande og flere forskellige slags byer (Computerspil 3). Udvide den grafiske brugergrænseflade med nogle ekstra knapper, labels og tekstfelter (Computerspil 4). Lave automatisk logning af et spil ved at gemme en passende tekstfil, der så senere kan genindlæses og afspilles for at genskabe det optagne spil (Computerspil 5). 7