Игра на Python слишком медленная

#python #python-turtle

#python #python-черепаха

Вопрос:

Моя игра стала слишком медленной после того, как я создал код в комментариях #sensors (см. Код ниже, в его циклах for много итераций). Я создал элементы управления для перемещения красной точки человеком, но предполагается, что в игру можно играть самостоятельно, с помощью компьютера.

Мой вопрос:

  1. Мой macbook pro 15 «от 2015 слишком медленный (будет ли этот код работать с другим компьютером)? или
  2. Язык Python слишком медленный (будет ли этот код работать с другим языком)? или
  3. Является ли модуль Python (turtle) неправильным для такого рода задач? или
  4. Мой код просто ужасен (он не будет работать ни с одним языком, ни с любым компьютером)?

или что-то еще?

Это мой код:

 import turtle
import math

#Set up screen
wn = turtle.Screen()
wn.bgcolor("lightyellow")
score = 0

#Draw border
mypen = turtle.Turtle()
mypen.penup()
mypen.setposition(-300, -300)
mypen.speed(0)
mypen.pendown()
mypen.pensize(3)
for side in range(4):
    mypen.forward(600)
    mypen.left(90)
mypen.hideturtle()

#Draw obstacle
myObstacle = turtle.Turtle()
myObstacle.penup()
myObstacle.setposition(-150, -150)
myObstacle.speed(0)
myObstacle.pendown()
myObstacle.pensize(3)
for side in range(4):
    myObstacle.forward(300)
    myObstacle.left(90)
myObstacle.hideturtle()

#Create player turtle
player = turtle.Turtle()
player.penup()
player.speed(0)
player.setposition(-200, -200)
player.color("red")
player.shape("circle")


#Set speed variable
speed = 1


#define functions
def turnleft():
    player.left(30)
def turnright():
    player.right(30)
def increasespeed():
    global speed
    speed  = 1
def decreasespeed():
    global speed
    if speed > 1:
        speed -= 1


#Set keyboard bindings
turtle.listen()
turtle.onkey(turnleft, "Left")
turtle.onkey(turnright, "Right")
turtle.onkey(increasespeed, "Up")
turtle.onkey(decreasespeed, "Down")


#bounderies
def merge(list1, list2): 
    merged_list = [(list1[i], list2[i]) for i in range(0, len(list1))] 
    return merged_list 

bounderies = merge([-300] * 601, list(range(-300,301)))
bounderies.extend(merge([300] * 601, list(range(-300,301))))
bounderies.extend(merge(list(range(-300,301)), [-300] * 601))
bounderies.extend(merge(list(range(-300,301)), [300] * 601))

bounderies.extend(merge([-150] * 301, list(range(-150,151))))
bounderies.extend(merge([150] * 301, list(range(-150,151))))
bounderies.extend(merge(list(range(-150,151)), [-150] * 301))
bounderies.extend(merge(list(range(-150,151)), [150] * 301))

def scoreset():
        global score
        score  = 1
        scorestring = "Score: %s" %score
        mypen.undo()
        mypen.penup()
        mypen.setposition(-340, 310)
        mypen.pendown()
        mypen.color("green")
        mypen.write(scorestring, False, align = "left", font=("ariel", 16, "bold"))




        

#sensors
def forwardDistance():
    forwardDistance = []
    minForwDist = 0
    tupleCoordinate = (0,0)
    yCoordinate = 0
    xCoordinate = 0
    position = (int(player.xcor()), int(player.ycor()))
    heading = player.heading()
    sinus = math.sin(math.radians(heading))
    cosinus = math.cos(math.radians(heading))
    tangent = sinus / cosinus
    
    for alpha in range(1000):
        if (heading < 45 and heading >= 0) or (heading < 360 and heading >= 315):
            xCoordinate = position[0]   alpha
            yCoordinate = xCoordinate * tangent   (position[1] - position[0] * tangent)
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))
            
        elif (heading < 315 and heading >= 225):
            yCoordinate = position[1] - alpha
            xCoordinate = (yCoordinate - (position[1] - position[0] * tangent)) / tangent
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        elif (heading < 225 and heading >= 135):
            xCoordinate = position[0] - alpha
            yCoordinate = xCoordinate * tangent   (position[1] - position[0] * tangent)
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        elif (heading < 135 and heading >= 45):
            yCoordinate = position[1]   alpha
            xCoordinate = (yCoordinate - (position[1] - position[0] * tangent)) / tangent
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        if tupleCoordinate in bounderies:
            forwardDistance.append(player.distance(tupleCoordinate))
            minForwDist = min(forwardDistance)
            #print("Forward distance: ", int(minForwDist))
    return minForwDist

