2D1311 Programmeringsteknik med PBL Föreläsning 6 Skolan för Datavetenskap och kommunikation
P-uppgiften –Spec –Minnesbild –Granskning –Redovisning –Krav –Betyg BlackJack, utmaning 3
Spec+minnesbild Specen ska lämnas in tisdag14 mars kl 10:15 Syftet med specen är att du ska planera programmet innan du börjar skriva det. Specen ska beskriva algoritm, datastrukturer, funktioner, klasser (med attribut och metoder) Rita också (för hand eller med dator) en minnesbild över den viktiga datastrukturen i programmet. Din assistent kommer att titta på specen med minnesbilden och ge den betyget godkänd/kompletteras.
Spec för BlackJack Algoritm: Läs in spelarnas namn. Dela ut två kort till varje spelare. Låt varje spelare: –få ett kort till, så länge den vill ha ett kort till och inte blivit tjock Skriv ut vem som vann.
Funktioner read_players (läser in namnen och skapar en lista med spelarna) create_deck (skapar korten) shuffle_deck (blandar korten) deal (delar ut två kort till varje spelare) check_if_bust (kollar om spelaren blivit tjock) check_who_won (kollar vem som vann)
Datastrukturer Card-objekt En kortlek som är en lista av Card-objekt Spelare som har namn och varsin lista med kort. En lista med spelare. En dealer som fungerar som en spelare.
rank suit is_face_up "4" "Hjärter" True rank suit is_face_up "7" "Spader" True 0 1 cards lista med Card-objekt name "Linda" rank suit is_face_up "5" "Klöver" True rank suit is_face_up "6" "Spader" True 0 1 cards lista med Card-objekt name "Raman" Minnesbild: game (som är ett BJ_Game-objekt) lista med BJ_Player-objekt playersdealer deck rank suit is_face_up "9" "Hjärter" True rank suit is_face_up "Kung" "Hjärter" True 0 1 cards lista med Card-objekt name "Given" rank suit is_face_up "Ess" "Ruter" True rank suit is_face_up "2" "Klöver" True rank suit is_face_up "10" "Hjärter" True cards
Granskning Innan det färdiga programmet kan redovisas ska det testas (granskas) av en kurskamrat. Din granskare ska kritiskt granska ditt program, testköra det och fylla i ett granskningsprotokoll.granskningsprotokoll Denna granskning är ett obligatoriskt moment. (Varje kursdeltagare måste granska en uppgift, och alla uppgifter måste granskas före redovisning.) Syftet med granskningen är att du genom att kritiskt granska en annans program ska få en ökad förståelse för hur man ska (och inte ska) programmera.
Redovisning Du bokar (via webben) en tid för redovisning. Ta med följande till redovisningen: –Uppgiftslydelsen –Specen med uppdaterad minnesbild –Granskningsprotokollet och granskaren –En färsk programutskrift –Programmet Om du tar med en egen dator till redovisningen ska den vara uppkopplad mot Internet, eftersom vi (för att förhindra fusk) jämför din lösning mot alla tidigare lösningar.
Krav Programmet ska vara kommenterat upptill med författare och datum. Programmet ska vara användarvänligt. Programmet ska vara uppdelat i lagom långa funktioner, och eventuellt klasser. Varje variabel och funktion ska vara försedd med kommentarer. Ange vad variabeln representerar och vad funktionen gör. För funktioner bör man också ange vad indata (parametrar) och utdata (retur-värde) betyder. Namn på variabler och funktioner ska vara vettiga. Nästan identiska kodstycken ska inte upprepas. Gör i stället generella funktioner. Inför konstanter för sådant som man kan tänkas vilja ändra framöver och för tal som inte ska ändras och går att beskriva med namn.
Betyg E.Godkänd redovisning med spec och minnesbild av uppgift som lösts tillräckligt bra (max tre påpekanden). D.Godkänd redovisning med spec och minnesbild. –För betyg högre än D krävs att grunduppgiften redovisas före kursomgångens slut. C.Kraven för D + ett perfekt program (inga anmärkningar i protokollet) med korrekt hantering av felaktig inmatning. B.Uppgift eller extrauppgift med betyg B som är perfekt och med korrekt hantering av felaktig inmatning. A.Kraven för C + en extrauppgift med betyg A (grafik eller avancerad algoritm). –Observera att kraven på ett perfekt program gäller hela programmet, inklusive extrauppgift. (För den som vill ha ut ett betyg i det gamla siffersystemet gäller att E eller D 3, C eller B 4, A 5.)
Kap 9, utmaning 3 Förbättra BlackJack-programmet genom att låta användaren satsa pengar. Var ska penga-variabeln finnas? –Hos spelaren, alltså i BJ_Player. Men den har ju ingen konstruktor? –Då är det bara att deklarera en. Kopiera och modifiera konstruktorn i BJ_Hand. Var i programmet ska spelaren satsa? –Hmm, det bör vara efter att han sett sina första två kort, men innan han får välja att ta fler. Nånstans i början av play-metoden!
class BJ_Player(BJ_Hand): """ A Blackjack Player. """ ### *1* Ny konstruktor, med attributen pengar, insats def __init__(self, name): super(BJ_Player, self).__init__(name) self.pengar = 1000 self.insats = 0 ### *2* Ny metod för att läsa in insatsen ### def satsa(self): print self.name,", du har",self.pengar self.insats = games.ask_number("Hur mycket vill du satsa? ",0,self.pengar+1) def is_hitting(self): response = games.ask_yes_no("\n" + self.name + ", vill du ha ett kort? (J/N): ") return response == "j" def bust(self): print self.name, "blir tjock." self.lose()
### *3* Förlorar insatsen ### def lose(self): print self.name, "förlorar.", self.pengar -= self.insats print "och har", self.pengar, "kvar." ### *4* Vinner dubbla insatsen ### def win(self): print self.name, "vinner." self.pengar += 2*self.insats print "och har nu", self.pengar, "." ### *5* Får tilbaka insatsen ### def push(self): print "Det det blev oavgjort." self.pengar += self.insats ### *7* Ny metod som kollar om spelaren är pank ### def pank(self): return self.pengar == 0
def play(self): # deal initial 2 cards to everyone self.deck.deal(self.players + [self.dealer], per_hand = 2) self.dealer.flip_first_card() # hide dealer's first card for player in self.players: print player print self.dealer # deal additional cards to players for player in self.players: ### *6* Låt spelaren satsa ### player.satsa() self.__additional_cards(player )
Ta bort panka spelare Vi går igenom listan med en for-slinga, kollar vilka spelare som är panka, och tar bort varje pank spelare med metoden remove. –Men vad händer med for-slingan när man tar bort en spelare ur listan? Hoppsan, det kommer inte att gå bra. Vi gör en kopia av listan först, så får for- slingan gå igenom kopian istället!
### *9* Ta bort alla spelare som är panka ### def ta_bort_panka(self): kopia = self.players[:] for player in kopia: print "Kollar ", player.name, "..." if player.pank(): print player.name, "är pank!" self.players.remove(player)
def play(self): self.ta_bort_panka() # deal initial 2 cards to everyone self.deck.deal(self.players + [self.dealer], per_hand = 2) self.dealer.flip_first_card() # hide dealer's first card for player in self.players: print player print self.dealer # deal additional cards to players for player in self.players: ### *6* Låt spelaren satsa ### player.satsa() self.__additional_cards(player)