Instituto de Tecnologías Educativas SIMÓN • Introducción • Consideraciones previas de programación y de implementación • ¿Cómo se ejecuta un programa? • Construcción • Descripción del juego INTRODUCCIÓN En la presente documentación se van a desarrollar una serie de ejemplos para instruirse en el manejo de la controladora CNICE utilizando el lenguaje de programación Logo y empleando el compilador MSWLogo que distribuye el Instituto de Tecnologías Educativas a través de su Observatorio y el lenguaje C utilizando el compilador DevC++. Con ellos se tratará de que el “alumno” vaya aprendiendo de forma gradual a programar esta controladora con estos lenguajes, por ello, y como se podrá comprobar, hay ejemplos que se desarrollan en varias fases. No obstante, hay que destacar que se presuponen unos conocimientos previos en estos lenguajes de programación y en las primitivas que se emplean para la controladora. En primer lugar se definirán los conceptos básicos de programación más importantes que se han empleado para implementar la mayor parte de los ejemplos para facilitar la comprensión del código desarrollado. Luego se explicará qué pasos se deben seguir para ejecutar en el compilador de MSWLogo cualquiera de los ejemplos proporcionados para poder ver cómo funciona con la controladora CNICE. Seguidamente se procederá a explicar en detalle cómo se ha construido el dispositivo que va a permitir probar los programas desarrollados. Se explicará también en detalle en qué consiste el juego. Por último se pasará a explicar el funcionamiento de cada uno de los ejemplos y las conexiones que se deben realizar en la controladora junto con el código correspondiente. Para obtener más información acerca de cómo se ha realizado la programación se debe consultar los amplios comentarios que se han introducido en el código de cada ejemplo. Consideraciones previas de programación y de implementación Como ya se ha mencionado anteriormente, se considera que el usuario debe tener conocimientos previos en el lenguaje de programación Logo y en las primitivas que se utilizan para manipular la controladora CNICE. No obstante se van a dar unas definiciones básicas para facilitar la comprensión del código desarrollado para implementar los programas proporcionados. Vectores. Un vector o array es una colección no ordenada de elementos a los que se puede acceder a través de un índice. En Logo para definir un vector se emplea la función predefinida: matriz tamaño [origen] Proyectos Simón 1 Interfaz de control de dispositivos externos por ordenador a través de puerto paralelo donde tamaño indica el número de elementos de los que consta el vector y origen es un parámetro opcional que indica el valor a partir del cual se comenzará a indexar en el vector. Para introducir elementos en el vector se utiliza el procedimiento predefinido: ponelemento indice nomb_vector valor donde indice indica la posición en el vector en la que se va a introducir el elemento, nomb_vector es el nombre del vector en el que se quiere poner el elemento y valor es el objeto que se pondrá en la posición indicada del vector. Por ejemplo, supongamos que queremos crear un vector de dos elementos al que queremos llamar mivector cuyo índice empiece en 0. Una vez creado queremos introducir los valores 5 y 7 en las posiciones 0 y 1 del vector. Por último queremos que se muestre por pantalla el resultado obtenido: haz "mivector (matriz 2 0) ponelemento 0 :mivector 5 ponelemento 1 :mivector 7 muestra :mivector {5 7} Capturar eventos de teclado. En casi todos los programas se ha empleado la captura de eventos realizados por el usuario a través del teclado, es decir, el usuario puede interactuar con los programas, recogiendo así las decisiones que quiere tomar éste, en cada momento, cuando se está ejecutando un programa determinado. En la mayor parte de los casos se ha empleado este tipo de captura de eventos para que se pueda terminar la ejecución del programa cuando el usuario pulse la tecla S. En la captura de eventos de teclado para saber la tecla que está siendo pulsada por el usuario se utiliza la función predefinida LEERCAR en el procedimiento en el que se pretende tratar la tecla pulsada. En el compilador, el foco debe de estar en la pantalla y no en la ventana de trabajo, para que se puedan capturar los eventos de las teclas. Esto se puede forzar con el procedimiento predefinido PONFOCO [pantalla de MSWLogo]. A modo de ejemplo, supongamos que queremos activar la captura de eventos de teclado para finalizar la ejecución del programa y dejar de capturar eventos de teclado al pulsar la tecla S mayúscula. Para ello deberemos incluir las siguientes líneas de código: (PONTECLADO [HAZ "tecla_p LEERCAR] [SI (:tecla_p = 83) [QUITATECLADO ALTO]]) PONFOCO [pantalla de MSWLogo] donde el número 83 corresponde al código ASCII de la letra S. El programa estará ejecutándose normalmente hasta que el usuario pulse la tecla S, momento en el cual el programa dejará su ejecución normal esté en el punto que esté y se procederá a ejecutar las instrucciones asociadas a dicha tecla. En este caso se desactivaría la captura de eventos (QUITATECLADO) y se detendría la ejecución (ALTO). Contadores Este es uno de los conceptos mas complejos que se han utilizado para implementar los programas. Un contador en Logo es una secuencia de comandos que se ejecutarán cada n milisegundos de forma continua hasta que se desactive el contador. Para activar un contador se usará el procedimiento: PONCONTADOR id retardo llamada donde id es un número del 1 al 31 que identificará al contador, retardo es el tiempo de espera en milisegundos entre cada llamada a la secuencia de comandos para que se vuelva a ejecutar y llamada es una función con la secuencia de comandos a ejecutarse. El ordenador como elemento de control 2 Instituto de Tecnologías Educativas La secuencia de comandos debe ejecutarse más rápido que el retardo del contador porque si no se pueden ir anidando llamadas que no se pueden ejecutar pudiendo provocar un desbordamiento de la pila. Para parar un contador se usará el comando: CONTADORACERO id donde id es el identificador del contador. Veamos un ejemplo para tratar de aclarar las dudas que hayan podido quedar con la explicación anterior: PARA Saludo ESCRIBE [HOLA] FIN PONCONTADOR 1 2000 [Saludo] HAZ "aux 0 REPITE 4 [HAZ "aux (:aux + 1) ESPERA 120 ESCRIBE :aux] CONTADORACERO 1 En este ejemplo se lanza un contador cuyo identificador es 1. Cada 2 segundos ejecutará el procedimiento Saludo que simplemente escribe por pantalla la palabra HOLA. Pasados 8 segundos (se ejecuta un bucle 4 veces que espera cada vez 2 segundos) se detiene el contador. Se ha empleado una variable aux que en cada vuelta del bucle se incrementa en una unidad y se escribe su valor por pantalla. Esto se ha hecho para ver que se pueden seguir ejecutando instrucciones aunque se esté a la espera de la siguiente llamada del contador. Programación estructurada Aunque los programas son muy sencillos se ha preferido dividir el código en distintos procedimientos para que el lector se habitúe a esta forma de programar mas estructurada, en lugar de incluir todas las líneas de código en un solo programa principal. CONSTRUCCIÓN Este dispositivo simula el funcionamiento del juego del Simón, el cual consiste en que nos muestra una secuencia de colores para que posteriormente nosotros los repitamos la misma secuencia de colores, las secuencia se muestran al principio lentamente, para ir aumentando progresivamente la velocidad con que se muestran los colores. Descripción de elementos: Los elementos que se van a utilizar para la construcción del Simón se listan a continuación: Proyectos Simón 3 Interfaz de control de dispositivos externos por ordenador a través de puerto paralelo Soporte (1): Está formado por varios bloques de fischer sobre los cuales se montan las bombillas, los sensores de contacto, y las láminas de plástico transparentes. 4 Bombillas (2): Son las que van a iluminar las láminas de plástico transparentes. 4 Sensores de contacto (3): Se van a utilizar para saber cuándo se pulsa un color de los cuatro que pueden lucir. 4 Láminas de plástico transparentes (4): Se puede utilizar cualquier material que permita el paso de la luz de las bombillas. 16 Cables eléctricos (5): Se utilizarán 2 cables para cada bombilla y para cada sensor, uno de los cables de las bombillas irá a una de las salidas digitales y el otro a masa, en los sensores de contacto uno de los cables irá a uno de las entradas digitales y el otro a masa. 16 Enganches de cables eléctricos (6): Estos sirven para enganchar los cables eléctricos a los bloques que forman el simón. Montaje del simón: El proceso de montaje del simón se desglosa en varios pasos, para que resulte más fácil su entendimiento. Para el montaje se han utilizado piezas de fischer. 1. Se monta el soporte (1), el cual se divide en 4 ventanas huecas sobre las que se van a poner en cada hueco una bombilla (2) y un sensor de contacto (3). A la hora de colocar la bombilla y el sensor en el soporte hay que tener cuidado de dejar libres los agujeros donde se conectan los conectores eléctricos. El ordenador como elemento de control 4 Instituto de Tecnologías Educativas 2. Se electrifica las bombillas y los sensores de contacto a través de los cables eléctricos (5) que se conectan a estos a través de los conectores eléctricos (6). 3. Se preparan las láminas cuadradas transparentes (4), para lo cual la hemos obtenido del recubrimiento que se pone en la parte superior de las terrinas de CD. Proyectos Simón 5 Interfaz de control de dispositivos externos por ordenador a través de puerto paralelo 4. Después de obtener 4 piezas, a cada una de las piezas las pintamos de distintos colores. 5. Por último se pegan las piezas transparentes sobre la punta de los sensores de contacto y parte de los bloques de fischer. El ordenador como elemento de control 6 Instituto de Tecnologías Educativas Esquema eléctrico: Para poder alimentar las bombillas son necesarios 1 par de cables eléctricos para cada bombilla, un cable se conecta a la salida digital y el otro cable se conecta a masa. Los sensores de contacto se conectarán un cable eléctrico a las entradas digitales y el otro cable eléctrico a masa. En total se utilizarán 8 cables, 2 por cada sensor de contacto. La forma en la que se conectan las bombillas y los sensores a la controladora se muestra en el siguiente esquema: DESCRIPCIÓN DEL JUEGO Los conceptos de programación principales que se van a manejar con estos ejemplos son creación y utilización de vectores, manipulación de ficheros, el uso de bucles y emisión de sonidos en Logo. Con respecto a la controladora se aprenderá a manipular sus entradas y salidas digitales. Se trata del juego Simón de 4 colores. A grandes rasgos este juego consiste en ir presentando al usuario una secuencia de colores y él debe ir repitiéndola. En cada iteración se presentará un color más en la secuencia y se incrementará la velocidad. Las consideraciones a tener en cuenta son las siguientes: Los colores deben ser rojo, verde, negro y azul. Influye el tiempo de respuesta del usuario. Si ha transcurrido un determinado intervalo de tiempo y el usuario no responde ◊ error --> fin de la partida. Si el jugador falla en la secuencia de colores --> error --> fin de la partida. Cada partida constará de 10 jugadas, es decir, la secuencia final de colores tendrá 10 elementos. Si el jugador consigue llegar al final del juego --> fin de la partida. Se debe presentar la opción de volver a jugar tanto si se ha terminado una partida como si ha habido error. Proyectos Simón 7 Interfaz de control de dispositivos externos por ordenador a través de puerto paralelo El juego tendrá dos niveles de dificultad: A. B. NIVEL PRINCIPIANTE: las secuencias de colores estarán prefijadas de antemano (mismas secuencias de colores para todas las partidas). NIVEL EXPERTO: las secuencias de colores se generarán de forma aleatoria para cada partida. ¿Cómo se van a ir almacenando las secuencias de colores que se deben mostrar?. En ambos casos se ha optado por utilizar para guardar la secuencia de colores un vector de 10 elementos en el que cada color estará representado por un número: o o o o ROJO --> 1 VERDE --> 2 NEGRO --> 3 AZUL --> 4 La diferencia entre las opciones A. (nivel principiante) y B. (nivel experto) es que en B. generamos la secuencia de colores de forma aleatoria y en A. ya de partida se sabe la secuencia de colores total. A partir de ese momento el funcionamiento es similar para ambos casos. Cada secuencia de colores debe tener un color más que la anterior. Así, la 1ª secuencia de colores tendrá 1 color, la 2ª 2 colores, y así sucesivamente. Además se debe ir “repitiendo” la secuencia de colores (la parte inicial debe ser común para todas las secuencias de colores), por ello se ha optado por tomar vectores como solución a la implementación. A medida que se avanza en la partida se va pasando de una secuencia a otra y al pasar de una secuencia a otra se va aumentando la velocidad (cada sonido para cada color debe tener menor duración y el tiempo entre secuencias de colores también disminuye). Veamos un ejemplo: {2 1 4 1 3 3 1 1 2 4} o o o o o o o La 1ª secuencia es VERDE. La 2ª secuencia es VERDE, ROJO. La 3º secuencia es VERDE, ROJO, AZUL . . . La 10ª secuencia es VERDE, ROJO, AZUL, ROJO, NEGRO, NEGRO, ROJO, ROJO, VERDE, AZUL. Para comprobar el funcionamiento en la controladora se deberán emplear cuatro salidas digitales una para cada color (bombilla) que se irá mostrando al jugador y cuatro entradas digitales para cada interruptor que debe pulsar el usuario para encender un color e intentar seguir la secuencia de colores que se le vaya mostrando. En concreto las salidas digitales serán: o o o o S0 S1 S2 S3 para para para para el el el el color color color color ROJO. VERDE. NEGRO. AZUL. Y las entradas digitales serán: o o o o E0 E1 E2 E3 para para para para el el el el pulsador pulsador pulsador pulsador correspondiente correspondiente correspondiente correspondiente El ordenador como elemento de control al al al al color color color color ROJO. VERDE. NEGRO. AZUL. 8 Instituto de Tecnologías Educativas PROGRAMACIÓN Diagrama de flujo Proyectos Simón 9 Interfaz de control de dispositivos externos por ordenador a través de puerto paralelo Programación en MSWLogo La programación de este caso se estructura en los siguientes pasos: 1. Se crea un procedimiento para crear la ventana gráfica principal del programa. Para ello se utiliza la función creaventana. Dentro de la ventana se crean los botones con la función creaboton. Dentro de cada botón se establecerán entre los corchetes las funciones que se han de ejecutar una vez presionado el botón. Uno de los botones creados será el que se utiliza para salir de la aplicación, para lo cual se utiliza la orden adiós. creaventana " "Principal [SIMON] 100 42 190 100 [] creaboton "Principal "NivelPrinciante "Nivel_Principiante 20 20 70 20 [proc_principiante] creaboton "Principal "NivelExperto "Nivel_Experto 100 20 70 20 [proc_experto] creaboton "Principal "Salir "Salir 60 50 70 20 [proc_salir adios] En este procedimiento se crea y se inicializa a 0 una variable que llamaremos bucle que nos servirá para poder leer las entradas digitales de manera continuada. 2. Se crea un procedimiento para crear la ventana grafica para cada uno de los tipos de funcionamiento del simón, Nivel Principiante o Nivel Experto. Estas dos ventanas van a ser de igual aspecto, la única diferencia que existe es secuencia de colores que ejecutará el simón. Se crean los botones para iniciar el juego, detenerlo o volver a la ventana inicial. creaventana " "NivelPrincipiante [SIMON-Nivel_Principiante] 100 42 150 100 [] creaboton "NivelPrincipiante "Iniciar "Iniciar 18 20 50 20 [proc_iniciarPrin] creaboton "NivelPrincipiante "Parar "Parar 80 20 50 20 [proc_parar] creaboton "NivelPrincipiante "Volver "Volver 50 50 50 20 [proc_salir graficos] 3. Para el nivel principiante, se leen los valores desde un fichero y en todas las partidas se genera la misma secuencia. Se establece como número de jugadas 10 por defecto y se ejecuta la secuencia obtenida con Crear_vector_predefinido, mientras no sea el final de la partida y no haya habido ningún error. para proc_iniciarPrin HAZ "num_jugadas 10 HAZ "iteracion 1 HAZ "tiemp_timbre 2000 HAZ "b_error "FALSO HAZ "FIN_PARTIDA "FALSO HAZ "vector_col Crear_vector_predefinido :num_jugadas MIENTRAS [(Y (NO :b_error) (NO :FIN_PARTIDA) (O (:iteracion < :num_jugadas) (:iteracion = :num_jugadas)))] [ HAZ "tiemp_timbre (Establecer_tiempo_timbre :iteracion) Escribir_Salidas_Digitales :vector_col :iteracion :tiemp_timbre HAZ "b_error (Comprobar_secuencia :vector_col :iteracion) SISINO (:b_error) [HAZ "tipo "fallo Mostrar_Mensaje :tipo ] [HAZ "FIN_PARTIDA (:iteracion = :num_jugadas) SISINO (:FIN_PARTIDA) [HAZLOCAL "tipo "exito Mostrar_Mensaje :tipo] [;Pasamos a la jugada siguiente HAZ "iteracion (:iteracion + 1) ] ] ] ;END_MIENTRAS fin Función Crear_vector_Predefinido El ordenador como elemento de control 10 Instituto de Tecnologías Educativas PARA Crear_vector_Predefinido :num_jugadas HAZLOCAL "vector_col (matriz :num_jugadas 1) SI ficherop "COLORES.txt [abrelectura "COLORES.txt ponlectura "COLORES.txt HAZLOCAL "i 1 MIENTRAS [NO finlec?] [ponelemento :i :vector_col (PRIMERO leelista) HAZLOCAL "i (:i + 1)] ponlectura [] cierra "COLORES.txt ] DEVUELVE :vector_col FIN En cada iteración se comprueba si se ha realizado de manera correcta la secuencia con la función Comprobar_secuencia. PARA Comprobar_secuencia :v_color :iter HAZLOCAL "seguir "VERDADERO HAZLOCAL "i 1 MIENTRAS [(Y (O (:i < :iter) (:i = :iter)) (:seguir))] [ HAZLOCAL "ent Leer_Entradas_Digitales SISINO (:ent = -1) [HAZ "seguir "FALSO] [HAZ "sec_color (elemento :i :v_color) SISINO (:ent = :sec_color) [HAZ "i (:i + 1)] [HAZ "seguir "FALSO] ] ] DEVUELVE (NO :seguir) FIN 4. Para el nivel experto, se genera la secuencia de colores aleatoriamente llamando a la función Generar_vector_aleatorio haciendo que en cada partida la secuencia de colores sea diferente. Este procedimiento realiza las mismas comprobaciones que el nivel principiante, con la diferencia de que en el nivel principiante se llama a la función Crear_vector_Predefinido y en el nivel experto se llama a Generar_vector_aleatorio. PARA Generar_vector_aleatorio :num_jugadas HAZLOCAL "vector_col (matriz :num_jugadas 1) DESDE [i 1 :num_jugadas 1] [ponelemento :i :vector_col ((azar 4)+1)] DEVUELVE :vector_col FIN 5. Se llama al procedimiento que crea la ventana gráfica fuera de cualquier procedimiento para que se cargue la aplicación gráfica nada más cargar el fichero de logo. Descargar el archivo programado en MSWLogo, descomprímalo y guárdelo en un directorio aparte. Contiene el fichero de código en MSWLogo (simon.lgo y las imágenes del simón). Ejecute el compilador MSWLogo versión 6.5a en castellano. Proyectos Simón 11 Interfaz de control de dispositivos externos por ordenador a través de puerto paralelo Vaya al menú del programa, Archivo/Abrir y seleccione el fichero simon.lgo que se descargó previamente. Se visualizará la siguiente pantalla: Independientemente del nivel que se haya elegido, se mostrará la siguiente pantalla: Programación en C La programación de este caso se estructura en los siguientes pasos: 1.- Se crea un nuevo proyecto 2.Se añaden al proyecto los archivos io.h, io.cpp, Primitivas_CNICE.CPP y Primiticas_CNICE.HPP y SDL.h (librería que permite añadir imágenes a la aplicación programada con C). 3.- Se crea el archivo main.c donde se incluirán las funciones necesarias para crear las ventanas 4.- Dentro del archivo main.c creado anteriormente, se añade la declaración a las funciones de la biblioteca io.dll de la siguiente manera: #include “io.h” También se añade la declaración a las funciones de la biblioteca SDL.dll de la siguiente manera: #include <SDL.h> 5.- En nuestro archivo main.c se define la siguiente función que permite activar o desactivar las entradas digitales de la controladora. El ordenador como elemento de control 12 Instituto de Tecnologías Educativas void Escribir_Salidas_Digitales(int Dato) { LoadIODLL(); PortOut(0x37A,0x7); PortOut(0x378,Dato); } 6.- Definimos también la función leedigital() que se encargara de leer el valor de las entradas digitales de la controladora. La función es la siguiente: int leedigital() { int bajo=0; int alto=0; int d=0; LoadIODLL(); PortOut(0x37A, 0x3); bajo = PortIn(0x379); bajo = (bajo & 0x78) / 8; bajo = ~bajo; bajo = bajo & 15; PortOut(0x37A, 0x1); alto = PortIn(0x379); alto = (alto & 0x78) / 8; alto = ~alto; alto = alto & 15; d = (alto * 16) | bajo; return d; } 7.- Se crearán dos botones en nuestra ventana, uno para manejar el Simon en un nivel Principiante y otro para manejarlo con un Nivel Experto. La diferencia entre estos dos niveles está en la secuencia de colores. Si es el nivel principiante, la secuencia esta ya prefijada y no cambia, pero si es el nivel experto, la secuencia es aleatoria y no se repite. 8.- En cada una de las dos opciones, se crea una ventana para manejar el Simon. Se crean 3 botones: Iniciar, Parar y Volver. 9.Para el Nivel Principiante se define una matriz donde se almacenan una serie de valores correspondientes a las salidas de la controladora. Una secuencia puede ser la siguiente: matriz[0]=1; matriz[1]=4; matriz[2]=2; matriz[3]=4; matriz[4]=4; matriz[5]=8; matriz[6]=2; matriz[7]=1; matriz[8]=8; matriz[9]=8; 10.- Para el Nivel Experto se rellena la matriz con valores aleatorios. Esto se consigue usando la función rand(). La manera de hacerlo es la siguiente: for(i=0;i<10;i++){ numero= rand()%(4-1+1)+1; if(numero==1) matriz[i]=1; else if(numero==2) matriz[i]=2; else if(numero==3) matriz[i]=4; else if(numero==4) matriz[i]=8; } Proyectos Simón 13 Interfaz de control de dispositivos externos por ordenador a través de puerto paralelo 11.- Para comprobar que el jugador pulsa correctamente la secuencia de colores que se pide, se crea un hilo que realiza esa comprobación. La función que ejecuta ese hilo es la siguiente: DWORD WINAPI Comprobar_Sensor(LPVOID parametro) { int E, i=0, num2; SDL_Surface *color; SDL_Surface *screen; SDL_Rect rect; for(;;){ for(i=0;i<num;i++){ Sleep(1000); if(matriz[i]==1) color = SDL_LoadBMP("simonrojo.bmp"); else if(matriz[i]==2) color = SDL_LoadBMP("simonverde.bmp"); else if(matriz[i]==4) color = SDL_LoadBMP("simonazul.bmp"); else if(matriz[i]==8) color = SDL_LoadBMP("simonnegro.bmp"); screen = SDL_SetVideoMode( 300, 300, 0, SDL_NOFRAME ); if( screen == NULL ) { printf( "Error al entrar a modo grafico: %s\n", SDL_GetError() ); SDL_Quit(); } rect = (SDL_Rect) {0, 0, 200, 200}; SDL_BlitSurface(color, NULL,screen,&rect); SDL_Flip(screen); encender(matriz[i]); Sleep(1000); encender(0); } num2=num; i=0; do{ do{ E=leedigital(); fflush(stdout); if(E!=0){ if(E==matriz[i]){ i++; Sleep(500); } else if(E!=matriz[i]){ MessageBox(0,"Has fallado","FALLO",0); return 0; } } }while(E==0); E=0; }while(i<num2); num++; if(num==11){ MessageBox(0,"¡Enhorabuena! Has acertado toda la secuencia", "",0); return 0; } }} Explicación de las funciones de la librería SDL. Cada vez que se quiera mostrar una imagen se indicara en nuestro proyecto lo siguiente: foto = SDL_LoadBMP("imagen.bmp"); screen = SDL_SetVideoMode(200, 308, 0, SDL_NOFRAME ); if( screen == NULL ) { printf( "Error al entrar a modo grafico: %s\n", SDL_GetError() ); SDL_Quit(); return -1; } rect.x=0; rect.y=0; El ordenador como elemento de control 14 Instituto de Tecnologías Educativas rect.w=primera1->w; rect.h=primera1->h; destino.x=0; destino.y=0; SDL_BlitSurface(primera1, &rect, screen, &destino); SDL_Flip(screen); donde foto y screen son del tipo SDL_Surface y rect y destino es del tipo SDL_Rect. - SDL_LoadBMP: carga la imagen .bmp que queramos SDL_SetVideoMode (int width, int height, int bpp, Uint32 flags): configure un modo de video con una anchura (width), una altura (height) y unos bits-por-pixeles. El parámetro flags indica el tipo de ventana que se quiere. En nuestro caso una ventana sin título no borde. SDL_BlitSurface(imagen, &rect, screen, &destino): pega desde la imagen, la porción seleccionada por rect sobre la superficie screen en el destino indicado por destino. SDL_Flip(screen): muestra la imagen que se ha seleccionado. 12.- Una vez creados los botones con la función que les corresponden, se compila comprobando que no hay ningún error. 13.- Una vez que se ha comprobado que no hay ningún error en nuestro código, se ejecuta y se comprueba el funcionamiento del Simon. Al ejecutar el proyecto se creará el fichero Simon.exe Descargue los diferentes archivos que forman todo el proyecto programado en C, descomprímalos y guárdelos en un directorio aparte. Ejecute el fichero Simon.exe. Se visualizará la siguiente pantalla: Pulsando los botones que se le presentan podrá elegir entre un funcionamiento a Nivel Principiante, a Nivel Experto o salir de la aplicación. Pulsando cualquiera de las dos opciones aparece la siguiente pantalla: Proyectos Simón 15 Interfaz de control de dispositivos externos por ordenador a través de puerto paralelo Imagen que indica que la luz roja está encendida Imagen que indica que la luz verde está encendida Imagen que indica que la luz azul está encendida Imagen que indica que la luz negra está encendida Nota: En la aplicación programada con C, la imagen puede no aparecer al lado de la ventana. En este caso basta con mover nuestra ventana y se verá correctamente la imagen. El ordenador como elemento de control 16