def leftDistance():
    forwardDistance = []
    minForwDist = 0
    tupleCoordinate = (0,0)
    yCoordinate = 0
    xCoordinate = 0
    position = (int(player.xcor()), int(player.ycor()))
    if player.heading()   90 >= 360:
        heading = player.heading()   90 - 360
    else:
        heading = player.heading()   90
    sinus = math.sin(math.radians(heading))
    cosinus = math.cos(math.radians(heading))
    tangent = sinus / cosinus
    
    for alpha in range(1000):
        if (heading < 45 and heading >= 0) or (heading < 360 and heading >= 315):
            xCoordinate = position[0]   alpha
            yCoordinate = xCoordinate * tangent   (position[1] - position[0] * tangent)
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))
            
        elif (heading < 315 and heading >= 225):
            yCoordinate = position[1] - alpha
            xCoordinate = (yCoordinate - (position[1] - position[0] * tangent)) / tangent
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        elif (heading < 225 and heading >= 135):
            xCoordinate = position[0] - alpha
            yCoordinate = xCoordinate * tangent   (position[1] - position[0] * tangent)
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        elif (heading < 135 and heading >= 45):
            yCoordinate = position[1]   alpha
            xCoordinate = (yCoordinate - (position[1] - position[0] * tangent)) / tangent
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        if tupleCoordinate in bounderies:
            forwardDistance.append(player.distance(tupleCoordinate))
            minForwDist = min(forwardDistance)
            #print("Left distance: ", int(minForwDist))
    return minForwDist

def leftForwardDistance():
    forwardDistance = []
    minForwDist = 0
    tupleCoordinate = (0,0)
    yCoordinate = 0
    xCoordinate = 0
    position = (int(player.xcor()), int(player.ycor()))
    if player.heading()   45 >= 360:
        heading = player.heading()   45 - 360
    else:
        heading = player.heading()   45
    sinus = math.sin(math.radians(heading))
    cosinus = math.cos(math.radians(heading))
    tangent = sinus / cosinus
    
    for alpha in range(1000):
        if (heading < 45 and heading >= 0) or (heading < 360 and heading >= 315):
            xCoordinate = position[0]   alpha
            yCoordinate = xCoordinate * tangent   (position[1] - position[0] * tangent)
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))
            
        elif (heading < 315 and heading >= 225):
            yCoordinate = position[1] - alpha
            xCoordinate = (yCoordinate - (position[1] - position[0] * tangent)) / tangent
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        elif (heading < 225 and heading >= 135):
            xCoordinate = position[0] - alpha
            yCoordinate = xCoordinate * tangent   (position[1] - position[0] * tangent)
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        elif (heading < 135 and heading >= 45):
            yCoordinate = position[1]   alpha
            xCoordinate = (yCoordinate - (position[1] - position[0] * tangent)) / tangent
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        if tupleCoordinate in bounderies:
            forwardDistance.append(player.distance(tupleCoordinate))
            minForwDist = min(forwardDistance)
            #print("Left-forward distance: ", int(minForwDist))
    return minForwDist

