2013-01-22 2 views
3

저는 현재 존 젤 (John Zelle)의 파이썬 프로그래밍 : 컴퓨터 과학 개론 (Introduction to Computer Science)에서 10 장의 걸림돌을 짚어보고 있습니다. 왜 그리고 어떻게 운동을하고 문제에 접근하는 방법에 대한 도움이 필요합니다. 이 연습을 통해 Card 클래스를 사용하여 n 개의 카드를 표시하는 프로그램을 만들고 다음과 같은 방법이 필요합니다.파이썬 교과서 요구 사항에 따라 '클래스 카드'를 구현하는 방법

  1. __init__(self, rank, suit):
  2. getRank(self)
  3. getSuite(self)
  4. BJValue(self)
  5. __str__(self)

으로 터무니 : 그것은 또한 무작위 카드의 N 수를 생성하는 응용 프로그램 내에서 호출해야 쉬운 이게 내가이 클래스를 구현하려고하는 벽에 부딪혔다는 것이다. 나는 52 장의 카드 덱을 생성하는 간단한 앱을 만들었고 사용자에게 원하는 카드의 개수를 묻고 그 카드로 손을 채웠다. 핸드가 생성되면 카드 특정 클래스의 혜택을 볼 수 없습니다. 여기 내 작업 코드는 지금까지의 : 나는 임의 N 카드의 손을 생성 한 그래서 일단

import random 

class Card: 
    def __init__(self, rank, suite): 
     self.rank = rank 
     self.suite = suite 

    def getRank(self): 
     return self.rank 

    def getSuite(self): 
     return self.suite 

    def BJValue(self): 
     if self.rank == 'Ace': 
      return 1 
     elif self.rank == 'Jack' or self.rank == 'Queen' or self.rank == 'King': 
      return 10 
     else: 
     return int(self.rank) 

    def __str__(self): 
     return ('{0} of {1}'.format(self.rank, self.suite)) 


def shuffled_deck(): 
    deck = [] 
    for suite in ['Clubs', 'Diamonds', 'Hearts', 'Spades']: 
     for num in ['Ace', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King']: 
      deck.append([num, suite]) 
    random.shuffle(deck) 
    return deck 


def main(): 
    deck = shuffled_deck() 
    hand = [] 
    print('>> Card Generator v1 <<') 
    while True: 
     try: 
      n = int(input('Please enter the number of cards to display (1-7): ')) 
     except ValueError: 
      print('Invalid input, please enter a number!\n') 
     else: 
      if n < 1 or n > 7: 
       print('Please enter a number between 1-7!\n') 
      else: 
       break 
    print('Your hand is:') 
    for i in range(n): 
     hand.append(deck[i]) 



main() 

, 나는 그것을 구현하는 경우에도 카드 클래스를 사용에서 내가 도움이 될 방법을 볼 수 없거나 . n은 1-7 사이의 임의의 숫자이므로 n 각 카드 개체를 저장하고 각 변수를 Card의 인스턴스에 할당 할 변수가 필요합니다. 내가 손으로 각 카드를 hand[i]으로 보여줄 수 있는데, Card 클래스를 필요로하지 않고 range(n)까지 반복하지만,이 프로젝트에서 기대하는 바가 아닙니다. 나는이 문제에 대해 어떻게 생각해야하는지에 대한 조언을 찾고 있으므로이 필수 클래스를 사용할 수 있습니다.

deck.append([num, suite]) 

이것은 deck 변수 52 개 Card 개체의 목록을 만드는

deck.append(Card(num, suite)) 

에 : 그것은 당신이 당신의 코드를 변경해야 할 유일한 것은 보이는

+1

왜 n 개의 변수가 필요합니까? 그냥 그 무작위 카드에 대한 목록을 사용하십시오! –

+3

왜 당신은 2013 년에 파이썬으로 getter와 setter를 배우고 있습니까? –

+1

'스위트'라기보다는 '수트'를 의미합니까? –

답변

11

라인을 변경하는 것입니다. Card 개체에는 두 개의 항목 (예 : [num, suite]) 목록에없는 몇 가지 기본 기능이 있으므로 유용합니다.


두 가지 예 : 당신은 당신의 코드 뒤에 선

print hand 

를 추가 할 경우 새 코드가

[Jack of Clubs, 9 of Spades] 
를 인쇄 할 때, 현재의 코드는

[["Jack", "Clubs"], ["9", "Spades"]] 

같은 것을 인쇄 할 것

(라인 print "\n".join(map(str, hand)))은 실제로 원하는 것에 더 가깝습니다.) 또한 라인 당신의 손의 총 블랙 잭 값을 얻을 수 있습니다 :

sum(c.BJValue() for c in hand) 
+0

환상적! 이것이 내가 필요한 개념이다. 그리고 추가 합계 코드를 제공해 주셔서 감사합니다. 그것은 내가이 문제를 다루는 다음 문제가 될 것입니다. –

+0

당신이 제안한 변경을 한 후 손으로 반복했습니다 : '카드를위한 카드 : print (card.getRank())'이제 각 카드의 객체 생성의 가치를 봅니다. 그 후에 카드를 이름으로 부르지 말고, 손으로 부르십시오. 이것은 혼란 스러웠던 곳에서 각 카드 객체를 호출 가능한 방식으로 식별하는 방법을 결정할 때 사용되었습니다. –

0

내가 파이썬에서 어떤 카드 클래스 등 U "\의 u2263"와를 사용하는 __unicode__ 방법이해야한다고 생각 - 그냥 재미를. 또한 카드를 비교할 수 있도록 @ functools.total_ordering을 __eq__ 및 __gt__ 메서드와 함께 꾸미는 것이 좋습니다. 게다가, "sorted"내장 함수는 카드 목록을 적절히 정렬합니다.

관련 문제