Programar Juegos Arcade
con Python y PygamePero Espera, Qué Otra Cosa Podemos Hacer?
Qué otras cosas podemos hacer con nuestras habilidades programadoras? Cuando acabes este curso y mires a tu alrededor, es posible que te encuentres haciendo algo distinto a programar videojuegos. Probablemente no estés programando en Python. A lo mejor, incluso, es probable que te des cuenta de que no tengas la oportunidad de programar en absoluto.
En este capítulo exploraremos diferentes ejemplos de lo que puedes hacer con tu habilidades programadoras. Aún si no te conviertes en un programador a tiempo completo, podrías ahorrarte mucho tiempo y esfuerzo creando pequeños programas que te ayuden realizar tareas muy repetitivas.
5.1 Demostración con Arduino
Antes era muy habitual que el combinar las habilidades de programación con la electrónica que controla robots fuera difícil. Crear sistemas incrustados que usaran un ordenador pequeño y barato, que además pudiera gestionar servos, válvulas, motores y luces, requería un tipo de programación muy diferente. Los sistemas incrustados no suelen tener, ni siquiera, un sistema operativo como Microsoft Windows. Es posible que no tengan ni disco duro!
Desde hace unos pocos años, programar sistemas incrustados se ha convertido en algo tan fácil, que incluso hasta los chicos de colegio lo están haciendo. Uno de los productos que están facilitando este movimiento del hágalo-usted-mismo, es Arduino. Las especificaciones para Arduino son gratis y abiertas, permitiendo a cualquiera, crear sus propias soluciones incrustadas por muy poco dinero.
Existen muchas empresas que venden kits de Arduino. Si tienes cerca una buena tienda Radio Shack en tu barrio, es probable que tenga una selección de
productos Arduino. En Adafruit (una de mis favoritas), venden un excelente pack de iniciación que incluye un ordenador Arduino, algunas luces, un motor, un
servo, y algunas otras cosas más. Otros componentes podremos comprarlos en muchas otras tiendas por menos de $100.
http://adafruit.com/products/170
Este pack de iniciación puede usarse para construir el siguiente prototipo de Arduino que controla nueve luces LED, una luz LED multicolor, y usa un sensor de fuerza para controlar un servo brazo.
La Figura 47.16 muestra como pinchar una luz LED a Arduino. El LED se pincha en el pin 13. También se coloca una “resistencia” en línea para impedir que la electricidad fluya demasiado rápido y queme el LED. Las resistencias poseen diferentes valores. Se utiliza un código de colores para facilitar su elección.
Este esquema para el pin 13, se repite para los pins desde el 13 al 4, de esta forma podemos colocar 9 LEDs sobre Arduino.
Si no te quieres limitar a un solo color de LED, podemos usar uno multicolor. Los LEDs multicolor poseen tres LEDs en su interior. Uno para el rojo, el otro para el verde y el tercero para el azul. No les suena familiar? Los colores son especificados controlando el brillo del rojo, verde y azul. Es como programar nuestro juego!
En la Figura 47.17 se ve cómo pinchar el LED multicolor.
La Figura 47.18 muestra cómo pinchar un sensor de fuerza que permita controlar lo lejos que ha de moverse un servo brazo. Este sensor de fuerza es muy sensible, y basándose en la presión ejercida sobre él, el servo brazo robótico realizará su trabajo. Con un poco más de esfuerzo podrías llegar a crear tu propio exoesqueleto!
Observa el código siguiente. Está escrito en el lenguaje de ordenador “C”. Verás que el lenguaje C tiene muchas cosas similares a lo que ya has aprendido en Python:
- En lugar de usar import para cargar una librería, C usa #include.
- C usa llaves en lugar de indentación para determinar qué va dentro de un bucle, función o declaración condicional.
- En el ejemplo, setup es una definición de función, lo mismo que en Python definimos las funciones.
- En lugar de qué tipo de dato queremos para una variable, C te pide que establezcas explícitamente que estás creando una variable nueva, y el tipo de dato que almacenará. Por ejemplo int r crea una nueva variable r que almacena un número entero.
- Arduino tiene una función setup, que posee un código similar al que escribimos en nuestros juegos en Python, antes del bucle principal del programa.
- Arduino tiene una función loop que es llamada una y otra vez. El código que va en ella, es del tipo que iría en nuestro bucle principal de Python.
- Como puedes ver, también existe una función random en C.
- El bucle for en C parece distinto al de Python, pero el concepto es el mismo.
- C también posee declaraciones if y emplea == para comprobar una igualdad.
// Importa la librería servo #include <Servo.h> // Variables Globales long currentPin=4; Servo myservo; // Declaración de la función void setup() { // Coloca el objeto servo en el pin 3 myservo.attach(3); // Establece los pins del 1 al 13 para salidas. for( int i=1; i <= 13; i++ ) pinMode(i, OUTPUT); } // Bucle principal del programa void loop() { // Itera los pins desde el 4 al 13 for( int i=4; i <= 13; i++ ) { // Reconoce si el LED debería estar encendido if( currentPin == i ) { digitalWrite(i, HIGH); // On } else { digitalWrite(i, LOW); // Off } } // Establece que el LED siguiente se ilumine currentPin += 1; // Resetea al principio if( currentPin > 13 ) { currentPin = 4; } // Obtiene valores aleatorios de color int r=random(0,256); int g=random(0,256); int b=random(0,256); // Establece los valores rojo, verde y azul del LED analogWrite(0, r); analogWrite(1, g); analogWrite(2, b); // Lee al sensor de fuerza en el A5 (rango posible 0-1023) int sensorValue = analogRead(A5); // Escribe la posición del servo (rango posible 0-255) myservo.write(sensorValue / 4); // Establece un retardo de 150ms antes de repetir todo delay(150); }
5.2 Demostración de una Macro Excel
47.2.1 Introducción
Imagina que te has graduado recientemente en la universidad y que estás empezando una carrera en el mundo de los negocios. De pronto, una pesadilla! No te han contratado como Vicepresidente de la compañía! Eres un pobre empleado del mundo de las finanzas, al que le han encargado que haga las tareas rutinarias para otra persona. No es precisamente lo que se te prometía en el folleto de la universidad.
Tienes que reproducir las mismas gráficas, una y otra vez, para algún analista financiero. Él dedica todo su tiempo a hacer dinero. No iba a perderlo haciendo gráficas. Tu primer trabajo es pues, hacer por él esas gráficas en Excel.
Alto! Tareas repetitivas y aburridas! Justamente para eso se creó la programación! Y tú has tomado estas clases, por lo que debes estar preparado para ello! Sigue el siguiente guión de Excel para hacer tu propia macro que te permitirá crear, automáticamente, gráficas sobre valores de bolsa.(Esto es realmente lo que me pasó en mi primer empleo, y fue luego, el principio para proponer mi primer gran proyecto)
47.2.2 Tutorial
- Vamos a comenzar nuestra vida laboral como un peón. Este es nuestro trabajo:
- Tenemos que importar datos desde la web.
- Tenemos que dibujar esos datos.
- Tenemos que crear 10 de esas gráficas cada día para diferentes conjuntos de datos.
- En casi cualquier trabajo podrían pedirnos esto. Esos datos pueden ser de cualquier tipo. En este caso usaremos valores de bolsa.
- Bien, nuestro trabajo es aburrido. Sujeto a errores. Toma demasiado tiempo. Especialmente si quieres que las gráficas luzcan magníficamente.
- Pero, espera! No asistimos a las clases de programación del Profesor Craven? Por qué no lo intentamos?
- Malo, malo. Tenemos que programar el Excel con Visual Basic, y el Dr. Craven nos enseñó Python. Bueno, no hay por qué preocuparse por detalles como estos.
- Crearemos un programa de Excel que construya gráficas nuevas con datos almacenados en internet.
- Este es un esquema de lo que queremos que haga nuestro programa:
- Abrir un archivo nuevo
- Importar datos desde la web
- Crear una gráfica
- Estos son los pasos para poder programar una macro en Excel:
- Abrir el programa Excel. Aquí estoy usando la versión del 2010.
- Escribir en la primera celda “Esta hoja de cálculo tiene nuestro programa.” Esto dejará claro cual hoja tiene el programa y cual otra tiene los gráficos.
- Guarda el archivo y llámalo “graficador”. Importante: Asegúrate de guardarlo como un libro (workbook) Macro! Sino, tu macro no podrá ejecutarse. Mira la Figura 47.19.
- Haz clic sobre la pestaña “vista”
- Haz clic sobre el menú de macros, y selecciona “grabar macro.” Ver Figura 47.20
- Llama CrearGrafica a la macro, ver Figura 47.21.
- No puedes usar espacios en el nombre, ya que es una función, y sigue las mismas reglas que Python.
- Pestaña Archivo ...Nuevo...Libro en blanco. Ver Figura 47.22.
- Pestaña Datos ...Desde web (No redimensionar la ventana, se produce un error en Excel.)
- Usar Yahoo para obtener la información de los valores:
http://finance.yahoo.com/q/hp?s=wfc - Seleccionar la tabla en la que estemos interesados e importarla. Ver Figura 47.23.
- Seleccionar las celdas que queremos dibujar. Hacerlo mediante el teclado: ctrl-shift-izquierda, luego ctrl-shift-abajo, luego una arriba.
- Pestaña Insertar...Gráfico de Líneas. Ver Figura 47.24.
- Seleccionar la opción de ir a una nueva hoja. Ver Figura 47.25.
- Hacer clic sobre el botón derecho, “seleccionar datos.” Ver Figura 47.26.
- Modificar los datos de forma que solo visualicemos Adj. Close*. Ver Figura 47.27.
- Seleccionar pestaña “Diseño”.
- Establecer las etiquetas de los ejes.
- Borrar la leyenda.
- Cambiar el título del gráfico por otro mejor.
- Detener el grabador(pestaña vista, botón de macros, detener grabación.)
- Cerrar la hoja de cálculo que hemos creado. (Cuidado, no la hoja “graficador” con nuestro programa.)
- Intenta lo siguiente:
- Ejecuta el graficador desde el menú de macros.
- Fantástico! Se dibuja una gráfica. Pero qué tiene que ver todo esto con lo que hemos estudiado? Dónde está el código?
- Qué bien que lo hayas preguntado. En lugar de ejecutar la macro, haz clic en editar.
- Observa la primera línea. Sub es una abreviatura para subrutina. Lo cual es otra forma de llamar a una función/método.
- Mira Workbooks.Add, una función para añadir un libro en blanco! Observa los parámetros! Booleanos! Objetos!
- Qué sucederá si cambiamos el Ticker?
- Genial! Qué tal si usamos una variable para representarlo?
- Ok, y qué tal si metemos esto en una función a la cual le pasemos la URL? Ver Figura 47.29.
- Y ahora, podemos crear una nueva función con un conjunto completo de símbolos tickers:
Sub CreateCharts() CreateChart ("WMT") CreateChart ("INTC") CreateChart ("WFC") CreateChart ("BBY") CreateChart ("FDX") End Sub
Así es como debería verse tu script de Visual Basic luego de haberlo grabado:
47.2.3 Listado de Código
Sub CreateChart() ' ' CreateChart Macro ' ' Workbooks.Add With ActiveSheet.QueryTables.Add(Connection:= _ "URL;http://finance.yahoo.com/q/hp?s=wfc", Destination:=Range("$A$1")) .Name = "hp?s=wfc" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .WebSelectionType = xlSpecifiedTables .WebFormatting = xlWebFormattingNone .WebTables = "16" .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .WebDisableRedirections = False .Refresh BackgroundQuery:=False End With Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select ActiveSheet.Shapes.AddChart.Select ActiveChart.ChartType = xlLine ActiveChart.SetSourceData Source:=Range("Sheet1!$A$1:$G$69") ActiveChart.Location Where:=xlLocationAsNewSheet ActiveChart.ChartArea.Select ActiveChart.Legend.Select Selection.Delete ActiveChart.ChartArea.Select ActiveChart.SeriesCollection(5).Select ActiveChart.SeriesCollection(1).Delete ActiveChart.SeriesCollection(1).Delete ActiveChart.SeriesCollection(1).Delete ActiveChart.SeriesCollection(1).Delete ActiveChart.SeriesCollection(1).Delete ActiveChart.ChartArea.Select ActiveChart.ChartTitle.Select ActiveChart.ChartTitle.Text = "WFC" Selection.Format.TextFrame2.TextRange.Characters.Text = "WFC" With Selection.Format.TextFrame2.TextRange.Characters(1, 3).ParagraphFormat .TextDirection = msoTextDirectionLeftToRight .Alignment = msoAlignCenter End With With Selection.Format.TextFrame2.TextRange.Characters(1, 3).Font .BaselineOffset = 0 .Bold = msoTrue .NameComplexScript = "+mn-cs" .NameFarEast = "+mn-ea" .Fill.Visible = msoTrue .Fill.ForeColor.RGB = RGB(0, 0, 0) .Fill.Transparency = 0 .Fill.Solid .Size = 18 .Italic = msoFalse .Kerning = 12 .Name = "+mn-lt" .UnderlineStyle = msoNoUnderline .Strike = msoNoStrike End With End Sub
Una vez que lo hayas modificado para que el script tome un parámetro, de forma que puedas dibujar cualquier valor, debería verse de la siguiente manera:
Sub CreateChart(ticker) ' ' CreateChart Macro ' ' Workbooks.Add With ActiveSheet.QueryTables.Add(Connection:= _ "URL;http://finance.yahoo.com/q/hp?s=" + ticker, Destination:=Range("$A$1")) .Name = "hp?s=wfc" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .WebSelectionType = xlSpecifiedTables .WebFormatting = xlWebFormattingNone .WebTables = "16" .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .WebDisableRedirections = False .Refresh BackgroundQuery:=False End With Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select ActiveSheet.Shapes.AddChart.Select ActiveChart.ChartType = xlLine ActiveChart.SetSourceData Source:=Range("Sheet1!$A$1:$G$69") ActiveChart.Location Where:=xlLocationAsNewSheet ActiveChart.ChartArea.Select ActiveChart.Legend.Select Selection.Delete ActiveChart.ChartArea.Select ActiveChart.SeriesCollection(1).Select ActiveChart.SeriesCollection(1).Delete ActiveChart.SeriesCollection(1).Delete ActiveChart.SeriesCollection(1).Delete ActiveChart.SeriesCollection(1).Delete ActiveChart.SeriesCollection(1).Delete ActiveChart.ChartArea.Select ActiveChart.ChartTitle.Select ActiveChart.ChartTitle.Text = ticker Selection.Format.TextFrame2.TextRange.Characters.Text = ticker With Selection.Format.TextFrame2.TextRange.Characters(1, 3).ParagraphFormat .TextDirection = msoTextDirectionLeftToRight .Alignment = msoAlignCenter End With With Selection.Format.TextFrame2.TextRange.Characters(1, 3).Font .BaselineOffset = 0 .Bold = msoTrue .NameComplexScript = "+mn-cs" .NameFarEast = "+mn-ea" .Fill.Visible = msoTrue .Fill.ForeColor.RGB = RGB(0, 0, 0) .Fill.Transparency = 0 .Fill.Solid .Size = 18 .Italic = msoFalse .Kerning = 12 .Name = "+mn-lt" .UnderlineStyle = msoNoUnderline .Strike = msoNoStrike End With End Sub
Sub CreateCharts() CreateChart ("WMT") CreateChart ("INTC") CreateChart ("WFC") CreateChart ("BBY") CreateChart ("FDX") End Sub
47.2.4 Examen de Opciones Múltiples
47.2.5 Respuestas Cortas
Haz click para ir a los Ejercicios.
47.2.6 Laboratorio
You are not logged in. Log in here and track your progress.
English version by Paul Vincent Craven
Spanish version by Antonio Rodríguez Verdugo
Russian version by Vladimir Slav
Turkish version by Güray Yildirim
Portuguese version by Armando Marques Sobrinho and Tati Carvalho
Dutch version by Frank Waegeman
Hungarian version by Nagy Attila
Finnish version by Jouko Järvenpää
French version by Franco Rossi
Korean version by Kim Zeung-Il
Chinese version by Kai Lin