2015-01-16 3 views
4

이 질문은 싫어하고 아마도 정말로 신속하게 대답 할 것이라고 이미 말할 수 있습니다. Id는이 사실을 당신이 내가 이것을 조사했음을 알리는 것에 의해 서언하기를 좋아하지만, 할 수있는 일을 이해하지 못한다.파이썬에서 클래스의 인스턴스를 하나만 사용하는 방법

그래서 나는 카드 게임을 만드는 파이썬 스크립트가 있습니다. 마음에있는 카드 놀이는 3 's이다. 내 가족에게만 게임하는 법을 아는 게임.

내 스크립트는 지금까지입니다 :

import math 
import random 
from itertools import product 

def start_game(): 
    print ("Game started") 
    deck = Deck() 
    deck.current_turn = random.randint(1,2) 
    print ("Player " + str(deck.current_turn) + " will go first.") 
    Round_Start() 
def Round_Start(): 
    deck = Deck() 
    p1down = Player1Down() 
    p2down = Player2Down() 
    p1up = Player1Up() 
    p2up = Player2Up() 
    if p1down.hidden == True: 
     print("P1: " + " - ".join(map(str,p1up.cards))) 
     print("P1: #/# - #/# - #/#") 
    else: 
     print("P1: " + " - ".join(map(str,p1up.cards))) 
     print("P1: " + " - ".join(map(str,p1down.cards))) 
    if p2down.hidden == True: 
     print("P2: " + " - ".join(map(str,p2up.cards))) 
     print("P2: #/# - #/# - #/#") 
    else: 
     print("P2: " + " - ".join(map(str,p2up.cards))) 
     print("P2: " + " - ".join(map(str,p2down.cards))) 
    Give_Turn() 
def P1Turn(): 
    print("It is now Player 1's turn.") 
def P2Turn(): 
    print("It is now Player 2's turn.") 
def Give_Turn(): 
    deck = Deck() 
    print(deck.current_turn) 
    if deck.current_turn == 2: 
     print("It is now Player 1's turn.") 
     P1Turn() 
    elif deck.current_turn == 1: 
     print("It is now Player 2's turn.") 
     P2Turn() 
class Player1Down(object): 
    def __init__(self): 
     deck = Deck() 
     self.cards = deck.Deal(3) 
     self.hidden = True 
class Player2Down(object): 
    def __init__(self): 
     deck = Deck() 
     self.cards = deck.Deal(3) 
     self.hidden = True 
class Player1Up(object): 
    def __init__(self): 
     deck = Deck() 
     self.cards = deck.Deal(3) 
class Player2Up(object): 
    def __init__(self): 
     deck = Deck() 
     self.cards = deck.Deal(3) 
class Deck(object): 
    current_turn = 0 
    def __init__(self, ranks=None, suits=None): 

     if ranks is None: 
      ranks = range(2,15) 
     if suits is None: 
      suits = ["H","D","C","S"] 
     self.deck = [] 
     for r in ranks: 
      for s in suits: 
       self.deck.append(Card(r,s)) 
    def Deal(self, n): 
     return random.sample(self.deck,n) 

class Card(object): 
    FACES = {11: 'J', 12: 'Q', 13: 'K', 14: 'A'} 
    def __init__(self, rank, suit): 
     self.suit = suit 
     self.rank = rank 

    def __str__(self): 
     value = self.FACES.get(self.rank, self.rank) 
     return "{0}/{1}".format(value, self.suit) 

    def __lt__(self, other): 
     return self.rank < other.rank 
if __name__ == '__main__': 
    start_game() 

지금 스크립트의 일부는 다른 사용자가 내가 일을이 시점까지 작동시킬 수있는 유일한 방법이었다, 직장에서 직접 복사 붙여 넣기입니다.

내 문제는

deck.current_turn 

는 내가 연 데크() 클래스의 여러 인스턴스를 가질 수 있기 때문입니다 알아낼 0으로 재설정 유지한다는 것이다. 그러나 나는 이것을 고치는 법을 모른다. 현재 스크립트에서

내 출력은 다음과 같습니다

Game started 
Player 2 will go first. 
P1: 7/H - 9/H - J/H 
P1: #/# - #/# - #/# 
P2: 5/H - 3/S - 10/H 
P2: #/# - #/# - #/# 
0 

이것은 내 첫 번째 스택 교환 포스트이며,이 바보 같은 질문 경우 미안 해요.

+3

게임을 시작할 때'Deck'을 한 번 만든 다음 모든 기능에'deck' 변수로 전달하십시오. 어쨌든 실생활에서는 매 게임마다 게임 덱에서 새 갑판을 구입하지 않을 것입니다. 어쨌든 하나의 프로그램에서 여러 게임을 실행할 수 없기 때문에 어쨌든 나쁜 생각 일 것입니다. – Rufflewind

+2

네, 새로운'Deck()'인스턴스를 만들 때마다 현재 턴은 0이됩니다. 게임을 시작할 때 하나의'Deck' 인스턴스를 만든 다음 내부적으로 처리하십시오. 'Game'과 같은 새로운 클래스를 만들고, __init__ 메소드에서'Deck'을 인스턴스화 할 수 있습니다. 그렇게하면 게임 내내 self.deck을 참조 할 수 있습니다. – reptilicus

+1

나는 Rufflewind와 Reptilicus가 주어진 해답을 조합 해 해결책을 찾았다. 나는 'Game'이라는 클래스를 만들었고 거기에서 'Deck'을 인스턴스화하고 나머지 'Game'클래스에서 참조했습니다. 매력을 발휘합니다. 감사! –

답변

1

의견에서 제안 된 해결책은 훨씬 뛰어 났지만 신속하고 더러운 접근법은 SingletonBorg입니다.

싱글 톤 방법 :

class Deck(object): 
    _deck = None 
    def __new__(cls, *a, **k): 
     if not cls._deck: 
      cls._deck = object.__new__(cls, *a, **k) 
     return cls._deck 
    # and the rest as you have it above 

보그 방법 :

class Deck(object): 
    _dict = {} 
    def __init__(self, ranks=None, suits=None): 
     self.__dict__ = self._dict 
     # and the rest as you have it, inc. the rest of __init__ 

그들은 모두 작동합니다. Borg의 창안자로서, 나는 그것을위한 부드러운 장소를 가지고 있습니다. 그리고 여러분은 여전히 ​​http://www.aleax.it/Python/5ep.html에서 그것에 관한 저의 고대 에세이를 읽을 수 있습니다.

관련 문제