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!