半成品,目前速度不能修改,另外某些状况下路径会比较奇怪,因为没有速度计算,包含了重力矢量,可以修改重力方向
import pygame as pg
import math
import time
import random
import mathclass Particle(): #Tile is for generating mazedef __init__(self,x,y):self.x,self.y = x,ydef draw(self,color = (100,100,100)): #x,y represents the tile coordinates pg.draw.rect(screen,color,(self.x,self.y,2,2))def rotation_matrix(angle,vector):x,y = vectorangle = angle/180*math.pix_ = math.cos(angle)*x - math.sin(angle)*yy_ = math.sin(angle)*x + math.cos(angle)*yreturn x_,y_def get_clicked():x,y = pg.mouse.get_pos() #pixel coordinatesreturn x,ydef add_particle(x,y):particle = Particle(x,y)print(x,y)matrix[y][x] = particleparticles.append(particle)def frame_calculation():for particle in particles:particle.draw()x,y = particle.x,particle.yfor dx,dy in move_direction:x_,y_ = int(particle.x+dx), int(particle.y+dy)if x_ not in range(grid_size[0]) or y_ not in range(grid_size[1]):breakif matrix[y_][x_] == None:particle.x,particle.y = particle.x+dx, particle.y+dymatrix[y_][x_] = Truematrix[int(y)][int(x)] = Nonebreak#================================initialize parameter===================================screen_size = [800,800]
grid_size = [800,800]
move_direction = [ rotation_matrix(45,[1,1]), #gravitational vectorrotation_matrix(90,[1,1]),rotation_matrix(0,[1,1])]
print(move_direction)particles = []matrix = []
for y in range(grid_size[1]+1):temp = []for x in range(grid_size[0]+1):temp.append(None)matrix.append(temp)screen = pg.display.set_mode(screen_size)
pg.init()#================================controls===============================================
mouse_l_clicked = False#================================game loop==============================================
run = True
while run:screen.fill((255,255,255))frame_calculation()pg.display.update()if mouse_l_clicked:x,y = get_clicked()add_particle(x,y)for event in pg.event.get():if event.type == pg.QUIT:run = Falsepg.quit()if event.type == pg.KEYDOWN:if event.key == pg.K_g:passif event.type == pg.MOUSEBUTTONDOWN:if event.button == 1:mouse_l_clicked = Trueelse:x,y = get_clicked()dx,dy = x-grid_size[0]/2,(y-grid_size[1]/2)print(dx,dy)norm = (dx**2+dy**2)**0.5vec = [dx/norm,dy/norm]move_direction = [ rotation_matrix(0,vec), #gravitational vectorrotation_matrix(45,vec),rotation_matrix(-45,vec)]elif event.type == pg.MOUSEBUTTONUP:if event.button == 1:mouse_l_clicked = False