def rightDistance():
    forwardDistance = []
    minForwDist = 0
    tupleCoordinate = (0,0)
    yCoordinate = 0
    xCoordinate = 0
    position = (int(player.xcor()), int(player.ycor()))
    if player.heading() < 90:
        heading = 360 - (90 - player.heading())
    else:
        heading = player.heading() - 90
    sinus = math.sin(math.radians(heading))
    cosinus = math.cos(math.radians(heading))
    tangent = sinus / cosinus
    
    for alpha in range(1000):
        if (heading < 45 and heading >= 0) or (heading < 360 and heading >= 315):
            xCoordinate = position[0]   alpha
            yCoordinate = xCoordinate * tangent   (position[1] - position[0] * tangent)
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))
            
        elif (heading < 315 and heading >= 225):
            yCoordinate = position[1] - alpha
            xCoordinate = (yCoordinate - (position[1] - position[0] * tangent)) / tangent
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        elif (heading < 225 and heading >= 135):
            xCoordinate = position[0] - alpha
            yCoordinate = xCoordinate * tangent   (position[1] - position[0] * tangent)
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        elif (heading < 135 and heading >= 45):
            yCoordinate = position[1]   alpha
            xCoordinate = (yCoordinate - (position[1] - position[0] * tangent)) / tangent
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        if tupleCoordinate in bounderies:
            forwardDistance.append(player.distance(tupleCoordinate))
            minForwDist = min(forwardDistance)
            #print("Right distance: ", int(minForwDist))
    return minForwDist

def rightForwardDistance():
    forwardDistance = []
    minForwDist = 0
    tupleCoordinate = (0,0)
    yCoordinate = 0
    xCoordinate = 0
    position = (int(player.xcor()), int(player.ycor()))
    if player.heading() < 45:
        heading = 360 - (45 - player.heading())
    else:
        heading = player.heading() - 45
    sinus = math.sin(math.radians(heading))
    cosinus = math.cos(math.radians(heading))
    tangent = sinus / cosinus
    
    for alpha in range(1000):
        if (heading < 45 and heading >= 0) or (heading < 360 and heading >= 315):
            xCoordinate = position[0]   alpha
            yCoordinate = xCoordinate * tangent   (position[1] - position[0] * tangent)
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))
            
        elif (heading < 315 and heading >= 225):
            yCoordinate = position[1] - alpha
            xCoordinate = (yCoordinate - (position[1] - position[0] * tangent)) / tangent
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        elif (heading < 225 and heading >= 135):
            xCoordinate = position[0] - alpha
            yCoordinate = xCoordinate * tangent   (position[1] - position[0] * tangent)
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        elif (heading < 135 and heading >= 45):
            yCoordinate = position[1]   alpha
            xCoordinate = (yCoordinate - (position[1] - position[0] * tangent)) / tangent
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        if tupleCoordinate in bounderies:
            forwardDistance.append(player.distance(tupleCoordinate))
            minForwDist = min(forwardDistance)
            #print("Right-forward distance: ", int(minForwDist))
    return minForwDist
#finished sensors


while True:
    rightForwardDistance()
    rightDistance()
    leftForwardDistance()
    leftDistance()
    forwardDistance()
    sensors = {'left': leftDistance(), 'left forward': leftForwardDistance(), 'forward': forwardDistance(), 'right forward': rightForwardDistance(), 'right': rightDistance()}
    changeDirectionTo = max(sensors, key=sensors.get)
    
    player.forward(speed)

    #change Direction To
    if changeDirectionTo == 'left':
        player.left(90)
    elif changeDirectionTo == 'left forward':
        player.left(45)
    elif changeDirectionTo == 'right forward':
        player.right(45)
    elif changeDirectionTo == 'right':
        player.right(90)
    
    #when hitting the boundary
    if (int(player.position()[0]),int(player.position()[1])) in bounderies:
        scoreset()
        
    if player.xcor() > 300 or player.xcor() < -300:
        player.right(30)
        
    if player.ycor() > 300 or player.ycor() < -300:
        player.right(30)
    
    if player.position() == myObstacle.position():
        player.right(30)
        
    if player.xcor() > -150 and player.xcor() < 150 and player.ycor() > -150 and player.ycor() < 150:
        player.right(30)
 

Комментарии:

1. Я новичок в программировании, и я уверен, что есть лучшие способы сделать это, мне просто интересно, почему этот код не работает.

2. Что ж, попробуйте подумать, что minForwDist = min(forwardDistance) нужно сделать в первую очередь и где вы должны это сделать.

3. Работает ли код или нет? Насколько она медленная?

