Tilbake til Blackjack Game.

Pa dette tidspunktet er du ekspert i a bruke Python-klasser for a lage spillkort, hender og dekk. Sa na er det pa tide a bygge videre pa denne kompetansen og se hvordan man kan kombinere disse klassene i et storre program for a lage et komplett, kasinostil, kortspill (klebrig gronn filt ikke inkludert).

Kortmodulen.

For a skrive Blackjack-spillet, opprettet jeg en siste kortmodul basert pa Playing Cards-programmene. Hand- og dekkklassen er noyaktig det samme som i Playing Cards 2.0-programmet. Den nye kortklassen representerer den samme funksjonaliteten som Positiv_Card fra Playing Cards 3.0-programmet. Her er koden for denne modulen, lagret i filene.py:

Design av klassene.

For du begynner a kode et prosjekt med flere klasser, kan det hjelpe deg med a kartlegge dem pa papir. Du kan lage en liste og ta en kort beskrivelse av hver klasse. Tabell 9.1 viser mitt forste pass pa en slik notering for Blackjack spillet.

Et blackjack-spillkort. Definer en attributtverdi for a representere punktverdien til et kort.

En blackjack dekk. En samling av BJ_Card-objekter.

En blackjack-hand. Definer et attributt totalt for a representere poengetall for en hand. Definer et attributtnavn for a representere eieren av handen.

En blackjack-spiller.

En blackjack-forhandler.

Et blackjack-spill. Definer et attributtdekk for a referere til et BJ_Deck-objekt. Definer en attributtforhandler for a referere til et BJ_Dealer-objekt. Definer en attributt spillere for a referere en liste over BJ_Player objekter.

Du bor prove a inkludere alle klassene du tror du trenger, men ikke bekymre deg for a gjore klassebeskrivelsene dine komplett, fordi de alltid ikke vil v re (min er ikke). Men a lage en slik liste bor hjelpe deg med a fa en god oversikt over hvilke objekter du skal jobbe med i prosjektet.

I tillegg til a beskrive klassene dine i ord, kan det hende du vil tegne et slektstre for a visualisere hvordan klassene dine er relatert. Det var det jeg gjorde i figur 9.8.

Figur 9.8: Arvelighetshierarki av klasser for Blackjack-spillet.

Et klasses hierarki-diagram, som det i Figur 9.8, kan gi deg et sammendrag av hvordan du bruker arv.

Skrive pseudokode for spillsloyfen.

Den neste tingen jeg gjorde i planleggingen av spillet var a skrive noen pseudokode for spill av en runde. Jeg trodde dette ville hjelpe meg a se hvordan objekter vil samhandle. Her er pseudokoden jeg kom opp med:

Importerer kortene og spillmodulene.

Na som du har sett planleggingen, er det pa tide a sjekke ut koden. I den forste delen av Blackjack-programmet importerer jeg de to modulene kortene og spillene:

Jeg opprettet spillmodulen, du vil huske, i Simple Game-programmet, tidligere i dette kapittelet.

BJ_Card-klassen.

Klassen BJ_Card utvider definisjonen av hva et kort er ved a arve fra cards.Card. I BJ_Card lager jeg en ny egenskap, verdi, for punktverdien av et kort:

Metoden get_value () returnerer et tall mellom 1 og 10, som representerer verdien av et blackjack-kort. Den forste delen av beregningen beregnes gjennom uttrykket BJ_Card.RANKS.index (self.rank) + 1. Dette uttrykket tar karakterattributtet til et objekt (si «6») og finner sitt tilhorende indeksnummer i BJ_Card.RANKS gjennom listemetodeindeksen () (for «6» vil dette v re 5). Endelig legges 1 til resultatet siden datamaskinen begynner a telle til 0 (dette gjor verdien beregnet fra «6» den korrekte 6). Siden rangeringsattributter av «J», «Q» og «K» resulterer i tall som er storre enn 10, er en verdi storre enn 10 satt til 10. Hvis en objects face_up attributt er False, unngas hele prosessen, og en verdi pa None returneres. Til slutt bruker jeg egenskapen () -funksjonen med get_value () -metoden for a opprette eiendomsverdien.

