Een inleiding in de Unified Modeling Language 67



Vergelijkbare documenten
Vakgroep CW KAHO Sint-Lieven

20 Ideeën met speelkaarten

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Functioneel programmeren

BEGINNER JAVA Inhoudsopgave

Patience spelen AaNn Patience betekent geduld.

Klaverjassen, het spel...

extra oefening algoritmiek - antwoorden

Lessen Java: Reeks pag. 1

Inkapseling 173. We zijn bij de laatste gekomen van de drie steunpilaren van het objectgeoriënteerde programmeren, namelijk:

Uitwerking Tweede deeltentamen Imperatief programmeren - versie 1 Vrijdag 21 oktober 2016, uur

Programmeren (1) Examen NAAM:

Kennismaking met programmeren

Verzamelingen, Lijsten, Functioneel Programmeren

Datastructuren: stapels, rijen en binaire bomen

2 OBJECTGEORIËNTEERDE BASISBEGRIPPEN.

Les 1. Het klaverjas spel wordt gespeeld met 32 speelkaarten, van de 7 oplopend tot en met de aas.

VAN BEGINNER TOT WINNER GIJSBERT OONK

INFORMATICA 1STE BACHELOR IN DE INGENIEURSWETENSCAPPEN

Programmeerproject: rapportering fase II

Lab Webdesign: Javascript 7 april 2008

Het kaartspel "Wippen"

Java spiekbrief. Commentaar. Definitie van een methode. Types. Variabelendeclaratie. Definitie van een klasse. Namen. Definitie van een veld

SPELREGELS KLAVERJASSEN CVVB

Practicumopgaven Gerrit-Jan Jansen & Mark Meertens

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, uur

Maak zelf een algoritme wanneer je een auto kunt winnen en welke auto je wint.

Rage Rage Spelidee. Spelmateriaal. Voorbereiding van het spel. Spelverloop. 1) Uitdelen van de kaarten.

Het handboek van Luitenant Skat

Dynamische webapplicaties in Java

Modelleren en Programmeren

Tentamen in2705 Software Engineering

Derde deeltentamen Gameprogrammeren Vrijdag 7 november 2014, uur

Een gelinkte lijst in C#

Programmeermethoden. Pointers. Walter Kosters. week 10: november kosterswa/pm/

Onafhankelijke verzamelingen en Gewogen Oplossingen, door Donald E. Knuth, The Art of Computer Programming, Volume 4, Combinatorial Algorithms

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren

Bridge in een flits 1 De basisregels

Stel dat u 15 tellers nodig heeft. Dat kunt u een array van tellers als volgt declareren:

6 Toepassingsvoorbeelden

Programmeren in C# Klassen schrijven

Online c++ leren programmeren:

oefening JavaScript - antwoorden

Spelregels voor 4 personen KAART EN SPELAVOND Initiatie Manillen. Jenthe Soenens. Club 250 Ouderraad Sint-Lodewijkscollege Spoorwegstraat 1

WEES OP JE HOEDE. De beurt van de speler is voorbij wanneer hij;

De kleur op zich maakt niet uit voor elk van die paren, maar er is wel verschil in waarde tussen ongelijke/gelijke

Leren Programmeren met Visual Basic 6.0 Les 3+4. Hoofdstuk 4 : De Selectie

Bieden (kaartspel) Inhoud. Spelregels. Delen. Bieden. Spelverloop

SQL datadefinitietaal

T-Rex Hans im Glück, 1999 KUHN Hanne & KUHN Wilfried spelers vanaf 10 jaar ± 45 minuten

Graphics. Small Basic graphics 1/6

3. Structuren in de taal

Javascript oefenblad 1

Programmeren 1 20 januari 2012 Prof. T. Schrijvers

Elke groep van 3 leerlingen heeft een 9 setje speelkaarten nodig: 2 t/m 10, bijvoorbeeld alle schoppen, of alle harten kaarten.

Een eenvoudig algoritme om permutaties te genereren

Datastructuren: stapels, rijen en binaire bomen

NAAM: Programmeren 1 Examen 29/08/2012

INHOUD. 50 speelkaarten:

[13] Rondjes draaien (loops)

