code: def move(self, d, add_tile=True):
          
          if d == Board.LEFT or d == Board.RIGHT:
              chg, get = self.setLine, self.getLine
          elif d == Board.UP or d == Board.DOWN:
              chg, get = self.setCol, self.getCol
          else:
              return 0
  
          moved = False
          score = 0
  
          for i in self.__size_range:
              # save the original line/col
              origin = get(i)
              # move it
              line = self.__moveLineOrCol(origin, d)
              # merge adjacent tiles
              collapsed, pts = self.__collapseLineOrCol(line, d)
              # move it again (for when tiles are merged, because empty cells are
              # inserted in the middle of the line/col)
              new = self.__moveLineOrCol(collapsed, d)
              # set it back in the board
              chg(i, new)
              # did it change?
              if origin != new:
                  moved = True
              score += pts
  
          # don't add a new tile if nothing changed
          if moved and add_tile:
              self.addTile()
  
          return score
docs: move and return the move score