首页 > 解决方案 > 在pygame中创建闪电

问题描述

我正在尝试在我的应用程序中创建闪电。到目前为止我做到了

import pygame
import random as rd
import copy

pygame.init()


color = 250,250,250
starting_point =0,0
ending_point = 400,400

a = [[400,0]]

depth = rd.randrange(50,80)

for i in range(depth):
    rand1 = rd.randrange(-20,20)
    rand2 = rd.randrange(2,15)
    a.append([a[i][0]+rand1,a[i][1]+rand2])

screen = pygame.display.set_mode((800,600))

running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((0,0,0))

    for j in range(0,depth):
        pygame.draw.aaline(screen, (200-2*j,200-2*j,200-2*j), [ a[j][0] , a[j][1] ], [ a[j+1][0] , a[j+1][1] ],1)

    pygame.draw.line(screen, color, a[0], a[1], 1)
    pygame.display.update()

这段代码创建了一条随机生成的闪电线,如下所示:

例子

我想做这样的事情:

闪电

我希望从最初生成的行中有更多行

我需要的只是最初的想法,我应该使用一个类还是另一个列表?

标签: pythonpygamepygame-surface

解决方案


您可以将代码放入函数中,并在生成上一行时使用递归在随机时刻开始下一行。但有时你可以得到一条线,有时你可以得到太多线。

我将它保留在平面列表中,因此它不知道使用什么颜色绘制下一行 - 代码可以为每个点添加颜色或深度,或者它应该为每一行添加深度作为列表中的第一个元素。

import pygame
import random as rd

def generate(x, y, depth):

    result = [ [(x,y)] ] # list for many lines

    for i in range(depth):
        x = result[0][-1][0] + rd.randrange(-20,20)
        y = result[0][-1][1] + rd.randrange(2,15)
        result[0].append((x, y))

        # should I generate next line from here?
        if rd.randrange(0,100) < 5:
            # add all generated lines to result
            result.extend(generate(x, y, depth-i))

    return result

# ---

pygame.init()

depth = rd.randrange(50, 80)
result = generate(400, 0, depth)
print(result)

screen = pygame.display.set_mode((800, 600))

screen.fill((0,0,0))

for line in result:
    for n, (point1, point2) in enumerate(zip(line, line[1:]), 1):
        #x1, y1 = point1
        #x2, y2 = point2
        c = 200-2*n
        pygame.draw.aaline(screen, (c,c,c), point1, point2, 1)

pygame.display.flip()

running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

pygame.quit()    

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述


编辑:我将深度添加为列表中的第一个元素,因此现在它具有更好的颜色。如果我使用line(..., width=),则顶部较厚,底部较薄

我正在考虑添加随机值,rd.randrange(-20+R,20+R)这样一些行会更左或更右。

import pygame
import random as rd


def generate(x, y, depth, c):

    result = [[c, (x,y)]]
    for i in range(depth):
        x = result[0][-1][0] + rd.randrange(-20,20)
        y = result[0][-1][1] + rd.randrange(2,15)
        result[0].append((x, y))

        if rd.randrange(0,100) < 5:
            result.extend(generate(x, y, depth-i, c+i))

    return result

# ---

pygame.init()

depth = rd.randrange(50, 80)
result = generate(400, 0, depth, 0)
print(result)

screen = pygame.display.set_mode((800, 600))

screen.fill((0,0,0))

for line in result:
    depth = line[0]
    line = line[1:]
    for n, (point1, point2) in enumerate(zip(line, line[1:]), depth):
        c = 200-2*n
        #pygame.draw.aaline(screen, (c,c,c), point1, point2, 1)
        pygame.draw.line(screen, (c,c,c), point1, point2, 12-n//6)

pygame.display.flip()

running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

pygame.quit()    

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述


推荐阅读