Dergelijke functionaliteit kunnen we zelf ook aan eigen code toevoegen.

Tentamen Objectgeorienteerd Programmeren TI februari Afdeling ST Faculteit EWI TU Delft

Reglement Diksmuidse zevenkamp caféspelen

6 Nimmt! Geen kaartspel voor stommelingen! Uitgever : Amigo, 1995 Auteur : KRAMER Wolfgang Spelers : spelers vanaf 10 jaar Duurtijd : ± 45

Project 2: LOTTO simulatie Programmeren I

Verslag. Projectteam: 107 Datum: 16 oktober 2008 Project leden: Lennard Fonteijn Harish Marhe Nicoletta Saba Turgay Saruhan Robin Tummers

HOOfDsTuk 1 Objecten en klassen

Een fragment wordt afgeleid van de basis klasse "Fragment".

Voor vragen: of mail naar

Marsha J. Falco. Een sterk visueel spel voor 1-8 spelers.

Lab Webdesign: Javascript 3 maart 2008

Uitgebreide uitwerking Tentamen Complexiteit, mei 2007

De laatste les. Samenvatting van de voorbereiding. Inleiding. Beknopte lijst van tien activiteiten

Les 1a. De regels. vormgeving: Ton Walbeek

Programmeren: Visual Basic

Verzamelingen, Lijsten, Functioneel Programmeren

Modelleren en Programmeren

Wiezen. Spelregels Volgens Café In de Goude Ster

EXAMEN CLUBLEIDER B (CLB)

Hoofdstuk 9: Menu s toevoegen

Verzamelingen, Lijsten, Functioneel Programmeren

Practicumopgave 3: SAT-solver

Syntax- (compile), runtime- en logische fouten Binaire operatoren

Programmeren A. Genetisch Programma voor het Partitie Probleem. begeleiding:

Haskell: programmeren in een luie, puur functionele taal

Objectgeoriënteerd Programmeren: WPO 2

Noties Informatica. In java fungeren objecten als een model voor de elementen waarin een probleem kan worden opgesplitst

Modelleren en Programmeren

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010

Spel rond organische chemie

Een inleiding in de Unified Modeling Language 79

Ontwerp van Informatiesystemen

In BlueJ. Doe onderstaande met muis/menu s:

Zelftest Programmeren in Java

Java spiekbrief. Commentaar. Definitie van een methode. Types. Variabelendeclaratie. Definitie van een klasse. Namen. Definitie van een veld

Doel. Spelopzet. Inhoud. A) Elke speler krijgt: B) Zak van de Bank. C) Transactiekaarten. D) Geheime «waarde» kaarten

1. Open de Bibliotheek verkenner. Dit kunt u in de Lint modus doen via View, de groep Toon, Bibliotheek Verkenner.

1.0 Algemeen 2.0 Het bieden 3.0 Het spelen 4.0 De puntentelling 1.0 Algemeen

Transcriptie:

