BlackJack

BlackJack

Innleggav Børhaug » fre 13.02.2009 22:29

Jeg sitter her å skal lage et lite BlackJack program/spill som skal kjøre i komandolinje. Det må lages i c, ikke c++ desverre.

Jeg har ikke behov for å skille mellom de ulike fargene (spar, kløver, hjerter, ruter), og heller ikke om det er et billedkort. Både 10, knekt, dame konge har verdien 10. Ess er 1 og 11. Sistnevnte må jeg kunne ha et valg mellom.

Det jeg trenger er en strategi for å implementere dette programmet. Dere kan tenke KISS (kip it simple stupid)

Dersom mer info er nødvendig, så spørr gjerne.

Brukerens avatar
medlem i 216 måneder
 

Re: BlackJack

Innleggav ak » lør 14.02.2009 11:07

Det høres veldig ut som en lekse som du ønsker at andre skal gjøre for deg.

Prøv først og spør om hjelp når du står fast?

Administrator
Brukerens avatar
medlem i 236 måneder
 

Re: BlackJack

Innleggav Børhaug » lør 14.02.2009 12:26

Følgelig er det en del av en øving, og følgelig har jeg forsøkt.

Jeg startet med å lage en 'use case' og så et 'UML'. Problemet er bare det at jeg synes 'UML' diagrammet ikke ga den optimale løsningen på problemet mitt. Da jeg startet å kode ble ting fort svært rotete. Jeg har ikke kodet vanlig c på nærmere et år, og da var det i stor grad på noen atmel mega chiper. Så er litt ny på c. C++ har jeg 7,5 stduiepoeng i fra 1-2 år siden.

Det jeg søker er en strategi som er bedre enn den jeg hadde, ikke en komplett løsning på problemet. Det hjelper meg ikke et kvekk mot eksamen det.

Brukerens avatar
medlem i 216 måneder
 

Re: BlackJack

Innleggav ak » lør 14.02.2009 13:18

Forklar den du hadde da ? UML virker vel tungt for et slikt problem, selv om det er kjekt å kunne det også.

Essensen i oppgaven er antageligvis å modelere kortstokken, primært
1) Unngå at et kort dukker opp mere enn 4 ganger
2) Passe på at sannsynligheten for å trekke '4' er mindre hvis '4' allerede ligger på bordet

Så hvordan vil du representere denne kortstokken?

Administrator
Brukerens avatar
medlem i 236 måneder
 

Re: BlackJack

Innleggav Børhaug » lør 14.02.2009 13:56

Min tanke var å bygge en array (fra 0 til 51) av kort. Disse kan enten være en integer, eller være en eller annen "struct card" eller liknende. Så kan jeg randomisere kortene på en eller annen måte. usikker på hvordan det gjores. I c++ benyttet jeg srand. Så tenkte jeg å trekke det øverste kortet i arrayen, får så å flytte meg nedover. Da vil jeg aldri ende opp med samme kortet mer enn fire ganger.

Må si det er uvant å ikke skrive med objekter. Da ville jeg kunne kalle en klasse 'deck', og legge inn byggingen, randomiseringen, og alt annet i constructoren. Blir så ryddig og pent.

min "strategi" var:

1: Bygge kortstokk og randomisere den
2: Ta inn info fra spiller. Navn, innsats og alt annet jeg måtte ønske
3. Dele de to øverste kortene fra min array/stac
4: Spørre hva spiller da vil gjøre:
- Stand
- Hit me!
4.1 Stand: Gå til 5.
4.2 Hit me! Dele en kort og kjøre 4 en gang til.
Punkt fire blir ikke helt pent i koden min. Forsøkt ulike fremgangsmåter. Switch er kanskje det peneste.

5. Dele kort til 'Banken'. Gi to til den. Dersom under 17, må banken ta et kort til (det er reglene), dersom banken har over 17, men mindre enn spiller, trekker den en til osv...

Må både i 4 og 5 må jeg kjøre en getSum() funksjon for hånden til spiller og Bank, for å være sikker på at ikke noen av de har tapt (over 21)

Dersom banken ikke får over spiller (trukket 5 kort) vinner spiller, dersom banken får 21 vinner alltid bank, dersom banken får under 21, men mer en spiller vinner banken, og dersom banken får over 21 vinner spiller.

Det siste ble litt rotete, men det er også essensen i dette innlegget. Relativt sikker på at jeg kan lage dette programmet, men det skal gjerne bli litt pent også, vedlikeholdbart osv. Sistnevnte mer for treningens skyld enn annet.

Brukerens avatar
medlem i 216 måneder
 

Re: BlackJack

Innleggav ak » lør 14.02.2009 14:24

Ikke dumt, jeg ville brukt boolean[52]

Alle starter som true, sett til false når et kort blir tatt ut. Trekning skjer ved å lage et tilfeldig tall mellom 0 og 51, i. Er array[i] blitt tatt trekker du bare på nytt (uten å vise det), ellers setter du array[i] til false.

Verdien på kortet er (i + 1) % 13 , dvs ess = 1

Administrator
Brukerens avatar
medlem i 236 måneder
 

Re: BlackJack

Innleggav decodex » lør 14.02.2009 20:31

Artige greier!

Angående at det er uvant å kode i C når man er mer vant med objektbaserte språk kan jeg fint forstå det. Sitter selv og pusler med å børste støv av min C-kunnskap for tiden, sammen med å kode en liten applikasjon i Objective-C. Jeg vil tipse om at structs i C mer eller mindre er hva du må se på som objekter.

