31 agosto 2011

Librería estándar (STL) y Vector

vectorx¿Para qué reinventar la rueda si a alguien ya se le ocurrió?  Es mejor usarla, ¿o no?  Este mismo argumento aplica para los programadores: ¿para qué programar cosas que ya están hechas de forma muy eficiente por otros programadores?  Sería una pérdida de tiempo.
Por eso los programadores podemos aprovechar la Standard Template Library, conocido como STL, o librería estándar de plantillas (se oye pésimo en español, pero esa es la traducción).  El STL contiene varios contenedores (valga la redundancia) que te permiten hacer diferentes cosas.  Hay contenedores para arreglos dinámicos (vector), colas (queue), heap (heap), listas ligadas (list), árboles (set), pilas (stack), etc.  Claro que cada uno de estos contiene un chorro de algoritmos que facilitan la vida para usarlos, manipularlos, llenarlos y casi cualquier otra cosa que termine con “arlos”, jeje.
En este artículo voy a hablar un poco sobre el uso del contenedor vector (tocayo del memorable malvado de la película “Mi villano favorito”, que aparece en la imagen de este mensaje).  Básicamente es un arreglo dinámico, es decir, un arreglo que puede cambiar de tamaño (uno de los inconvenientes de los arreglos comunes y corrientes).
Usar el contenedor vector tiene muchas ventajas sobre los arreglos, por ejemplo:
  • Los vectores pueden crecer y los arreglos no.
  • Los vectores pueden usar algoritmos programados en el STL.  Los arreglos no.
Aunque no todo es pura dulzura porque hay también algunas desventajas en el uso de vectores:
  • Necesitan más memoria.
  • Cuando los vectores crecen mucho, disminuya el rendimiento.
  • Los vectores no están disponibles en todas las plataformas.

Antes de empezar…

Antes que nada, hay que incluir la librería que contiene al contenedor (valga la redundancia) vector.  Como está en el namespace std, no hace falta incluir el “.h”.
#include <vector>

Declarar un vector

Para declarar un vector, la sintaxis básica es la siguiente:
vector<tipo_de_dato> nombre_de_variable;
Por ejemplo, si quiero declarar un vector de tipo string con nombre inventario, escribo:
vector<string> inventario;
También puedo decirle que comience con 10 elementos en el vector así:
vector<string> inventario(10);
Y si quiero inicializar los 10 elementos con la cadena “Nada”, escribiría:
vector<string> inventario(10,”Nada”);
Finalmente, si quiero inicializar mi vector con el contenido de un arreglo (en este ejemplo, se llama Arr), escribiría:
vector<string> inventario(Arr);

Funciones

Las funciones más usuales de este contenedor son las siguientes:
  • push_back – agrega un elemento al final del vector.
  • size – devuelve el número de elementos que están almacenados en el vector.
  • pop_back – elimina el último elemento del vector.  esto hace que el vector cambie de tamaño (se hace más pequeño).
  • clear – elimina todos los elementos del vector.
  • empty – Devuelve un valor de verdadero si el vector carece de elementos.

Ejemplo que usa el contenedor Vector

Aquí les presento código hecho en Visual C++ 2010.  Es un ejemplo simple que pone en práctica todo lo que escribí con anterioridad.  Si necesitas, aquí puedes descargar un archivo comprimido con todos los archivos y carpetas que conforman la solución.
CódigoVector

Atracciones futuras

Para que puedas trabajar mejor con vectores y que se puedan aprovechar mejor, es importante hablar de iterators (¿iteradores?).  De éstos hablaré en mi próximo post de C++.

Referencias para mayor información

Si quieres saber más, te recomiendo el sitio de GabaWiki sobre STL Vector.  Abajo pongo la referencia a un libro que me ayudó a crear este post.
La imagen de Vector que aparece al principio es cortesía de USA Today.

30 agosto 2011

10 videojuegos más pirateados

