Pensum for denne øvingen er pensum i faget.


a)

lag funksjonen getDeck(), denne skal sette opp og returnere en liste med structs som inneholder feltene suit og value. Listen som returneres skal inneholde totalt 52 elementer, altså like mange som i en kortstokk. Rekkefølgen på de forskjellige kortene i listen velger du selv - du kan for eksempel ha alle hjerter-kort på posisjon 1-13, ruter-kort på 14-26 osv.

I hvert element skal feltet suit betegne hvilken farge kortet har, enten Hjerter, Ruter, Kløver og Spar. Disse forskjellige fargene representeres henholdsvis med tegnene  'H', 'D', 'C' og 'S'. Feltet suit skal altså inneholde en av disse char-verdiene.

Feltet value er da verdien på selve kortet, som går fra 2 til 14 (ess) for alle farger.

Eksempel på kjøring
>> deck = getDeck()
deck = 

  1×52 struct array with fields:

    suit
    value
 
>> deck(1).suit
ans =

    'H'
 
>> deck(1).value
ans =

     2
 
>> deck(52).suit
ans =

    'S'


>> deck(52).value
ans =

    14

 

 

b)

Lag nå funksjonen randomHand(n), denne skal ta inn et tall n som er antall kort vi ønsker å trekke. Funksjonen skal generere en vektor med tilfeldige unike tall mellom og 52. Lengden på vektoren er gitt som n, og de tilfeldige genererte verdiene i vektoren gir oss posisjonene til de kortene vi skal trekke ut fra kortstokken i deloppgave a). Deretter skal funksjonen opprette en kortstokk vha. getDeck fra forrige oppgave, og opprette en ny liste med kort-structs hvor vi kun tar med elementene i getDeck som ligger på posisjonene vi har genererte. Vi skal altså stå igjen med en vektor på samme format som i getDeck, men som kun inneholder de n kortene vi har valgt oss ut tilfeldig.

Eksempel på kjøring
>> randomHand(5)
ans = 

  1×5 struct array with fields:

    suit
    value

% Innholdet i structene i denne listen er likt som i oppgave a

 

 

c)

Du skal nå lage en visuell representasjon av kortene i en hånd. For å gjøre dette skal du lage funksjonen visualRepresentation(hand), som tar inn en hånd av samme format som returneres fra getDeck og randomHand. Funksjonen skal deretter printe ut innholdet av denne hånden som en streng på følgende format:

Q♦, 3♤, 2♥, 4♤, 6♤, T♧,

Tallverdien til kortet når vi kommer over 9 skal altså erstattes med et tegn. Disse er som følger:

 'T' for tallet 10, 'J' for knekt, 'Q' for dame, 'K' for konge og 'A' for ess.


(valgfritt) Videre kan du velge å erstatte innholdet i feltet suit med et ASCII-tegn som representerer kortfargen. ASCII-kodene for disse tegnene er listet opp nedenfor.

Black Spade♠
Black Heart♥
Black Club♣
Black Diamond♦
White Spade♤
White Heart♡
White Club♧
White Diamond♢
Eksempel på kjøring
>> visualRepresentation(randomHand(10))
5♧J♦4♥9♧3♤9♥6♥T♦7♧T♤

 

 

d)

Du skal nå lage en funksjon som evaluerer hånden som vi genererer i randomHand. Funksjonen skal kunne evaluere om hånden inneholder en av følgende hender i Poker: 

  1. Straight Flush – alle på rad i samme sort, f.eks. 9♠ 8♠ 7♠ 6♠ 5♠
  2. Quads – fire kort av samme rang, f.eks. 5♠ 5♥ 5♦5♣ 9♠
  3. Full House – tre like pluss to like, f.eks. 6♠ 6♦ 6♥ K♠ K♣
  4. Flush – alle i samme sort, f.eks. A♠ 10♠ 8♠ 6♠ 4♠
  5. Straight – alle kortene på rad, f.eks. 7♠ 6♥ 5♦ 4♣ 3♠
  6. Trips – tre kort av samme rang, f.eks. 3♠ 3♥ 3♦ 9♣ 5♠
  7. Two pairs – to forskjellige par, f.eks. K♠ K♦ 4♥ 4♠ 6♣
  8. Pair – to kort av samme rang, f.eks. 10♠ 10♦ Q♥9♠ 7♣
  9. High Card – ingen av de nevnte kombinasjonene, f.eks. Q♠ 10♦ 8♥ 5♠ 2♣

Måten du setter opp denne funksjonen er opp til deg og det er mange måter å løse det på. Dersom du bare får til å implementere noen av hendene i listen er dette bedre enn ingenting. Funksjonen skal returnere en streng med navnet på hånden skrevet på samme format som i navnet i fet tekst listen over. Vi har laget noen forslag til hvordan du kan lage funksjonen nedenfor:

 

Et forslag til en måte å sette opp funksjonen, dersom du er kjent med Function Handles i Matlab er å opprette en cell-array med forskjellige function handles. Deretter lager du en funksjon for hver type hånd ovenfor, som gir ut true eller false på om hånden vi evaluerer er av den aktuelle typen. Cell-arrayen skal så inneholde et element med en function handle for hver av disse funksjonene, og vi kan dermed iterere over denne listen og se hvilke funksjoner som gir true.
En annen måte å løse oppgaven på er ved å bruke mange IF-setninger som tester for hver enkelt type hånd og returnerer navnet på den hånden hvis testen gir positivt utslag.
Eksempel på kjøring
>> getValue(randomHand(5))
ans =

    'Pair'

>> getValue(randomHand(5))
ans =

    'High Card'

 

 

e)

Vi skal nå sette alt sammen i en hovedfunksjon som kjører simuleringen vår, og som vi kaller for main(num). denne skal ta inn et tall num som er antall ganger vi skal kjøre simuleringen. Funksjonen skal sette opp og dele ut en tilfeldig hånd, hvorpå vi evaluerer hvilken type hånd vi ble delt, vha. funksjonen vi lagde i deloppgave d). Dette skal den gjøre num antall ganger. Funksjonen skal deretter printe ut som resultat prosentfordelingen mellom de forskjellige hendene med fprintf.

Eksempel på kjøring
>> main(10000);
High Card occurred 5033 times. That is 50.330%
Pair occurred 4186 times. That is 41.860%
Two Pairs occurred 485 times. That is 4.850%
Trips occurred 230 times. That is 2.300%
Straight occurred 34 times. That is 0.340%
Flush occurred 17 times. That is 0.170%
Full House occurred 13 times. That is 0.130%
Quads occurred 2 times. That is 0.020%
Straight Flush occurred 0 times. That is 0.000%

 

 

f)

Kjør simuleringen du lagde i oppgave e) 100 000 ganger. Sjekk at resultatene fra simuleringen stemmer overens med sannsynlighetene for å få forskjellige typer hender på 5 kort. Du kan finne en liste over dette på Wikipedia-siden her: https://en.wikipedia.org/wiki/Poker_probability#Frequency_of_5-card_poker_hands

 

 

(frivillig) g)

Bruk den innebygde funksjonen "Run and time" for å optimalisere kjøretiden din. Spesifikt optimalisering av kjøretid går utenom pensum, men et hint til hvordan koden kan optimalisere er ved hjelp av persistente variabler i Matlab, som inngår i pensum.

 

  • No labels