BJ_Deck-klassen.

BJ_Deck-klassen brukes til a lage et kort av blackjack-kort. Klassen er nesten noyaktig den samme som sin grunnklasse, kort.Deck. Den eneste forskjellen er at jeg tilsidesetter cards.Deck ‘s populate () metode slik at et nytt BJ_Deck objekt blir fylt med BJ_Card objekter:

BJ_Hand-klassen.

BJ_Hand-klassen, basert pa kort.Hand, brukes til blackjack-hender. Jeg overstyrer kortene. Konstruktor og legg til et navnattributt for a representere navnet pa eieren av eieren:

Deretter overstyrer jeg den arvede __str __ () metoden for a vise den totale poengverdien av handen:

Jeg konkluderer objektets navnattributt med strengen som returneres fra kortene. Hent __str __ () -metoden for objektet. Sa, hvis objektets totale egenskap ikke er None, konkluderer jeg strengrepresentasjonen av verdien av totalt. Til slutt returnerer jeg den strengen.

Deretter oppretter jeg en eiendom som kalles totalt, som representerer den totale poengverdien av en blackjack-hand. Hvis en blackjack-hand har et forsiden ned-kort i den, sa er den totale egenskapen Ingen. Ellers beregnes total ved a legge til poengverdiene for alle kortene i handen.

Den forste delen av denne metoden kontrollerer for a se om et kort i blackjack-handen har en verdiattributt som er lik None (noe som betyr at kortet er forsiden ned). I sa fall returnerer metoden Ingen. Den neste delen av metoden summere bare poengverdiene for alle kortene i handen. Neste del avgjor om handen inneholder et ess. Hvis det er tilfelle, bestemmer den siste delen av metoden om kortets poengverdi skal v re 11 eller 1. Den siste linjen i denne delen oppretter eiendommen totalt.

Den siste metoden i BJ_Hand is_busted (). Den returnerer True hvis objektets totale egenskap er storre enn 21. Ellers returnerer den False.

Legg merke til at i denne metoden, returnerer jeg resultatet av tilstanden self.total & gt; 21 i stedet for a tildele resultatet til en variabel og deretter returnere den variabelen. Du kan opprette denne typen returerkl ring med en hvilken som helst betingelse (noe uttrykk egentlig) og det resulterer ofte i en mer elegant metode.

Denne typen metode, som returnerer enten True or False, er ganske vanlig. Det brukes ofte (som her) til a representere en tilstand av et objekt med to muligheter, for eksempel «pa» eller «av». Denne typen metode har nesten alltid et navn som begynner med ordet «er», som i is_on ().

BJ_Player-klassen.

BJ_Player-klassen, avledet fra BJ_Hand, brukes til blackjack-spillere:

Den forste metoden, is_hitting (), returnerer True hvis spilleren onsker en annen hit og returnerer False hvis spilleren ikke gjor det. Bust () -metoden kunngjor at en spiller buster og paberoper objektets tap () -metode. Methoden lose () forteller at en spiller mister. Win () -metoden kunngjor at en spiller vinner. Og push () -metoden kunngjor at en spiller skyver. Bustene (), lose (), win () og push () metoder er sa enkle at du kanskje lurer pa hvorfor de eksisterer. Jeg legger dem i klassen fordi de danner en flott skjelettstruktur for a handtere de mer komplekse problemene som oppstar nar spillere far lov til a satse (som de vil, nar du fullforer ett av kapittelutfordringene i slutten av kapitlet).

BJ_Dealer-klassen.

Klassen BJ_Dealer, avledet fra BJ_Hand, brukes til spillets blackjack-forhandler:

