Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #51826 > unrolled thread

Python: Code is ignoring the if and else

Started bykevin4fong@gmail.com
First post2013-08-02 17:40 -0700
Last post2013-08-03 03:34 +0000
Articles 12 — 7 participants

Back to article view | Back to comp.lang.python


Contents

  Python: Code is ignoring the if and else kevin4fong@gmail.com - 2013-08-02 17:40 -0700
    Re: Python: Code is ignoring the if and else MRAB <python@mrabarnett.plus.com> - 2013-08-03 02:38 +0100
    Re: Python: Code is ignoring the if and else John Ladasky <john_ladasky@sbcglobal.net> - 2013-08-02 18:39 -0700
      Re: Python: Code is ignoring the if and else kevin4fong@gmail.com - 2013-08-02 18:44 -0700
        Re: Python: Code is ignoring the if and else Chris Angelico <rosuav@gmail.com> - 2013-08-03 02:56 +0100
        Re: Python: Code is ignoring the if and else Joshua Landau <joshua@landau.ws> - 2013-08-03 03:11 +0100
          Re: Python: Code is ignoring the if and else kevin4fong@gmail.com - 2013-08-02 19:24 -0700
            Re: Python: Code is ignoring the if and else Terry Reedy <tjreedy@udel.edu> - 2013-08-03 01:04 -0400
              Re: Python: Code is ignoring the if and else kevin4fong@gmail.com - 2013-08-03 13:12 -0700
    Re: Python: Code is ignoring the if and else Terry Reedy <tjreedy@udel.edu> - 2013-08-02 21:42 -0400
      Re: Python: Code is ignoring the if and else kevin4fong@gmail.com - 2013-08-02 18:46 -0700
    Re: Python: Code is ignoring the if and else Dave Angel <davea@davea.name> - 2013-08-03 03:34 +0000

#51826 — Python: Code is ignoring the if and else

Fromkevin4fong@gmail.com
Date2013-08-02 17:40 -0700
SubjectPython: Code is ignoring the if and else
Message-ID<c6702eb3-494a-4359-84ef-d6679c09df35@googlegroups.com>
I'm trying to create a game of Go Fish in Python. But I've stumbled onto a little problem that I can't seem to figure out how to deal with.

There is a human player (player 0) and three computer players (from 1-3). The human player goes first and chooses a target player. And then a card rank (for example, the player could target player two and choose jacks, then the computer would have to give the player all its jacks).

What I have so far is below but the problem I'm having is right at the bottom of the code. So far, the code generates a deck, creates hands for every player, and then shows the player his/her cards. Then the player is asked which computer player he/she wants to target as well as the rank of cards.

The problem I'm having is with the last set of lines (the def player_0_hitman) at the bottom of the code. Any help would be much appreciated. There are basically three issues I'm having problems with.

    Basically, my code is ignoring the if's and else's. I don't get why. Everything appears to be positioned correctly, but for some odd reason, even after an if, the program also runs the else as well.

    the "hit" is not being returned. Even though in the definition, I have the hit set to hit = hit - 1 for the last else, it still reruns the whole definition again as if it the hit was 1

    I'm trying to use the count line to count how many cards are being transferred so the program will tell the player how many cards he gains when he gets a successful guess but I only get a statement saying I got 1 card each time no matter what (whether I get no cards or I get more than one).

I understand the basics of what I need to do but I can't seem to get a working code for this. I've tried changing the "for" to "if" but I get all sorts of errors so I don't think that will work. Then I tried converting "hit" into another code before entering the definition, changing it while inside, then converting it back before returning it but that also seems to do nothing, and I still get the same issues.


CODE:

import random

def SetDeck():
    suitList = ["s", "c", "d", "h"]
    rankList = ["a", "2", "3", "4", "5", "6", "7", "8", "9", "t", "j", "q", "k"]
    deck = []
    for suite in range(4):
        for rank in range(13):
            deck.append(rankList[rank]+suitList[suite])
    return deck

