Mi Primer Proyecto Dribbler


Autor: Daniela Muñoz Muñoz
Competencia: Desarrollo de Software (Nivel 1)
Palabras Clave: Programación, NXC, robótica, Lego


Descripción de la Actividad: A continuación les daré a conocer mi grata experiencia como estudiante de primer año de ingeniería civil en informática, en mi primer proyecto llamado "Dribbler".
El proyecto Dribbler, consiste en encontrar la mayor cantidad de zona de puntaje (circulos negros), logrando así acumular puntos, sin chocar con los obstáculos que se presenten en el camino, ya que al hacerlo el juego se termina.



Solución
La solución al problema es crear el  pseudocódigo que nos facilitara el desarrollo del código.




                                                                      Pseudocodigo:



Variable Puntos=0; 
Variable Velocidad;
Variable tiempo=0; 
Variable tiempo_actual= 0; 
Variable tiempo_anterior=0; 
Subrutina Avanzar
 {
 Avanzar (Motores, Velocidad);
 }
Subrutina Musica
 {
 Mientras(Sea Verdad)
 {
 Tocar Música
 }
 }

Subrutina MusicaAnotacion() //Reproduce musica al anotar un punto (detectar punto negro)
 {
 Tocar Musica
  }

Subrutina Esquivar() 
 {
 Avanzar (Motor A, Potencia 100);
Retroceder (Motor C, Potencia 100);
 Esperar 0.5 segundos
 }

Subrutina Puntos() 
 {
 tiempo_actual= Capturar Tiempo
 Llamar Subrutina MusicaAnotacion();
 tiempo=(tiempo_actual-tiempo_anterior)/1000;
 tiempo_anterior=tiempo_actual;
Si (tiempo es menor o igual a 10)
 {
 Puntos=Puntos - 5*tiempo + 50;
 }
  Si (tiempo es mayor a 10)
 {
 Puntos=Puntos+0;
 }
 Si (Velocidad es menor a 100)
 {
Sumar 20 a Velocidad;}
 }
Tarea Actividad ()

{
Mientras (Sea verdad) 
 {
  Llamar Subrutina Avanzar();
 Si (Se detecta sonido)
 {
 Llamar a Subrutina Esquivar();
 }

 Si (Detecta Punto)
 {
 Llamar Subrutina Puntos();
 Avanzar (Motor A, Potencia 100);
 Retroceder (Motor C, Potencia 100);
 Esperar 0.1 segundos
 }

 Si ( Toca Pared)
 {
 Aumentar puntaje;
 Imprimir Puntaje;
 Apagar Motores;
 Esperar 0.4 Segundos;
 Detener todo;
 }
 }
}
Tarea Musik ()
{
Llamar Subrutina Musica();
}
Tarea MusikPunto()
{
Llamar Subrutina MusicaAnotacion();
}
Tarea TextoPantalla() 
{
 Mostrar Puntaje en pantalla;
}
Tarea main ()
{
tiempo_anterior= Calcular tiempo
Encender sensor tacto;
Encender sensor luz;
Encender sensor sonido;
Ejecutar (Tarea Actividad, Tarea Musik, Tarea TextoPantalla); 
Si (Detecta punto)
Salir a (Tarea MusikPunto);
}


El pseudocódigo anteriormente mencionado, corresponde al siguiente código:

//Proyecto Robotica
//Proyecto Dribbler
//Grupo Project NASA
//Integrantes:
//Daniela Muñoz Muñoz

//



#define UMBRAL 40   // Valor que se usa para determinar el color negro de los puntos
#define SONIDO 95
int Puntos=0;            //Valor usado para calcular el puntaje
int Velocidad=20;   // Variable usada para controlar la velocidad
int tiempo=0;      //Variable usada para el calculo del tiempo entre punto y punto
int t_actual= 0;  //Variable usada para guardar el tiempo capturado
int t_anterior=0;   //Variable usada para guardar el tiempo actual ya usado
int arrayPtje[];   //Arreglo puntaje
int i=0;
int r=0;


sub Avanzar() //Avanza linea recta
{
OnFwd(OUT_AC, Velocidad);
}

sub Musica() //Reproduce musica en toda la ejecucion del programa

{
while(true)
{
PlayTone(100,500);
Wait(300);
PlayTone(200,500);
Wait(300);
PlayTone(300,500);
Wait(300);
PlayTone(400,500);
Wait(300);
PlayTone(500,500);
Wait(300);
PlayTone(500,500);
Wait(300);
PlayTone(400,500);
Wait(300);
PlayTone(300,500);
Wait(300);
PlayTone(200,500);
Wait(300);
PlayTone(100,500);
Wait(300);

}
}

sub MusicaAnotacion() //Reproduce musica al anotar un punto (detectar punto negro)
{
PlayTone(2000,500);
Wait(400);
PlayTone(8000,500);
Wait(400);
PlayTone(2000,500);
Wait(400);
PlayTone(8000,500);
Wait(400);
}

sub Esquivar() //Realiza un giro para esquivar obstaculos y la pared
{
OnFwd(OUT_A, 100);
OnRev(OUT_C, 100);
Wait(1);
}

sub Punts() //Calculo del puntaje ganado y total
{

t_actual= CurrentTick();
MusicaAnotacion();
tiempo=(t_actual-t_anterior)/1000;
t_anterior=t_actual;

if(tiempo <= 10)
{
Puntos=Puntos - 5*tiempo + 50;

}//Cierre if

if(tiempo > 10)
{
Puntos=Puntos+0;
}

arrayPtje[i] = Puntos;
i++;

if(Velocidad<100)
{Velocidad=Velocidad+10;}

} //Cierre if


task Actividad ()

{

while(true)

{

Avanzar();

if (SENSOR_4>SONIDO)
{
Esquivar();
}

if (SENSOR_1<UMBRAL)
{
Punts();
OnFwdReg(OUT_A,100,OUT_REGMODE_SPEED);
OnRevReg(OUT_C,100,OUT_REGMODE_SPEED);
Wait (100);
}

if(SENSOR_3==1)
{
for(r=0; r < ArrayLen(arrayPtje); r++) {
Puntos=Puntos+arrayPtje[r];
NumOut (5,20, Puntos); }
Off(OUT_AC);
Wait(4000);
StopAllTasks();
}

}
}


task Musik ()

{
Musica();
}

task MusikPunto()
{
MusicaAnotacion();
}

task TextoPantalla() // Muestra en pantalla el puntaje
{

TextOut(1,50,".-PROJECT NASA-.",false);
TextOut(1,30,"Puntaje = ",false);
NumOut (5,20, Puntos);
}



task main ()
{

t_anterior= CurrentTick();

SetSensorTouch(IN_3); // Enciende sensor tacto
SetSensorLight(IN_1); // Enciende sensor luz
SetSensorSound(IN_4); // Enciende sensor de sonido

Precedes(Actividad, Musik, TextoPantalla); //Realiza todas las tareas anteriores

if(SENSOR_1<UMBRAL)
ExitTo(MusikPunto);

}


El vídeo que muestra la actividad es el siguiente:



Reflexión:
Esta forma de programar, realizando un proyecto del cual se pueda disfrutar, entretenerse y que llame la atención, tanto como a uno que realizara el proyecto (incluyase código), como una persona  que lo ve desde el exterior.