Den forste metoden, is_hitting (), representerer hvorvidt forhandleren tar ekstra kort. Siden en forhandler ma sla pa en hand pa totalt 17 eller mindre, returnerer metoden True hvis objektets totale egenskap er under 17, ellers returnerer den False. Bust () -metoden kunngjor at forhandleren bryter. Metoden flip_first_card () overgar forhandlerens forste kort.

BJ_Game-klassen.

Klassen BJ_Game brukes til a lage et enkelt objekt som representerer et blackjack-spill. Klassen inneholder koden for hovedspillet i sin spill () -metode. Spillets mekanikk er imidlertid komplisert nok til at jeg lager noen elementer utenfor metoden, inkludert en __additional_cards () -metode som tar seg av a handtere flere kort til en spiller og en stillplayende egenskap som returnerer en liste over alle spillerne som fortsatt spiller i runden.

Den __init __ () Metoden.

Konstruktoren mottar en liste over navn og lager en spiller for hvert navn. Metoden skaper ogsa en forhandler og et dekk.

Still_playing Property.

Egenskapen still_playing returnerer en liste over alle spillerne som fortsatt spiller (de som ikke har busted denne runden):

__additional_cards () Metoden.

Metoden __additional_cards () gir flere kort til enten en spiller eller en forhandler. Metoden mottar et objekt i spillerens parameter, som kan enten v re et BJ_Player eller BJ_Dealer-objekt. Metoden fortsetter mens objektets is_busted () metode returnerer False og sin is_hitting () metode returnerer True. Hvis objektets metode is_busted () returnerer True, blir objektets bust () -metode pakalt.

Polymorfisme er pa jobb her i to metallsamtaler. Metoden for player.is_hitting () -metoden fungerer like bra om spilleren refererer til et BJ_Player-objekt eller et BJ_Dealer-objekt. Metoden __additional_cards () ma aldri vite hvilken type objekt den jobber med. Det samme gjelder i linjespilleren.bust (). Siden begge klassene, BJ_Player og BJ_Dealer, hver definerer sin egen bust () -metode, oppretter linjen onsket resultat i begge tilfeller.

Spillet () Metode.

Spillet () -metoden er hvor spillsloyfen er definert og har en slaende likhet med pseudokoden jeg introduserte tidligere:

Hver spiller og forhandler deltar de to forste kortene. Forhandlerens forste kort er vendt for a skjule sin verdi. Deretter vises alle hendene. Deretter blir hver spiller gitt kort sa lenge spilleren ber om tilleggskort og ikke har busted. Hvis alle spillerne har busted, blir dealerens forste kort vendt og forhandlerens hand er skrevet ut. Ellers fortsetter avspillingen. Forhandleren far kort sa lenge forhandlerens hand totalt er under 17. Hvis forhandleren bryter, vinner alle resterende spillere. Ellers sammenlignes hver gjenv rende spillers hand med forhandlerens. Hvis spillernes totale er storre enn forhandlerens, vinner spilleren. Hvis spillernes totale er mindre, taper spilleren. Hvis de to totalene er like, skyver spilleren.

Hovedfunksjonen ().

Hovedfunksjonen () far navnet pa alle spillerne, legger dem i en liste, og lager et BJ_Game-objekt, ved hjelp av listen som et argument. Deretter pakaller funksjonen objektets spill () -metode og vil fortsette a gjore det til spillerne ikke lenger vil spille.

Microsoft Windows Server 2003 (c) TCP / IP-protokoller og -tjenester (c) Teknisk referanse.

Python Programmering: En introduksjon til datateknologi 2. utgave.

Oppdag dine egne dataspill med Python, 2. utgave.

Begynner Python: Fra nybegynner til profesjonell (Boker for profesjonelle ved profesjonelle)

Quick Python Book, Second Edition.

Databasemodellering med Microsoft® Visio for Enterprise Architects (The Morgan Kaufmann Series i Data Management Systems)