PiracySoy fan de los videojuegos.  Para los que me conocen hasta saben que mi tesis de maestría tiene que ver con ellos.  Por eso me llamó mucho la atención un post en el blog de MakeUseOf que quiero compartir con ustedes.  Se trata de los videojuegos más pirateados de todos los tiempos.  Generalmente los juegos más pirateados también son los más vendidos lo cual hace difícil basarse en información de ventas y es por esto que James Bruce (autor del artículo original) se basó en el número de veces que han sido descargados (incluso pone la fecha, misma que yo transcribo, en que obtuvo ese dato).  Así que sin más preludio, ahí va la lista.
  1. Call of Duty: Black Ops4.27 millones de descargas (Noviembre 2010).  Esta no es novedad.  Según mis alumnos (yo no soy muy fan de este género de videojuegos) es el mejor FPS que hay en el mercado.  La calidad de los FPS se basan en comparación con este.  Ya veremos qué mejoras se les ocurre para el 22 de octubre cuando está programado que salga la nueva versión a la venta.
  2. Call of Duty: Modern Warfare4.1 millones de descargas (Noviembre 2009).  Este es muy similar al anterior, solo que fue creado por un estudio diferente y no está tan avanzado (sobre todo en lo que respecta a subir de niveles y los premios).
  3. Battlefield: Bad Company 23.96 millones de descargas (Marzo 2010).  Otro juego de combate, pero enfocado más en la estrategia que en el combate personal como en los FPS (como los dos anteriores).
  4. Mafia 23.55 millones de descargas (Agosto 2010).  Es una mezcla de manejar autos, disparadera y combate cuerpo a cuerpo.  Según los críticos (como Eurogamer y 2KGames) es un juego pésimo.  sin embargo, pese a su fracaso en el mercado, el número de descargas dice que muchos lo juegan.
  5. Mass Efect 2 - 3.24 millones de descargas (Enero 2010).  Es un RPG que te permite explorar un mundo virtual con elementos de un FPS.  La primera versión presentó algunas fallas técnicas, pero ya tenía una narrativa muy interesante.  Esta versión corrige todos esos detalles.  Aunque no lo he jugado, parece un excelente juego.
  6. Sims 33.2 millones de descargas (Junio 2009).  Los Sims han sido uno de los juegos más vendidos y que han marcado época.  Una simulación del mundo real… algo así como un universo paralelo donde el jugador puede vivir una vida alterna en un mundo virtual.
  7. Starcraft 23.12 millones de descargas (Julio 2010).  Es un juego de estrategia fenomenal que construye sobre el juego Starcraft original con mejores gráficos y nuevas funciones y personajes que lo hace bastante adictivo.
  8. Prototype2.35 millones de descargas (Junio 2009).  Es un juego donde el usuario se desenvuelve en un mundo virtual abierto, tipo Grand Theft Auto, con una narrativa intrigante y muchas misiones diferentes y variados.  Puedes manejar tanques y mandar otros carros volando, o también puedes tomar el papel de alguno de los personajes.
  9. Need for Speed: Shift2.1 millones de descargas (Septiembre 2009).  Pese a lo que digan algunos, es uno de los mejores juegos de carreras de autos.
  10. Street Fighter IV – 1.85 millones de descargas (Julio 2009).  En lo personal no me gusta este juego, pero no por eso deja de ser popular.  Es una actualización con mejores gráficos que el juego original Street Fighter que está en todos los changarritos alrededor del país.
Algo que es extraño es que no apareciera Grand Theft Auto 4, pese a que rompió un record Guiness por ser el juego que mayor ingreso ha obtenido en 24 horas después de su lanzamiento en mayo del 2008.  En fin, no se les puede dar gusto a todos…
Nota: esta información es meramente informativa.  De ninguna manera estoy intentando decir que piratear juegos es lo mejor.  En otras palabras, di no a la piratería, jejeje.

28 agosto 2011

Bitmaps y Visual Basic

super-mario-bros-8bitEn mensajes anteriores he hablado de la forma de aprovechar el GDI+ que viene con Visual Basic .net para usar la clase Graphics para dibujar líneas y cuadrados al azar, hacer un especie de Paint chafa y luego lo combinamos con menús para que la interfaz se viera bien.  En esta ocasión haré uso de la clase Bitmap y un PictureBox para crear una superficie que me permita dibujar sobre él mediante código.  Con esto podremos hacer animaciones basados en Sprites, lo cual es la base de todas las animaciones que se hacen en los videojuegos 2D.
Para dibujar mediante el código, se necesitan objetos de la clase Bitmap y Graphics, que puedo declarar de la siguiente manera:
Public superficie As Bitmap
Public disp as Graphics
Luego, suponiendo que tengo un PictureBox llamado PictureBox1, creo los objetos.  Aunque el PictureBox se puede crear a la hora de ejecución, en esta ocasión voy a hacerlo de forma manual (o sea, dibujándolo en la pantalla).  El código se vería así:
superficie = New Bitmap(Me.Size.Width,Me.Size.Height)
PictureBox1.Image = superficie
disp = Graphics.FromImage(superficie)
Con esto ya inicializamos los objetos que necesitamos para seguir.

Cargando un bitmap a la memoria

Para crear un nuevo bitmap (o mapa de bits en español), no hay una función que la cargue de forma automática.  Hay que hacer uso del constructor de la clase de la siguiente manera:
Public bmp As Bitmap
bmp = New Bitmap(“imagen.bmp”)
Aunque se podría declarar y llamar el constructor al mismo tiempo, no lo voy a hacer para tener mayor control sobre el proceso.  El hacerlo en 2 líneas (muy a pesar de que me gusta ahorrar líneas de código) me permite usar un bloque Try…Catch (ya en varios posts he explicado la forma en que nos podemos recuperar de errores con estas instrucciones) para asegurarme que se haya podido cargar a la memoria sin problemas.  El´código quedaría así:
Try 
    bmp = New Bitmap(“imagen.bmp”)