Een inleiding in de Unified Modeling Language 67 1.4.5. Toepassing 5: Klasse Kaart. De opdracht bestaat erin algemene klassen te maken zodanig dat het mogelijk wordt om het even welk kaartspel te maken. Wat kunnen we nu in het algemeen zeggen over kaartspelen die met een standaardpak pokerkaarten worden gespeeld? We kunnen het best bij de stapel kaarten zelf beginnen. Een standaardkaartspel bevat 52 kaarten. U kunt de hele stapel kaarten schudden en u kunt een kaart op een willekeurige plaats uit de stapel nemen. U kunt een kaart ook weer op een willekeurige plaats in de stapel terug stoppen. Elke andere manier voor het trekken van een kaart is gewoon een gespecialiseerde manier van het op een willekeurige plaats uit de stapel nemen van een kaart. Wat kunnen we verder over de kaarten zelf zeggen? Alle kaarten delen een algemene structuur. Elke kaart heeft een kleur: ruiten, harten, schoppen of klaveren. Elke kaart heeft ook een waarde: 2-10, boer, vrouw, koning of aas. De ene kaart verschilt alleen van de andere in de waarde van deze twee eigenschappen. Kaarten doen in de echte wereld zelf niet echt veel. Een kaart toont gewoon zijn kleur en zijn waarde. Een kaart heeft wel een toestand: met het gezicht naar boven of naar onderen. Een pak speelkaarten doet ook niet veel in de echte wereld. Het is in plaats daarvan de kaartgever die al het werk voor het schudden en het uitdelen doet. De stapel bevat gewoon alleen de speelkaarten. U kunt, tenzij u vals speelt, nooit de onderkant van een kaart zien tot u die kaart toegespeeld krijgt. U kunt ook geen kaarten invoegen die geen deel uitmaken van het spel. Een kaart zal in de computerwereld zijn kleur, waarde en toestand onthouden. Een kaart zal in een eenvoudig programma ook weten hoe deze zichzelf weergeeft. Een stapel kaarten zal de kaarten maken en bewaren. De kaartgever zal tenslotte weten hoe de kaarten geschud worden en hoe een kaart wordt uitgedeeld. Voor het genereren van willekeurige getallen maken we gebruik van de random( )-, die zal goed van pas komen voor het schudden van de kaarten. Deze levert een waarde tussen 0 en 1 en (geheel getal) (random ( ) * 52) levert bijvoorbeeld een getal tussen 0 en 51. Denk na over welke klassen u nodig heeft en hoe ze met elkaar in verband staan. Duid dit aan in een klassediagram. U moet dan een kleine main ( ) schrijven die de kaartgever en uw stapel kaarten instantieert, de kaarten schudt, een aantal kaarten aan een speler geeft en dan die kaarten toont. Oplossingen en bespreking We maken drie klassen: de klasse Kaart, de klasse SpelKaarten en KaartGever. Klassediagram: SpelKaarten 1 52 Kaart stapel beheerder KaartGever

Een inleiding in de Unified Modeling Language 68 Klasse Kaart: Uit de tekst kunnen volgende zelfstandige naamwoorden bij kaart gerangschikt worden: kleur, waarde en toestand. Een kaart moet zichzelf kunnen tonen, zijn toestand kunnen weergeven, ook de mogelijkheid om een kaart zich zichtbaar en onzichtbaar te stellen. We leggen eerst constanten vast die niet meer veranderen voor het instantiëren van kaartkleuren en -waarden. Constanten : RUITEN = 4 HARTEN = 3 SCHOPPEN = 6 KLAVEREN = 5 TWEE = 2 DRIE = 3 VIER = 4 VIJF = 5 ZES = 6 ZEVEN = 7 ACHT = 8 NEGEN = 9 TIEN = 10 BOER = 74 KONINGIN = 84 KONING = 75 AAS = 65 Kaart - waarde : geheel getal - kleur : geheel getal - toestand : boolean Kaart( I: cwaarde, ckleur: gehele getallen) + Kaart(cwaarde: geheel getal, ckleur: geheel getal) + getwaarde( ): geheel getal + getkleur( ): geheel getal + gettoestand( ):boolean - setwaarde(mwaarde: geheel getal): void - setkleur(mkleur: geheel getal): void - settoestand(mtoestand: boolean):void + zichtbaar( ): void + onzichtbaar( ):void + iszichtbaar( ): boolean + toon( ): String constructor gedefinieerd zijn in een klasse met dezelfde naam De eigenschappen waarde en kleur krijgen de inhoud van cwaarde en ckleur.

Een inleiding in de Unified Modeling Language 69 setwaarde( ), setkleur( ) setwaarde(cwaarde) setkleur(ckleur) getwaarde( I: / U: waarde2: geheel getal) accessor De eigenschap waarde bestaat. De inhoud van de eigenschap waarde wordt geretourneerd. waarde2=waarde getkleur ( I: / U: kleur2: geheel getal) accessor De eigenschap kleur bestaat. De inhoud van de eigenschap kleur wordt geretourneerd. kleur2=kleur gettoestand( I: / U: toestand2: boolean) accessor De eigenschap toestand bestaat. De inhoud van de eigenschap toestand wordt geretourneerd. toestand2= toestand setwaarde ( I: mwaarde: geheel getal) U:/) mutator In de klasse bestaat een eigenschap die de waarde voorstelt. Aan de eigenschap waarde wordt de inhoud toegewezen, dat de invoervariabele mwaarde van deze mutator bevat. /

