2016-11-20 6 views
0

Ich mache ein Projekt in Python und ein Teil davon beinhaltet Ranking Board Staaten in einem Spiel. Dieses Spiel, Sneaky Statues, ist ähnlich zu verbinden vier, in denen Sie gewinnen, indem Sie vier Stücke in Folge. Meine naive Einschätzung eines Bretts ist, wie viele Stücke du hintereinander hast (also entweder 1,2,3 oder 4). Das Brett ist ein Dreieck, so dass Sie Teile in einer Reihe hoirizontaly oder diagonal in jeder Richtung haben können. Dies ist die Funktion, die ich gerade benutze, um Stücke zu finden.Wie Code effektiv in Python wiederverwenden

def score(player): 

    player_x = sorted(player, key=lambda statue: statue.x) #player's pieces sorted by x coordinate 
    player_y = sorted(player, key=lambda statue: statue.y) 
    max_score = [0] 

    count = 1 
    #pieces are in a horizontal line if they share a y coord and have sequential x coords 
    for cur_s, next_s in zip(player_x, player_x[1:]): 
     if cur_s.x + 1 == next_s.x and cur_s.y == next_s.y: 
      count += 1 
     else: 
      max_score.append(count) 
      count = 1 
    max_score.append(count) 

    count = 1 
    #pieces are diagonal if they share an x and have sequental y's 
    for cur_s, next_s in zip(player_y, player_y[1:]): 
     if cur_s.y + 1 == next_s.y and cur_s.x == next_s.x: 
      count += 1 
     else: 
      max_score.append(count) 
      count = 1 
    max_score.append(count) 

    count = 1 
    #they are diagonal if both x's and y's are sequential 
    for cur_s, next_s in zip(player_y, player_y[1:]): 
     if cur_s.y + 1 == next_s.y and cur_s.x + 1 == next_s.x: 
      count += 1                                        
     else: 
      max_score.append(count) 
      count = 1 
    max_score.append(count) 

    return max(max_score) 

Soweit ich seine Arbeit sagen kann, aber ich wiederhole mich im Wesentlichen dreimal. Meine Frage ist, was ist der pythischste Weg für mich, diese Funktion zu schreiben, damit ich mich weniger wiederhole?

Antwort

1

Dies ist wahrscheinlich nicht die beste, aber auf den ersten Blick sehe ich, dass Sie alle Schleifen in einer einzigen Funktion kombinieren die drei Argumente hat:

def score(player): 

    player_x = sorted(player, key=lambda statue: statue.x) #player's pieces sorted by x coordinate 
    player_y = sorted(player, key=lambda statue: statue.y) 
    max_score = [0] 

    def take_count(player, x_offset, y_offset): 
     count = 1 
     for cur_s, next_s in zip(player, player[1:]): 
      if cur_s.x + x_offset == next_s.x and cur_s.y + y_offset == next_s.y: 
       count += 1 
      else: 
       max_score.append(count) 
       count = 1 
     max_score.append(count) 

    #pieces are in a horizontal line if they share a y coord and have sequential x coords 
    take_count(player_x, 1, 0) 

    #pieces are diagonal if they share an x and have sequental y's 
    take_count(player_y, 0, 1) 

    #they are diagonal if both x's and y's are sequential 
    take_count(player_y, 1, 1) 

    return max(max_score) 
Verwandte Themen