def Shuffle(deck):
    nCards = len(deck)
    for i in range(nCards):
        j = random.randint(i,nCards-1)
        deck[i], deck[j] = deck[j], deck[i]
    return deck

def GetTopCard(shuffledDeck):
    return shuffledDeck.pop(0)

def DealInitialCards(nPlayers,nCards,shuffledDeck):
    playersCards = [["" for j in range(nCards)] for i in range(nPlayers)]
    for j in range(nCards):
        for i in range(nPlayers):
            playersCards[i][j] = GetTopCard(shuffledDeck)
    return playersCards

def Sort(cards):
    rankString = "a23456789tjqk"
    swapped=True
    while swapped:
        swapped = False
        for i in range(len(cards)-1):
            if rankString.find(cards[i][0])>rankString.find(cards[i+1][0]):
                cards[i],cards[i+1]=cards[i+1],cards[i]
                swapped = True
    return


def ShowCards(player,cards):
    print("\n****************************************************")
    print("************Player "+str(player)+" has**************")
    print("****************************************************\n")
    for i in range(len(cards)):
        print(cards[i]),
    print("\n")
    return

def ShowMessage(msg):
    print("****************************************************")
    print(str(msg))
    print("****************************************************\n")
    return

def remove_suits(player):
    new_hand = []
    for card in pHands[player]:
        new_card = card[0]
        new_hand.append(new_card)
    return new_hand

def choosing_target():
    target_player = raw_input ("Who do you want to ask? (1-3)")
    while target_player.isdigit() == False or 1 > int(target_player) or 3 < int(target_player):
        print "Error: Must type a valid player id (from 1 to 3)"
        target_player = raw_input ("Who do you want to ask? (1-3)")
    target_player = int(target_player)
    return target_player

def target_rank():
    target_card = raw_input ("What rank are you seeking? (" + str(",".join(new_hand)) + ")")
    while target_card not in new_hand:
        print "Error: Must type one of the follow valid single character card ranks"
        print str(",".join(new_hand))
        target_card = raw_input ("What rank are you seeking? (" + str(",".join(new_hand)) + ")")
    return target_card

print("~"*70)
print("~"*25+"WELCOME TO GO FISH!"+"~"*26)
print("~"*70)

nPlayers = 4
nCards = 10
deck = SetDeck()
sDeck = Shuffle(deck[:])
pHands = DealInitialCards(nPlayers,nCards,sDeck)
Sort(pHands[0])
ShowCards(0,pHands[0])

hit = 1

while hit == 1 :
    ShowMessage("TURN: Player 0, its your turn.")
    target_player = choosing_target()
    new_hand = remove_suits(0)
    target_card = target_rank()
    ShowMessage("Target: Player " + str(target_player) + " is being targeted for the rank <" + str(target_card) + ">")
    temp_hit = player_0_hitman(hit)
    print "hit = " + str(hit)

def player_0_hitman(hit):
    for card in pHands[target_player]:
        if target_card[0] == card[0]:
            count = pHands[target_player].count(card)
            pHands[0].append(card)
            pHands[target_player].remove(card)
            ShowMessage("HIT: " + str(count) + " card(s) transferred")
    else:
        if target_card[0] != card[0]:
            top_card = GetTopCard(sDeck)
            pHands[0].append(top_card)
            if top_card[0] == target_card[0]:
                ShowMessage("HIT: LUCKILY Player 0 has fished up a rank <" + str(top_card[0]) + ">!!!")
            else:
                ShowMessage("MISS: You fished up the rank <" + str(top_card[0]) + ">")
                hit = hit - 1
            return hit

[toc] | [next] | [standalone]


#51833

