self driving car
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
const carCanvas = document.getElementById("carCanvas");
|
||||
carCanvas.width = 200;
|
||||
|
||||
const networkCanvas = document.getElementById("networkCanvas");
|
||||
networkCanvas.width = 0;
|
||||
|
||||
const carCtx = carCanvas.getContext("2d");
|
||||
const networkCtx = networkCanvas.getContext("2d");
|
||||
|
||||
const road = new Road(carCanvas.width / 2, carCanvas.width * 0.9, 5);
|
||||
const N = 200;
|
||||
const cars = generateCars(N);
|
||||
const traffic = [];
|
||||
let minY = 500;
|
||||
let carsCount = 3;
|
||||
for (let i = 0; i < carsCount; i++) {
|
||||
traffic.push(
|
||||
new Car(
|
||||
road.getLaneCenter(Math.random() * 5),
|
||||
Math.random() * (-1300 + 700) - 700,
|
||||
"DUMMY",
|
||||
getRandomColor(),
|
||||
Math.random() * 2.9
|
||||
)
|
||||
);
|
||||
}
|
||||
let bestCar = cars[0];
|
||||
if (localStorage.getItem("bestBrain")) {
|
||||
for (let i = 0; i < cars.length; i++) {
|
||||
cars[i].brain = JSON.parse(localStorage.getItem("bestBrain"));
|
||||
if (i != 0) {
|
||||
NeuralNetwork.mutate(cars[i].brain, 0.2);
|
||||
}
|
||||
}
|
||||
}
|
||||
animate();
|
||||
|
||||
function save() {
|
||||
localStorage.setItem("bestBrain", JSON.stringify(bestCar.brain));
|
||||
localStorage.setItem("bestScore", JSON.stringify(bestCar.y));
|
||||
}
|
||||
function discard() {
|
||||
localStorage.removeItem("bestBrain");
|
||||
localStorage.removeItem("bestScore");
|
||||
}
|
||||
function generateCars(N) {
|
||||
const cars = [];
|
||||
for (let i = 0; i <= N; i++) {
|
||||
cars.push(new Car(road.getLaneCenter(1), -1, "AI"));
|
||||
}
|
||||
return cars;
|
||||
}
|
||||
setInterval(() => {
|
||||
if (carsCount < 15) {
|
||||
traffic.push(
|
||||
new Car(
|
||||
road.getLaneCenter(Math.random() * 3),
|
||||
bestCar.y - 800,
|
||||
"DUMMY",
|
||||
getRandomColor(),
|
||||
Math.random() * 2.9
|
||||
)
|
||||
);
|
||||
carsCount += 1;
|
||||
}
|
||||
if (bestCar.y < localStorage.getItem("bestScore")) save();
|
||||
if (minY > 0) minY = -minY;
|
||||
minY = minY * 1.5;
|
||||
}, 5000);
|
||||
function animate() {
|
||||
for (let i = 0; i < traffic.length; i++) {
|
||||
if (
|
||||
traffic[i].y > bestCar.y + 350 ||
|
||||
traffic[i].y < bestCar.y - 1400
|
||||
) {
|
||||
traffic.splice(
|
||||
i,
|
||||
1,
|
||||
new Car(
|
||||
road.getLaneCenter(Math.random() * 3),
|
||||
bestCar.y - 800,
|
||||
"DUMMY",
|
||||
getRandomColor(),
|
||||
Math.random() * 2.9
|
||||
)
|
||||
);
|
||||
}
|
||||
traffic[i].update(road.borders, []);
|
||||
}
|
||||
let restart = true;
|
||||
for (let i = 0; i < cars.length; i++) {
|
||||
cars[i].update(road.borders, traffic);
|
||||
restart = restart && cars[i].damaged;
|
||||
if (minY < cars[i].y) cars[i].damaged = true;
|
||||
}
|
||||
if (restart) location.reload();
|
||||
bestCar = cars.find((c) => c.y == Math.min(...cars.map((c) => c.y)));
|
||||
carCanvas.height = window.innerHeight;
|
||||
networkCanvas.height = window.innerHeight;
|
||||
|
||||
carCtx.save();
|
||||
carCtx.translate(0, -bestCar.y + carCanvas.height * 0.7);
|
||||
road.draw(carCtx);
|
||||
for (let i = 0; i < traffic.length; i++) {
|
||||
traffic[i].draw(carCtx, "red");
|
||||
}
|
||||
carCtx.globalAlpha = 0.2;
|
||||
for (let i = 0; i < cars.length; i++) {
|
||||
cars[i].draw(carCtx, "blue");
|
||||
}
|
||||
carCtx.globalAlpha = 1;
|
||||
bestCar.draw(carCtx, "blue", true);
|
||||
carCtx.restore();
|
||||
// Visualizer.drawNetwork(networkCtx, bestCar.brain);
|
||||
requestAnimationFrame(animate);
|
||||
}
|
||||
Reference in New Issue
Block a user