4. Да, код работает, он очень медленный, но воспроизводимый, если у вас есть крайнее терпение. Я бы сказал, что это, вероятно, 10% -20% от первоначальной скорости.

5. Также обратите внимание, что в верхней части вашего while True: цикла вы вызываете каждую из функций distance, а затем отбрасываете их результаты. Это делает программу примерно в два раза медленнее, чем необходимо.

Ответ №1:

Я скопировал и запустил ваш код, и позвольте мне сначала ответить на вопросы:

  1. Нет, ваш компьютер в порядке.
  2. В данном случае это не должно быть проблемой.
  3. Я в это не верю. Проверьте документацию.
  4. Я бы сказал, что это можно улучшить.

Основное место, где код выполняет большую обработку, находится в wile True условии. Там вы вызываете 10 функций:

 rightForwardDistance()
rightDistance()
leftForwardDistance()
leftDistance()
forwardDistance()
sensors = {'left': leftDistance(), 'left forward': leftForwardDistance(), 'forward': forwardDistance(),
           'right forward': rightForwardDistance(), 'right': rightDistance()}
 

если у каждого из них есть цикл for с диапазоном 1000, удаление / комментирование первых 5 сделает игру немного быстрее.

 rightForwardDistance()
rightDistance()
leftForwardDistance()
leftDistance()
forwardDistance()
 

Кроме того, код можно улучшить различными способами, например:

     for alpha in range(1000):
    if (heading < 45 and heading >= 0) or (heading < 360 and heading >= 315):
        xCoordinate = position[0]   alpha
        yCoordinate = xCoordinate * tangent   (position[1] - position[0] * tangent)
        tupleCoordinate = (int(xCoordinate), int(yCoordinate))

    elif (heading < 315 and heading >= 225):
        yCoordinate = position[1] - alpha
        xCoordinate = (yCoordinate - (position[1] - position[0] * tangent)) / tangent
        tupleCoordinate = (int(xCoordinate), int(yCoordinate))

    elif (heading < 225 and heading >= 135):
        xCoordinate = position[0] - alpha
        yCoordinate = xCoordinate * tangent   (position[1] - position[0] * tangent)
        tupleCoordinate = (int(xCoordinate), int(yCoordinate))

    elif (heading < 135 and heading >= 45):
        yCoordinate = position[1]   alpha
        xCoordinate = (yCoordinate - (position[1] - position[0] * tangent)) / tangent
        tupleCoordinate = (int(xCoordinate), int(yCoordinate))

    if tupleCoordinate in bounderies:
        forwardDistance.append(player.distance(tupleCoordinate))
        minForwDist = min(forwardDistance)
    # print("Left distance: ", int(minForwDist))
 

Этот код повторяется 5 раз и может быть перемещен в функцию, чтобы избежать его повторения.
В коде также есть неиспользуемые переменные, которые можно удалить.

 yCoordinate = 0
xCoordinate = 0
 

После этих изменений код будет более читаемым и немного быстрее:

 import turtle
import math

# Set up screen
wn = turtle.Screen()
wn.bgcolor("lightyellow")
score = 0

# Draw border
mypen = turtle.Turtle()
mypen.penup()
mypen.setposition(-300, -300)
mypen.speed(0)
mypen.pendown()
mypen.pensize(3)
for side in range(4):
    mypen.forward(600)
    mypen.left(90)
mypen.hideturtle()

# Draw obstacle
myObstacle = turtle.Turtle()
myObstacle.penup()
myObstacle.setposition(-150, -150)
myObstacle.speed(0)
myObstacle.pendown()
myObstacle.pensize(3)
for side in range(4):
    myObstacle.forward(300)
    myObstacle.left(90)
myObstacle.hideturtle()

# Create player turtle
player = turtle.Turtle()
player.penup()
player.speed(0)
player.setposition(-200, -200)
player.color("red")
player.shape("circle")

# Set speed variable
speed = 1


# define functions
def turnleft():
    player.left(30)


def turnright():
    player.right(30)


def increasespeed():
    global speed
    speed  = 1


def decreasespeed():
    global speed
    if speed > 1:
        speed -= 1


