From 2a28d355df346fd5affcc09fb463730dbfb1c982 Mon Sep 17 00:00:00 2001 From: Thomas Naber Date: Thu, 22 Feb 2024 20:56:33 -0500 Subject: [PATCH] My experience with OOP was interesting, as I had the opportunity to experience it from the perspective my students do. OOP is helpful in this case because it allows us to break down the steps of yahtzee and compartmentalize them so that, if we want to change one thing, we do not need to change the entire program. If we were to try and write this program in Units 1 and 2, we'd need to use multiple different functions, which each depend on each other. This would be more unwieldy and much more difficult to make updates to. --- __pycache__/yahtzee_goals.cpython-311.pyc | Bin 11963 -> 13692 bytes test_goals.py | 35 ++++++ yahtzee_goals.py | 124 ++++++++++++---------- 3 files changed, 101 insertions(+), 58 deletions(-) create mode 100644 test_goals.py diff --git a/__pycache__/yahtzee_goals.cpython-311.pyc b/__pycache__/yahtzee_goals.cpython-311.pyc index 417cfcad9dbe5b2d7560d55537ba1037f5f7a5ed..2b56f56756bc7c80395ada78a0ee8219dd162e20 100644 GIT binary patch literal 13692 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 delta 3247 zcmb_eZERCj7{2HB-qP;ww(HieA8WgI-Ruh6SjU%cgE3`ug$e>Q1euJvR+xZfw>42x z*b+@_a7yu*SarrhB5uh{AV$Stq9(@hhooy3y%{m02|v&umdqc<7~}iic5Ue}I^%8b z(|f+&bI$ub=RNNqPhWjPd|wpH7oitLN-pB1_e5+`;{vaI` z1GL@HM-EZ9!$GGE?ph88so-7w5#SBxFmsBHk!{Qq)>En&8&lCA8tcnWiVRdw*kUZ* zZLOwVo{IZpY=~H4MD~FaTPPi6u~uS3s=W-faD^5y&{}CVupz#>LYW`6YmHMmAQ* zwQ`j?!w_w~0`Z6Ba#OPEUCUdRH*J%)xpGfD5D&;2!&%)K-JHfUud$>w7FjSRc29IB ztyBIMBEIFC%rrLSdUd@Fy9mzu8W`M$5h(+2srRZ-u(FP&c)HPH3DL8Z*o) ztw}bT;ytptCd06zQ-Op^uBv|h{^aOun-iO5qcz!mE|BQ?O|G)UgEy;;3BRNVdpms^ z+SO)L1BHy#Ll3R7=)3R}VF2DpkiOhzbF%zKFuDYqa^9L@@?fW}CI{)FUuvwyf_mFD zpa`nh+)KvkE9NZ)F}((s?=7aS1u^|+1zG4Gi?gB%xA72eAt!^=mIn^Lh~+_m70BS< z)4noxgSfyfyI)x=2hQTsiYRuc1@~0_oZy`oy#F7?L8N$NA5M)B!%1-=#NUoA#~b9f%u6G%tYRd(%9&0-B8wBvf|=grbm< z4<@`4OzsXkMWb^4(3To(Va&h>B2KllW4TraoomO=Lwn=}fR$?{8wvz(O7KnxE)C5F zuLQmr`Yf1k>Pt2C-4z`6PmN9vq(xs!^i7XkA+yJ>j9eq19ZR=tSEX9EqoAlurKT6{ zjr7K99UZSNGZSeKENX@=1ilDHR61Mhu+QR}>#}RcIN?YOj$~*~@XQMydby#R6rJ`x zD20c2L1zi!O&nS(g+Pi618$ zPE?7|3eevRo>J}$UK)DlaCk;t@SC&^d*M~Fzz?5z_L=Ac8HuQ&2$zPTe)HH>_*@(V zSb+j63~~ND1KbEn!#UgQHgK61gR-_J-Yx4bNy9`e`TVqD+CNh@dHNEWtM#Y#{*>M? zSD0WxS%Uu!+@0t?(;jb^>8JJe#q8UhuoTGv;3EPTEf$eq96?IS zA4Kwf`_Kr&hiIsj{4FVNOOAYcX^m5%cwZ^SU*FfSP<*_xPd$(3{$GmCR?I#asf6ed zca)`{d(7?v*_)tSf3Ng7_Ev7L9Fd>+HmhZ z@R4YdPqk~@hFdst7-89Mc|>tx7~2q1@Gf&_#ka*nkB!`8%?`-AG=dB z(9`8^`be`#7U_ZJVA*lBitsbN+`NMvFZKHNmi>y?e_GqY{>e~ptA7K5-b)V$ALzHm zD1dUx2!1U+O8y3UTs~pbX_PZWCT#TW)(#J(9+*!l$Hu41o|pVliJ)N@z18aNRl%H* zhoP7|AK(3RQgt(Tn-)b#<<@)^bD|naj4H`tcA+7XkM8VVI^_3_Eo;w;LrEn=n8xxu z`)`L}^zAl)>``GQ+`6Qko&0%mxukNeT?KGb+&^?AdNLeti432R!Xj=e0QImbL4UUE zOji;TE!Vu@%5*Wj*7RQgbpM5csR78Y66<8qaCY#_V6uNsteY3>GK>m3M5m({VpB1> z%9LpPn@lT;+R=~V5)gieH=Aj7s`wVLvIJ!s46}JKs(Dj}Sq_RgrBRw`Yv{$yO}X2Z zsIHuDMW2eCl-ZO>wYaX lw41Tta=3$azZM$S(~Il9q+P*{w01)ye(4x1js{Sc^cP?;4PO8N diff --git a/test_goals.py b/test_goals.py new file mode 100644 index 0000000..42d723f --- /dev/null +++ b/test_goals.py @@ -0,0 +1,35 @@ +from die import Die + +from yahtzee_goals import ThreeOfAKind +from yahtzee_goals import FourOfAKind +from yahtzee_goals import FullHouse +from yahtzee_goals import SmallStraight +from yahtzee_goals import LargeStraight +from yahtzee_goals import Chance +from yahtzee_goals import Yahtzee + +def makeDice(faces): + dice = [] + for face in faces: + die = Die() + die.face = face + dice.append(die) + return dice + +three = makeDice([1,1,1,3,4]) +four = makeDice([1,2,4,4,4]) +full = makeDice([3,3,5,6,6]) +sstraight = makeDice([1,3,5,5,6]) +lstraight = makeDice([1,2,3,4,5]) +chance = makeDice([2,2,3,4,6]) +yahtzee = makeDice([1,4,4,4,4]) + +goalThree = ThreeOfAKind() +goalFour = FourOfAKind() +goalFull = FullHouse() +goalSstraight = SmallStraight() +goalLstraight = LargeStraight() +goalChance = Chance() +goalYahtzee = Yahtzee() + +print(goalYahtzee.score(yahtzee)) \ No newline at end of file diff --git a/yahtzee_goals.py b/yahtzee_goals.py index cdce267..691ec4a 100644 --- a/yahtzee_goals.py +++ b/yahtzee_goals.py @@ -92,31 +92,31 @@ class GoalSixes: class ThreeOfAKind: "Total of all six dice, if there are at least three of one number" used = False - + + def diceFaces(self,dice): + return [die.face for die in dice] + def prompt(self,dice): potential_score = self.score(dice) return f"Three of a Kind ({potential_score})" - def is_three_of_a_kind(self,dice): - facesList = [] - for die in dice: - facesList += die.face() - facesList.sort() - if facesList[0]==facesList[2]: + def is_three_of_a_kind(self, faces): + faces.sort() + if faces[0]==faces[2]: return True - elif facesList[1]==facesList[3]: + elif faces[1]==faces[3]: return True - elif facesList[3]==facesList[5]: + elif faces[2]==faces[4]: return True else: return False def score(self,dice): - if self.is_three_of_a_kind(dice): + faces = self.diceFaces(dice) + if self.is_three_of_a_kind(faces): total = 0 - for die in dice: - if die.face == 6: - total+= 6 + for face in faces: + total += face return total else: return 0 @@ -124,28 +124,29 @@ class ThreeOfAKind: class FourOfAKind: "Total of all six dice, if there are at least four of one number" used = False - + + def diceFaces(self,dice): + return [die.face for die in dice] + def prompt(self,dice): potential_score = self.score(dice) return f"Four of a Kind ({potential_score})" - def is_four_of_a_kind(self, dice): - facesList = [] - for die in dice: - facesList += die.face() - if facesList[0]==facesList[3]: + def is_four_of_a_kind(self, faces): + faces.sort() + if faces[0]==faces[3]: return True - elif facesList[1]==facesList[4]: + elif faces[1]==faces[4]: return True else: return False def score(self,dice): - if self.is_four_of_a_kind(dice): + faces = self.diceFaces(dice) + if self.is_four_of_a_kind(faces): total = 0 - for die in dice: - if die.face == 6: - total+= 6 + for face in faces: + total += face return total else: return 0 @@ -154,23 +155,25 @@ class FullHouse: "If there are two of one number and three of another, earn 25 points" used = False + def diceFaces(self,dice): + return [die.face for die in dice] + def prompt(self,dice): potential_score = self.score(dice) return f"Full House ({potential_score})" - def is_full_house(self, dice): - facesList = [] - for die in dice: - facesList += die.face() - if facesList[0] == facesList[1] and facesList[2] == facesList[4]: + def is_full_house(self, faces): + faces.sort() + if faces[0] == faces[1] and faces[2] == faces[4]: return True - elif facesList[0] == facesList[2] and facesList[3] == facesList[4]: + elif faces[0] == faces[2] and faces[3] == faces[4]: return True else: return False def score(self, dice): - if self.is_full_house(dice): + faces = self.diceFaces(dice) + if self.is_full_house(faces): return 25 else: return 0 @@ -180,25 +183,27 @@ class SmallStraight: "If there is any sequence of four numbers, earn 30 points" used = False + def diceFaces(self,dice): + return [die.face for die in dice] + def prompt(self, dice): potential_score = self.score(dice) return f"Small Straight ({potential_score})" - def is_small_straight(self,dice): - facesList = [] - for die in dice: - facesList += die.face() + def is_small_straight(self,faces): + faces.sort() count = 0 - for i in range(0,3): - if facesList[i] == facesList[i+1] - 1: - count += 1 - if count >= 4: + + if faces[0]+1 == faces[1] and faces[1]+1 == faces[2] and faces[2]+1 == faces[3]: + return True + elif faces[1]+1 == faces[2] and faces[2]+1 == faces[3] and faces[3]+1 == faces[4]: return True else: - return False + return False def score(self,dice): - if self.is_small_straight(dice): + faces = self.diceFaces(dice) + if self.is_small_straight(faces): return 30 else: return 0 @@ -209,25 +214,29 @@ class LargeStraight: "If there is any sequence of 5 numbers, earn 40 points" used = False + def diceFaces(self,dice): + return [die.face for die in dice] + def prompt(self,dice): potential_score = self.score(dice) return f"Large Straignt ({potential_score})" - def is_Large_Straight(self,dice): - facesList = [] - for die in dice: - facesList += die.face() + def is_Large_Straight(self,faces): + faces.sort() count = 0 - for i in range(0,3): - if facesList[i] != facesList[i+1] - 1: + for i in range(0,4): + if faces[i] == faces[i+1] - 1: count += 1 - if count == 5: + else: + count = 0 + if count == 4: return True else: return False def score(self,dice): - if self.is_Large_straight(dice): + faces = self.diceFaces(dice) + if self.is_Large_Straight(faces): return 40 else: return 0 @@ -251,25 +260,24 @@ class Yahtzee: "Six of a Kind 50 points, 100 points for yahtzees after the first" used = False + def diceFaces(self,dice): + return [die.face for die in dice] + def prompt(self,dice): potential_score = self.score(dice) return f"Yahtzee ({potential_score})" - def is_yahtzee(self): - facesList = [] - for die in dice: - facesList += die.face() - - if facesList[0] == facesList[4]: + def is_yahtzee(self, faces): + faces.sort() + if faces[0] == faces[4]: return True else: return False def score(self,dice): - if self.is_yahtzee(dice) and used == True: - return 100 - elif self.is_yahtzee(dice) and used != True: + faces = self.diceFaces(dice) + if self.is_yahtzee(faces): return 50 else: return 0