Juego de naves en C para Arduino con libreria TVOut.

Les dejo un micro juego en C para Arduino, utiliza la libreria TVOut para poder usar la TV como salida visual :?:
Para jugar necesitas un "Servo Joystick" (Motor DC común y corriente) y un pulsador (en mi caso dos cables pelados).

Y aqui el sketch:

#include <Arduino.h>
#include <video_gen.h>
#include <TVout.h>
#include <fontALL.h>

using namespace std;
TVout TV;
String ESTADOJUEGO = "NO-INICIADO";
int X = 0;
int Y = 0;
int xM = 0;
int yM = 0;
int tDisparo = 0;
long retardoIA = 0;
long retardoIA2 = 10;
long retardoIA3 = 20;
long retardoIA4 = 20;
long retardoIA5 = 20;
bool Disparado = false;
bool retardoDesIA = false;
bool COL = false;
int Vidas = 3;
int Puntos = 0;

//OVNIS PREFABS

//OVNI 1
int xO1 = random(10,80);
int yO1 = 0;
String Oe = "VIVO";

//OVNI 2
int xO2 = random(10,80);
int yO2 = 0;
String O2e = "VIVO";

//OVNI 3
int xO3 = random(10,80);
int yO3 = 0;
String O3e = "VIVO";

//OVNI4
int xO4 = random(10,80);
int yO4 = 0;
String O4e = "VIVO";

//OVNI5
int xO5 = random(10,80);
int yO5 = 0;
String O5e = "VIVO";


void setup() {
TV.begin(NTSC,105,105);
TV.select_font(font6x8);
X = 50;
Y = 90;
pinMode(2,OUTPUT);
digitalWrite(2,HIGH);
pinMode(3,INPUT);
pinMode(11,INPUT);
pinMode(12,INPUT);
ESTADOJUEGO = "INICIADO";
}

void loop() {
TV.clear_screen();
if (ESTADOJUEGO == "GAME-OVER"){
  GAMEOVER();
}
if (ESTADOJUEGO == "INICIADO"){
TV.print(10,10,Vidas);
TV.print(80,10,Puntos);
TECLADO();
MovMunicion();
dibujar_NAVE(X,Y);
dibujar_OVNI(xO1,yO1);
dibujar_OVNI(xO2,yO2);
dibujar_OVNI(xO3,yO3);
dibujar_OVNI(xO4,yO4);
dibujar_OVNI(xO5,yO5);

MovOvni1();
MovOvni2();
MovOvni3();
MovOvni4();
MovOvni5();
DibujarLimites();
CONTROLADOR();
retardoDesIA = !retardoDesIA;

comprobarColisiones(xM,1,yM,1,xO1,10,yO1,4);
if (COL){
  Disparado = false;
  resetOvni1();
}
comprobarColisiones(xM,1,yM,1,xO2,10,yO2,4);
if (COL){
  Disparado = false;
  resetOvni2();
}
comprobarColisiones(xM,1,yM,1,xO3,10,yO3,4);
if (COL){
  Disparado = false;
  resetOvni3();
}
comprobarColisiones(xM,1,yM,1,xO4,10,yO4,4);
if (COL){
  Disparado = false;
  resetOvni4();
}
comprobarColisiones(xM,1,yM,1,xO5,10,yO5,4);
if (COL){
  Disparado = false;
  resetOvni5();
}



comprobarColisiones(X,10,Y,8,xO1,10,yO1,4);
if (COL){
  resetOvni1();
  Vidas--;
  for(int i=400;i>1;i--){
    tone(5,i,10);
  }
}
comprobarColisiones(X,10,Y,8,xO2,10,yO2,4);
if (COL){
  resetOvni2();
    for(int i=400;i>1;i--){
    tone(5,i,10);
  }
  Vidas--;
}
comprobarColisiones(X,10,Y,8,xO3,10,yO3,4);
if (COL){
  resetOvni3();
    for(int i=400;i>1;i--){
    tone(5,i,10);
  }
  Vidas--;
}
comprobarColisiones(X,10,Y,8,xO4,10,yO4,4);
if (COL){
  resetOvni4();
    for(int i=400;i>1;i--){
    tone(5,i,10);
  }
  Vidas--;
}
comprobarColisiones(X,10,Y,8,xO5,10,yO5,4);
if (COL){
  resetOvni5();
    for(int i=800;i>1;i--){
    tone(5,i,10);
  }
  Vidas--;
}
} // ESTADOJUEGO
delay(30);
}

