May-27-2017, 06:16 PM
I made this game that there is a turtle and you can make walls using mouse1, delete them using mouse2 and "command" the turtle to walk with scroll click.
The problems that I have are:
The turtle is teleporting all over the place.
The turtle is not even going on the right path..
I've tried to fix it for 3~4h and still can't seem to find a solution.
Here is the code:
The problems that I have are:
The turtle is teleporting all over the place.
The turtle is not even going on the right path..
I've tried to fix it for 3~4h and still can't seem to find a solution.
Here is the code:
import pygame
import a_star, numpy, heapq, time
size = screen_width , screen_heigth= 900, 900
LeftClick = False
MiddleClick = False
RightClick = False
turtle = pygame.image.load("turtle.png")
turtleRect = turtle.get_rect()
turtleRect.center = (406, 406) #Initiate the turtle in the middle
black = (0, 0, 0)
white = (255, 255, 255)
width = 25
margin = 5
grid = [[0 for x in range(30)] for y in range(30)]
screen = pygame.display.set_mode(size)
def draw_grid(length, margin):
"""Draws the grid"""
for row in range(30):
for column in range(30):
color = white
if grid[row][column] == 1:
color = (127, 123, 111) #The color of the wall
pygame.draw.rect(screen,
color,
[(margin+ width) * column + margin,
(margin+ width) * row + margin,
length, length])
def set_block(value):
"""Sets the value of the block"""
row, column = get_coords()
grid[row][column] = value
def get_coords():
"""Get's the coordonates of the block that was clicked"""
pos = pygame.mouse.get_pos()
row, column = get_block(pos[0], pos[1])
return (row, column)
def get_path(endX, endY):
"""Get the path"""
try:
print("Incercam la get_path")
NPgrid = numpy.array(grid)
start = get_block(turtleRect.center[0],turtleRect.center[1])
goal = get_block(endY, endX)
path = a_star.astar(NPgrid, start, goal)
path = path[::-1]
return path
except:
pass
def blockCenter(x,y):
return (x*30+12.5, y*30+12.5)
def get_block(x, y):
"""Gets the row and column given the position of the block"""
column = x // (width + margin)
row = y // (width + margin)
return row, column
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT: sys.exit() #Exit
elif event.type == pygame.MOUSEBUTTONDOWN: # Mouse click
TypeOfClick = pygame.mouse.get_pressed()
if TypeOfClick[0] == 1: #Left Click
LeftClick = True
else: LeftClick = False
if TypeOfClick[1] == 1: #Middle Click
MiddleClick = True
else: MiddleClick = False
if TypeOfClick[2] == 1: #Right Click
RightClick = True
else: RightClick = False
elif event.type == pygame.MOUSEBUTTONUP:
LeftClick, RightClick, MiddleClick = False, False , False
#Daca Click-ul este inca apasat atunci seteaza block-ul
if LeftClick:
set_block(1)
elif RightClick:
set_block(0)
elif MiddleClick:
pos = pygame.mouse.get_pos()
path = get_path(pos[0], pos[1])
screen.fill(black) #Keep this so it doesn't make a trail
#Miscam testoasa
try:
for coords in path:
print(coords,path)
#continue
print("Incercam la asta cu try")
bx, by = blockCenter(coords[0], coords[1]) #Mijloacele blockurilor
dx, dy = (bx - turtleRect.center[0] , by - turtleRect.center[1]) #Distanta
stepx, stepy = (dx / 30., dy / 30.) #Cati pasi sa ia
for _ in range(30):
turtleRect = turtleRect.move(stepx, stepy)
screen.blit(turtle, turtleRect)
#time.wait(0.01)
path = []
except:
pass
pygame.display.set_caption("ATurtle") #The title
pygame.time.Clock().tick(30) #30 fps
# Draw the screen
draw_grid(width, margin)
#print(turtleRect.center)
screen.blit(turtle, turtleRect)
pygame.display.flip()Here is the a_star:# Author: Christian Careaga ([email protected]) # A* Pathfinding in Python (2.7) # Please give credit if used import numpy from heapq import * def heuristic(a, b): return (b[0] - a[0]) ** 2 + (b[1] - a[1]) ** 2 def astar(array, start, goal): neighbors = [(0,1),(0,-1),(1,0),(-1,0),(1,1),(1,-1),(-1,1),(-1,-1)] close_set = set() came_from = {} gscore = {start:0} fscore = {start:heuristic(start, goal)} oheap = [] heappush(oheap, (fscore[start], start)) while oheap: current = heappop(oheap)[1] if current == goal: data = [] while current in came_from: data.append(current) current = came_from[current] return data close_set.add(current) for i, j in neighbors: neighbor = current[0] + i, current[1] + j tentative_g_score = gscore[current] + heuristic(current, neighbor) if 0 <= neighbor[0] < array.shape[0]: if 0 <= neighbor[1] < array.shape[1]: if array[neighbor[0]][neighbor[1]] == 1: continue else: # array bound y walls continue else: # array bound x walls continue if neighbor in close_set and tentative_g_score >= gscore.get(neighbor, 0): continue if tentative_g_score < gscore.get(neighbor, 0) or neighbor not in [i[1]for i in oheap]: came_from[neighbor] = current gscore[neighbor] = tentative_g_score fscore[neighbor] = tentative_g_score + heuristic(neighbor, goal) heappush(oheap, (fscore[neighbor], neighbor)) return False
