В то время как move_ip()
изменяет положение самого объекта, move
возвращает новый объект с другой позицией, но не изменяет сам объект.
Следовательно, self.rect.move(50,400)
вообще ничего не делает, потому что возвращаемое значение никуда не идет.
Оператор
self.rect.move_ip(50,400)
может быть заменен на
self.rect = self.rect.move(50,400)