> 
> ----------------------------------------------------------------------
> 
> Message: 1
> Date: Wed, 15 Feb 2012 23:57:08 -0500
> From: Luke Thomas Mergner <lmerg...@gmail.com>
> To: tutor@python.org
> Subject: [Tutor] Debugging While Loops for Control
> Message-ID: <a8bdf988-fe78-4ca1-8cb7-c0a0e68fd...@gmail.com>
> Content-Type: text/plain; charset=us-ascii
> 
> Hi,
> 
> I've been translating and extending the Blackjack project from 
> codeacademy.com into Python. My efforts so far are here: 
> https://gist.github.com/1842131
> 
> My problem is that I am using two functions that return True or False to 
> determine whether the player receives another card.  Because of the way it 
> evaluates the while condition, it either prints too little information or 
> previously called the hitMe() function too many times.  I am assuming that I 
> am misusing the while loop in this case. If so, is there an elegant 
> alternative still running the functions at least once.
> 
> e.g. 
> while ask_for_raw_input() AND is_the_score_over_21():
>       hitMe(hand)
> 
> 
> Any advice or observations are appreciated, but please don't solve the whole 
> puzzle for me at once! And no, not all the functionality of a real game is 
> implemented. The code is pretty raw. I'm just a hobbyist trying to learn a 
> few things in my spare time.
> 
> Thanks in advance.
> 
> Luke
> 
> ------------------------------
> 
> Message: 2
> Date: Thu, 16 Feb 2012 09:05:39 +0000
> From: Alan Gauld <alan.ga...@btinternet.com>
> To: tutor@python.org
> Subject: Re: [Tutor] Debugging While Loops for Control
> Message-ID: <jhigt3$jdp$1...@dough.gmane.org>
> Content-Type: text/plain; charset=ISO-8859-1; format=flowed
> 
> On 16/02/12 04:57, Luke Thomas Mergner wrote:
> 
>> My problem is that I am using two functions that return True or False
>> to determine whether the player receives another card.
> 
>> Because of the way it evaluates the while condition, it either
>> prints too little information or previously called the hitMe()
>> function too many times.
> 
>> I am assuming that I am misusing the while loop in this case.
> 
>> while ask_for_raw_input() AND is_the_score_over_21():
>>      hitMe(hand)
> 
> I haven't looked at the code for the functions but going
> by their names I'd suggest you need to reverse their order to
> 
> while is_the_score_over_21() and ask_for_raw_input():
>       hitMe(hand)
> 
> The reason is that the first function will always get called
> but you (I think) only want to ask for, and give out, another
> card if the score is over 21 (or should that maybe be
> *under* 21?).
> 
> Personally I would never combine a test function with
> an input one. Its kind of the other side of the rule that
> says don't don;t put print statements inside logic functions.
> In both cases its about separating himan interaction/display from 
> program logic. So I'd make the ask_for_raw_input jusat return a value(or 
> set of values) and create a new funtion to test
> the result and use that one in the while loop.
> 
> HTH,
> -- 
> Alan G
> Author of the Learn to Program web site
> http://www.alan-g.me.uk/


Alan (and list),

Thanks for the advice. It at least points me to an answer: I'm trying to be too 
clever for my experience level. I am going to go back and incorporate your 
suggestions.

In the meantime, and continuing my problem of over-cleverness, I was trying to 
rethink the program in classes.  With the caveat that I'm only a few hours into 
this rethinking, I've added the code below. My question is: when I want to 
build in a "return self" into the Hand class, which is made up of the card 
class; how do I force a conversion from card object into integer object which 
is all the card class is really holding? Should I make the class Card inherit 
from Integers? or is there a __repr__ def I don't understand yet? 

Bonus question: when I create a the "def score(self)" in class Hand, should 
that be an generator? And if so where do I go as a newb to understand 
generators? I'm really not understanding them yet.  The "x for x in y:" syntax 
makes it harder to follow for learners, even if I appreciate brevity.


Thanks in advance,
Luke


class Card(object):
        def __init__(self):
                self.score = self.deal()
                
        def deal(self):
                """deal a card from 1 to 52 and return it's points"""
                return self.getValue(int(math.floor(random.uniform(1, 52))))
                
        def getValue(self, card):
                """Converts the values 1 - 52 into a 1 - 13 and returns the 
correct blackjack score based on remainder."""
                if (card % 13 == 0 or card % 13 == 11 or card % 13 == 12):
                        #Face Cards are 10 points
                        return 10
                elif (card % 13 == 1):
                        return 11
                else:
                        #Regular cards, return their value
                        return card % 13
                        
        def showCard(self):
                return repr(self.score)

class Hand:
        def __init__(self):
                self.cards = []
                #Add cards this way to avoid duplicates.
                for i in range(2): 
                        self.cards.append(Card())
                                
        def hit(self):
                self.cards.append(Card())
                
        def showHand(self):
                return self
                        
        def score(self):
                #how do you sum(objects) ???
                        
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to