void TECLADO(){
int  btnDisp = digitalRead(3);
  if (btnDisp == HIGH && Disparado == false){
  Disparar();
  }
  if (digitalRead(11) == HIGH && X < 85){
    X++;
  }
  if (digitalRead(12) == HIGH && X > 5){
    X--;
  }
}

void dibujar_NAVE(int x, int y){
TV.set_pixel(x + 4,y + 0,2);
TV.set_pixel(x + 5,y + 0,2);
TV.set_pixel(x + 4,y + 1,2);
TV.set_pixel(x + 5,y + 1,2);
TV.set_pixel(x + 2,y + 2,2);
TV.set_pixel(x + 3,y + 2,2);
TV.set_pixel(x + 4,y + 2,2);
TV.set_pixel(x + 5,y + 2,2);
TV.set_pixel(x + 6,y + 2,2);
TV.set_pixel(x + 7,y + 2,2);
TV.set_pixel(x + 0,y + 3,2);
TV.set_pixel(x + 1,y + 3,2);
TV.set_pixel(x + 2,y + 3,2);
TV.set_pixel(x + 3,y + 3,2);
TV.set_pixel(x + 4,y + 3,2);
TV.set_pixel(x + 5,y + 3,2);
TV.set_pixel(x + 6,y + 3,2);
TV.set_pixel(x + 7,y + 3,2);
TV.set_pixel(x + 8,y + 3,2);
TV.set_pixel(x + 9,y + 3,2);
TV.set_pixel(x + 3,y + 4,2);
TV.set_pixel(x + 4,y + 4,2);
TV.set_pixel(x + 5,y + 4,2);
TV.set_pixel(x + 6,y + 4,2);
TV.set_pixel(x + 4,y + 5,2);
TV.set_pixel(x + 5,y + 5,2);
TV.set_pixel(x + 3,y + 6,2);
TV.set_pixel(x + 4,y + 6,2);
TV.set_pixel(x + 5,y + 6,2);
TV.set_pixel(x + 6,y + 6,2);
TV.set_pixel(x + 2,y + 7,2);
TV.set_pixel(x + 3,y + 7,2);
TV.set_pixel(x + 4,y + 7,2);
TV.set_pixel(x + 5,y + 7,2);
TV.set_pixel(x + 6,y + 7,2);
TV.set_pixel(x + 7,y + 7,2);
}
void dibujar_OVNI(int x, int y){
  TV.set_pixel(x + 4,y + 0,1);
  TV.set_pixel(x + 5,y + 0,1);
  TV.set_pixel(x + 3,y + 1,1);
  TV.set_pixel(x + 4,y + 1,1);
  TV.set_pixel(x + 5,y + 1,1);
  TV.set_pixel(x + 6,y + 1,1);
  TV.set_pixel(x + 0,y + 2,1);
  TV.set_pixel(x + 1,y + 2,1);
  TV.set_pixel(x + 2,y + 2,1);
  TV.set_pixel(x + 3,y + 2,1);
  TV.set_pixel(x + 4,y + 2,1);
  TV.set_pixel(x + 5,y + 2,1);
  TV.set_pixel(x + 6,y + 2,1);
  TV.set_pixel(x + 7,y + 2,1);
  TV.set_pixel(x + 8,y + 2,1);
  TV.set_pixel(x + 9,y + 2,1);
  TV.set_pixel(x + 4,y + 3,1);
  TV.set_pixel(x + 5,y + 3,1);
}
void dibujar_Disparo(int x, int y){
  TV.set_pixel(x,y,2);
}

void DibujarLimites(){
for(int i=0;i<101;i++){
TV.set_pixel(i,0,1);
TV.set_pixel(0,i,1);
TV.set_pixel(100,i,1);
TV.set_pixel(i,100,1);
  }
}

void Disparar(){
  if (Disparado == false){
  Disparado = true;
tone(5,880,500);
  xM = X + 4;
  yM = Y - 3;
  dibujar_Disparo(xM, yM);
  }
}