FromMRAB <python@mrabarnett.plus.com>
Date2013-08-03 02:38 +0100
Message-ID<mailman.139.1375493890.1251.python-list@python.org>
In reply to#51826
On 03/08/2013 01:40, kevin4fong@gmail.com wrote:
> I'm trying to create a game of Go Fish in Python. But I've stumbled onto a little problem that I can't seem to figure out how to deal with.
>
> There is a human player (player 0) and three computer players (from 1-3). The human player goes first and chooses a target player. And then a card rank (for example, the player could target player two and choose jacks, then the computer would have to give the player all its jacks).
>
> What I have so far is below but the problem I'm having is right at the bottom of the code. So far, the code generates a deck, creates hands for every player, and then shows the player his/her cards. Then the player is asked which computer player he/she wants to target as well as the rank of cards.
>
> The problem I'm having is with the last set of lines (the def player_0_hitman) at the bottom of the code. Any help would be much appreciated. There are basically three issues I'm having problems with.
>
>      Basically, my code is ignoring the if's and else's. I don't get why. Everything appears to be positioned correctly, but for some odd reason, even after an if, the program also runs the else as well.
>
>      the "hit" is not being returned. Even though in the definition, I have the hit set to hit = hit - 1 for the last else, it still reruns the whole definition again as if it the hit was 1
>
>      I'm trying to use the count line to count how many cards are being transferred so the program will tell the player how many cards he gains when he gets a successful guess but I only get a statement saying I got 1 card each time no matter what (whether I get no cards or I get more than one).
>
> I understand the basics of what I need to do but I can't seem to get a working code for this. I've tried changing the "for" to "if" but I get all sorts of errors so I don't think that will work. Then I tried converting "hit" into another code before entering the definition, changing it while inside, then converting it back before returning it but that also seems to do nothing, and I still get the same issues.
>
[snip]

> def player_0_hitman(hit):
>      for card in pHands[target_player]:
>          if target_card[0] == card[0]:
>              count = pHands[target_player].count(card)
>              pHands[0].append(card)
>              pHands[target_player].remove(card)
>              ShowMessage("HIT: " + str(count) + " card(s) transferred")
>      else:
>          if target_card[0] != card[0]:
>              top_card = GetTopCard(sDeck)
>              pHands[0].append(top_card)
>              if top_card[0] == target_card[0]:
>                  ShowMessage("HIT: LUCKILY Player 0 has fished up a rank <" + str(top_card[0]) + ">!!!")
>              else:
>                  ShowMessage("MISS: You fished up the rank <" + str(top_card[0]) + ">")
>                  hit = hit - 1
>              return hit
>
You have "else" lined up with "for".

In Python a "for" loop can have an "else" clause, which is run if it 
didn't "break" out of the loop but finished.

[toc] | [prev] | [next] | [standalone]


#51834

FromJohn Ladasky <john_ladasky@sbcglobal.net>
Date2013-08-02 18:39 -0700
Message-ID<dfa6368b-565b-4512-8755-ef36fd2719cd@googlegroups.com>
In reply to#51826
On Friday, August 2, 2013 5:40:52 PM UTC-7, kevin...@gmail.com wrote:
>     Basically, my code is ignoring the if's and else's. I don't get why.
> Everything appears to be positioned correctly, but for some odd reason, even
> after an if, the program also runs the else as well.

Look carefully at your indentation.  One "else" statement is at the same indentation as a "for" statement rather than an "if" statement.  So what, you say?

http://docs.python.org/2/tutorial/controlflow.html

"Loop statements may have an else clause; it is executed when the loop terminates through exhaustion of the list (with for) or when the condition becomes false (with while), but not when the loop is terminated by a break statement."

I don't know of any other computer programming language besides Python which has the "for...break...else" idiom.  However, I know quite a few that do not.  I find it useful in many situations.

[toc] | [prev] | [next] | [standalone]


#51836

