2017-10-19 3 views
0

Je suis novice en matière de classes, mais j'essaie de les intégrer dans des programmes pour des fonctions qui prennent toutes les mêmes entrées (je suppose que c'est ce qui fait le plus sens...?). Je travaille sur un échiquier, donc ça semble aller.Classes Python - faire glisser des noms de variables par l'intermédiaire de fonctions

J'ai un exemple ci-dessous où j'essaie d'obtenir les mouvements valides pour un morceau.

class Board: 

    def __init__(self, board, r, c): 
     self.board = board 
     self.r = r 
     self.c = c 

    def piece(self): 
     return self.board[self.r,self.c] 

    def color(self): 
     #does this line not get pushed down so 'legal_moves' can't see self.piece? 
     self.piece = Board(self.board,self.r,self.c).piece() 

     if self.piece == '-': 
      return 'N' 
     elif self.piece.istitle(): 
      return 'w' 
     else: 
      return 'b' 

#This is the function that returns None 
    def legal_moves(self): 

    moves = {'P':[(1,0)], 
        'p':[(-1,0)], 
        'r':[(1,0),(-1,0),(0,1),(0,-1)], 
        'n':[(2,1),(2,-1),(-2,-1),(-2,1)], 
        'b':[(1,1),(-1,-1),(-1,1),(1,-1)], 
        'k':[(1,0),(-1,0),(0,1),(0,-1),(1,1),(-1,-1),(-1,1),(1,-1)]} 

    return moves.get(self.piece) 

Mon conseil est juste un échiquier standard 8x8 avec R-K pour 'w' et r-K pour 'b' dans sa configuration initiale (pas de coups joués)

print(Board(curr,1,2).piece()) #returns P - correct 
print(Board(curr,1,2).color()) #returns w - correct 
print(Board(curr,1,2).legal_moves()) #returns None - incorrect 

Thank you! De plus, je suis novice en programmation. Si vous avez des commentaires sur le style/l'efficacité, ajoutez-les également.

Répondre

2

vous appelez get sur self.piece qui est votre méthode, pas le résultat de la méthode. Cette clé est pas dans votre dict et vous obtenez la valeur par défaut de get

Vous avez besoin:

moves.get(self.piece()) 

peut-être faire un piecepropriété utilisant le décorateur de la propriété serait plus lisible (et vous ne besoin du ())

@property 
def piece(self): 
    return self.board[self.r,self.c] 

avec que moves.get(self.piece) œuvres.

+0

Merci beaucoup! Parfait. En guise de note, devrais-je être capable de définir 'def valide_move (auto, r, c, r_offset,): self.r_offset, self.c_offset = r + r_offset, c + c_offset' et ensuite utiliser' self.r_offset' dans autres fonctions dans la même classe? Il semble que non, mais je voulais juste vérifier – user6142489