void MovMunicion(){
  if (Disparado){
  yM--; yM--; yM--; 
  if (yM > 1){
  dibujar_Disparo(xM,yM);
  } else{
    Disparado = false;
  }
  }
  }

  void MovOvni1(){
    if (retardoDesIA){
      yO1++;
    }
    retardoIA++;
    if (retardoIA > 35){
  retardoIA = 0;
    }
    if (xO1 < X && retardoIA > 20){
    xO1++;
    } 
    if (xO1 > X && retardoIA > 20){
      xO1--;
    }
    if (yO1 > 99){
      ESTADOJUEGO = "GAME-OVER";
    }
    if (xO1 > 85){
      xO1--;
    }
    if (xO1 < 10) {
      xO1++;
    }
  }

void MovOvni2(){
    if (retardoDesIA){
      yO2++;
    }
    retardoIA2++;
    if (retardoIA2 > 45){
  retardoIA2 = 0;
    }
    if (xO2 < X && retardoIA2 > 20){
    xO2++;
    } 
    if (xO2 > X && retardoIA2 > 20){
      xO2--;
    }
    if (yO2 > 99){
      ESTADOJUEGO = "GAME-OVER";
    }
    if (xO2 > 85){
      xO2--;
    }
    if (xO2 < 10) {
      xO2++;
    }
  }

void MovOvni3(){
    
      yO3++;

    retardoIA3++;
    if (retardoIA3 > 35){
  retardoIA3 = 0;
    }
    if (xO3 < X && retardoIA3 > 10){
    xO3++;
    } 
    if (xO3 > X && retardoIA3 > 10){
      xO3--;
    }
    if (yO3 > 99){
      ESTADOJUEGO = "GAME-OVER";
    }
    if (xO3 > 85){
      xO3--;
    }
    if (xO3 < 10) {
      xO3++;
    }
  }

  void MovOvni4(){
    
      yO4++;

    retardoIA4++;
    if (retardoIA4 > 25){
  retardoIA4 = 0;
    }
    if (xO4 < X && retardoIA4 > 15){
    xO4++;
    } 
    if (xO4 > X && retardoIA4 > 15){
      xO4--;
    }
    if (yO4 > 99){
      ESTADOJUEGO = "GAME-OVER";
    }
    if (xO4 > 85){
      xO4--;
    }
    if (xO4 < 10) {
      xO4++;
    }
  }

  void MovOvni5(){
    if (retardoDesIA){
      yO5++;
    }
    retardoIA5++;
    if (retardoIA5 > 55){
  retardoIA5 = 0;
    }
    if (xO5 < X && retardoIA5 > 10){
    xO5++;
    } 
    if (xO5 > X && retardoIA5 > 10){
      xO5--;
    }
    if (yO5 > 99){
      ESTADOJUEGO = "GAME-OVER";
    }
    if (xO5 > 85){
      xO5--;
    }
    if (xO5 < 10) {
      xO5++;
    }
  }

  
  void resetOvni1(){
    Puntos = Puntos + random(1,10);
      tone(5,1,500);
      tone(5,999,150);
    yO1 = random(-10,-100);
    xO1 = random(-50,200);
  }

Saludos!

Y cual es la pregunta? Estas en un foro de preguntas. Si quieres dejar un tutorial ve a Documentación.
La verdad que no veo en que contribuye tu aporte y disculpa por el comentario pero si por cada cosa que encontremos en la Web vamos a postear aqui, estaríamos releyendo todo, no te parece?

Perdón por ponerlo en el lugar equivocado. No se que podrá aportar, es una demostración, eso queda en cada uno pero el código es mio no lo encontré en la web, si buscaste y lo encontraste es un post mio en un pequeño foro que nada tiene que ver con arduino y me pareció este un mejor foro.
Al menos la respuesta fue rápida, y eso da la sensación de un buen foro activo.

Perdona entonces.
Sería bueno que armes un tutorial ya que es tuyo explicando como haces cada paso. Si te parece hago que lo muevan a Documentacion que sería la sección mas apropiada, pero desarrolla mas la ida porque esta muy crudo.
Llegas y pones un código tuyo que no explica demasiado.
Arma un video y puedes explicarlo y finalmente jugar un poco para entusiasmar a alguno o algunos.
Son todas criticas constructivas.

NOTA : me disculpo por mi comentario anterior.