Fromkevin4fong@gmail.com
Date2013-08-02 18:44 -0700
Message-ID<b16bb894-a720-4e0c-a3ce-d699afffeb8e@googlegroups.com>
In reply to#51834
On Friday, August 2, 2013 6:39:43 PM UTC-7, John Ladasky wrote:
> On Friday, August 2, 2013 5:40:52 PM UTC-7, kevin...@gmail.com wrote:
> 
> >     Basically, my code is ignoring the if's and else's. I don't get why.
> 
> > Everything appears to be positioned correctly, but for some odd reason, even
> 
> > after an if, the program also runs the else as well.
> 
> 
> 
> Look carefully at your indentation.  One "else" statement is at the same indentation as a "for" statement rather than an "if" statement.  So what, you say?
> 
> 
> 
> http://docs.python.org/2/tutorial/controlflow.html
> 
> 
> 
> "Loop statements may have an else clause; it is executed when the loop terminates through exhaustion of the list (with for) or when the condition becomes false (with while), but not when the loop is terminated by a break statement."
> 
> 
> 
> I don't know of any other computer programming language besides Python which has the "for...break...else" idiom.  However, I know quite a few that do not.  I find it useful in many situations.

Yeah, I already know about that. But if I try to change it, I'm not even able to start the program. If I try to change the if statement that it corresponds with, I get a an error saying "card" is not a global. And if I try to shift it in, for some reason...the program runs through the MISS line multiple times.

[toc] | [prev] | [next] | [standalone]


#51838

FromChris Angelico <rosuav@gmail.com>
Date2013-08-03 02:56 +0100
Message-ID<mailman.141.1375494990.1251.python-list@python.org>
In reply to#51836
On Sat, Aug 3, 2013 at 2:44 AM,  <kevin4fong@gmail.com> wrote:
> Yeah, I already know about that. But if I try to change it, I'm not even able to start the program. If I try to change the if statement that it corresponds with, I get a an error saying "card" is not a global. And if I try to shift it in, for some reason...the program runs through the MISS line multiple times.

Okay. Stop, take a step back, and simplify your problems. You're
currently exhibiting a technique of shotgun programming that may be
getting in your way; you're just trying things without really knowing
what you're doing. Play with individual control structures in
interactive Python (eg IDLE), and get to know what's really happening.
Read the docs. Be sure you're structuring your code the way you think
you are. You'll find everything easier once you understand why your
code is doing what it's doing.

ChrisA

[toc] | [prev] | [next] | [standalone]


#51839

FromJoshua Landau <joshua@landau.ws>
Date2013-08-03 03:11 +0100
Message-ID<mailman.142.1375495945.1251.python-list@python.org>
In reply to#51836

[Multipart message — attachments visible in raw view] — view raw

On 3 August 2013 02:44, <kevin4fong@gmail.com> wrote:

> Yeah, I already know about that. But if I try to change it, I'm not even
> able to start the program. If I try to change the if statement that it
> corresponds with, I get a an error saying "card" is not a global. And if I
> try to shift it in, for some reason...the program runs through the MISS
> line multiple times.
>

You have a car with a broken engine and a broken tire and are telling us
that you refuse to fix the engine because it highlights the problem of the
broken tire.

Take the fix and move on to the next problem.

One piece of advice is about scoping. This is perhaps the hardest "gotcha"
of Python conceptually, but it's sensible once you understand the
justifications.

Run the four commands below and try and understand why this applies to your
code.

a = 1

def access_global():
    print(a)

def set_variable():
    a = 2
    print(a)

def broken_set():
    a = a + 1
    print(a)

def also_broken():
    print(a)
    return
    a = 1 # Never run!

The fix for the broken variants is to start the functions with "global a".

[toc] | [prev] | [next] | [standalone]


#51841

