Research and Development 1/^Archief/2009-2010/07/Pilot/Klassen
Deze pagina gaat over de Java-klassen die we nodig zullen hebben.
Inhoud
Grote Lijnen
De klasse die het geheel controleert en overziet wordt de Game-klasse. Een Speler-klasse heeft dus een naam, krijgt een beurt en heeft een type (aanvaller/verdediger/manager). De hoofdklasse Unit bevat alle eenheden, dus Infantry/Vehicle/Etc. Misschien zijn er geen subklassen hiervoor nodig maar dat moeten we nog bekijken.
De UI wordt geregeld door twee klassen. De ene klasse (Console) regelt de in en uitvoer van het consolevenster en de andere klasse (Canvas) geeft een map van het spel op het scherm weer. Deze UI klassen ontvangen en sturen gegevens van en naar de Game-klasse. Canvas ontvangt de huidige status van de map om weer te geven en Console de eventuele zinnen die in het consolevenstertje moeten worden weergeven. Console stuurt ook de commandos die een gebruiker heeft ingevoerd naar de Game klasse, die ze dan kan uitvoeren. We gebruiken nu voor het gemak System.out.println(...) en een Scanner. Later zullen we dit veranderen in een Console klasse.
We hebben ook een Building klasse voor gebouwen. Turret moet waarschijnlijk een aparte klasse worden, misschien met een apart tekentje op de kaart. Elk Building moet ook een lijst hebben van eenheden (dus een Army) dat daar gestationeerd is.
Er is ook de klasse Army die een leger van Units representeert. Een Army behoort tot de verdediger dan wel de aanvaller van een team.
Verder hebben we een klasse Resource nodig, die resource-ontginbare plekken op de kaart representeert.
De Game klasse moet over al deze spelrelevante klassen kunnnen beschikken en deze manipuleren.
Command
Deze klasse is puur voor het representeren van een Commando, met een paar string-attributen en meer niet. CommandInterpreter gebruikt deze.
Moet weten:
- De commandonaam, aantal parameters en van welke soort deze zijn, de help en usage strings.
Moet kunnen:
- Al deze informatie doorgeven.
CommandInterpreter
Deze klasse leest alle bekende commandos uit een file en stopt ze in een lijst van Commandos. Daarna kan er een string aan doorgegeven worden met een functie, waarna deze geinterpreteerd wordt door het op te zoeken en alle parameters in te lezen en op te slaan.
Moet weten:
- Het laatst ingevoerde commando. Dit ontvangt hij dus van de UI.
Moet kunnen:
- Het laatst ingevoerde commando kunnen interpreteren. Dit betekent dus: Controleren of het commando een commando dan wel een textbericht is, het eerste woord uit het commando interpreteren als commandonaam en alle volgende interpreteren als parameters. Als er een verkeerd type parameter of iets dergelijks gebeurt, kan hij dit aan de UI doorgeven dat er een fout commando is ingevoerd.
Empty
Representeerd niks op de map. Wordt gebruikt door de Map om lege vakken te representeren.
TextIO
Bevat methoden om dingen weer te geven en aan de gebruiker te vragen. Game gebruikt deze.
Moet kunnen:
- Bij een functieaanroep de gebruiker om een invoerregel vragen
- Bij een functieaanroep een zin (of meerdere) doorgeven
Canvas
Behoudt een Map en tekent deze telkens als hij verandert. Wordt geinstantieerd door Game, verder wordt zijn update-functie na elk commando aangeroepen.
Moet weten:
- Een Map om weer te geven
- Dimensies van het venster
Moet kunnen:
- Een Map ontvangen, en deze weergeven
Map
Gebruikt een MapReader om een bepaald mapfile in te lezen, en maakt dan het terrein aan. Wordt alleen gebruikt om een tekening weer te geven, en om het terrein bij te houden.
Moet weten:
- Een matrix met het terreintype
- Een matrix met alle objecten (gebouwen, legers)
- De lengte/breedte van deze matrixes
- Een enumeratie met mogelijke dingen die in een gridvakje kunnen staan (Leeg veld, Obstakel, Grondstoffenplek, Basisgebied voor Team1, Basisgebied voor Team2)
Moet kunnen:
- Zichzelf genereren uit een string gekregen van MapReader
- (Eventueel nog doen) Zichzelf willekeurig genereren met een gegeven breedte, grondstoffenconcentratie, basisgrootte etc.
- Een GameObject kunnen verplaatsen naar x of y, voor het bijhouden van de map
- De matrixes kunnen doorgeven aan andere klassen
- Doorgeven wat er precies op een gespecifieerd vak staat
MapReader
Wordt aangeroepen door Map voor het inlezen van een mapbestand, en dan alle strings door te sturen naar de Map zodat deze zich kan genereren.
Moet weten:
- Een folder waar alle mapbestanden instaan
Moet kunnen:
- Een gegeven Naam kunnen lezen uit deze folder en de informatie doorspelen
GameObject (interface)
Interface voor GameObjecten die op de map kunnen voorkomen, zoals Buildings, Armies en Lege objecten.
Abstracte Methoden:
- Soort GameObject: enum Kind {Army, Building, Nothing, etc..}
- Een boolean methode die zegt of het object verplaatsbaar is op de map
- getKind: De soort van dit object doorgeven
- getPlayerRef: De eigenaar van dit object doorgeven
- getX: De x-coordinaat van de plek waar het object op de map staat doorgeven
- getY: De y-coordinaat van de plek waar het object op de map staat doorgeven
- setX: De x-coordinaat van de plek waar het object op de map staat veranderen
- setY: De y-coordinaat van de plek waar het object op de map staat veranderen
Unit
Klasse die een eenheid representeerd, met een naam, stats en gezondheid. De bouwstenen van legers. Wordt ingelezen uit een bestand door een ObjectManager.
Moet weten:
- De naam (dus eigenlijk een soort identifier)
- Beschrijvingsstring voor uitvoer
- Stats (Loopsnelheid, Vuurkracht, Defense, Kosten, Grootte)
Moet kunnen:
- De naam en stats doorgeven
Army (implements GameObject)
Klasse voor het bijhouden van een enkel leger, met een lijst van Units. Deze klasse kan een Army of Building ontvangen en hier dan mee vechten tot er 1 de winnaar is. Game houdt alle Armies van het spel bij.
Moet weten:
- Een array van Units waar dit Army uit opgebouwd is
- Het type van dit Army (Verdediger/Aanvaller)
- De eigenaar van dit Army (Een Player dus)
- De plaats van dit leger op de kaart. Default is dit bij het hoofdgebouw van dat team.
- De maximale grootte van dit leger, in grootte-units (dus niet aantal eenheden; een tank is uiteraard groter dan een soldaat)
- Of het al gespot is door de vijand en met welke grootte dit was
Moet kunnen:
- De totale sterkte van dit leger berekenen uit de stats van de units
- De totale verdedigingskracht van dit leger berekenen uit de stats van de units
- Het type, de eigenaar en de Unit-array doorgeven
- De minimale loopsnelheid uit alle Units nemen en deze doorgeven
- Een Unit, of lijst, ontvangen om aan dit leger toe te voegen
- Een Unit, of lijst, ontvangen om uit dit leger te verwijderen
- Een Army ontvangen om tegen te vechten, en dan te bepalen wie de winnaar is
- Een Building ontvangen om tegen te vechten, en dan te bepalen wie de winnaar is
Building (implements GameObject)
Gebouw-klasse. Kent zijn naam, een boel stats en alle legers die momenteel in dit gebouw gestationeerd zijn. Game houdt ook hier een lijst van bij. Wordt net als Unit ingelezen uit een bestand door een ObjectManager.
Moet weten:
- De naam (Dus een soort identifier)
- Beschrijvingsstring voor uitvoer
- Stats (UnitCapaciteit, Defense, Powergeneratie, GrondstoffenCapaciteit, Aanvalskracht, Kosten, ProduceerbareUnits)
- Een array van Unit-namen die dit gebouw kan produceren
- Een Army dat hier eventueel gestationeerd staat (Maximaal 1 dus)
- De Speler waartoe dit gebouw behoort
- Weten of het al gespot is
Moet kunnen:
- Een Army accepteren om in dit gebouw te stationeren, op voorwaarde dat: (1) Het Army overschreidt de UnitCapaciteit van dit gebouw niet en (2) Het Army van hetzelfde Team is
- Alle Stats en de naam kunnen doorgeven aan andere klassen
Game
Klassse die het gehele spel representeerd. Deze klasse regelt alles aan het spel, de instantiatie, het uitvoeren van commandos en het beeindigen van het spel. Houdt TextIO, ObjectManager, Descriptions, en een Map bij om alles goed te kunnen regelen.
Moet weten:
- Een Map van het speelveld
- Een Canvas om op te tekenen
- Teams
- Spelers
- De huidige speler
- Laatst gebruikte lijsten, voor de "interface"
- Een IO-object voor input/output
- Informatie over wat wel en niet mag met bepaalde objecten
Moet kunnen:
- Een spel starten. Dit houdt in: De Map construeren, alle Commandos laten inlezen, alle Stats laten inlezen, de Players en Teams initializeren, en een team de eerste beurt geven.
- Een Player een beurt laten doen. Dit houdt in: Deze Player om een commando vragen, en dan dit commando uitvoeren. Als het commando niet uitgevoerd kan worden, stuur een fout terug en vraag opnieuw.
- Een Commando uitvoeren dus. Dit houdt in: De functie geassocieerd met dit Commando uitvoeren en het resultaat teruggeven. Deze functie moet rekening houden met krijgt de huidige speler, eventuele int parameters en eventuele string parameters mee.
- Bepalen of een Team gewonnen heeft.
Player
Klasse die een speler representeerd. Wordt bijgehouden door Team en verandert door Game. Heeft ook een van de drie types van spelers.
Moet weten:
- De naam
- Het type (Aanvaller, Verdediger, Manager die in een enumeratie zitten)
- Het aantal punten dat deze speler nog heeft om dingen te doen
- Hoeveel geld deze speler heeft
- Bij welk team hij hoort
Moet kunnen:
- Het type en de naam kunnen doorgeven aan andere klassen
- Methodes om het aantal overgebleven punten te managen
- Methodes om het geld te managen
Team
Klasse die een Team dat meespeelt in het spel represnteerd. Houdt 3 spelers en wat teamstats bij. Wordt gebruikt door Game.
Moet weten:
- De teamnaam
- Teamkleur
- Een array van 3 Players
- Hoeveelheid stroom
- Aantal GameObjecten onder dit team
Moet kunnen:
- De Players kunnen doorgeven, eventueel van een bepaald type
- Methodes om de stroom te managen
ObjectManager
Klasse speciaal voor het inlezen en gebruiken van data over de verschillende Units en Buildings. Wordt bijgehouden door Game, en kan een kopie van een Unit of Building leveren zodat deze zich makkelijk kunnen instantieren.
Moet weten:
- Een array van hoofdunits om te kopieeren
- Een array van hoofdgebouwen om te kopieeren
- De paden naar het Building-bestand en het Unit-bestand
Moet kunnen:
- De files lezen, opdelen en de hoofdunits creeeren
- Een naam ontvangen en de hoofdunit hiervan doorspelen
- Een naam ontvangen en het hoofdgebouw hiervan doorspelen
Descriptions
Leest alle objectbeschrijvingen uit een file en geeft ze door als er om wordt gevraagd. Wordt bijgehouden door Game.
Moet kunnen:
- Alle objectbeschrijvingen kunnen lezen uit een bestand
- De beschrijving van een bepaald object doorgeven