2014-04-17 6 views
5

मैं अजगर में एक कार्ड खेल को लागू कर रहा हूँ, और मेरे स्तर के खिलाड़ी, PlayerHandler संभाल करने के लिए, मैं हाल ही में __next__ कार्यान्वित बस next_player कॉल करने के लिए। चूंकि गेमप्ले को अनंत लूप में सोचा जा सकता है (खिलाड़ियों को छोड़ने या जीतने/हारने तक खेलना जारी रहेगा), इसे पुनरावृत्ति रोकने के लिए यह समझ में नहीं आया। हालांकि, यह एक भ्रमित प्रतीत हो सकता है अगर लूप के लिए एक अनंत लूप का कारण बनता है, तो क्या मुझे कहीं StopIteration उठाना चाहिए?लूप खराब अभ्यास के लिए एक अनंत है?

class PlayerHandler(): 
    """Holds and handles players and order""" 
    def __init__(self, players=None, order=1): 
     if players is None: 
      self.players = [] 
     else: 
      self.players = list(players) 
     self.current_player = None 
     self.next_player() 
     self.order = order 

    def get_player(self, interval): 
     assert type(interval) == int, "Key must be an integer!" 
     if not interval and self.players: 
      return self.current_player 
     elif self.players: 
      step = interval * self.order 
      index = self.players.index(self.current_player) + step 
      while index >= len(self.players): 
       index -= len(self.players) 
      while index <= -(len(self.players)): 
       index += len(self.players) 
      return self.players[index] 
     else: 
      raise KeyError("No players in the list!") 

    def next_player(self): 
     """Sets the current player to the next player to play""" 
     if not self.current_player: 
      if self.players: 
       self.current_player = self.players[0] 
      else: 
       self.current_player = None 
     else: 
      self.current_player = self.get_player(1) 

    def __iter__(self): 
     return self 

    def __next__(self): 
     self.next_player() 
     return self.current_player 
+2

मुझे लगता है कि यह एक https://codereview.stackexchange.com सवाल है। उस ने कहा, अंतिम खिलाड़ी के बाद स्टॉपइटरेशन बढ़ाने पर विचार करें, * लेकिन *, गैमेलोप में 'itertools.cycle' का उपयोग करें, यदि उपयुक्त हो तो पहले खिलाड़ी को वापस चक्र में ले जाएं। – kojiro

+1

एक पुनरावर्तक के साथ कुछ भी गलत नहीं है जो कभी खत्म नहीं होता है। यह इटेटरेटर के लिए क्या है इसका हिस्सा है - मूल्यों के अनुक्रम पर कोई मनमानी सीमा नहीं है। – dstromberg

+0

तकनीकी रूप से आप एक अनंत लूप नहीं बना रहे हैं क्योंकि आप जो इंतजार कर रहे हैं वह जीतने/खोने/छोड़ने वाले खिलाड़ी हैं। यह थोड़ी देर चलने की बहुत परिभाषा है 1: लूप .... यानी। जबकि अभी भी खिलाड़ी हैं .... छोड़ो मत। – Amazingred

उत्तर

4

क्या मायने रखता है कि आपका कोड पठनीय है। यदि आप चिंतित हैं, तो एक टिप्पणी जोड़ें - यही वह है जो वे हैं!

# Endless loop 
for p in players: 
    # Do game things... 

ऐसा कहकर, शायद आपको कोई और खिलाड़ी नहीं होने पर रोकना चाहिए।

संबंधित मुद्दे