Catch ex As Exception
    MsgBox(“Error al cargar el archivo”)
End Try

Para simplificarnos la vida, sería conveniente hacer una función que cargue un mapa de bits a la memoria y devolviera un objeto Bitmap si lo puede abrir o un Nothing (valor nulo) si no es posible (ya sea que no está el archivo o está dañado o lo que sea).  Una función de este tipo sería como esto:
Public Function CargaBitmap(ByVal NombreArchivo As String)
    Dim bmp As Bitmap
    Try
        bmp = New Bitmap(NombreArchivo)
    Catch ex As Exception
        MsgBox(“Error al cargar el archivo”)
    End Try
End Function
 
Creo que con una función como esta nos simplificamos la vida muchísimo.  Ahora, ¡a continuar con la aventura!

Dibujando un mapa de bits en la ventana

Hay varias versiones de la función Graphics.DrawImage() lo que en términos de la OOP (Programación Orientada a Objetos, por sus siglas en inglés) diríamos que son funciones sobrecargadas.  Independientemente del término rimbombante que le quieras poner, la versión más simple solo recibe las coordenadas horizontales (X), verticales (Y) y el mapa de bits a dibujar.  Por ejemplo, para dibujar un bitmap (suponiendo que estás usando los mismos nombres que he usado para objetos en este post) en la coordenada 15,20 escribiría lo siguiente:
disp.DrawImage(bmp,15,20)
Esta función también acepta otros dos enteros que indican el ancho y alto a los que se mostrará haciendo que la imagen cambie de tamaño (120 pixeles de ancho por 120 de alto):
disp.DrawImage(bmp,15,20,120,120)

Girando y volteando el mapa de bits

Además de cambiar el tamaño, hay otras cuantas maneras de manipular el mapa de bits en tu ventana.  Por ejemplo, se puede girar en 90, 180 y 270 grados y/o voltear tanto de forma horizontal o vertical.  Por ejemplo, si quiero girar un mapa de bits 90o escribiría:
bmp.RotateFlip(RotateFlipType.Rotate90FlipNone)
Para mayores informes sobre la función RotateFlip, qué mejor que preguntarle a Microsoft aquí y si quieres saber todas las opciones de giros, vueltas y revueltas (yo solo puse uno), fíjate en su información acerca de la enumeración RotateFlipType aquí para que seas capaz de hacer todo tipo de malabares con mapas de bits.

Accesando a los pixeles del mapa de bits

También es posible tener acceso a cada pixel del mapa de bits.  Para eso está la función GetPixel() a la que le paso las coordenadas y devuelve un objeto Color con el color que hay en esa posición.  De la misma manera funciona la función (valga la redundancia) SetPixel(), solo que éste último establece un color, lo “pinta” del color que quieres.  Por ejemplo, supongamos que quiero que un mapa de bits se vea como recién sacado de la Matrix (o sea en tono verde), podríamos hacerlo con este código:
For x = 0 To bmp.Width – 1
    For y = 0 To bmp.Height – 1
        Dim ColorActual As Color = bmp.GetPixel(x, y)
        Dim ColorNuevo As Color = Color.FromArgb(0, ColorActual.G, 0)
        bmp.SetPixel(x, y, ColorNuevo)
    Next
Next

Solo una cosa que recordar antes de terminar.  Pese a que Visual Basic 2010 tiene muchas funciones para manipular mapas de bits, tiene sus límites.  No es un programa de diseño ni de dibujo. No se compara al Photoshop ni siquiera al pinchurriento Paint que viene con Windows.  Dicho esto, creo que terminé.

Agradecimientos y referencias

Imagen de Mario en 8 bits cortesía de T&S Web Design.  Y gran parte de lo que escribí aquí, fue asesorado por este libro:

24 agosto 2011

Números aleatorios en C++

numeros-300x290Los números aleatorios son de gran importancia en la programación.  Necesitas números aleatorios para hacer girar unos dados, repartir cartas, posicionar enemigos en la pantalla y tal vez hasta controlar sus movimientos.  Sin embargo, crear un algoritmo para generar números aleatorios es todo un problema porque, ¿quién sabe cómo le hace para pensar en un número al azar?  ¿Acaso sigue algunos pasos?  No, es un proceso mental fácil de realizar, pero que no lleva algún procedimiento preciso y esto hace que sea casi imposible hacerlo en la computadora.  Lo más cercano es una función matemática que calcula números al azar.  Aquí voy a presentar un ejemplo que puede ser útil para generar números aleatorios usando funciones de C++.

