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:
- Is my macbook pro 15" from 2015 too slow (will this code work with another computer)? or
- Is Python language too slow (will this code work with another language)? or
- Is Python module (turtle) wrong for this kind of a task? or
- 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
没有评论:
发表评论