@Karina
This is an old and sometimes very poorly written clone I did to learn about ai (flappy bird is an awesome game for basic artificial intelligence experiments). I didn’t bother about graphics, but maybe it’s helpful to you.
Run this to play the game:
from scene import *
import sound
import random
import math
import gameExtension as extension
#import nnExtension as nn
A = Action
class MyScene (Scene):
def setup(self):
self.background_color = 'beige'
self.gravity = Vector2(0, -self.size.y/1500)
self.birds = []
self.running = True
extension.setup_walls(self)
extension.update_walls(self)
#self.birdCount = 1 #uncomment if using ai
for x in range(self.birdCount):
extension.add_bird(self)
pass
def did_change_size(self):
pass
def update(self):
if self.running:
self.running = False
extension.update_walls(self)
for bird in self.birds:
if bird.distance >= 10000: bird.dead = True
if not bird.dead:
self.running = True
extension.count_distance(self, bird)
extension.update_bird(self, bird)
bird.data = extension.get_data(self, bird)
if bird.position.y-bird.size.y/2 <= 0 or bird.position.y+bird.size.y/2 >= self.size.y:
bird.color = 'red'
bird.dead = True
for wall in self.walls:
if bird.frame.intersects(wall.frame):
bird.color = 'red'
bird.dead = True
else:
if bird.position.x + bird.size.x/2 >= 0:
bird.position = (bird.position.x - 1, bird.position.y)
def touch_began(self, touch):
self.birds[0].up = True
pass
def touch_moved(self, touch):
pass
def touch_ended(self, touch):
pass
if __name__ == '__main__':
run(MyScene(), PORTRAIT, show_fps=True)
Save this in the same folder as the upper main code as gameExtension.py
from scene import *
import random
def add_bird(self):
self.birds.append(ShapeNode(rect(0,0,10,10)))
bird = self.birds[len(self.birds)-1]
bird.color = 'black'
bird.size = (self.size.x/50, self.size.x/50)
bird.position = (self.size.x/4, self.size.y/2)
bird.z_position = 2
bird.dead = False
bird.distance = 0
bird.up = False
bird.max_fall_vel = Vector2(0, self.size.y/100)
bird.up_acc = Vector2(0, self.size.y/2)
bird.vel = Vector2(0, 0)
bird.acc = Vector2(0, 0)
bird.data = get_data(self, bird)
self.add_child(bird)
def setup_walls(self):
self.wall_distance = self.size.x/4
self.gap_size = self.size.y/6
self.wall_width = self.size.x/14
self.distance_to_next_wall = self.wall_distance + 1
self.walls = []
def count_distance(self, bird):
bird.distance = bird.distance + 1
def update_walls(self):
if self.distance_to_next_wall >= self.wall_distance:
self.distance_to_next_wall = 0
build_wall(self)
else: self.distance_to_next_wall = self.distance_to_next_wall+1
removal = []
for x in range(len(self.walls)):
wall = self.walls[x]
wall.position = (wall.position.x - 1, wall.position.y)
if wall.position.x + wall.size.x/2 < 0:
removal.append(x)
for x in range(len(removal)):
wallIndex = removal[x]-x
wall = self.walls[wallIndex]
wall.remove_from_parent()
self.walls.pop(wallIndex)
def build_wall(self):
posY = random.randint(round(self.gap_size/2), round(self.size.y - self.gap_size/2)) #random position of gap
self.walls.append(ShapeNode(rect(0,0,10,10))) #set up the upper wall
wall = self.walls[len(self.walls)-1]
wall.size = (self.wall_width, self.size.y - posY - self.gap_size/2)
wall.color = 'grey'
wall.position = (self.size.x + self.wall_width/2, self.size.y - wall.size.y/2)
wall.z_position = 1
self.add_child(wall)
self.walls.append(ShapeNode(rect(0,0,10,10))) #set up the lower wall
wall = self.walls[len(self.walls)-1]
wall.size = (self.wall_width, posY - self.gap_size/2)
wall.color = 'grey'
wall.position = (self.size.x + self.wall_width/2, wall.size.y/2)
wall.z_position = 1
self.add_child(wall)
def update_bird(self, bird):
if bird.up:
bird.up = False
bird.acc = bird.up_acc
else: bird.acc = self.gravity
bird.vel = bird.vel + bird.acc
if bird.vel[1] > bird.max_fall_vel[1]: bird.vel = bird.max_fall_vel
bird.position = bird.position + bird.vel
def get_data(self, bird):
data = []
for x in range(len(self.walls)):
wall = self.walls[x]
if wall.position.x + wall.size.x/2 >= bird.position.x - bird.size.x/2:
y_to_gap = (wall.position.x - wall.size.x/2) - (bird.position.x + bird.size.x/2)
if y_to_gap < 0: y_to_gap = 0
data.append(y_to_gap)
x_to_upper_wall = (wall.position.y - wall.size.y/2) - (bird.position.y + bird.size.y/2)
data.append(x_to_upper_wall)
wall = self.walls[x+1]
x_to_lower_wall = (wall.position.y + wall.size.y/2) - (bird.position.y - bird.size.y/2)
data.append(x_to_lower_wall)
break
distance_to_top = self.size.y - bird.position.y + bird.size.y/2
data.append(distance_to_top)
distance_to_bottom = bird.position.y - bird.size.y/2
data.append(distance_to_bottom)
velocity = bird.vel[1]
data.append(velocity)
return data