2015-08-19 5 views
-2

Мое возвращаемое значение всегда распечатывает в общей сложности 20 независимо от того, какие карты находятся в user_hand. Любая причина в том, почему?Возврат всегда дает мне то же значение

suits = ["Heart", "Diamond", "Spade", "Club"] 
ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] 

deck = [(suit, rank) for rank in ranks for suit in suits] 

random.shuffle(deck,random.random) 

user_hand = [] 
dealer_hand = [] 

user_hand.append(deck.pop()) 

dealer_hand.append(deck.pop()) 

user_hand.append(deck.pop()) 

dealer_hand.append(deck.pop()) 

def handtotal (hand): 

    total = 0 

    for rank in hand: 

     if rank == "J" or "Q" or "K": 

      total += 10 

     elif rank == 'A' and total < 11: 

      total += 11 

     elif rank == 'A' and total >= 11: 

      total += 1 

     elif rank == '2': 

      total += 2 

     elif rank == '3': 

      total += 3 

     elif rank == '4': 

      total += 4 

     elif rank == '5': 

      total += 5 

     elif rank == '6': 

      total += 6 

     elif rank == '7': 

      total += 7 

     elif rank == '8': 

      total += 8 

     elif rank == '9': 

      total += 9 

    return total 


print ("Your current hand is {}".format(user_hand)) 

print ("This provides you with a total of:") 

print (handtotal(user_hand)) 
+0

'ранга == "J" или "Q" или "K"' возвращает истину, вы хотите сделать 'ранг в [ "J", "Q" , "K"] ' – fredtantini

+0

Возможный дубликат [Как проверить одну переменную на несколько значения?] (http://stackoverflow.com/questions/15112125/how-do-i-test-one-variable-against-multiple-values) – fredtantini

+0

Вы действительно должны работать над сокращением вашей ошибки до минимально возможного кода. Это могло бы объяснить вам, какая строка была неправильной. – Teepeemm

ответ

0

Вы должны изменить это:

if rank == "J" or "Q" or "K": 

к этому:

if rank in ["J", "Q", "K"]: 

operator precedence Смотрите для получения дополнительной информации.

1

Одна из ваших проблем эта линия:

if rank == "J" or "Q" or "K" 

Как она стоит, это будет всегда оценить истинные (хорошо, технически "Q"). Вы должны сравнивать rank для всех переменных:

if rank == "J" or rank == "Q" or rank == "K" 

или больше Pythonic путь:

if rank in ["J", "Q", "K"] 

Кроме того, вы передаете user_hand к handtotal(). Поскольку каждый элемент из user_hand является кортежем, вам нужно сравнить со вторым элементом каждого элемента (например, rank[1]) user_hand.

+0

Большое спасибо! – mtomney

+0

Как только я добавил это изменение, сумма теперь всегда оценивается до 0. – mtomney

+0

Это потому, что вы не сравниваете ранг, а «карточку» (целую пару). См. Мой ответ ниже .. – navneet35371

-2

Я думаю, что проблема с этим:

если ранг == «J» или «Q» или «K»:

Я знаю, что вы можете сделать много странных вещей с питоном, но Я уверен, что заявление должно быть

если ранг == «J» или ранг == «Q» или ранг == «K» ...

-1

Как говорили люди, ваш первый, если не ОК.

Кроме того, как я попытался запустить свой код, я также заметил, что вы не сравнивая ранг, но «карта» (вся пара)

Ваш код рабочего будет следующим:

import random 
suits = ["Heart", "Diamond", "Spade", "Club"] 
ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] 

deck = [(suit, rank) for rank in ranks for suit in suits] 

random.shuffle(deck,random.random) 

user_hand = [] 
dealer_hand = [] 

user_hand.append(deck.pop()) 

dealer_hand.append(deck.pop()) 

user_hand.append(deck.pop()) 

dealer_hand.append(deck.pop()) 

def handtotal (hand): 

    total = 0 

    for rank in hand: 
     if rank[1] == "J" or rank[1] == "Q" or rank[1] == "K": 
      total += 10 
     elif rank[1] == 'A' and total < 11: 
      total += 11 
     elif rank[1] == 'A' and total >= 11: 
      total += 1 
     elif rank[1] == '2': 
      total += 2 
     elif rank[1] == '3': 
      total += 3 
     elif rank[1] == '4': 
      total += 4 
     elif rank[1] == '5': 
      total += 5 
     elif rank[1] == '6': 
      total += 6 
     elif rank[1] == '7': 
      total += 7 
     elif rank[1] == '8': 
      total += 8 
     elif rank[1] == '9': 
      total += 9 
    return total 


print ("Your current hand is {}".format(user_hand)) 

print ("This provides you with a total of:") 

print (handtotal(user_hand)) 
-1

Этот код работает здесь:

import random 
suits = ["Heart", "Diamond", "Spade", "Club"] 
ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] 

deck = [(suit, rank) for rank in ranks for suit in suits] 

random.shuffle(deck,random.random) 

user_hand = [] 
dealer_hand = [] 

user_hand.append(deck.pop()) 

dealer_hand.append(deck.pop()) 

user_hand.append(deck.pop()) 

dealer_hand.append(deck.pop()) 

def handtotal (hand): 

    total = 0 

    for rank in hand: 
    rank = rank[1] 
     if rank in ["J", "Q","K"]: 

      total += 10 

     elif rank == 'A' and total < 11: 

      total += 11 

     elif rank == 'A' and total >= 11: 

      total += 1 

     elif rank == '2': 

      total += 2 

     elif rank == '3': 

      total += 3 

     elif rank == '4': 

      total += 4 

     elif rank == '5': 

      total += 5 

     elif rank == '6': 

      total += 6 

     elif rank == '7': 

      total += 7 

     elif rank == '8': 

      total += 8 

     elif rank == '9': 

      total += 9 

    return total 


print ("Your current hand is {}".format(user_hand)) 

print ("This provides you with a total of:") 

print (handtotal(user_hand)) 
+0

Хорошо, я получаю вызов индекса [1], чтобы указать только значение самой карты. Код выше для меня в настоящее время возвращает только первое значение двух карт в руке. Я думал, что цикл for прошел через каждый элемент в списке (или кортеже). – mtomney