0

I'm making a game environment for NEAT. The first two obstacles seem to collide with the players just fine, but none of the other obstacles do anything. The visuals won't work, but based on the size of the player list, yeah no it's not working. The collide class also wouldn't work before I started implementing NEAT, so there's that. Anyway here's some (probably) irrelevant code:

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 = []

And here's some relevant code:

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)
  • use `pygame.Rect()` to keep position and size - and then you can check collisions `player.rect.colliderect(block.rect)` – furas Jan 22 '20 at 08:52
  • don't remove objects from list which you iterate - `homies` - because when you remove element then other elements moves on list and `for` will skip some elements. Better create new list with elements which you want to keep - `homies_keep` - and after `for`-loop replace lists - `homies = homies_keep` – furas Jan 22 '20 at 08:55
  • BTW: using `pygame.Rect()` to keep size and position you can also use it to draw - `pygame.draw.rect(win, (0, 255, 0), ob.rect)` - doc: [pygame.Rect()](https://www.pygame.org/docs/ref/rect.html) – furas Jan 22 '20 at 08:57

0 Answers0