Een inleiding in de Unified Modeling Language 70 waarde = mwaarde setkleur ( I: mkleur: geheel getal) U:/) / kleur = mkleur mutator In de klasse bestaat een eigenschap die de kleur voorstelt. Aan de eigenschap kleur wordt de inhoud toegewezen, dat de invoervariabele mkleur van deze mutator bevat. settoestand ( I: mtoestand: boolean U:/) / mutator In de klasse bestaat een eigenschap die de toestand voorstelt. Aan de eigenschap toestand wordt de inhoud toegewezen, dat de invoervariabele mtoestand van deze mutator bevat. toestand = mtoestand zichtbaar ( I: / U: /) De eigenschap toestand bestaat. De inhoud van de eigenschap toestand wordt true gesteld. settoestand( ) settoestand(true) onzichtbaar ( I: / U: /)

Een inleiding in de Unified Modeling Language 71 De eigenschap toestand bestaat. De inhoud van de eigenschap toestand wordt false gesteld. settoestand( ) settoestand(false) iszichtbaar ( I: / U: toestand2: boolean) De eigenschap toestand bestaat. De inhoud van de eigenschap toestand wordt weergegeven. gettoestand( ) toestand2 = gettoestand( ) toon ( I: / U: toonwaarde: String) De waarde van de kaart wordt in woorden weergegeven. toonwaarde = String.valueOf( (char) waarde) // geeft de naam van de constante weer die de waarde voorstelt ALS (kleur) = RUITEN : toonwaarde = RUITEN + toonwaarde = HARTEN : toonwaarde = HARTEN + toonwaarde = SCHOPPEN : toonwaarde = SCHOPPEN + toonwaarde = KLAVEREN : toonwaarde = KLAVEREN + toonwaarde -ALS De definitie van de klasse Kaart begint met het definiëren van een paar constanten. Deze constanten sommen de geldige waarden en kleuren voor kaarten op. U zult opmerken dat de waarde van een kaart niet meer veranderd kan worden als deze eenmaal is geïnstantieerd (merk op dat de mutators privaat zijn; een andere mogelijkheid bestaat erin geen mutators te definiëren). Instanties van Kaart zijn onveranderlijk. Het onveranderlijk maken van de kaart betekent dat niemand de waarde van een kaart later op een verkeerde manier kan veranderen. Een onveranderlijk (of immutable) object is een object waarvan de toestand niet meer verandert als het object eenmaal is gemaakt.

Een inleiding in de Unified Modeling Language 72 De klasse Kaart is verantwoordelijk voor het onthouden van zijn kleur en zijn waarde. De kaart weet ook hoe deze een String-representatie van zichzelf moet leveren. Klasse SpelKaarten De klasse SpelKaarten is verantwoordelijk voor het instantiëren van de kaarten en het daarna leveren van toegang tot de kaarten. Het SpelKaarten levert n voor het ophalen en terugstoppen van kaarten. Hierbij wordt gebruik gemaakt van een gekoppelde lijst of in Java-termen LinkedList uit de Java.util bibliotheek en de verschillende n van zo n LinkedList. SpelKaarten - spelkaarten : java.util.linkedlist + SpelKaarten( ) + get(index : geheel getal): Kaart +replace(index : geheel getal, kaart: Kaart) : void + size( ): geheel getal + removefromfront( ) : Kaart + returntoback(kaart : Kaart) : void - buildkaarten( ) : void SpelKaarten( I:/) constructor gedefinieerd zijn in een klasse met dezelfde naam Er wordt een spel met 52 kaarten gemaakt buildkaarten( ) buildkaarten( ) get ( I: index : geheel getal U:kaart2 : Kaart) De kaart met de opgegeven index wordt geretourneerd get( )- van de LinkedList, size( ) ALS (index< spelkaarten.size( ) ) DAN kaart2 = (Kaart) spelkaarten.get(index) ANDERS

