2014-04-17 14 views
5

Wdrażam grę karcianą w Pythonie, a dla mojej klasy do obsługi graczy, PlayerHandler, niedawno zaimplementowałem __next__, aby po prostu zadzwonić pod numer next_player. Ponieważ rozgrywkę można myśleć w nieskończonej pętli (gracze będą grać dalej, dopóki nie zakończą lub nie wygrają/przegrają), nie ma sensu, aby przerwać iterację. Jednak może wydawać się mylące, jeśli pętla for spowodowała nieskończoną pętlę, więc czy powinienem gdzieś podnieść StopIteration?Czy nieskończona pętla to zła praktyka?

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

Myślę, że to jest pytanie https://codereview.stackexchange.com. To powiedziawszy, zastanów się nad zwiększeniem StopIteracji po ostatnim graczu, * ale *, użyj 'itertools.cycle' w gameloop, aby w razie potrzeby wrócić do pierwszego gracza. – kojiro

+1

Nie ma nic złego w iteratorze, który nigdy się nie kończy. Jest to część tego, do czego służą iteratory - nie ma arbitralnych ograniczeń w sekwencji wartości. – dstromberg

+0

Technicznie nie tworzysz nieskończonej pętli, ponieważ na to, na co czekasz, gracze wygrywają/przegrywają/kończą. Jest to definicja początku działania 1: pętla .... tj. gdy wciąż są gracze ... nie rezygnuj. – Amazingred

Odpowiedz

4

Ważne jest, aby twój kod był czytelny. Jeśli się martwisz, dodaj komentarz - właśnie po to są!

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

Powiedziawszy to, może powinieneś przestać, kiedy nie ma już graczy.