Antes de empezar de lleno, honor a quien honor merece.  Este ejemplo y parte de la explicación es una traducción/adaptación de un artículo que leí en la página de daniweb.com, escrito por un tal Bob (¿acaso será el constructor?  Bueno, mal chiste…).  Voy a ir explicando funciones, constantes y una que otra monería y al final viene un programa que ejemplifica su uso.

La funciones que se necesitan para generar números al azar se encuentran en la librería cstdlib, así que hay que incluirlo al principio del código.  Para generar el número aleatorio se hace uso de la función rand, misma que genera un número al azar entre 0 y la constante RAND_MAX (que vale generalmente 32,767 pero puede variar según el compilador de C++ que estés usando).

rand funciona de maravilla, pero el problema es que cada vez que ejecutes el programa, te va a mostrar exactamente la misma secuencia de números, lo cual puede resultar interesante la primera vez, pero pierde chiste en las ejecuciones subsecuentes del programa.  Para remediar esto, se puede inicializar el generador de números aleatorios con la función srand, misma que recibe un número entero que inicia el pseudogenerador de números aleatorios.  Pero si cada vez lo inicializas con el mismo entero, el problema no se quita: sigues generando la misma serie de números.  Lo mejor es usar el reloj del sistema para que te dé la hora actual, lo conviertes a entero y así cada vez es diferente.  Para eso usamos la función time que está en la librería ctime.

Una vez resuelto el problema de generar una secuencia de números aleatorios únicos, ahora hay que abordar la manera de generar números en un cierto rango.  La fórmula para hacerlo sería la siguiente:

numero_aleatorio=rango_inferior+int(rango*rand()/(RAND_MAX+1.0))

donde rango_inferior es el valor mínimo del rango del que se desea un número y rango es la diferencia entre el valor mayor y el menor.  Por ejemplo, si quiero generar un número aleatorio entre 6 y 15 y guardarlo en un entero que declaré con el nombre de X, la instrucción sería:

X=6+int((15-6)*rand()/(RAND_MAX+1.0))

Creo que con esta explicación ya puedes generar los números aleatorios que necesites para cualquier aplicación.  Aquí les dejo el código fuente de un programa que ejemplifica todo lo anterior.  ¡Hasta la próxima!

(Imagen de los números aleatorios cortesía del blog “La aventura de las matemáticas”)

aleatorio.cpp

13 agosto 2011

Fotos del semestre Enero-Junio 2011

Tarde, pero sin sueño.  Les dejo las fotos que nos tomamos en la última semana de clases el semestre pasado.  Les agradezco a todos por aguantarme y por dejar que me divierta en el aula.
Hagan clic sobre cada foto para verla grande y con mejor resolución.
2do semestre, grupo B, técnico Comunicación (2B TCM) Materia: TICs II
2B TCM 0     2B TCM
2do semestre, grupo C, técnico Comunicación (2C TCM) Materia: TICs II
2C TCM
2do semestre, técnico Programador (2 TPO) Materia: Software de Aplicación
2 TPO
4to semestre, técnico Programador (4 TPO) Materia: Bases de Datos y Lenguaje C
4 TPO
6to semestre, técnico Informática Administrativa (6 TIA) Materia: Aplicaciones para Internet
6 TIA     6 TIA 0
6to semestre, técnico Programador (6 TPO) Materia: TICs II
6 TPO

12 agosto 2011

Historia de los Sistemas Operativos

Hoy me topé con esta infografía que me pareció padrísimo para explicar como han cambiado los sistemas operativos de las computadoras.  Aquí se los comparto (haz clic sobre la imagen para verlo en su tamaño real).  Es cortesía del blog conecti.ca, quien a su vez lo tomó del blog de MakeUseOf.
muo-history-operating-systems

02 agosto 2011

Presentación de Videojuegos y Educación en la Univa

videojuegosparatodosAunque es un poco tarde para contarles, estaré presentando algunos resultados de mi tesis de maestría en la preparatoria Univa el día de hoy (2/Ago/2011) alrededor de la 1pm (el coloquio de investigación comienza a las 12pm, pero soy el último).  Si puedes, allí te espero.

No es mi examen recepcional (aún) y va más enfocada a la educación que a la comunicación (cosa que reservo para mi titulación del a maestría).  Seguramente volarán muchas piedras… espero que no te caiga ninguno.

¡Allá los espero!

También les dejo hasta abajo el Prezi que voy a usar, por si lo quieren ver.  Claro que falta todo el choro que voy a decir en el coloquio, pero te puede dar una idea de lo que voy a hablar.

(Imagen cortesía de CinismoIlustrado).

El Tony y sus ondas...

Related Posts Plugin for WordPress, Blogger...