gpt4 book ai didi

python - 带有 NEAT 的 pygame 的 flappy bird 游戏中不显示管道

转载 作者:行者123 更新时间:2023-12-04 17:15:50 26 4
gpt4 key购买 nike

我一直在学习技术教程,在第 4 部分结束时一切正常,第 5 部分只是解释了 neat,然后在第 6 部分中实现了 neat,到一半时我们再次测试了代码第 7 部分(最后一部分)它没有正常工作,但没有错误代码。

我试过将 pygame.display.update() 移动到不同的位置,但似乎没有帮助。

我曾尝试更改绘制顺序,以便先绘制鸟类,然后再绘制管道,但这似乎没有帮助。

import pygame, neat, time, os, random

pygame.font.init()

WIN_WIDTH = 576
WIN_HEIGHT = 900

BIRD_IMGS = [pygame.transform.scale2x(pygame.image.load('flappybird_pics/yellowbird-downflap.png')), #.convert_alpha()
pygame.transform.scale2x(pygame.image.load('flappybird_pics/yellowbird-midflap.png')), #.convert_alpha()
pygame.transform.scale2x(pygame.image.load('flappybird_pics/yellowbird-upflap.png'))] #.convert_alpha()

PIPE_IMG = pygame.transform.scale2x(pygame.image.load('flappybird_pics/pipe-green.png')) #.convert()

BASE_IMG = pygame.transform.scale2x(pygame.image.load('flappybird_pics/base.png')) #.convert()

BG_IMG = pygame.transform.scale2x(pygame.image.load('flappybird_pics/background-day.png')) #.convert()

STAT_FONT = pygame.font.SysFont("comicsans", 50)


class Bird:
IMGS = BIRD_IMGS
MAX_ROTATION = 25
ROT_VEL = 20
ANIMATION_TIME = 5

def __init__(self, x, y):
self.x = x
self.y = y
self.tilt = 0
self.tick_count = 0
self.vel = 0
self.height = self.y
self.img_count = 0
self.img = self.IMGS[0]

def jump(self):
self.vel = -10.5
self.tick_count = 0
self.height = self.y

def move(self):
self.tick_count += 1

d = self.vel * self.tick_count + 1.5 * self.tick_count ** 2

if d >= 16:
d = 16

if d < 0:
d -= 2

self.y = self.y + d

if d < 0 or self.y < self.height + 50:
if self.tilt < self.MAX_ROTATION:
self.tilt = self.MAX_ROTATION
else:
if self.tilt > -90:
self.tilt -= self.ROT_VEL

def draw(self, win):
self.img_count += 1

if self.img_count < self.ANIMATION_TIME:
self.img = self.IMGS[0]
elif self.img_count < self.ANIMATION_TIME*2:
self.img = self.IMGS[1]
elif self.img_count < self.ANIMATION_TIME*3:
self.img = self.IMGS[2]
elif self.img_count < self.ANIMATION_TIME*4:
self.img = self.IMGS[1]
elif self.img_count == self.ANIMATION_TIME*4+1:
self.img = self.IMGS[0]
self.img_count = 0

if self.tilt <= -80:
self.img = self.IMGS[1]
self.img_count = self.ANIMATION_TIME*2

rotated_image = pygame.transform.rotate(self.img, self.tilt)
new_rect = rotated_image.get_rect(center=self.img.get_rect(topleft=(self.x, self.y)).center)
win.blit(rotated_image, new_rect.topleft)

def get_mask(self):
return pygame.mask.from_surface(self.img)

class Pipe:
GAP = 200
VEL = 5

def __init__(self, x):
self.x = x
self.height = 0

self.top = 0
self.bottom = 0
self.PIPE_TOP = pygame.transform.flip(PIPE_IMG, False, True)
self.PIPE_BOTTOM = PIPE_IMG

self.passed = False
self.set_height()

def set_height(self):
self.height = random.randrange(50, 450) #todo check this
self.top = self.height - self.PIPE_TOP.get_height()
self.bottom = self.height + self.GAP

def move(self):
self.x -= self.VEL

def draw(self, win):
win.blit(self.PIPE_TOP, (self.x, self.top))
win.blit(self.PIPE_BOTTOM, (self.x, self.bottom))

def collide(self, bird):
bird_mask = bird.get_mask()
top_mask = pygame.mask.from_surface(self.PIPE_TOP)
bottom_mask = pygame.mask.from_surface(self.PIPE_BOTTOM)