# Set keyboard bindings
turtle.listen()
turtle.onkey(turnleft, "Left")
turtle.onkey(turnright, "Right")
turtle.onkey(increasespeed, "Up")
turtle.onkey(decreasespeed, "Down")


# bounderies
def merge(list1, list2):
    merged_list = [(list1[i], list2[i]) for i in range(0, len(list1))]
    return merged_list


bounderies = merge([-300] * 601, list(range(-300, 301)))
bounderies.extend(merge([300] * 601, list(range(-300, 301))))
bounderies.extend(merge(list(range(-300, 301)), [-300] * 601))
bounderies.extend(merge(list(range(-300, 301)), [300] * 601))

bounderies.extend(merge([-150] * 301, list(range(-150, 151))))
bounderies.extend(merge([150] * 301, list(range(-150, 151))))
bounderies.extend(merge(list(range(-150, 151)), [-150] * 301))
bounderies.extend(merge(list(range(-150, 151)), [150] * 301))


def scoreset():
    global score
    score  = 1
    scorestring = "Score: %s" % score
    mypen.undo()
    mypen.penup()
    mypen.setposition(-340, 310)
    mypen.pendown()
    mypen.color("green")
    mypen.write(scorestring, False, align="left", font=("arial", 16, "bold"))


# sensors
def forwardDistance():
    position = (int(player.xcor()), int(player.ycor()))
    heading = player.heading()
    sinus = math.sin(math.radians(heading))
    cosinus = math.cos(math.radians(heading))
    tangent = sinus / cosinus

    return doMath(heading, position, tangent)



def leftDistance():
    position = (int(player.xcor()), int(player.ycor()))
    if player.heading()   90 >= 360:
        heading = player.heading()   90 - 360
    else:
        heading = player.heading()   90
    sinus = math.sin(math.radians(heading))
    cosinus = math.cos(math.radians(heading))
    tangent = sinus / cosinus

    return doMath(heading, position, tangent)


def leftForwardDistance():
    position = (int(player.xcor()), int(player.ycor()))
    if player.heading()   45 >= 360:
        heading = player.heading()   45 - 360
    else:
        heading = player.heading()   45
    sinus = math.sin(math.radians(heading))
    cosinus = math.cos(math.radians(heading))
    tangent = sinus / cosinus

    return doMath(heading, position, tangent)


def rightDistance():
    position = (int(player.xcor()), int(player.ycor()))
    if player.heading() < 90:
        heading = 360 - (90 - player.heading())
    else:
        heading = player.heading() - 90
    sinus = math.sin(math.radians(heading))
    cosinus = math.cos(math.radians(heading))
    tangent = sinus / cosinus

    return doMath(heading, position, tangent)


def rightForwardDistance():
    position = (int(player.xcor()), int(player.ycor()))
    if player.heading() < 45:
        heading = 360 - (45 - player.heading())
    else:
        heading = player.heading() - 45
    sinus = math.sin(math.radians(heading))
    cosinus = math.cos(math.radians(heading))
    tangent = sinus / cosinus

    return doMath(heading, position, tangent)


def doMath(heading, position, tangent):
    forwardDistance = []
    minForwDist = 0
    tupleCoordinate = (0, 0)

    for alpha in range(1000):
        if (heading < 45 and heading >= 0) or (heading < 360 and heading >= 315):
            xCoordinate = position[0]   alpha
            yCoordinate = xCoordinate * tangent   (position[1] - position[0] * tangent)
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        elif (heading < 315 and heading >= 225):
            yCoordinate = position[1] - alpha
            xCoordinate = (yCoordinate - (position[1] - position[0] * tangent)) / tangent
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        elif (heading < 225 and heading >= 135):
            xCoordinate = position[0] - alpha
            yCoordinate = xCoordinate * tangent   (position[1] - position[0] * tangent)
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        elif (heading < 135 and heading >= 45):
            yCoordinate = position[1]   alpha
            xCoordinate = (yCoordinate - (position[1] - position[0] * tangent)) / tangent
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        if tupleCoordinate in bounderies:
            forwardDistance.append(player.distance(tupleCoordinate))
            minForwDist = min(forwardDistance)

    return minForwDist

