2021年1月4日星期一

Python Game Too Slow

EDIT: Maybe this is useful, the code uses for-loops like this: it iterates with 5 different functions, 1000 times over a list that has 3,600 items.

My game became too slow after I created code under #sensors comments (see code below, it has a lot of iterations in its for-loops). I have made controls for a human to move the red dot, but the game is supposed to be played by itself, by computer.

My question is:

  1. Is my macbook pro 15" from 2015 too slow (will this code work with another computer)? or
  2. Is Python language too slow (will this code work with another language)? or
  3. Is Python module (turtle) wrong for this kind of a task? or
  4. Is my code just horrible (it wouldn't work with any language nor any computer)?

or something else?

This is my code:

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)  
https://stackoverflow.com/questions/65571954/python-game-too-slow January 05, 2021 at 09:15AM

没有评论:

发表评论