Перемещение в 2D координатной плоскости, отслеживание положения и расстояния от начала координат - PullRequest
0 голосов
/ 16 октября 2019

Итак, я пытаюсь создать код (в основном используя класс), который позволил бы мне сделать движение робота (представьте, что есть координатная плоскость), начиная с центра (0,0) ВВЕРХ, ВНИЗ, ВЛЕВО или ВПРАВО. Перед нами стояла задача, чтобы программа неоднократно запрашивала строковый ввод для определения направления и расстояния перемещения, а затем выводила текущее положение и евклидово расстояние робота от начала координат. Предположим, что ввод для направления и расстояния разделен пробелом (например, «UP 5», «LEFT 6»). И если ввод неверен (например, нет направления или номер), выведите «Invalid Input». Пример вывода показан ниже.

Input (Direction Distance): UP 5
Position = (0, 5.0)
Distance = 5.0

Input (Direction Distance): LEFT 2
Position = (-2.0, 5.0)
Distance = 5.3851...

Вот решение, которое я попробовал:

class Robot(object):
    def __init__(self, n=(0,0)):
        self.n = n
        post = list(n)
        self.x = post[0]
        self.y = post[1]

    def movement(self,a):
        direction = self.a[0]
        move = self.a[1]
        if direction == "UP":
            y_d = self.y + move.y
        elif direction == "DOWN":
            y_d = self.y - move.y
        elif direction == "RIGHT":
            x_d = self.x + move.x
        elif direction == "LEFT":
            x_d = self.x - move.x
        return (x_d**2 + y_d**2) **0.5


direction_list = ["UP","DOWN","LEFT","RIGHT"]      
while True:
    question = input('Do you want to enter a move? (YES/NO)')
    while question == 'YES' or question == "Yes" or question == "yes":
        a = input('Input DIRECTION AND DISTANCE').split()
        if a[0] in direction_list and a[1].isnumeric():
            #direction = a[0]
            #distance = a[1]
            print(Robot(a))
        else: 
            print('Invalid Input')  
    break

Когда я пытаюсь запустить его, я всегда получаю это:

Input DIRECTION AND DISTANCEUP 5
<__main__.Robot object at 0x000001EB1DEA9F60>

Кто-нибудь объяснит, что я делаю не так?

1 Ответ

1 голос
/ 16 октября 2019

Сначала вам нужно сделать объект класса Robot, чтобы иметь возможность использовать его методы. Это называется объектно-ориентированным программированием (ООП), я предлагаю прочитать некоторые из его основ.

Для этой конкретной проблемы вам не нужно решение ООП.

Удалите определение класса и просто используйте саму функцию:

 def movement(direction,move):
        if direction == "UP":
            # mathematical calculations without using self. Just put the numbers or 
            #variables you have defined before 
            dis = direction * 10 + move/ 10 # just for sake of having an output
        elif direction == "DOWN":
            dis = direction * 10 + move/ 10 # just for sake of having an output
        elif direction == "RIGHT":
            dis = direction * 10 + move/ 10 # just for sake of having an output
        elif direction == "LEFT":
            dis = direction * 10 + move/ 10 # just for sake of having an output
        return dis

direction_list = ["UP","DOWN","LEFT","RIGHT"]      
while True:
    question = input('Do you want to enter a move? (YES/NO)')
    while question == 'YES' or question == "Yes" or question == "yes":
        a = input('Input DIRECTION AND DISTANCE').split()
        if a[0] in direction_list and a[1].isnumeric():
            #direction = a[0]
            #distance = a[1]
            print(movement(a[0], a[1]))
        else: 
            print('Invalid Input')   
    break

Обратите внимание, что для вызова метода движения вы должны задать входные аргументы, такие как: Move (a [0],a [1])


Редактировать: Хорошо, заметив, что у вас должно быть решение ООП, я сделал этот кусок кода. Что именно вам нужно:

class Robot(object):
    def __init__(self, n=(0,0)):
        self.n = n
        post = list(n)
        self.x = post[0]
        self.y = post[1]
    def distance(self):
        return (self.x **2 + self.y **2) **0.5

    def position(self):
        print("x: ", self.x,"y: ", self.y)

    def movement(self,direction,move):
        x_d = self.x
        y_d = self.y
        if direction == "UP":
            y_d = self.y + move
        elif direction == "DOWN":
            y_d = self.y - move
        elif direction == "RIGHT":
            x_d = self.x + move
        elif direction == "LEFT":
            x_d = self.x - move
        self.x = x_d
        self.y = y_d
        return 0



direction_list = ["UP","DOWN","LEFT","RIGHT"]
robot = Robot()


while True:
    question = input('Do you want to enter a move? (YES/NO)')
    while question == 'YES' or question == "Yes" or question == "yes":
        a = input('Input DIRECTION AND DISTANCE').split()
        if a[0] in direction_list:
            #direction = a[0]
            #distance = a[1]
            robot.movement(a[0], float(a[1]))
            print("Position: ")
            robot.position()
            print ("distance ",robot.distance())
        else: 
            print('Invalid Input')  
    break

Сначала я сделал 2 другие функции. Один для расстояния и один для положения. Функция движения не должна ничего выводить. Смысл ООП в том, чтобы все упростить. Для каждого конкретного действия вам нужен определенный метод (то есть функция).

Вы определяете эти методы в своем классе, а затем создаете объект этого класса. И вызывайте функции «через» объект, который вы сделали. Класс подобен инструкции по созданию робота. Пока объект - твой робот. Вы можете сделать столько объектов (роботов), сколько захотите. Каждый объект похож на переменную, которая содержит данные, которые вы записали в определении класса. (Аргументы и методы)

Также [1] всегда является строкой. (он не является числовым, хотя вы проверили его в своем условии if, но это означает, что строка может рассматриваться как числовое значение. Быть числовым отличается от типа int). Я должен был бросить это, чтобы плавать, в то время как я послал это методу движения. (Я не хотел приводить его к int, потому что значение расстояния может быть значением с плавающей запятой, например, 0,6)

В ООП имеются хорошие ресурсы в Интернете. Самый простой - это w3schools. https://www.w3schools.com/python/python_classes.asp

...