# finished sensors


while True:
    sensors = {'left': leftDistance(), 'left forward': leftForwardDistance(), 'forward': forwardDistance(),
               'right forward': rightForwardDistance(), 'right': rightDistance()}
    changeDirectionTo = max(sensors, key=sensors.get)

    player.forward(speed)

    # change Direction To
    if changeDirectionTo == 'left':
        player.left(90)
    elif changeDirectionTo == 'left forward':
        player.left(45)
    elif changeDirectionTo == 'right forward':
        player.right(45)
    elif changeDirectionTo == 'right':
        player.right(90)

    # when hitting the boundary
    if (int(player.position()[0]), int(player.position()[1])) in bounderies:
        scoreset()

    if player.xcor() > 300 or player.xcor() < -300:
        player.right(30)

    if player.ycor() > 300 or player.ycor() < -300:
        player.right(30)

    if player.position() == myObstacle.position():
        player.right(30)

    if player.xcor() > -150 and player.xcor() < 150 and player.ycor() > -150 and player.ycor() < 150:
        player.right(30)
 

Комментарии:

1. Спасибо! Я постараюсь улучшить его, как вы сказали.

Ответ №2:

У вас есть довольно много мест, таких как:

if something in bounderies: ...

Проблема в том, bounderies что это список, так что поиск — это операция O (n). И поскольку это наиболее распространенный случай something not in bounderies , обычно приходится проверять весь список, чтобы убедиться, что ваших координат в нем нет.

Добавление одной строки:

 ...
bounderies.extend(merge(list(range(-150,151)), [-150] * 301))
bounderies.extend(merge(list(range(-150,151)), [150] * 301))
bounderies = set(bounderies)  # <--
 

оказывается, это очень дорого — и часто! — поиск от O (n) до O (1), и на моем компьютере вся программа выполнялась примерно в 18 раз быстрее.

Есть еще много других вещей, которые вы можете сделать, чтобы сделать это быстрее, но это очень простая и эффективная оптимизация.

Комментарии:

1. Вау, теперь все работает гладко после того, как я преобразовал bounderies в set: bounderies = set(bounderies)

Ответ №3:

В вашем коде есть несколько проблем. Во-первых, это bounderies [так в оригинале] проблема с набором, которую @KirkStrauser прекрасно решает. Но проблема с sensors этим даже больше, чем предполагает @LucasBelfanti. Вместо того, чтобы выполнять математику (т. Е. геометрию) и Находить расстояние до цели, вы проверяете каждую возможную точку вдоль каждого элемента вектора, ведущего к цели. Не считая исправления геометрии, поскольку вы смотрите только по одному вектору за раз, первый перехват должен быть нужной вам точкой, и вы можете вырваться из датчика и избежать следующих 500 или около того тестов.

Если мы объединим это с использованием math.tan() вместо math.sin()/math.cos() и используем модульную арифметику для угла, для одного из ваших датчиков мы получим что-то вроде:

 from math import radians, tan

def rightDistance():
    minForwDist = 0
    tupleCoordinate = (0, 0)
    x, y = int(player.xcor()), int(player.ycor())
    heading = (player.heading() - 90) % 360
    tangent = tan(radians(heading))

    for alpha in range(1000):
        if 0 <= heading < 45 or 315 <= heading < 360:
            xCoordinate = x   alpha
            yCoordinate = xCoordinate * tangent   (y - x * tangent)
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))
        elif 225 <= heading < 315:
            yCoordinate = y - alpha
            xCoordinate = (yCoordinate - (y - x * tangent)) / tangent
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))
        elif 135 <= heading < 225:
            xCoordinate = x - alpha
            yCoordinate = xCoordinate * tangent   (y - x * tangent)
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))
        elif 45 <= heading < 135:
            yCoordinate = y   alpha
            xCoordinate = (yCoordinate - (y - x * tangent)) / tangent
            tupleCoordinate = (int(xCoordinate), int(yCoordinate))

        if tupleCoordinate in boundaries:
            return player.distance(tupleCoordinate)

    return minForwDist