Fromkevin4fong@gmail.com
Date2013-08-02 19:24 -0700
Message-ID<0b558115-68c4-460b-863c-fef4b844bb57@googlegroups.com>
In reply to#51839
On Friday, August 2, 2013 7:11:37 PM UTC-7, Joshua Landau wrote:
> On 3 August 2013 02:44,  <kevin...@gmail.com> wrote:
> 
> 
> 
> Yeah, I already know about that. But if I try to change it, I'm not even able to start the program. If I try to change the if statement that it corresponds with, I get a an error saying "card" is not a global. And if I try to shift it in, for some reason...the program runs through the MISS line multiple times.
> 
> 
> 
> 
> 
> You have a car with a broken engine and a broken tire and are telling us that you refuse to fix the engine because it highlights the problem of the broken tire.
> 
> 
> Take the fix and move on to the next problem.
> 
> 
> 
> 
> One piece of advice is about scoping. This is perhaps the hardest "gotcha" of Python conceptually, but it's sensible once you understand the justifications.
> 
> 
> Run the four commands below and try and understand why this applies to your code.
> 
> 
> 
> 
> a = 1
> 
> 
> def access_global():
>     print(a)
> 
> 
> def set_variable():
>     a = 2
>     print(a)
> 
> 
> def broken_set():
> 
> 
>     a = a + 1
>     print(a)
> 
> 
> def also_broken():
>     print(a)
>     return
>     a = 1 # Never run!
> 
> 
> The fix for the broken variants is to start the functions with "global a".

I'll take a look at those. I used that fix you brought up as well but the main issue I get after that is:

I'll try to explain the main issue I'm having as accurately as possible. Basically, I've changed the indentations around but the main issue I get is that the GetTopCard(sDeck) line is being run multiple times for some reason. So when I run the program, I get "MISS: You fished up the rank......" multiple times and my list pHands[0] is increased by several number combinations when I only want it to increase by one. I also updated that last definition in my main code.



def player_0_hitman(hit):
    for card in pHands[target_player]:
        if target_card[0] == card[0]:
            count = pHands[target_player].count(card)
            pHands[0].append(card)
            pHands[target_player].remove(card)
            ShowMessage("HIT: " + str(count) + " card(s) transferred")
        else:
            top_card = GetTopCard(sDeck)
            pHands[0].append(top_card)
            if top_card[0] == target_card[0]:
                ShowMessage("HIT: LUCKILY Player 0 has fished up a rank <" + str(top_card[0]) + ">!!!")
            else:
                ShowMessage("MISS: You fished up the rank <" + str(top_card[0]) + ">")
                hit = hit - 1

[toc] | [prev] | [next] | [standalone]


#51844

FromTerry Reedy <tjreedy@udel.edu>
Date2013-08-03 01:04 -0400
Message-ID<mailman.146.1375506317.1251.python-list@python.org>
In reply to#51841
On 8/2/2013 10:24 PM, kevin4fong@gmail.com wrote:

Looking at this again, I believe you actually had the structure almost 
right before. You want to look through *all* of the target players cards 
and if *none* of them match, (ie the search fails), you want to draw 1 
card. What you were missing before is break or return

def player_0_hitman(hit):
      for card in pHands[target_player]:
          if target_card[0] == card[0]:
              count = pHands[target_player].count(card)
              pHands[0].append(card)
              pHands[target_player].remove(card)
              ShowMessage("HIT: " + str(count) + " card(s) transferred")
              return True

       # else: needed if just break above, but not with return
		
       top_card = GetTopCard(sDeck)
       pHands[0].append(top_card)
       if top_card[0] == target_card[0]:
           ShowMessage("HIT: LUCKILY Player 0 has fished up a rank <" + 
str(top_card[0]) + ">!!!")
           return True
        else:
            ShowMessage("MISS: You fished up the rank <" + 
str(top_card[0]) + ">")
            hit = hit - 1
            return False

The returns are based on what I remember of the rules from decades ago, 
that a hit either in the hand or the draw allowed another turn by the 
player.

-- 
Terry Jan Reedy

[toc] | [prev] | [next] | [standalone]


#51882