Vanlige er gjerne at man lager structs for sammensatte datamodeller og funksjoner som arbeider med disse (kall det metoder) i egne filer, på samme måte som man gjerne deler inn klasser i egne filer. (På den måten kan du jo også lage private, statiske variabler om nødvendig, f.eks. for kortstokken.)

Flytt datamodell for kortstokk og funksjoner relatert til dette i egen fil. Lag gjerne også egen fil for datamodellen til en hånd med tilhørende funksjoner.

Da tror jeg main.c vil bli relativt ren og pen mtp. programflyt. Og når jeg sier «egen fil» så mener jeg da selvfølgelig to relaterte filer, én header-fil og en implementasjonsfil.

Og så er det godt mulig du visste dette allerede :)

Brukerens avatar
medlem i 217 måneder
 

Re: BlackJack

Innleggav TO » lør 14.02.2009 21:59

ak skrev:
>Ikke dumt, jeg ville brukt boolean[52]
>Alle starter som true, sett til false når et kort blir tatt ut. Trekning skjer ved å lage et >tilfeldig tall mellom 0 og 51, i
Smart!
>Er array[i] blitt tatt trekker du bare på nytt (uten å vise det),
...ved å søke opp neste hvor: array[++i%52]==true, men maksimum 52 av denne.
medlem i 212 måneder
 

Re: BlackJack

Innleggav ak » lør 14.02.2009 23:57

TO: Jeg tror ny, tilfeldig trekning egentlig er bedre. Hvis ikke øker du sjansen for sekvensielle kort? Jeg tror ikke en optimalisering hvor man luker ut kort som er brukt opp er verdt det, primært fordi kortstokken må stokkes oftere enn at bommerter rekker å bli noe problem.
Eksempel:
- Posisjon 1 blir tatt ved første trekning
- Da har posisjon 2 dobbelt så stor sjanse som alle andre kort å komme ut ved neste trekning, for det kan enten være 1 eller 2 som blir trukket

Administrator
Brukerens avatar
medlem i 236 måneder
 

Re: BlackJack

Innleggav TO » søn 15.02.2009 3:47

Ah, selvsagt - helt enig.
Min foretrukne løsning er nok heller en "struct" slik som Børhaug tenker på, for å få forutsigbar tid,
ref.: http://www.chemie.fu-berlin.de/chemnet/ ... bc_15.html (Searching and Sorting Example)
struct kort
{
const double *slumptall;
const int *kortnr;
};
1. Fyllt opp en array med 52 av disse, kortnr f.eks. fra 0 til 51 (konvensjonen til ak) og
vilkårlige slumptall.
2. Sortert mht. slumptallene (se eksempel i lenka) Du må skrive sorteringsfunk, sjekk dokumentasjon
3. Gitt fra toppen av kortstokken.
medlem i 212 måneder
 

Re: BlackJack

Innleggav henrik.eriksen » søn 15.02.2009 14:54

TTK4125.. :-)
medlem i 197 måneder
 

Re: BlackJack

Innleggav Børhaug » søn 15.02.2009 21:19

Oi - her var det mange svar plutselig. Borte en stund, og en lang debatt har utartet seg. Morsomt. Takk for alle svar uansett. Tror jeg skal finne en ok løsning nå.

Og til henrik.eriksen: Jepp, stemmer det. 'Negative feedback loopen' avslører meg kanskje der.

Brukerens avatar
medlem i 216 måneder
 

Re: BlackJack

Innleggav henrik.eriksen » søn 15.02.2009 21:24

Tilbakekoblingssløyfen i kombinasjon med at jeg også holder på med den øvinga..
medlem i 197 måneder
 

Re: BlackJack

Innleggav Børhaug » søn 15.02.2009 21:29

hehe - any luck?

Brukerens avatar
medlem i 216 måneder
 

Re: BlackJack

Innleggav Børhaug » ons 18.02.2009 13:57

Programmet er skrevet ferdig, og ble stor sykse. Ble tilslutt svært enkelt. Endte opp med bruk av srand() og rand(), samt litt sansynlighetsregning, fremfor å lage array's osv.

Siden man i BlackJack ofte spiller med 5 kortstokker eller fler, gir det et like realistisk bilde ved rand(), som ved bruk av en konstruert kortstokk. Det er jo med 1 player maksimalt 10 kort som blir benyttet i spillet, dvs umulig å bruke flere av en kortverdi enn det vil være i den imaginære kortstokken (når man tenker bruk av 3 kortstokker eller fler).

Dette ga et pent lite spill på litt over 100 linjer, inklusiv komentering, som jeg etter hjelp fra dere kodet fra starten av igjen på under 2 timer. Morsomt når det kan bli lite og elegant.

Takk takk til alle.

kan legge til at jeg håndterte det at man har mindre sannsynlighet for å trekke et nytt kort av samme verdi ved å regne ut hvor mange som var trukket (si 1), og hvor mange som var igjen (si 3, dersom en kortstokk, eller 19 dersom 5 kortstokker), for så å kjøre en rand() som ga meg et tall mellom 0 og 3. Dersom 0, trakk jeg nytt kort. Dersom 1-3 var kortet gyldig og ble benyttet som neste utdelte kort (gitt 1 kortstokk vel å merke). 3 kjappe linjer med kode, som ga et svært realistisk bilde av en virkelig kortstokk.

Brukerens avatar
medlem i 216 måneder
 

Neste

Returner til C



Hvem er i Forumene

Registrerte brukere: Google [Bot]