top_offset = (self.x - bird.x, self.top - round(bird.y))
bottom_offset = (self.x - bird.x, self.bottom - round(bird.y))

b_point = bird_mask.overlap(bottom_mask, bottom_offset)
t_point = bird_mask.overlap(top_mask, top_offset)

if t_point or b_point:
return True

return False

class Base:
VEL = 5
WIDTH = BASE_IMG.get_width()
IMG = BASE_IMG

def __init__(self, y):
self.y = y
self.x1 = 0
self.x2 = self.WIDTH

def move(self):
self.x1 -= self.VEL
self.x2 -= self.VEL

if self.x1 + self.WIDTH < 0:
self.x1 = self.x2 + self.WIDTH

if self.x2 + self.WIDTH < 0:
self.x2 = self.x1 + self.WIDTH

def draw(self, win):
win.blit(self.IMG, (self.x1, self.y))
win.blit(self.IMG, (self.x2, self.y))

def draw_window(win, birds, pipes, base, score):
win.blit(BG_IMG, (0, 0))

for pipe in pipes:
pipe.draw(win)

text = STAT_FONT.render("Score: " + str(score), 1, (255,255,255))
win.blit(text, (WIN_WIDTH - 10 - text.get_width(), 10))

base.draw(win)
for bird in birds:
bird.draw(win)

pygame.display.update()


def main(genomes, config):
nets = []
ge = []
birds = []

for _, g in genomes:
net = neat.nn.FeedForwardNetwork.create(g, config)
nets.append(net)
birds.append(Bird(230,350))
g.fitness = 0
ge.append(g)

base = Base(730) # todo twick
pipes = [Pipe(700)]
win = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
clock = pygame.time.Clock()

score = 0

run = True
while run:
clock.tick(30)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.quit()
quit()

pipe_ind = 0
if len(birds) > 0:
if len(pipes) > 1 and birds[0].x > pipes[0].x + pipes[0].PIPE_TOP.get_width():
pipe_ind = 1
else:
run = False
break

for x, bird in enumerate(birds):
bird.move()
ge[x].fitness += 0.1

output = nets[x].activate((bird.y, abs(bird.y - pipes[pipe_ind].height), abs(bird.y -
pipes[pipe_ind].bottom)))

if output[0] > 0.5:
bird.jump()

add_pipe = False
rem = []
for pipe in pipes:
for x, bird in enumerate(birds):
if pipe.collide(bird):
ge[x].fitness -= 1
birds.pop(x)
ge.pop(x)

if not pipe.passed and pipe.x < birds[0].x:
pipe.passed = True
add_pipe = True

if pipe.x + pipe.PIPE_TOP.get_width() < 0:
rem.append(pipe)

pipe.move()

if add_pipe:
score += 1
for g in ge:
g.fitness += 5
pipes.append(Pipe(700))

for r in rem:
pipes.remove(r)

for x, bird in enumerate(birds):
if bird.y + bird.img.get_height() > 730 or bird.y < 0:
birds.pop(x)
nets.pop(x)
ge.pop(x)

base.move()
draw_window(win, birds, pipes, base, score)


def run(config_path):
config = neat.config.Config(neat.DefaultGenome, neat.DefaultReproduction, neat.DefaultSpeciesSet,
neat.DefaultStagnation, config_path)

p = neat.Population(config)

p.add_reporter(neat.StdOutReporter(True))
stats = neat.StatisticsReporter()
p.add_reporter(stats)

winner = p.run(main, 50)

if __name__ == "__main__":
local_dir = os.path.dirname(__file__)
config_path = os.path.join(local_dir, "config.txt")
run(config_path)

最佳答案

Indentation 有问题.这意味着 pipe.move() 永远不会被调用,并且管道仍然位于窗口的最右侧:

def main(genomes, config):
# [...]

run = True
while run:
# [...]

add_pipe = False
rem = []
for pipe in pipes:
for x, bird in enumerate(birds):
if pipe.collide(bird):
ge[x].fitness -= 1
birds.pop(x)
ge.pop(x)

if not pipe.passed and pipe.x < birds[0].x:
pipe.passed = True
add_pipe = True

# INDENTATION
#-->|
if pipe.x + pipe.PIPE_TOP.get_width() < 0:
rem.append(pipe)

pipe.move()

# [...]

关于python - 带有 NEAT 的 pygame 的 flappy bird 游戏中不显示管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68751116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com