Fromkevin4fong@gmail.com
Date2013-08-03 13:12 -0700
Message-ID<65bd3363-8d39-4713-8e31-13ec8629f3a8@googlegroups.com>
In reply to#51844
On Friday, August 2, 2013 10:04:56 PM UTC-7, Terry Reedy wrote:
> On 8/2/2013 10:24 PM, kevin4fong@gmail.com wrote:
> 
> 
> 
> Looking at this again, I believe you actually had the structure almost 
> 
> right before. You want to look through *all* of the target players cards 
> 
> and if *none* of them match, (ie the search fails), you want to draw 1 
> 
> card. What you were missing before is break or return
> 
> 
> 
> def player_0_hitman(hit):
> 
>       for card in pHands[target_player]:
> 
>           if target_card[0] == card[0]:
> 
>               count = pHands[target_player].count(card)
> 
>               pHands[0].append(card)
> 
>               pHands[target_player].remove(card)
> 
>               ShowMessage("HIT: " + str(count) + " card(s) transferred")
> 
>               return True
> 
> 
> 
>        # else: needed if just break above, but not with return
> 
> 		
> 
>        top_card = GetTopCard(sDeck)
> 
>        pHands[0].append(top_card)
> 
>        if top_card[0] == target_card[0]:
> 
>            ShowMessage("HIT: LUCKILY Player 0 has fished up a rank <" + 
> 
> str(top_card[0]) + ">!!!")
> 
>            return True
> 
>         else:
> 
>             ShowMessage("MISS: You fished up the rank <" + 
> 
> str(top_card[0]) + ">")
> 
>             hit = hit - 1
> 
>             return False
> 
> 
> 
> The returns are based on what I remember of the rules from decades ago, 
> 
> that a hit either in the hand or the draw allowed another turn by the 
> 
> player.
> 
> 
> 
> -- 
> 
> Terry Jan Reedy

Thank you, that information worked quite well and is much appreciated.

[toc] | [prev] | [next] | [standalone]


#51835

FromTerry Reedy <tjreedy@udel.edu>
Date2013-08-02 21:42 -0400
Message-ID<mailman.140.1375494162.1251.python-list@python.org>
In reply to#51826
Nonsense: they are executed just as you ask, even though what you ask is 
not what you meant.

On 8/2/2013 8:40 PM, kevin4fong@gmail.com wrote:

> def player_0_hitman(hit):
>      for card in pHands[target_player]:
>          if target_card[0] == card[0]:
>              count = pHands[target_player].count(card)
>              pHands[0].append(card)
>              pHands[target_player].remove(card)
>              ShowMessage("HIT: " + str(count) + " card(s) transferred")
>      else:
            else: # indent to match if
>          if target_card[0] != card[0]:
            # delete this if line, see below.

>              top_card = GetTopCard(sDeck)
>              pHands[0].append(top_card)
>              if top_card[0] == target_card[0]:
>                  ShowMessage("HIT: LUCKILY Player 0 has fished up a rank <" + str(top_card[0]) + ">!!!")
>              else:
>                  ShowMessage("MISS: You fished up the rank <" + str(top_card[0]) + ">")
>                  hit = hit - 1
>              return hit

This executes the for loop multiple times and the the else: clause of 
the *for* statement (see the ref manual). I believe you want the whole 
else: clause indented so that it will be executed when the if condition 
is false. If so, the second if is redundant and should just be removed.

-- 
Terry Jan Reedy

[toc] | [prev] | [next] | [standalone]


#51837

