diff --git a/flappy game ONLY.py b/flappy game ONLY.py new file mode 100644 index 0000000..d6ce864 --- /dev/null +++ b/flappy game ONLY.py @@ -0,0 +1,241 @@ +import pygame +import neat +import time +import os +import random +pygame.font.init() + +WIN_WIDTH = 500 +WIN_HEIGHT = 800 + +BIRD_IMGS = [pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird1.png"))), pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird1.png"))),pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird2.png"))),pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird3.png")))] +PIPE_IMG = pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "pipe.png"))) +BASE_IMGS = pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "base.png"))) +BG_IMGS = pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bg.png"))) + +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) + 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_IMGS.get_width() + IMG = BASE_IMGS + + 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_windows(win, bird, pipes, base, score): + win.blit(BG_IMGS, (0,0)) + for pipe in pipes: + pipe.draw(win) + + text = STAT_FONT.render("Your Score: " + str(score), 1, (255,255,255)) + win.blit(text, (WIN_WIDTH - 10 -text.get_width(), 10)) + + base.draw(win) + + bird.draw(win) + pygame.display.update() + + +def main(): + bird = Bird(230,350) + base = Base(730) + pipes = [Pipe(600)] + + score = 0 + + win = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT)) + clock = pygame.time.Clock() + run = True + while run: + clock.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + run = False + keys = pygame.key.get_pressed() + if keys[pygame.K_j]: + bird.jump() + bird.move() + add_pipe = False + rem = [] + for pipe in pipes: + if bird.y + bird.img.get_height() >= 730 or bird.y < 0: + pygame.quit() + quit() + if pipe.collide(bird): + pygame.quit() + quit() + pass + + if pipe.x + pipe.PIPE_TOP.get_width() < 0: + rem.append(pipe) + + if not pipe.passed and pipe.x < bird.x: + pipe.passed = True + add_pipe = True + + pipe.move() + + if add_pipe: + score += 1 + pipes.append(Pipe(random.randrange(500, 800))) + + for r in rem: + pipes.remove(r) + + if bird.y + bird.img.get_height() >= 730: + pass + base.move() + draw_windows(win, bird, pipes, base, score) + + pygame.quit() + quit() + +main() + +def run(config_path): + config = neat.config.Config(neat.DefaultGenome, neat.DefaultReproduction, + neat.DefaultSpeciesSet, neat.DefaultStagnation, + config_file) + + 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-feedforward.txt") + run(config_path) \ No newline at end of file