Ошибка заставляет игрока сталкиваться с первыми двумя препятствиями и ничем иным - PullRequest
0 голосов
/ 20 января 2020

Я создаю игровую среду для NEAT. Первые два препятствия, кажется, сталкиваются с игроками очень хорошо, но ни одно из других препятствий ничего не делает. Визуальные элементы не будут работать, но в зависимости от размера списка игроков, да, нет, это не работает. Класс столкновения также не сработал бы до того, как я начал реализовывать NEAT, так что вот так. В любом случае вот некоторый (возможно) не относящийся к делу код:

import pygame
from pygame.locals import *
import random
import os
import neat

debugfun = 0
W = 300
H = 300
win = pygame.display.set_mode((W, H))
pygame.display.set_caption("bruv moment")


coords = [0, 60, 120, 180, 240]


class Player(object):
    def __init__(self, x):
        self.x = x
        self.y = 600 - 60
        self.width = 60
        self.height = 60
        self.pos = 0
        self.left = False
        self.right = False

    def move(self):
        if self.left:
            self.pos -= 1
        if self.right:
            self.pos += 1
        if self.pos < 0:
            self.pos = 4
        if self.pos > 4:
            self.pos = 0
        self.x = coords[self.pos]


class Block(object):
    def __init__(self, pos, vel):
        self.pos = pos
        self.x = coords[self.pos]
        self.y = -60
        self.width = 60
        self.height = 60
        self.vel = vel

    def move(self):
        self.y += self.vel


def redraw_window():
    pygame.draw.rect(win, (0, 0, 0), (0, 0, W, H))
    for ob in obs:
        pygame.draw.rect(win, (0, 255, 0), (ob.x, ob.y, ob.width, ob.height))
    for ind in homies:
        pygame.draw.rect(win, (255, 0, 0), (ind.x, ind.y, ind.width, ind.height))
    pygame.display.update()


obs = []
homies = []
player_collision = False

ge = []
nets = []

А вот соответствующий код:

def collide():
    for ob in obs:
        for x, ind in enumerate(homies):
            if ind.y < ob.y + ob.height and ind.y + ind.height > ob.y and ind.x + ind.width > ob.x and ind.x < ob.x + ob.width:
                ge[x].fitness -= 1
                homies.pop(x)
                nets.pop(x)
                ge.pop(x)


def main(genomes, config):
    speed = 30

    pygame.time.set_timer(USEREVENT + 1, 550)
    pygame.time.set_timer(USEREVENT + 2, 1000)

    for _, g in genomes:
        net = neat.nn.FeedForwardNetwork.create(g, config)
        nets.append(net)
        homies.append(Player(0))
        g.fitness = 0
        ge.append(g)

    clock = pygame.time.Clock()
    ran = True
    while ran and len(homies) > 0:
        clock.tick(27)
        collide()
        for x, ind in enumerate(homies):
            ind.move()
            ge[x].fitness += 0.1

            try:
                output = nets[x].activate((ind.x, abs(obs[0].x - ind.x)))
            except IndexError:
                output = 50
            try:
                if output in range(5, 25):
                    ind.left = True
                else:
                    ind.left = False
                if output > 25:
                    ind.right = True
                else:
                    ind.right = False
            except TypeError:
                if output[0] in range(5, 25):
                    ind.left = True
                else:
                    ind.left = False
                if output[1] > 25:
                    ind.right = True
                else:
                    ind.right = False
        for ob in obs:
            ob.move()
            if ob.x > H:
                obs.pop(obs.index(ob))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                ran = False
                pygame.quit()
            if event.type == USEREVENT+1:
                if speed <= 200:
                    speed += 3
            if event.type == USEREVENT+2:
                for g in ge:
                    g.fitness += 0.5
        if len(obs) == 0:
            obs.append(Block(round(random.randint(0, 4)), speed))
        print(len(homies))
        print(len(obs))
        redraw_window()


def run(config_file):
    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, "avoidpedofiles.txt")
    run(config_path)
...