Project 2: LOTTO simulatie Programmeren I K. van Assche - H. Gruyaert
1
Inleiding
Schrijf een java programma dat het spel van de nationale loterij, de Lotto simuleert. De communicatie met de gebruiker gebeurt via het console venster; gebruik hiervoor de methode readString() van de klasse Stream. Je programma bestaat uit een 4-tal onderdelen: • je deelname aan het spel via een lottoformulier • de lotto/joker trekking • een simulatie van de totale inzet en daaruit voortvloeiend de te verdelen winst • de winstbepaling van jouw deelname.
2
Je lottoformulier
Een lottoformulier bestaat uit 12 roosters. Elk rooster omvat de getallen 1 tot en met 42. Een deelname is geldig als uit een even aantal roosters een selectie is gemaakt van exact 6 getallen. De prijs per koppel roosters is 1 EURO. Verzorg onderstaande gebruikersinterface (lay-out wijzigt volgens het aantal gewenste roosters) :
LOTTO Kies 6 nummers per rooster. Speel 2, 4, 6, 8, 10 of 12 roosters Hoeveel roosters wens je te spelen? 6 1
+-------------------++-------------------++-------------------+ | 1 2 3 4 5 6 || 1 2 3 4 5 6 || 1 2 3 4 5 6 | | 7 8 9 10 11 12 || 7 8 9 10 11 12 || 7 8 9 10 11 12 | | 13 14 15 16 17 18 || 13 14 15 16 17 18 || 13 14 15 16 17 18 | | 19 20 21 22 23 24 || 19 20 21 22 23 24 || 19 20 21 22 23 24 | | 25 26 27 28 29 30 || 25 26 27 28 29 30 || 25 26 27 28 29 30 | | 31 32 33 34 35 36 || 31 32 33 34 35 36 || 31 32 33 34 35 36 | | 37 38 39 40 41 42 || 37 38 39 40 41 42 || 37 38 39 40 41 42 | +-------------------++-------------------++-------------------+ + + + +-------------------++-------------------++-------------------+ | 1 2 3 4 5 6 || 1 2 3 4 5 6 || 1 2 3 4 5 6 | | 7 8 9 10 11 12 || 7 8 9 10 11 12 || 7 8 9 10 11 12 | | 13 14 15 16 17 18 || 13 14 15 16 17 18 || 13 14 15 16 17 18 | | 19 20 21 22 23 24 || 19 20 21 22 23 24 || 19 20 21 22 23 24 | | 25 26 27 28 29 30 || 25 26 27 28 29 30 || 25 26 27 28 29 30 | | 31 32 33 34 35 36 || 31 32 33 34 35 36 || 31 32 33 34 35 36 | | 37 38 39 40 41 42 || 37 38 39 40 41 42 || 37 38 39 40 41 42 | +-------------------++-------------------++-------------------+ 1 EURO 2 EURO 3 EURO De speler heeft de mogelijkheid om zelf cijfers in te geven, dan wel om de lottoterminal willekeurig getallen te laten kiezen (quick pick). Voorzie de nodige controle op de geldigheid van eigen cijferkeuze. • Quick Pick: Voor quick pick, geef Q. Q +-------------------++-------------------++-------------------+ | . 2 . . . . || . 2 . . 5 . || 1 . 3 . . 6 | | . . 9 . . . || . 8 . . . . || . . . . . 12 | | 13 . 15 . . . || . . . . . . || 13 . . . . . | | . . . . . . || . . . . . . || . . . . . . | | . . . . . 30 || . . 27 . . . || . . . . . . | | . . . . . . || . 32 . . . . || . . . 34 . . | | . 38 . . . . || 37 . . . . . || . . . . . . | +-------------------++-------------------++-------------------+ | . . 3 . . . || . . . . . . || . . . . . 6 | | . . . . 11 . || . . 9 . . 12 || . . . . . 12 | | . . . 16 . . || . . 15 . . . || . . . 16 . . | 2
| . . . . . 24 || . . . . . . || 19 . . . . . | | . 26 . . . 30 || . . . . . . || . 26 . . . . | | . . . . . . || 31 32 33 . . . || . . . . . . | | . . . . . . || . . . . . . || . . . . 41 . | +-------------------++-------------------++-------------------+ • Eigen cijferkeuze: Voor quick pick, geef Q. Welke 6 cijfers wens je te spelen? (Voorzie een spatie tussen de cijfers) rooster1: 1 2 3 4 5 6 rooster2: 10 11 12 13 14 15 rooster3: 42 1 41 2 40 3 rooster4: 6 9 12 15 18 21 rooster5: 9 8 7 6 5 4 rooster6: 12 04 19 05 06 23 +-------------------++-------------------++-------------------+ | 1 2 3 4 5 6 || 1 2 3 . . . || . . . 4 5 6 | | . . . . . . || . . . . . . || 7 8 9 . . . | | . . . . . . || . . . . . . || . . . . . . | | . . . . . . || . . . . . . || . . . . . . | | . . . . . . || . . . . . . || . . . . . . | | . . . . . . || . . . . . . || . . . . . . | | . . . . . . || . . . 40 41 42 || . . . . . . | +-------------------++-------------------++-------------------+ | . . . . . . || . . . . . 6 || . . . 4 5 6 | | . . . 10 11 12 || . . 9 . . 12 || . . . . . 12 | | 13 14 15 . . . || . . 15 . . 18 || . . . . . . | | . . . . . . || . . 21 . . . || 19 . . . 23 . | | . . . . . . || . . . . . . || . . . . . . | | . . . . . . || . . . . . . || . . . . . . | | . . . . . . || . . . . . . || . . . . . . | +-------------------++-------------------++-------------------+ Vervolgens kan de speler een aantal jokers inzetten (max 4). De prijs per joker bedraagt 1,25 EURO. Een jokernummer is een getal dat gegenereerd wordt door de lottoterminal en bestaat uit exact 7 digits. Hoeveel jokers wens je in te zetten? (0, 1, 2, 3 of 4) 2 joker 1: 6569557 joker 2: 5575167 3
Geef vervolgens weer wat de kostprijs is voor de speler zijn deelname: TE BETALEN VOOR DEELNAME: 5.5 EURO
3
De lotto/joker trekking
Bij de lottotrekking worden 6 ballen getrokken en een reservebal. Er wordt ook een jokernummer getrokken. #################### TREKKING ############################## LOTTO: 1 2 3 28 37 41 ( reserve = 31) JOKER: 1762567 #################### TREKKING ##############################
4
Simulatie van inzet en te verdelen winst
Simuleer een totale inzet tussen de 1 miljoen en 10 miljoen euro. Het totaal uit te keren bedrag is vastgelegd op 47% van de totale inzet. Elke speler met 3 juiste cijfers krijgt 2.5 EURO winst uitbetaald. Simuleer een aantal spelers met 3 juiste cijfers tussen de 10.000 en 100.000. Het uit te keren bedrag wordt bijkomend verdeeld over de winnaars met resp. 4, 5, 5+ en 6 juiste cijfers: • 25% wordt verdeeld over de spelers met 4 juiste cijfers. Simuleer een aantal tussen 1.000 en 2.000. • 20% wordt verdeeld over de spelers met 5 juiste cijfers. Simuleer een aantal tussen 200 en 500. • 10% wordt verdeeld over de spelers met 5 juiste cijfers plus het reservegetal. Simuleer een aantal tussen 1 en 100. • 45% wordt verdeeld over de spelers met 6 juiste cijfers. Simuleer een aantal tussen 0 en 5. ------------------SIMULATIE--------------------TOTALE INZET = 1.0207786E7 EURO UIT TE KEREN BEDRAG (47%) = 4797659.42 EURO AANTAL WINNAARS MET 3 juiste cijfers = 12385 (goed voor 30962.5 EURO)
4
PROPORTIONEEL TE VERDELEN BEDRAG = 4766696.92 EURO Aantal winnaars met 4 juiste cijfers = 1580 (goed voor totaal van 1191674.23 EURO Aantal winnaars met 5 juiste cijfers = 457 (goed voor totaal van 953339.38 EURO) Aantal winnaars met 5 juiste cijfers en reserve = 91 (goed voor totaal van 476669 Aantal winnaars met 6 juiste cijfers = 2 (goed voor totaal van 2145013.61 EURO) Winst bij 6 juiste: 1072506.8 EURO Winst bij 5 juiste en reservegetal: 5238.12 EURO Winst bij 5 juiste: 2086.08 EURO Winst bij 4 juiste: 754.22 EURO Winst bij 3 juiste: 2.5 EURO ------------------SIMULATIE---------------------
5
Winst met uw lottoformulier
Winstberekening voor Tussentijdse winst: Winstberekening voor Tussentijdse winst: Winstberekening voor Tussentijdse winst: Winstberekening voor Tussentijdse winst: Winstberekening voor Tussentijdse winst: Winstberekening voor Tussentijdse winst:
uw cijfers 1 2 3 4 2.5 EURO uw cijfers 10 11 12 13 0.0 EURO uw cijfers 1 2 3 40 754.22 EURO uw cijfers 6 9 12 15 0.0 EURO uw cijfers 4 5 6 7 0.0 EURO uw cijfers 4 5 6 12 0.0 EURO
5
6 : AANTAL JUIST: 3
14 15 : AANTAL JUIST: 0 41 42 : AANTAL JUIST: 4 18 21 : AANTAL JUIST: 0 8
9 : AANTAL JUIST: 0
19 23 : AANTAL JUIST: 0
TOTALE LOTTOWINST: 756.72 EURO
De winstbepaling voor de joker is afhankelijk van het aantal digits dat je correct hebt (beginnend van rechts): • 2.5 EURO bij 1 juiste digit. • 10 EURO bij 2 juiste digits. • 50 EURO bij 3 juiste digits. • 500 EURO bij 4 juiste digits. 5
• 5.000 EURO bij 5 juiste digits. • 50.000 EURO bij 6 juiste digits. • 1.000.000 EURO wanneer je het volledige jokernummer hebt. Aantal juiste digits in joker 6569557 = 1 Aantal juiste digits in joker 5575167 = 2 TOTALE JOKERWINST: 12.5 EURO Aldus bekom je het totaal te ontvangen bedrag bij inlevering van je bulletin: ==> TOTAAL TE ONTVANGEN: 769.22 EURO Voorzie tenslotte dat je het spel herhaaldelijk kan spelen: Opnieuw spelen ? j Hoeveel roosters wens je te spelen? ...
6
Richtlijnen
In je implementatie zijn enkel constanten toegestaan als velden van de klasse zelf. Alle informatie moet met andere woorden opgeslaan worden in lokale variabelen en aan de behoevende methode(s) doorgegeven worden via de parameterlijst van deze methode(s). Je programma wordt gestructureerd in een set van methodes met welomschreven functionaliteit. Als functionaliteiten zal je zeker tegenkomen: • het willekeurig genereren van een aantal ballen, elke bal heeft een nummer tussen 1 en 42 (inclusief). Deze methode kan zowel gebruikt worden bij quick-pick (waar je 6 ballen moet trekken) als bij de lottotrekking zelf (6 ballen + reservebal) public byte[] genereerBallen(int aantal) • het sorteren van ballen, het afdrukken van ballen, ... public void drukBallen(byte[] balRij) public byte[] sorteerBallen(byte[] balRij) 6
• de invulling van het gewenst aantal roosters op je lottoformulier, eigen cijferingave of via quick-pick public byte[][] kiesLottoCijfers(int aantalRoosters) public byte[][] genereerLottoCijfersQuickPick(int aantalRoosters) • het willekeurig genereren van een (aantal) jokernummer(s), elk jokernummer bestaat uit exact 7 digits public int[] genereerJokerNummers(int aantalJokers) • het afdrukken van de roosters, de jokernummers, ... public void drukRoosters(byte[][] roosters) public void drukJokerNummers(int[] jokers) • de lotto-joker trekking public byte[] doeLottoTrekking() public int doeJokerTrekking() • de simulatie van een totale inzet met als resultaat de winstbedragen voor resp. 4, 5, 5+ en 6 juiste cijfers. public double[] simuleerTotaleInzet() • andere: het zoeken of een getal in een rooster zit, de berekening van de prijs voor je deelname, de winstberekening voor ´e´en rooster, de winstberekening voor ´e´en jokernummer, de winstberekening voor jouw deelname, het afronden van bedragen tot op een aantal cijfers na de komma, ... • vanuit een start() methode wordt het spel herhaaldelijk gespeeld. De eigenlijke logica zit vervat in de speel() methode, waar een aantal relevante lokale variabelen gedeclareerd worden: public void speel() { byte[][] uwRoosters; int[] uwJokers; byte[] lottoTrekking; int jokerTrekking; 7
double[] winstverdeling; ... //uwRoosters = genereerLottoCijfersQuickPick(aantalRoosters); ... } Beperk het aantal regels code in een methode tot een maximum van 20. Hierbij worden accolades, commentaar en open regels niet meegeteld. Zorg ook dat je niet zondigt tegen de stijlregels. Dus, twee statements op een regel plaatsen om plaats te winnen is niet toegelaten. Je hebt ook geen enkel excuus om je code niet overzichtelijk te maken (indentatie, regels open laten, . . . ). Schrijf boven elke methode gebruikersdocumentatie. Ook boven het programma moet de nodige documentatie voorzien worden. Genereer Html met javadoc. Waar relevant voorzie je ook commentaar tussen je code.
7
Afspraken
Het project moet individueel gemaakt worden; kopi¨eren wordt vertaald naar een 0-score voor je project. Je moet je project ten laatste ge¨ upload hebben naar Toledo op zondag 14 januari om 23.59u.
8
Quotering • Functionaliteit (12pt) • Afwerking (4pt) Controle op de ingave van de gebruiker, lay-out van het lottoformulier, ... • Documentatie en Commentaar (2pt) • Stijl (2pt) Vragen omtrent de opgave kunnen gesteld worden via het ICT forum op http://gent.kahosl.be/ictforum/index.php Veel succes !!
8