Een inleiding in de Unified Modeling Language 73 kaart2 = null -ALS-DAN replace ( I: index : geheel getal, kaart : Kaart U: /) De kaart wordt in het spelkaarten op de positie index geplaatst. set( )- van de LinkedList spelkaarten.set( index, kaart ) size ( I: / U: grootte : geheel getal) Levert de grootte van het spelkaarten. size( )- van de LinkedList grootte = spelkaarten.size( ) removefromfront ( I: / U: kaart2 : Kaart) De eerste kaart, vooraan, van het spelkaarten wordt verwijderd. removefirst( )- van de LinkedList, size( ) ALS(spelKaarten.size( )>0) DAN kaart2 = (Kaart) spelkaarten.removefirst( ) ANDERS kaart2 = null -ALS-DAN returntoback ( I: kaart : Kaart U: /)

Een inleiding in de Unified Modeling Language 74 De kaart wordt achteraan aan het spelkaarten toegevoegd. add( )- van de LinkedList spelkaarten.add(kaart) buildkaarten (I: / U: /) Er wordt een volledig spelkaarten gemaakt. add( )- en LinkedList( )-constructor van de LinkedList, de constructor Kaart( ) van de klasse Kaart spelkaarten = nieuw java.util.linkedlist( ) Klasse KaartGever spelkaarten.add(nieuw Kaart(Kaart.TWEE,Kaart.RUITEN)) spelkaarten.add(nieuw Kaart(Kaart.DRIE, Kaart.RUITEN)) spelkaarten.add(nieuw Kaart(Kaart.VIER, Kaart.RUITEN)) spelkaarten.add(nieuw Kaart(Kaart.VIJF, Kaart.RUITEN)) // volledige definitie ingekort om redenen van beknoptheid De kaartgever is verantwoordelijk voor het schudden en het uitdelen van de kaarten. KaartGever - spelkaarten : SpelKaarten + KaartGever( s : SpelKaarten) + schudden( ) : void + uitdelen( ): Kaart + setspelkaarten(mspelkaarten : SpelKaarten):void KaartGever( I: s : SpelKaarten) setspelkaarten( ) constructor gedefinieerd zijn in een klasse met dezelfde naam Aan de eigenschap spelkaarten wordt de inhoud toegewezen van s.

Een inleiding in de Unified Modeling Language 75 setspelkaarten( s ) setspelkaarten ( I: mspelkaarten : SpelKaarten U:/) / mutator In de klasse bestaat een eigenschap die het spelkaarten voorstelt. Aan de eigenschap spelkaarten wordt de inhoud toegewezen, dat de invoervariabele mspelkaarten van deze mutator bevat. spelkaarten = mspelkaarten schudden ( I: / U:/) Gegevens: Het spelkaarten wordt volledig door elkaar geschud. size( ), get( ), replace( ) van de klasse SpelKaarten; random( ) van de klasse Math aantalkaarten, i, index : gehele getallen kaart_i, kaart_index : Kaart aantalkaarten = spelkaarten.size( ) i = 1 ZOLANG( i <= aantalkaarten ) DOE index = (geheel getal) (random ( ) * aantalkaarten) kaart_i = (Kaart) spelkaarten.get( i ) kaart_index = (Kaart) spelkaarten.get( index ) spelkaarten.replace(i, kaart_index) spelkaarten.replace(index, kaart_i) i = i+1 -ZOLANG-DOE uitdelen ( I: / U:kaart2 : Kaart) Het spelkaarten wordt uitgedeeld.

