Spaces:
Running
Running
// Neuro-Evolution Flappy Bird with TensorFlow.js | |
// http://thecodingtrain.com | |
// https://youtu.be/cdUNkwXx-I4 | |
class Bird { | |
constructor(brain) { | |
this.y = height / 2; | |
this.x = 64; | |
this.gravity = 0.8; | |
this.lift = -12; | |
this.velocity = 0; | |
this.score = 0; | |
this.fitness = 0; | |
if (brain) { | |
this.brain = brain.copy(); | |
} else { | |
this.brain = new NeuralNetwork(5, 8, 2); | |
} | |
} | |
dispose() { | |
this.brain.dispose(); | |
} | |
show() { | |
stroke(255); | |
fill(251, 236, 93); | |
ellipse(this.x, this.y, 32, 32); | |
} | |
up() { | |
this.velocity += this.lift; | |
} | |
mutate() { | |
this.brain.mutate(0.1); | |
} | |
think(pipes) { | |
// Find the closest pipe | |
let closest = null; | |
let closestD = Infinity; | |
for (let i = 0; i < pipes.length; i++) { | |
let d = pipes[i].x + pipes[i].w - this.x; | |
if (d < closestD && d > 0) { | |
closest = pipes[i]; | |
closestD = d; | |
} | |
} | |
let inputs = []; | |
inputs[0] = this.y / height; | |
inputs[1] = closest.top / height; | |
inputs[2] = closest.bottom / height; | |
inputs[3] = closest.x / width; | |
inputs[4] = this.velocity / 10; | |
let output = this.brain.predict(inputs); | |
//if (output[0] > output[1] && this.velocity >= 0) { | |
if (output[0] > output[1]) { | |
this.up(); | |
} | |
} | |
offScreen() { | |
return this.y > height || this.y < 0; | |
} | |
update() { | |
this.score++; | |
this.velocity += this.gravity; | |
//this.velocity *= 0.9; | |
this.y += this.velocity; | |
} | |
} | |