Fromkevin4fong@gmail.com
Date2013-08-02 18:46 -0700
Message-ID<3ded73b2-e493-4726-9272-dd79610cd834@googlegroups.com>
In reply to#51835
On Friday, August 2, 2013 6:42:30 PM UTC-7, Terry Reedy wrote:
> Nonsense: they are executed just as you ask, even though what you ask is 
> 
> not what you meant.
> 
> 
> 
> On 8/2/2013 8:40 PM, kevin4fong@gmail.com wrote:
> 
> 
> 
> > def player_0_hitman(hit):
> 
> >      for card in pHands[target_player]:
> 
> >          if target_card[0] == card[0]:
> 
> >              count = pHands[target_player].count(card)
> 
> >              pHands[0].append(card)
> 
> >              pHands[target_player].remove(card)
> 
> >              ShowMessage("HIT: " + str(count) + " card(s) transferred")
> 
> >      else:
> 
>             else: # indent to match if
> 
> >          if target_card[0] != card[0]:
> 
>             # delete this if line, see below.
> 
> 
> 
> >              top_card = GetTopCard(sDeck)
> 
> >              pHands[0].append(top_card)
> 
> >              if top_card[0] == target_card[0]:
> 
> >                  ShowMessage("HIT: LUCKILY Player 0 has fished up a rank <" + str(top_card[0]) + ">!!!")
> 
> >              else:
> 
> >                  ShowMessage("MISS: You fished up the rank <" + str(top_card[0]) + ">")
> 
> >                  hit = hit - 1
> 
> >              return hit
> 
> 
> 
> This executes the for loop multiple times and the the else: clause of 
> 
> the *for* statement (see the ref manual). I believe you want the whole 
> 
> else: clause indented so that it will be executed when the if condition 
> 
> is false. If so, the second if is redundant and should just be removed.
> 
> Yeah, thanks for the advice. But unfortunately, I already tried that and I ended up with a whole bunch of new errors.
> 
> -- 
> 
> Terry Jan Reedy

[toc] | [prev] | [next] | [standalone]


#51842

FromDave Angel <davea@davea.name>
Date2013-08-03 03:34 +0000
Message-ID<mailman.144.1375500916.1251.python-list@python.org>
In reply to#51826
kevin4fong@gmail.com wrote:

> I'm trying to create a game of Go Fish in Python. But I've stumbled onto a little problem that I can't seem to figure out how to deal with.
>
   <snip>

Please list the program the way you are actually running it.  The
present one will not run very long before producing the error:

Traceback (most recent call last):
  File "kevin.py", line 100, in <module>
    temp_hit = player_0_hitman(hit)
NameError: name 'player_0_hitman' is not defined

Next, tell us the environment it runs in.  In this case that means the
version of Python you're using.  In some places you include parens
around the print arguments, like needed in Python 3, but in others your
code could only work up to version 2.7  So we have to do some detective
work just to discover you're using version 2.x

Next, when telling us of an error, quote the exact traceback, don't just
say something like:  "I get a an error saying "card" is not a global"

Next, what on earth does the following mean:
" And if I try to shift it in" ??  Are you perhaps referring to Perl
grammar, or to DOS batch files?

Next, comments like: "tried that and I ended up with a whole bunch of
new errors"  don't tell us much.  Likewise " I'm not even able to start
the program. If I try to change the if statement that it corresponds
with"  The last noun was "program" so I don't know which of the
program's if statements you're changing.

There are multiple things wrong with the code, and you can't expect any
one of us to be able to spot them all.  Some are clear by inspection,
and others would probably require actually running the code, after you
fix the problem with player_0_hitman above.  Example of inspection: you
have the line:
       temp_hit = player_0_hitman(hit)

but never actually use the temp_hit variable.

Similarly, the line:
    pHands[target_player].remove(card)

is going to mess up the loop it's in,  When you're iterating over a
list, you can't normally add or remove items from that list.

Even after you fix that, the loop is still all wrong.  The count method
will never get more than one, since all the cards are unique.  You want
to count up the cards that match a particular rank, regardless of suit. 
And that loop effectively does that, transferring one at a time.  But
you don't do anything to keep track of how many you transferred.

As for the misplaced else, it doesn't belong there at all.  What you
presumably want to do is after exiting the loop, you want to check the
corrected count value to decide how many cards were transferred.  If
that is non zero, then the logic should be executed, including
decrementing the hit value and returning it.


 Is this your own program? If so, you should be able to
siimplify it to ask a question. Few of us are willing to figure out
the logic of go-fish, but many of us are willing to figure out what
indentation makes sense for a given function.

-- 
DaveA

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.python


csiph-web