Een inleiding in de Unified Modeling Language 76 Gegevens: removefromfront( ), size( ) van de klasse SpelKaarten ALS( spelkaarten.size( ) > 0) DAN kaart2 = spelkaarten.removefromfront( ) ANDERS kaart2 = null -ALS-DAN De kaartgever is verantwoordelijk voor het schudden en het uitdelen van de kaarten. Deze implementatie van KaartDeler is eerlijk. Een andere implementatie van KaartDeler zou kaarten vanaf de onderkant van de stapel kunnen uitdelen! De drie klassen hebben allemaal een duidelijk gescheiden verantwoordelijkheid. De Kaart representeert pokerkaarten. Het SpelKaarten bewaart de stapel kaarten en de KaartDeler deelt de Kaarten uit. Deze drie klassen verbergen ook allemaal hun implementatie. Er is nergens aan te zien dat het SpelKaarten feitelijk een LinkedList met kaarten bevat. Kaart mag dan wel een aantal constanten definiëren, maar dat brengt de integriteit van zijn implementatie niet in gevaar, want het staat de Kaart vrij deze constanten op elke gewenste manier te gebruiken. Het staat de Kaart ook vrij de waarden van deze constanten op elk gewenst moment te veranderen. De buildkaarten( ) van het SpelKaarten brengt wel een tekortkoming van het verbergen van de implementatie aan het licht. U zou kaarten met de waarde 2-10 in een ZOLANG-DOE-lus kunnen instantiëren. Als u de constanten bekijkt, dan ziet u dat TWEE tot en met TIEN opeenvolgend van twee tot tien tellen. Een dergelijke lus is veel eenvoudiger dan het individueel instantiëren van elke kaart. Een dergelijke aanname betekent echter dat u zich vastlegt op de huidige waarden van de constanten. U mag het uw programma niet toestaan er afhankelijk van te worden dat een bepaalde constante een bepaalde waarde heeft. U moet in plaats daarvan blind gebruikmaken van de constante door Kaart.TWEE, Kaart.DRIE enzovoort aan te roepen. U mag geen enkele soort aanname over de waarde van de constante maken. Kaart zou de waarden van de constanten op elk willekeurig moment kunnen herdefiniëren. Het is in het geval van buildkaarten( ) makkelijk in de verleiding te komen de waarden van de constanten rechtstreeks te gebruiken. Het contract tussen Kaart en de gebruiker van de constanten van Kaart bestaat hier uit de namen van de constanten en niet uit hun onderliggende waarden. In een hoofdprogramma kunnen we nu een spel schrijven: de kaartgever schudt de kaarten en geeft aan de speler zoveel kaarten als hij wilt. De kaarten worden getoond op het scherm. De som van de waarden worden opgeteld. De waarden hoeven niet noodzakelijk overeen te komen met de waarden achter de constanten.(vb kaarten van 2 tot 10 hebben hun cijferwaarden, BOER = 1, KONINGIN = 2, KONING = 3 en AAS = 11) Spel

Een inleiding in de Unified Modeling Language 77 Gegevens: main-functie De klassen Kaart, SpelKaarten en KaartGever bestaan. Er wordt een spelkaarten en een kaartgever gemaakt. De kaartgever schudt de stapel kaarten en geeft de speler zoveel kaarten als hij wilt. De som van de waarden wordt gemaakt, volgens de vastgelegde waarden (vb kaarten van 2 tot 10 hebben hun cijferwaarden, BOER = 1, KONINGIN = 2, KONING = 3 en AAS = 11) De klassen Kaart, SpelKaarten en KaartGever waarde = reëel getal spelkaarten = SpelKaarten kaartgever = KaartGever kaart = Kaart antw = karakter waarde = 0 spelkaarten = nieuw SpelKaarten( ) kaartgever = nieuw KaartGever(spelkaarten) kaartgever.schudden( ) VOERUIT(Scherm, Wilt u een kaart? ) VOERIN(Klavier,antw) ZOLANG(antw= j ) DOE kaart = kaartgever.uitdelen( ) kaart.zichtbaar( ) VOERUIT(Scherm, Dit is de kaart:, kaart.toon( )) ALS(kaart.getWaarde( )) = TWEE : waarde = waarde + 2 = DRIE : waarde = waarde + 3 = VIER : waarde = waarde + 4 = VIJF : waarde = waarde + 5 = ZES : waarde = waarde + 6 = ZEVEN : waarde = waarde + 7 = ACHT : waarde = waarde + 8 = NEGEN : waarde = waarde + 9 = TIEN : waarde = waarde + 10 = BOER : waarde = waarde + 1 = KONINGIN : waarde = waarde + 2 = KONING : waarde = waarde + 3 = AAS : waarde = waarde + 11 -ALS VOERUIT(Scherm, Wilt u een kaart? ) VOERIN(Klavier,antw) -ZOLANG-DOE VOERUIT(Scherm, De totale waarde van uw kaarten =, waarde)