Archivo del sitio

HexTraductor

HexTraductor

Blogged with the Flock Browser

Documentación de Pygame en español

Documentación de Pygame en español

Blogged with the Flock Browser

Conceptos Básicos para el Desarrollo de Videojuegos 2D [Losersjuegos]

Conceptos Básicos para el Desarrollo de Videojuegos 2D [Losersjuegos]

Conceptos Básicos para el Desarrollo de Videojuegos 2D

Créditos

  • Autor: Roberto Albornoz Figueroa (RCAF)
  • Fecha: 10 de Enero del 2007

Introducción

Una de las razones para comenzar a desarrollar primero videojuegos 2D, es que los conceptos involucrados son mucho más simples y fáciles de asimilar.

Además lo más probable es que varios de estos conceptos ya sean conocidos por quienes lleven un tiempo programando o trabajando con computadores.

Otra ventaja, es que obtendremos resultados más rápidos, a diferencia del desarrollo de videojuegos 3D, que involucra conocer tópicos más avanzados de matemáticas y de programación. Pero tampoco hay que asustarse, si queremos luego dar el próximo paso a las 3D, ya que hay que recordar siempre que todo lo podemos estudiar y aprender, nada es imposible.

En las próximas páginas conoceremos la terminología básica, que nos hará comprender de mejor forma los conceptos gráficos involucrados en un videojuego.

Conceptos básicos

Partiremos hablando del dispositivo externo más común y que todos ya conocemos, el Monitor. Este dispositivo de salida es uno de los más importantes que posee nuestro computador, ya que nos permite visualizar la información con la que estamos trabajando.

monitor.jpg

El monitor se conecta al computador a través de una Tarjeta de video. Esta tarjeta es un circuito integrado que nos permite transformar las señales digitales con las que trabaja, en señales análogas para que puedan ser visualizadas en el monitor. Este proceso es realizado a través de un conversor analógico-digital que toma la información que se encuentra en la memoria de video y luego la lleva al monitor. Este conversor se conoce como RAMDAC (Random Access Memory Digital Analog Converter).

targeta_video.jpg

La superficie de la pantalla de un monitor es fluorescente y esta compuesta por líneas horizontales. El hardware del monitor actualiza de arriba hacia abajo cada una de estas líneas. Para dibujar una imagen completa el monitor lo hace a una cierta velocidad, a esto se le conoce como Frecuencia de refrescado y se mide en Hz. Los valores frecuentes son de 60/70 Hz, incluso frecuencias mayores. Es preferible que supere los 70 Hz para que la vista no se canse tanto y no aparezcan los molestos parpadeos (flickering). El valor de la frecuencia depende de la resolución usada.

El tiempo que existe entre dos refrescos de pantalla se conoce como Vertical retrace, y corresponde al momento en que el haz de electrones del monitor regresa a la parte superior de la pantalla.

El concepto más básico usado en la programación gráfica es el de Pixel, significa Picture Element, es decir, un elemento de una imagen que corresponde a la unidad mínima que esta puede contener. También lo podríamos definir como un simple punto que es parte de una imagen determinada, que podemos mostrar en pantalla y que tiene asociado un color.

Composición de una imagen.

Esta imagen que está formada por un arreglo ordenado de pixeles en forma de grilla o cuadricula, se conoce con el nombre de Bitmap. Un bitmap posee dimensiones: ancho y alto (que se miden en número de pixeles) y además tiene asociado un formato, que puede ser alguno de los ya conocidos: bmp, png, jpg, gif, etc.

La diferencia entre formatos gráficos, viene dada por algunos parámetros que esperamos tener, como la calidad o tamaño del archivo. Por ejemplo si queremos mantener un equilibrio en tamaño/calidad, un formato que se ajusta a estos parámetros son los formatos jpg o png, no así el formato bmp, que casi no posee ningún tipo de compresión.

Una imagen tiene otras características, aparte de sus dimensiones, una de estas es la Profundidad de color. Esto corresponde al número de bits necesarios para poder representar un color, es conocido por las siglas BPP (Bits Per Pixel).

El número de bits que podemos utilizar es de 1, 8, 16, 24 o 32. Con este dato podemos saber cual será el número máximo de colores que puede representar una imagen en pantalla. El número de combinaciones se calcula mediante la siguiente fórmula:

Cantidad de Colores = 2bpp

Ahora podemos resumir en una tabla cada una de estas combinaciones:

Número de bits Cantidad de colores Nombre
1 2 Monocromo
8 256 Indexado
16 65.536 Color de alta densidad (High Color)
24 16.777.216 Color real (True Color)
32 4.294.967.296 Color real (True Color)

El color se representa en pantalla utilizando el Modelo RGB (Red, Green, Blue), es decir, para formar un color necesitamos conocer la intensidad de estos colores primarios. Cada una de estas intensidades corresponde a un número que se encuentra en el rango: 0 a 255.

Cuando se utilizan 8 bits para mostrar un pixel, como ya sabemos, tenemos como máximo 256 colores, pero no se representan directamente utilizando las intensidades RGB, sino que se mantiene una Paleta o Colormap (un arreglo de tamaño igual a 256 bytes), donde cada posición apunta a un color con las 3 componentes (Rojo, Verde, Azul). Esta paleta puede ser modificada para implementar algunos efectos, ya que si cambiamos por ejemplo las componentes de un color, se verán modificados inmediatamente todos los pixeles que hagan referencia a dicho color. El modo de 8 bits, se conoce también como Modo indexado y ofrece un alto rendimiento, pero como ya sabemos con la desventaja de tener pocos colores disponibles.

Para profundidades más altas, esta paleta ya no existe, y esto nos permite tener un abanico más grande de colores. En la actualidad ya no usamos modos de video a 8 bits, normalmente usaremos 16 o 32, siendo el modo de 32 bits el más eficiente, ya que los procesadores de 32 bits trabajan con datos empaquetados en bloques de 4 bytes.

Todas las componentes que forman un color se empaquetan en un entero, donde se asigna una cantidad fija de bits para cada una de ellas.

El orden en que se empaquetan las componentes de un color, depende de la arquitectura en la que se esté trabajando, podemos usar el formato RGB (Big Endian) o BGR (Little Endian).

En arquitecturas x86 (Windows, Linux) se usa el formato Little Endian (el byte de menor peso se almacena en la dirección más baja de memoria y el byte de mayor peso en la más alta) y en PowerPC (Mac), Big Endian (el byte de mayor peso se almacena en la dirección más baja de memoria y el byte de menor peso en la dirección más alta).

La cantidad de bits usada para cada componente de un pixel, la podemos ver resumida en la siguiente tabla:

8 bits 16 bits 24 bits 32 bits
1:5:5:5 8:8:8 8:8:8:8
Se utiliza una paleta, donde cada posición apunta a un color que posee las intensidades RGB. El primer bit indica la transparencia, si es 0, la transparencia será total, si es 1 habrá opacidad total. 8 bits para cada corresponde al canal componente RGB El primer byte 8 bits para cada corresponde al canal componente RGB alpha (componente que almacena el grado de transparencia). Los últimos 3 bytes son las componentes RGB del color.
5:6:5
5 bits para componente Red, 6 bits para componente Green, 5 bits para componente Blue

Anteriormente mencionamos que una imagen tiene dimensiones y a esta dimensión (ancho y alto) también se le conoce como Resolución. La resolución nos permite conocer cuanto detalle existe en una imagen, esto quiere decir que a mayor resolución obtendremos mayor calidad. La resolución no solo se aplica a una imagen, sino que también a la pantalla o monitor. Existen algunas resoluciones estándar:

  • 320×200
  • 320×240
  • 640×480
  • 800×600
  • 1024×768
  • 1152×864
  • 1280×720
  • Etc.

El Modo de video es la unión de la resolución con la profundidad de color y se denota como AnchoxAltoxBpp.

Por ejemplo podríamos trabajar con los siguientes modos de video:

  • 640x480x8 (640 pixeles de ancho x 480 pixeles de alto a 8 bits por pixel)
  • 640x480x16 (640 pixeles de ancho x 480 pixeles de alto a 16 bits por pixel)
  • 800x600x32 (800 pixeles de ancho x 600 pixeles de alto a 32 bits por pixel)
  • Etc.

La elección de un modo de video u otro, es un factor importante a la hora de comenzar a desarrollar un videojuego, ya que con estos datos sabremos cual será el flujo de información (medido en bytes) que existirá. Además las imágenes que se muestren en pantalla deberán tener algún tamaño determinado, que debe ajustarse a la resolución elegida.

Por ejemplo supongamos que estamos trabajando con el siguiente modo de video, 800x600x32 y queremos conocer cuando memoria ocupa una imagen con las mismas dimensiones que la resolución seleccionada, entonces el tamaño que ocupará será de:

Tamaño = 800 x 600 x 4 = 1.920.000 bytes = 1.83 Mb

Multiplicamos por 4, ya que 32/8 = 4 bytes, es decir para mostrar un solo color en pantalla o píxel necesitamos 4 bytes.

El resultado anterior no es un tamaño despreciable, imaginemos el tamaño que podríamos obtener a resoluciones mayores.

En los primeros juegos que aparecieron para PC, se utilizaban resoluciones muy bajas como 320×200 (también conocido como modo 13h) o 320×240 (modo x) y a 8 bits por píxel, o sea como ya sabemos disponíamos de un máximo de 256 colores.

A medida que pasaron los años se empezaron a utilizar resoluciones de 640×480 o 800×600 y a profundidades de color más altas, de 16 o 32 bits, todo esto gracias a que aumentaron las capacidades de las tarjetas de video.

Hoy en día, en la mayoría de los juegos tenemos la posibilidad de elegir el modo de video que mejor se adapte a nuestro equipo. Existen algunos casos típicos, como cuando queremos tener el mejor rendimiento en nuestro videojuego, bajamos la resolución al mínimo o a una resolución intermedia. Al contrario, cuando disponemos de un buen equipo y una buena tarjeta de video, lo más probable es que seleccionemos un modo de video más alto, para disfrutar de unos gráficos de mejor calidad.

Otro concepto importantísimo es el de Video RAM, básicamente es la memoria o buffer que se encuentra en la tarjeta de video. Toda tarjeta de video tiene como mínimo una memoria, un microprocesador, una caché y un bus de datos, que normalmente es AGP.

En la Video RAM se almacenan los datos que serán mostrados posteriormente en la pantalla, estos datos pueden ser texturas, vértices, etc.

Para el desarrollo de videojuegos 2D, esto se simplifica ya que solo tendremos en la memoria cada uno de los píxeles que forman la imagen.

En el caso de juegos 3D, en la memoria se pueden almacenar algunas rutinas o procedimientos que ejecutan algunas instrucciones para generar normalmente algún efecto, a estas rutinas se les conoce como Shaders.

Además, el microprocesador también conocido como GPU (Graphics Processing Unit), se comunica con la memoria a través de un bus interno, ejecuta instrucciones y actualiza el caché de instrucciones, de texturas y geometría. El proceso de llenar la memoria de video con datos se hace posible a la existencia de la GPU, el cual lo hace a través de un bus de puerto acelerado, conocido como AGP. Después el monitor lee periódicamente desde el buffer de video (Video RAM) los datos y refresca la pantalla, lo que nos permite ver una imagen en el monitor. No importa la velocidad con que se modifiquen los datos del buffer, el monitor no actualizará nada hasta el próximo refresco.

Técnicas 2D

Ahora continuaremos viendo otros conceptos, que llamaremos técnicas 2D. Estos términos son aplicados básicamente al desarrollo de aplicaciones 2D y algunos son la base para las 3D.

Sprites

Un sprite es cualquier objeto que aparece en nuestro videojuego. Normalmente tiene asociado algunos atributos, siendo los más básicos una imagen y una posición.

donkey_dance.jpg

Los sprites pueden ser estáticos o dinámicos. Al hablar de sprite estático, nos referimos a un objeto que no cambiará su posición durante el videojuego, por ejemplo la imagen de una llama, piedra, etc. En cambio un sprite dinámico, es aquel que tendrá algún tipo de movimiento, el cual puede ser realizado por el usuario o por el computador, por ejemplo el sprite de un jugador o de los enemigos.

Representar un sprite en memoria puede ser realizado de muchísimas formas, y puede depender mucho del gusto del programador y su experiencia. Normalmente se almacenan sus atributos en una estructura o clase.

Animación de Sprites

Esto es bastante simple, aquí aparece el concepto de frame o cuadro, que corresponde a una de las imágenes que forman la animación completa de un sprite. Podemos pensar en una secuencia de imágenes que son dibujadas rápidamente, que engañan al ojo humano dando el efecto de un movimiento fluido. Es el mismo método que se utiliza para los dibujos animados.

Secuencia de imagenes que componen una animación

El número de frames dibujados en un periodo de tiempo se conoce como frame rate (tasa de frames), siendo un aspecto muy importante en la animación, ya que de esto depende la calidad de animación que obtendremos. Si cada uno de los frames se muestra muy rápido o muy lento, la ilusión del movimiento se perderá y el usuario verá cada uno de los frames como una imagen separada.

Una animación muy común puede ser la de un personaje caminando, saltando, o realizando cualquier otra acción.

Esto también debe ser representado de alguna forma inteligente en nuestro videojuego, utilizando algún tipo de estructura de datos adecuada, como un vector o lista.

Normalmente el sprite tendrá como atributo una lista de animaciones (las acciones del personaje, enemigo, etc.), donde cada animación corresponderá a otra lista con cada uno de los frames.

La totalidad de los frames que forman un personaje, suele almacenarse en un solo archivo de imagen, a esto se le llama sprite sheet, es decir, una imagen donde tenemos secuencias de frames para las diferentes acciones que puede realizar un personaje en un videojuego. La siguiente imagen lo ilustra claramente.

Sprite Sheet

Transparencias: Color Keys

Cuando mostramos una imagen en pantalla, esta siempre se verá como un cuadrado o rectángulo, pero sabemos que dentro tiene la representación de un objeto, personaje, enemigo, ítem, etc. Al dibujar esta imagen queremos ver solo la forma que representa, para esto debemos elegir algún color transparente, pintar con ese color las zonas que no queremos que aparezcan y luego dibujar la imagen ignorando dicho color.

Normalmente se utiliza el color magenta (255, 0, 255), como color de transparencia, ya que es poco probable que se encuentre en una imagen.

Dependiendo de la API gráfica que utilicemos para desarrollar nuestro videojuego, tendremos una función que realice esta tarea, la de descartar un color determinado al dibujar la imagen.

sprite_sheet.jpg

Pero no solo usar un color como el magenta es la solución para no ver una imagen en su forma original, también podemos hacer uso de las propiedades del formato gráfico PNG (Portable Network Graphics), ya que este formato guarda un canal alpha con las partes transparentes de la imagen.

Transparencias: Máscara

Existe otro método para ignorar un color en una imagen, el uso de una máscara que se antepone al bitmap original, es decir, debemos tener otro bitmap que indica cuales son los pixeles transparentes. El color que indica la transparencia es el negro, y el color blanco la figura que queremos mostrar. Por lo tanto, al dibujar la imagen, recorreremos cada pixel de la máscara, y si este color es blanco, mostraremos el pixel del bitmap original que se encuentra en esa posición.

donkey_mascara.jpg

Transformaciones

Cuando dibujamos un sprite en pantalla, tenemos la posibilidad de aplicar algunas transformaciones, las más usadas son las siguientes:

Transformaciones: Translation

Esta es la transformación más simple, corresponde a cambiar la posición del sprite para luego dibujarla en otro lugar de la pantalla, dando el efecto de movimiento, sin duda lo más usado en cualquier videojuego. Y se resume en asignar una nueva posición a las coordenadas (x, y) del sprite.

Por ejemplo si las variables x e y son las coordenadas de la esquina superior izquierda del sprite, y vx, vy las velocidades en cada eje, con una simple suma en cada componente cambiaremos la posición del sprite.

x = x + vx;
y = y + vy;

Transformaciones: Rotation

Otra transformación típica, que consiste en girar el sprite un número determinado de grados. Se usa para mostrar objetos vistos desde otro ángulo, por ejemplo en el videojuego Micro Machines, cuando doblamos cambiamos el ángulo del auto y luego este cambio lo vemos reflejado en la pantalla gracias a la rotación.

También lo podríamos usar para realizar efectos para una presentación, efectos durante el videojuego, etc. Además al rotar una imagen debemos saber con respecto a que punto lo haremos (pivote), por ejemplo en la siguiente imagen realizamos unas rotaciones con respecto al centro de la imagen.

Transformaciones: Scaling

Otra transformación muy usada en algunos videojuegos, consiste en escalar una imagen, es decir, cambiar su tamaño (normalmente de forma proporcional), ya sea un aumento o una disminución. Se puede usar para dar un efecto de profundidad, es decir, si el objeto está más alejado de nosotros lo dibujaremos más pequeño, en cambio si está muy cerca de nosotros, lo dibujaremos de un tamaño más grande.

Suele usarse también en conjunto con la rotación para realizar algunos efectos.

Al utilizar esta transformación, hablamos de scale factor, es decir, un valor que indica el porcentaje de escalado, donde el valor 1 corresponde al tamaño normal.

donkey_scaling.jpg

En la imagen anterior nos damos cuenta que al aumentar su tamaño, se produce un efecto no deseado en los bordes de la imagen, conocido como aliasing, es decir, las líneas o curvas que forman los bordes de la imagen se ven discontinuas (en forma de escalera). Para esto existe una solución, el antialiasing, una técnica que permite suavizar todos los bordes y así disminuir el efecto de escalera. En toda API gráfica encontraremos una función que realice esta tarea.

antialiasing.jpg

Transformaciones: Flipping

El flipping es un tipo de transformación especial para realizar algunos efectos.

Básicamente existen dos tipos, Vertical Flip que corresponde al efecto que se produce cuando se refleja un objeto en el agua y Horizontal Flip que corresponde al reflejo de un objeto en un espejo. Con la siguiente imagen quedará mucho más claro.

donkey_flipping.jpg

Alpha blending

Alpha blending o mezclado alpha es una técnica para crear transparencias en una imagen con respecto al fondo. Para lograr esto se agrega un cuarto canal a un color, llamado canal alpha.

Ahora los colores de una imagen se representarán como RGBA. Cada valor alfa de un pixel representa su grado de opacidad, donde un valor cero indica un 100% de transparencia, y a medida que aumentamos su valor se irá haciendo más opaco. El rango va desde 0 a 255.

Para crear un canal alpha en una imagen, tenemos dos opciones, una es almacenar esta información con algún software de edición de imágenes (Photoshop) y en un formato apropiado. (PNG, Portable Network Graphics), o hacerlo posteriormente en el mismo videojuego, utilizando alguna función de la API que nos permita setear un grado de transparencia para la imagen.

El funcionamiento de esta técnica es relativamente simple, ya que se realiza una media ponderada de cada pixel que forma la imagen y los pixeles que conforman el fondo.

Por ejemplo supongamos que tenemos un color de una imagen, el (100, 40, 50) con un valor alfa de 90, y dibujaremos este pixel sobre otro con el valor (70, 100, 80). Con estos datos el pixel resultante tomara un 35% del primer color y un 65% del segundo.

Entonces, multiplicaremos cada componente del pixel por el porcentaje que le corresponde y luego sumaremos cada unas de las componentes, obteniendo así el pixel resultante.

  • Pixel1: (100, 40, 50) / *0.35
  • Pixel2: (70, 100, 80) / *0.65
  • Pixel resultante: (100*0.35+70*0.65, 40*0.35+100*0.65, 50*0.35+80*0.65) = (81, 79, 70)

El cálculo anterior se debe hacer para cada pixel que forma la imagen, lo cual afecta al rendimiento, pero hoy en día todas las tarjetas de video realizan este tipo de operaciones vía hardware.

donkey_alpha_blending.jpg

Esta técnica se puede aplicar a un bitmap completo o solo a un grupo de pixeles de la imagen. Es utilizado para hacer una variedad de efectos en videojuegos, por ejemplo puede usarse para dar un carácter de fantasma a cierto personaje, para hacer un menú transparente, escribir texto sobre un rectángulo transparente, etc.

Screen Buffer

El screen buffer es simplemente un área de la memoria de video, donde podemos dibujar algo que se mostrará en la pantalla. Si queremos mostrar un pixel, debemos tener un puntero a la dirección de memoria de video y calcular la posición (offset, desplazamiento) donde queremos dibujar el pixel y luego en esa posición copiar el byte o los bytes que representan el color.

Supongamos que estamos trabajando en el siguiente modo de video: 640x480x24, es decir, tenemos 640 pixeles de ancho, 480 pixeles de alto, y cada pixel ocupa 3 bytes, entonces:

int color;      // Aca almacenamos el color del pixel
int * buffer;   // Screen buffer
int x, y;       // Coordenadas del punto
 
// Calculamos el desplazamiento
int desp = y * 640 + x * 3;
 
// Colocamos un pixel en la posicion (x, y)
buffer[desp] = color;

En el ejemplo anterior no mostramos como se calcula el valor numérico del color, para hacerlo hay que hacer uso de operaciones a nivel de bits y desplazamientos, y esto depende de la profundidad de bits que se este usando. Supongamos que el color tiene la siguientes componentes (200, 150, 60) y estamos trabajando a 24 bits. Si recordamos la tabla de componentes RGB, para 24 bits tenemos que cada componente ocupa 8 bits, así que el cálculo es el siguiente:

int r = 200;
int g = 150;
int b = 60;
 
Color = (r << 16) | (g << 8) | b;

Es decir, gracias a los desplazamientos colocamos la componente en su posición correcta y luego sumamos todos estos valores con el operador OR a nivel de bits.

Para calcular la posición de memoria donde debe colocarse el pixel, la posición “y” es multiplicada por el ancho en pixeles de la resolución elegida, es decir, con esto nos movemos “y” líneas por la pantalla, luego en esa posición debemos movernos unos ciertos bytes hasta llegar a la posición “x” que buscamos. Para eso sumamos la posición de la coordenada “x” multiplicada por el tamaño del pixel en bytes, en este caso como estamos usando una profundidad de color de 24 bits, se debe multiplicar por 3. Luego asignamos el color al buffer justo en la posición que calculamos anteriormente.

En general esta es la forma elemental para dibujar un pixel en pantalla. Para dibujar una imagen completa debemos recorrer cada punto de la imagen, calcular la posición y asignar el color a dicha posición. Para nuestra suerte, todas las APIs gráficas traen funciones para crear un color, como lo hicimos anteriormente, y funciones para dibujar una imagen completa en pantalla.

Surface

Este término es la base de la programación 2D. Básicamente es una zona de memoria que puede estar en la RAM o Video RAM y es usada para almacenar un bitmap. Si queremos ver esto en el ámbito de la programación, una Surface es una estructura o clase que tiene como mínimo las misma propiedades de un archivo de imagen, es decir, tendrá un arreglo lineal de datos que contiene cada uno de los pixeles que forma la imagen y además el ancho y alto del bitmap. Dependiendo de la biblioteca gráfica que se use, pueden existir más atributos.

Una Surface se podría confundir con el concepto de Sprite, pero en general un Sprite tiene como atributo al menos una Surface.

Blitting

El blitting es una operación para transferir un bloque de bytes (surface) de un sector de la memoria a otra. Viene del termino Blit (Block Image Transfer, Transferencia de Imagen por Bloque) y es una forma de renderizar (dibujar) sprites con o sin transparencias sobre un fondo. Esta técnica puede ser acelerada por hardware, lo cual ayuda a incrementar bastante el rendimiento, de hecho esta operación es una de las más críticas en cualquier videojuego y es la que más usaremos.

Gracias al blitting podemos armar una escena en un videojuego, por ejemplo en la siguiente imagen vemos que a partir de dos superficies, una con los sprites de los personajes y otra con un fondo, armamos a través de blits una tercera superficie que contiene la escena final.

No se ha encontrado nada.

En una operación de blitting, podemos especificar en que posición de la superficie destino queremos copiar la superficie origen, incluso que parte de la superficie origen queremos copiar. De esta forma podemos colocar en cualquier posición, superficies dentro de otras. La forma de especificar las superficies origen/destino y sus posiciones, depende de la API gráfica que se esté utilizando. Siempre se nos proveerá de una función de blitting, ya que todas las bibliotecas disponen de al menos una.

Double Buffering

Para entender esta técnica, antes que todo debemos saber que el monitor ya sea CRT (Tubo de rayos catódicos) o LCD (Pantalla de cristal líquido), no dibuja la imagen en la pantalla instantáneamente, sino que lo hace pixel a pixel, partiendo desde la esquina superior izquierda hasta la esquina inferior derecha. Esto se realiza a una velocidad bastante rápida que el ojo humano no percibe, y a este tiempo, como vimos al principio, se le conoce como frecuencia de refrescado.

Cuando queremos mostrar una imagen en la pantalla, como ya sabemos colocamos los pixeles de la imagen en la memoria de video y durante el tiempo de refrescado el monitor leerá la información que hay en la Video RAM y la mostrará en la pantalla.

Ahora imaginemos que queremos mover un objeto por la pantalla, los pasos son simples, primero dibujamos la imagen en una posición, luego la borramos, y la dibujamos en la nueva posición, pero aquí aparecen algunos problemas, si a la mitad del refrescado cambiamos la imagen en la memoria de video, el monitor ahora obtendrá otra información de la imagen y probablemente la parte superior e inferior de la imagen no correspondan, es decir, veremos imágenes superpuestas y además un molesto parpadeo. Una posible solución a esto, es esperar a que el monitor termine de refrescar la pantalla, para luego escribir en la Video RAM la nueva imagen. La mayoría de las APIs gráficas disponen de alguna función que espera el refrescado del monitor, evitando así el parpadeo y la superposición de imágenes, pero no del todo.

Para evitar totalmente el parpadeo, usamos esta técnica llamada Double Buffering, que consiste en tener dos áreas de memoria en la RAM (o Video RAM). Una de estas zonas se conoce como front-buffer, y corresponde a la que se muestra actualmente en pantalla y también tenemos el back-buffer, que es donde dibujamos los objetos que formarán la escena final. Estas áreas de memoria deben tener las mismas dimensiones del modo de video seleccionado.

Ahora tenemos dos opciones para esta técnica. Si el back-buffer se encuentre en la RAM, deberemos copiar todo el contenido al front-buffer, es decir, a la memoria de video para que veamos los cambios en el monitor. Para esto realizaremos un proceso de blitting, que dependiendo del modo de video usado, puede ser un poco costoso.

La otra posibilidad es que el back-buffer también se encuentre en la Video RAM, de ser así, no tendremos que realizar un blitting, sino que haremos algo más simple, intercambiaremos estas dos zonas de memoria, lo cual tiene un costo bastante bajo. A este proceso de intercambio del back-buffer con el front-buffer, se le conoce con el nombre de Page Flipping, y es lo que se suele usar hoy en día, ya que disponemos de más RAM en las tarjetas de video. Además la función de Page Flipping, está implementada en todas las APIs gráficas, así que solo deberemos llamarla en el momento adecuado.

Dirty Rectangles

Esta técnica es una forma de optimizar la anterior. Con Double Buffering constantemente estamos volcando el contenido completo de una zona de memoria a otra, pero puede haber ocasiones donde no este sucediendo ningún cambio en pantalla, o tal vez solo haya cambiado una pequeña parte de esta. Es aquí donde aparece la técnica, Dirty Rectangles (rectángulos sucios) y su funcionamiento es bastante simple. Copiaremos a la Video RAM solo las áreas de la pantalla que han cambiado, por lo tanto, cada vez que algún sprite cambie su posición, copiaremos a la memoria de video el área de un rectángulo que rodee al sprite (incluyendo el área donde se encontraba antes) y la colocaremos justo en las mismas coordenadas en la Video RAM. Pero no siempre es recomendable utilizar esta técnica, ya que podemos tener demasiados sprites moviéndose por la pantalla, y ya no sería óptimo estar copiando cada rectángulo a la Video RAM, ya que sería lo mismo que copiar la pantalla completa, en un caso así conviene solo usar la técnica Double Buffering.

Clipping

El clipping es un técnica bien sencilla, consiste en definir una área de recorte para la pantalla, es decir, todo lo que se dibuje fuera de esta área será ignorado y no se mostrará en pantalla. Normalmente esta área de recorte coincide con la resolución elegida para el videojuego, pero puede ser cualquier otra.

Sistema de coordenadas 2D

Es importante saber que cuando dibujamos algo en pantalla, siempre tendremos que informar la posición en la cual dibujaremos el objeto. Por defecto la posición de un objeto se encuentra en la esquina superior izquierda, pero algunos prefieren usar como punto de anclaje el centro, y en general puede ser cualquier otro punto. Calcular el centro del punto es tan simple como sumar a la posición x, la mitad del ancho del objeto y a la posición y, la mitad de la altura del objeto.

Nosotros estamos acostumbrados a trabajar en el cuadrante I del plano cartesiano, donde las coordenadas del eje “x” crecen hacia la derecha y las coordenadas del eje “y” crecen hacia arriba, pero al trabajar con gráficos en el computador, esto es relativamente distinto, ya que el eje y se invierte, es decir, ahora el mundo está al revés, las coordenadas en el eje “y” crecerán hacia abajo.

En la siguiente imagen podemos ver el plano cartesiano en su forma normal versus el plano cartesiano utilizado en la programación gráfica.

Sincronización en los videojuegos

Lo ideal en cualquier videojuego, es que todos los objetos se muevan a la misma velocidad, independiente de la velocidad del computador donde se ejecute. Si no nos preocupamos por esto, y ejecutamos nuestro videojuego en un computador antiguo, por ejemplo, en un Pentium de 100 Mhz, probablemente el videojuego se vea muy lento, en cambio si lo ejecutamos en un computador con un procesador de última generación, un Pentium IV a 2.4 Ghz, se verá tan rápido que será imposible jugar.

Para solucionar este problema, disponemos de dos métodos.

Sincronización por Framerate

El primer método, consiste en sincronizar el framerate, también conocido como FPS o Frames per Second (Frames por segundo). Al hablar de FPS, nos referimos a la frecuencia con que se ejecuta el ciclo principal de un videojuego en un segundo. A mayor cantidad de FPS obtendremos una mayor fluidez en las animaciones.

En el cine se considera que una velocidad de 24 FPS es suficiente para que el ojo humano perciba una animación fluida, pero en los videojuegos esta cantidad es demasiado baja. Valores adecuados son sobre 60 o 100 FPS.

El método es bastante sencillo, y lo primero que debemos hacer cuando comienza el ciclo del videojuego, es obtener el tiempo transcurrido hasta ese momento, que normalmente se mide en milisegundos. Luego procesamos lo relacionado al videojuego, ya sea entrada, IA, lógica del juego, detección de colisiones, dibujo de gráficos, etc. y antes de terminar el ciclo, creamos otro loop en el cual vamos obteniendo el tiempo transcurrido hasta ese momento, calculamos la diferencia de tiempo y verificamos si es menor a los FPS que buscamos. De esta forma cada vez que ejecutemos el programa en una máquina diferente, el programa esperará el tiempo adecuado para obtener los FPS.

Utilizando este método, en computadores más rápidos se verá más fluido, pero si lo ejecutamos en una máquina con un procesador mucho más antiguo del que usamos para desarrollarlo, lo más probable es que se vea bastante lento.

Claro, no todo podía ser perfecto, pero es por eso que los videojuegos piden algunos requerimientos mínimos.

Ahora veamos el código para este método de sincronización:

int t1, t2;     // Almacena los tiempos inicial y final
int fps = 100;
 
while (! salir)
{
    t1 = GetTime(); // Obtenemos tiempo inicial
 
    // Hacemos algo ...
 
    do
    {
        t2 = GetTime(); // Obtenemos tiempo final
    } while ((t2 - t1) <= 1000/fps);
 
    // Si llegamos a este punto es porque ya paso el tiempo de espera
    // para que se cumpla el tiempo esperado
}

Sincronización por Tiempo

El segundo método consiste en sincronizar en base al tiempo. En este método no importa el framerate que posea el videojuego, pero aun así los objetos se moverán a la misma velocidad en todas las máquinas.

Básicamente, lo que debemos hacer es calcular la posición de un objeto de una forma distinta, en el método anterior si queríamos mover un objeto 5 pixeles por frame haríamos lo siguiente:

x = x + 5;

Y para mantener siempre la misma velocidad en varios equipos, esperaríamos un tiempo determinado al final del ciclo del videojuego.

Lo que haremos ahora será obtener el tiempo que ha transcurrido hasta el momento de calcular la nueva posición del objeto, y multiplicar ese tiempo por la velocidad. Es decir:

x = x + vx*dt;

Ahora la variable vx, que almacena la velocidad, no será entera (int) sino que un numero flotante (float), ya que ahora lo multiplicaremos por un delta t de tiempo.

Imaginemos ahora que vx tiene el valor 0.005, y el ciclo demora 1 segundo en ejecutarse, el nuevo incremento será de:

x = x + 0.005*1000
x=x+5

Ahora el incremento es menor, claro, debe ser así porque en tan solo 10 milisegundos se mueve 0.05 pixeles, entonces cuando pase 1 segundo se habrá movido:

(1000/10)*0.05 = 100*0.05 = 5 pixeles

Justamente lo que esperábamos, ahora no importan los FPS que existan en el videojuego, basándonos en el tiempo, los objetos se moverán a la misma velocidad en cualquier equipo.

Veamos esto en un simple código:

int t_new, t_old;       // Almacena los tiempos actual y anterior
int dt;   // Diferencia de tiempos
 
t_new = GetTime();      // Tiempo actual
 
while(!salir)
{
    t_old = t_new;      // El tiempo anterior
 
    // Hacemos algo ...
    t_new = GetTime();  // Obtenemos el tiempo actual
    dt = t_new - t_old  // Calculamos la diferencia de tiempos
    x = x + vx*dt       // Calculamos la nueva posicion
    // Dibujamos objetos ...
}

Este método se usa bastante en videojuegos 3D, ya que el framerate varía mucho en cada ciclo, dependiendo de la cantidad de objetos que se deban renderizar.

Pero este método también tiene su desventaja, a pesar de que los objetos se mueven siempre a la misma velocidad, en un computador más lento, el desplazamiento no se verá fluidamente. Esto se aprecia en el ejemplo que ya vimos, en el caso extremo de demorarse 1 segundo cada ciclo, cada vez que se deba mover un objeto, este aparecerá 5 pixeles más a la derecha, produciéndose un salto muy notorio. En computadores aun más lentos, se comenzará a ver un parpadeo en el desplazamiento de los objetos.

Pero como ya dijimos nuestro videojuego siempre tendrá unos requerimientos mínimos y tendremos que seleccionar el método que más nos acomode. Pero claramente el primer método, sincronización por framerate, es el más simple y el más extendido.

Resumen

Hemos aprendido o repasado varios conceptos, que nos ayudarán a comprender mejor la programación gráfica que se usa en los videojuegos 2D.

Todos estos conceptos se pueden aplicar a cualquier biblioteca gráfica, muchas de las cosas que vimos ya vienen implementadas, como por ejemplo setear un modo de video, obtener un color, realizar operaciones de blitting, efectos de alpha blending, usar transparencias por color keys, transformaciones como rotación, escalado, traslación, page flipping, etc., por lo tanto no será necesario que escribamos código para esto, pero conviene conocer su funcionamiento.

Blogged with the Flock Browser
Anuncio publicitario

Pygame: Introducción a Pygame de Python [Losersjuegos]

Pygame: Introducción a Pygame de Python [Losersjuegos]

Pygame: Introducción a Pygame de Python

Créditos

  • Autor: Pete Shinners
  • Traducido por: Daniela López Seco
  • Fecha: Sábado 20 de Enero del 2007

Introducción

Este artículo es una introducción a la biblioteca Pygame para programadores Python. La versión original apareció en PyZine, volumen 1 tercera edición. Esta versión contiene revisiones menores, para crear un mejor artículo. Pygame es una biblioteca de extensión de Python que encapsula la funcionalidad de la biblioteca SDL y sus ayudantes.

Historia

Pygame comenzó en el verano del 2000. Siendo un programador C por muchos años, descubrí Python y SDL casi al mismo tiempo. Usted ya está familiarizado con Python, que estaba en su versión 1.5.2, por lo tanto podría necesitar una introducción a SDL, que significa Simple Directmedia Layer. Creada por Sam Lantinga, es una biblioteca multiplataforma para controlar multimedia, comparable a DirectX. A sido usada para cientos de juegos comerciales y de código abierto.

Estaba impresionado por lo nítidos y directos que eran ambos proyectos y no pasó mucho tiempo antes que me diera cuenta que mezclar Python y SDL era una propuesta interesante.

Descubrí un pequeño proyecto ya en curso con exactamente la misma idea, PySDL. Creada por Mark Baker, PySDL era una implementación directa de SDL como una extensión de Python. La interfase era mas limpia que una envoltura genérica SWIG, pero forzaba un “estilo C” al código. La muerte repentina de PySDL se incito a empezar un nuevo proyecto por mi cuenta.

Quería generar un proyecto que realmente tomara ventaja de Python. Mi meta era hacer muy simple realizar las cosas sencillas, y directo para hacer las cosas difíciles. Pygame empezó en Octubre del 2000. Seis meses mas tarde la versión 1.0 de Pygame fue lanzado.

Gusto

Creo que la mejor forma de entender una nueva biblioteca es ir directamente a un ejemplo. En las etapas tempranas de Pygame desarrollé una animación de una pelota que rebotaba con 7 lineas de código. Miremos una versión mas amigable de la misma cosa.

Debería ser lo suficientemente simple para seguirlo:
Código fuente: ball.py

1.   import sys, pygame
2.   pygame.init()
3.   
4.   size = width, height = 320, 240
5.   speed = [2, 2]
6.   black = 0, 0, 0
7.   
8.   screen = pygame.display.set_mode(size)
9.   
10.   ball = pygame.image.load("ball.png")
11.   ballrect = ball.get_rect()
12.   
13.   while 1:
14.       
15.       for event in pygame.event.get():
16.       
17.           if event.type == pygame.QUIT:
18.               sys.exit()
19.         
20.       ballrect = ballrect.move(speed)
21.   
22.       if ballrect.left < 0 or ballrect.right > width:
23.           speed[0] = -speed[0]
24.           
25.       if ballrect.top < 0 or ballrect.bottom > height:
26.           speed[1] = -speed[1]
27.   
28.       screen.fill(black)
29.       screen.blit(ball, ballrect)
30.       pygame.display.flip()

Para probar este programa simplemente baje los archivos ball.py y ball.png a su computadora y ejecute python ball.py Captura de pantalla del programa funcionandoEsta es la manera mas simple de hacer una animación de una pelota que rebota. Primero vemos que importar e inicializar Pygame no es algo digno de prestarle atención. El “import pygame” incorpora el paquete con todos los módulos Pygame disponibles.

La llamada a “pygame.init()” inicializa cada uno de estos módulos.

En la linea 8 creamos una ventana gráfica con la llamada a “pygame.display.set_mode()”. Pygame y SDL hacen esto simple predeterminando los mejores modos gráficos para el hardware del equipo. Puedes anular el modo y SDL compensará todo lo que el hardware no puede hacer.

Pygame representa a las imágenes como objetos Surface. La función “display.set_mode()” crea un nuevo objeto Surface que referencia a la representación actual de pantalla. Cualquier dibujo que se haga sobre este objeto Surface se hace visible en el monitor.

En la linea 10 cargamos nuestra imagen de la pelota. Pygame soporta una gran variedad de formatos de imágenes a través de la biblioteca SDL_image, incluyendo JPG, PNG, TGA, y GIF. La función “pygame.image.load()” nos devuelve un objeto Surface con los datos de la pelota. La Surface mantendrá cualquier color o transparencia Alpha del archivo. Después de cargar la imagen de la pelota creamos una variable llamada ballrect.

Pygame incluye un tipo de objeto de utilidad conveniente llamado Rect, que representa un área rectangular. Mas tarde, en la parte de animación del código, veremos que se puede hacer con Rect.

En este punto, la linea 13, nuestro programa está inicializado y listo para ejecutarse. Dentro de un ciclo infinito verificamos las entradas de datos del usuario, movemos la pelota, y después dibujamos la pelota.

Si está familiarizado con la programación GUI, tiene experiencia con eventos y ciclos de eventos. En Pygame no hay diferencia, verificamos si un evento QUIT ha llegado. Si es así, simplemente cerramos el programa, Pygame se asegura que todo se cierra limpiamente.

Es tiempo de actualizar la posición de la pelota. Las lineas 17 a 21 mueven la variable ballrect a la velocidad actual. Si la pelota se ha movido afuera de la pantalla, revertimos la velocidad en esa dirección. No es exactamente física Newtoniana, pero es todo lo que necesitamos.

En la linea 23 borramos la pantalla rellenándola con un color negro RGB. Si nunca ha trabajado con animaciones esto le será extraño. Se estará preguntando “¿por que hay necesidad de borrar todo, por que no movemos directamente la pelota en la pantalla?”; Así no es exactamente como trabajan las animaciones en computadora. Las animaciones no son mas que una serie de imágenes individuales, que desplegadas en secuencia engañan fácilmente al ojo humano para que vea movimiento. La pantalla es simplemente una imagen individual que el usuario ve. Si no nos tomamos un tiempo para borrar la pelota de la pantalla, veremos en realidad un “rastro” del movimiento mientras dibujamos continuamente la pelota en nuevas posiciones.

Efecto que produce no restaurar el fondo de pantalla

En la linea 24 dibujamos la imagen de la pelota en la pantalla. El dibujo de imágenes es manejado por el método “Surface.blit()”. Un blit básicamente significa copiar píxeles de color de una imagen a otra. Le pasamos al método blit un Surface fuente para que copie de él, y una posición para poner la fuente sobre el destino.

La ultima cosa que necesitamos hacer es actualizar la pantalla. Pygame maneja la pantalla con Double Buffer. Cuando terminamos de dibujar llamamos al método “pygame.display.flip()”. Esto hace que todo lo que dibujamos en la pantalla se haga visible. Este almacenamiento intermedio se asegura que solo veamos pantallas completamente dibujadas en la pantalla. De otra forma, el usuario vería partes a la mitad de la pantalla mientras estas son creadas.

Así concluye esta corta introducción a Pygame. Pygame también contiene un módulo para hacer cosas como manejo de entradas para el teclado, mouse y joystick. Puede mezclar audio y reproducir música. Con los objetos Surface puede dibujar formas simples, rotar y escalar una imagen. Incluso puede manipular los píxeles de una imagen en tiempo real como un arreglo Numeric de Python. Hay soporte para reproducir video MPEG y CDs de audio. Pygame también tiene la habilidad de funcionar como una capa de visualización multiplataforma para PyOpenGL.

La mayoría de los módulos de Pygame están escritos en lenguaje C, pocos actualmente están realizados con Python.

El sitio web de Pygame tiene una documentación de referencia completa para toda función de Pygame y tutoriales para usuarios de todos los niveles. El código fuente de Pygame viene con varios ejemplos de cosas como “monkey punching” y “UFO shooting”.

Python y los juegos

¿Es Python conveniente para juegos? La respuesta es, “Depende del juego”. Python es realmente bastante capaz de correr juegos. Probablemente hasta lo sorprenda cuanto se puede hacer en menos de 30 milisegundos. Aún así, no es difícil llegar al techo una vez que su juego se haga mas complejo. Cualquier juego ejecutándose en tiempo real hará uso completo de la computadora.

Durante los últimos años ha existido una tendencia interesante en el desarrollo de juegos, que se acerca a lenguajes de mas alto nivel. Usualmente un juegos se divide en 2 grandes partes. El motor del juego, el cual tiene que ser lo mas rápido posible, y la lógica del juego, que le indica al motor que debe realizar. No hace mucho tiempo que el motor de un juego se escribía en Assembler, con porciones escritas en lenguaje C. Hoy en día, C se ha trasladado al motor del juego, mientras que el juego mismo es escrito en un lenguaje de Scripts de mas alto nivel. Juegos como Quake 3 y Unreal ejecutan estos Scripts como código binario portable.

Al comienzo del 2001, el desarrollador Rebel Act Studios terminó su juego, Severance: Blade of Darkness. Usado su propio motor de 3D a medida, el resto del juego está escrito en Python. El juego es en tercera persona de acción sangrienta. Usted controla a guerreros medievales en intrincadas combinaciones de ataques “decapitantes” mientras explora calabozos y castillos. Puede descargar agregados creados por terceras partes para este juego, y encontrar que no son nada mas que archivos fuente de Python.

Severance: Blade of Darkness

Recientemente, Python ha sido usado por una variedad de juegos como Freedom Force, y Humungous’ Backyard Sports Series.

Freedom force

Pygame y SDL sirven como excelentes motores C para juegos 2D. Los juegos igualmente pasarán la mayor parte del tiempo de ejecución dentro de SDL manejando sus gráficos. SDL puede tomar ventaja de la aceleración de hardware de gráficos. Habilitando esto, se puede elevar el rendimiento de un juego que corre aproximadamente a 40 cuadros por segundo hasta 200 cuadros por segundos. Cuando se ve a un juego de Python ejecutando a 200 cuadros por segundos, se puede ver que Python y los juegos pueden funcionar juntos.

Es impresionante cuan bien funcionan Python y SDL en múltiples plataformas. Por ejemplo, en Mayo del 2001 lance mi propio proyecto Pygame completo, SolarWolf, un juego de acción del estilo Arcade.

SolarWolf

Una cosa que me ha sorprendido es que un año mas tarde, no ha existido la necesidad de parches, arreglo de Bugs, o actualizaciones. El juego fue desarrollado enteramente en Windows, pero corre en Linux, Mac OSX y muchos Unix sin la necesidad de trabajo extra por mi lado.

Aún así, hay limitaciones muy claras. La mejor manera de manejar gráficos de aceleradoras de video no es siempre la forma de obtener resultados rápidos del Software que procesa gráficos. El soporte de hardware no está disponible en todas las plataformas. Cuando un juego se hace mas complejo, usualmente se tiene que comprometer con uno u otro. SDL tiene otras limitaciones de diseño, cosas como los desplazamientos de pantalla completa pueden llevar rápidamente a su juego a velocidades injugables.

Mientras SDL no es conveniente para todo tipo de juegos, recuerde que compañías como Loki usaron SDL para ejecutar una gran variedad de títulos de calidad de ventas por menor.

Pygame es de bajo nivel cuando se trata de escribir juegos. Se encontrará rápidamente en la necesidad de envolver funciones comunes en su propio ambiente de juego. La gran ventaja de esto es que no hay nada en Pygame que le impida seguir su camino. Su programa está en total control de todo. El efecto colateral de esto es que se encontrará pidiendo prestado mucho código para realizar un marco de trabajo mas avanzado. Necesitará un mejor entendimiento de lo que está haciendo.

Cierre

Desarrollar juegos es muy gratificante, existe algo muy excitante en ser capaz de ver e interactuar con el código que uno escribió. Pygame está actualmente siendo usado por casi 30 proyectos. Varios de ellos están listos para jugar ahora. Puede que le sorprenda visitar el sitio web de Pygame, y ver lo que otros usuarios han podido hacer con Python.

Algo que me ha llamado la atención es la cantidad de personas que han accedido a Pyhon por primera vez para probar el desarrollo de juegos. Veo por que los juegos son atractivos para los nuevos programadores, pero puede ser difícil porque crear juegos requiere un gran conocimiento del lenguaje. He intentado dar mi apoyo a este grupo de usuarios creando muchos ejemplos y tutoriales de Pygame para personas novatas en estos conceptos.

Al final de cuentas, mi consejo en mantener las cosas simples. Si está planeando crear su primer juego, hay mucho para aprender. Hasta un juego muy simple desafiará sus diseños, y los juegos complejos no necesariamente son juegos divertidos. Cuando entienda Python, puede usar Pygame para crear un juego simple en solo una o dos semanas. Desde ahí, necesitará una sorpresiva cantidad de tiempo para agregar el terminado que lo convertirá en un juego presentable completo.

Resumen de módulos Pygame

  • cdrom: administra los dispositivos CDROM y la reproducción de CDs de audio.
  • cursors: carga imágenes de cursor, incluyendo los cursores por defecto.
  • display: controla la ventana principal o pantalla.
  • draw: dibuja figuras simples sobre objetos Surface.
  • event: administra eventos y la cola de eventos.
  • font: genera e imprime fuentes tipográficas Truetype.
  • image: lee y graba imágenes.
  • joystick: administra dispositivos de joystick.
  • key: administra el teclado.
  • mouse: permite controlar el mouse
  • movie: reproduce películas en formato MPEG.
  • sndarray: manipula sonidos con Numeric.
  • surfarray: manipula imágenes con Numeric.
  • time: controlador de tiempo.
  • transform: puede escalar, rotar e invertir imágenes.
Blogged with the Flock Browser

Tutorial: Escribiendo juegos en Python I | Manzana Mecánica

Tutorial: Escribiendo juegos en Python I | Manzana Mecánica

Muchos de nosotros gozamos a diario jugando videojuegos. Y somos muchos los que siempre hemos querido hacer nuestro propio juego. Cuando yo era chico programé infinidad de juegos en mi Atari. Pero programar un juego no es cosa sencilla, y aprender el lenguaje C no es para cualquiera.

Existe una plataforma de código libre para escribir juegos de manera sencilla, en un lenguaje poderoso. Esta es la primera parte de una serie de artículos que escribiré para enseñar a utilizar las librerías pygame para hacer videojuegos. Estas librerías son open-source y están disponibles para las plataformas tradicionales (Linux, MacOSX y Windows).

¿Qué es pygame?

Pygame es un conjunto de librerías para el lenguaje Python que facilitan el escribir juegos. Hacen fáciles tareas complicadas como cargar imágenes, desplegarlas en la pantalla, almacenar y tocar sonidos/música; también te permiten abstraerte de problemas como qué tipo de hardware tienen los usuarios.

Para aprender a usar pygame sólo necesitas tener conocimientos de Python. Como el enfoque de este tutorial no es aprender Python, les dejo la página oficial con tutoriales sobre cómo aprender este lenguaje.

Instalar pygame

La manera más sencilla de instalar Pygame es hacerlo en Linux :D, con un simple comando en el terminal. En Ubuntu la instalación es así:

  1. sudo apt-get install python-pygame

Se siguen las instrucciones y listo. En la página de Pygame pueden encontrar instrucciones para instalarlo en Windows y MacOSX

Manos a la obra

Lo primero que haremos será crear un archivo de texto llamado «demo1.py», y copiar estas líneas en él. Luego les explicaré qué significan.

  1. import pygame
  2. from pygame.locals import  *
  3. SCREEN_WIDTH = 800
  4. SCREEN_HEIGHT = 600
  5. def game():
  6.         pygame.init()
  7.         screen = pygame.display.set_mode( (SCREEN_WIDTH,SCREEN_HEIGHT) )
  8.         pygame.display.set_caption( «demo1» )
  9.    
  10.         while True:
  11.                 keyinput = pygame.key.get_pressed()
  12.                 if keyinput[K_ESCAPE] or pygame.event.peek(QUIT):
  13.                         raise SystemExit
  14. if __name__ == ‘__main__’:
  15.         game()

Vamos por partes. Con las siguientes líneas lo que hacemos es decir que usaremos las librerías:

  1. import pygame
  2. from pygame.locals import *

Luego definimos un par de constantes, como la resolución de pantalla que usaremos para nuestro juego:

  1. SCREEN_WIDTH = 800
  2. SCREEN_HEIGHT = 600

Así, nuestro juego correrá en 800×600. Luego escribimos una función llamada «Game». Veamos el cuerpo de la función. Lo primero que hacemos es inicializar los sistemas de pygame:

  1.         pygame.init()

Después le decimos a pygame la resolución que usaremos y el nombre de nuestro juego. Como lo corremos (por ahora) dentro de una ventana, este nombre es el que se desplegará en el título de la ventana.

  1.         screen = pygame.display.set_mode( (SCREEN_WIDTH,SCREEN_HEIGHT) )
  2.         pygame.display.set_caption( «demo1» )

Finalmente, entramos a lo que es el ciclo principal del juego. Este ciclo tomará todo el tiempo de juego. Es en este juego en que sucede la inteligencia de los personajes, se calculan las nuevas posiciones, se dibujan los gráficos y se toca la música. Demos un vistazo.

Comenzamos el ciclo:

  1.         while True:

Ahora le pedimos a Pygame que nos dé un arreglo con todas las teclas que están siendo presionadas en este instante. Y luego vemos si la tecla ESCAPE está presionada. Si esto es así, procedemos a terminar el juego. Para terminar, basta con salir del ciclo principal.

  1.                 keyinput = pygame.key.get_pressed()
  2.                 if keyinput[K_ESCAPE] or pygame.event.peek(QUIT):
  3.                         raise SystemExit

Y por último, estas líneas sirven para que el juego comience. Son líneas típicas de los programas en Python, así que no las explicaremos.

  1. if __name__ == ‘__main__’:
  2.         game()

Corriendo nuestro juego

Ha llegado la hora correr el juego. Para eso, simplemente ejecuta este comando en un terminal abierto en la misma carpeta de tu juego:

  1. python demo1.py

¿Y qué veremos? Pues muy poco hasta aquí. Simplemente veremos una ventana en negro con el título de nuestro juego. Si presionas la tecla ESCAPE la ventana se cerrará.

No podemos decir que nuestro juego es muy interesante hasta ahora, pero es la base de todos los programas que podrás escribir de ahora en adelante.

Agregando una imagen de fondo

Vamos un poco más allá de lo básico. Agregar una imagen de fondo a nuestro juego es muy sencillo. Primero debemos crear una función que es la que usaremos para leer imágenes desde el disco duro.

  1. def load_image(filename, transparent = False):
  2.         try: image = pygame.image.load(filename)
  3.         except pygame.error, message:
  4.                 raise SystemExit, message
  5.         image = image.convert()
  6.         if transparent:
  7.                 color = image.get_at((0,0))
  8.                 image.set_colorkey(color, RLEACCEL)
  9.         return image

Esta función es bastante simple. Lo que hace es leer la imagen desde el disco duro y almacenarla en una variable temporal. Si el segundo parámetro es verdadero, entonces la función get_at se usa para obtener el color del pixel en la posición (0,0). Esto lo haremos cuando trabajemos con personajes. Por ahora puedes ignorarlo.

Luego, descarga esta imagen y ponla en la misma carpeta que el juego.

Ahora, los últimos toques al código. Haremos algunas modificaciones al método principal. Antes del ciclo while agregaremos las siguientes líneas:

  1. screen = pygame.display.set_mode( (SCREEN_WIDTH,SCREEN_HEIGHT) )
  2. background_image = load_image(‘back.jpg’);

Lo que hicimos aquí fue crear una superficie. Las superficies son los objetos gráficos de Pygame. Pero esta superficie en particular es la que representa a la ventana principal del juego. Lo que dibujemos en ésta saldrá dibujado en nuestro juego. Luego cargamos la imagen «back.jpg» en memoria y la almacenamos en la variable background_image.

Ahora agregamos bajo el ciclo while estas otras líneas:

  1. screen.blit(background_image, (0,0) )
  2. pygame.display.flip()

Estas últimas dos líneas hacen que por cada ciclo la imagen de fondo se dibuje sobre la superficie de la pantalla. Los parámetros (0, 0) son para indicarle al intérprete que la esquina superior izquierda de la imagen se dibuje sobre la esquina superior izquierda de la pantalla. En otras palabras, es la posición en la pantalla.

Resultado final

El código final de esta segunda versión sólo es un poco más largo. Veamos:

  1. import pygame
  2. from pygame.locals import *
  3. SCREEN_WIDTH = 800
  4. SCREEN_HEIGHT = 600
  5. def load_image(filename, transparent = False):
  6.         try: image = pygame.image.load(filename)
  7.         except pygame.error, message:
  8.                 raise SystemExit, message
  9.         image = image.convert()
  10.         if transparent:
  11.                 color = image.get_at((0,0))
  12.                 image.set_colorkey(color, RLEACCEL)
  13.         return image
  14. def game():
  15.         pygame.init()
  16.         screen = pygame.display.set_mode( (SCREEN_WIDTH,SCREEN_HEIGHT) )
  17.         pygame.display.set_caption( «demo1» )
  18.         background_image = load_image(‘back.jpg’);
  19.         while True:
  20.                 screen.blit(background_image, (0,0) )
  21.                 pygame.display.flip()
  22.                 keyinput = pygame.key.get_pressed()
  23.                 keyinput = pygame.key.get_pressed()
  24.                 if keyinput[K_ESCAPE] or pygame.event.peek(QUIT):
  25.                         raise SystemExit
  26.  
  27.        
  28. if __name__ == ‘__main__’:
  29.         game()

Si lo hiciste todo bien, tipeando «python demo1.py» deberías ver algo como esto:

Bueno, con esto terminamos la primera parte. En la segunda veremos cómo hacer personajes y lograr que éstos se muevan por la pantalla. ¡Nos vemos!

Bueno, ha pasado un poco más de un mes, pero lo prometido es deuda. Les dejo aquí la segunda parte de nuestro tutorial de juegos en Python y pygame. Si te perdiste la primera parte, no te preocupes, sigue este enlace.

En esta segunda parte comenzaremos a implementar uno de los juegos más clásicos de la historia de los videojuegos: Arkanoid.

Después de esto, sabrás como hacer que un objeto se mueva por tu pantalla y una manera simple de agregar sonidos a tus juegos. Si ya estás ansioso de empezar a programar, entonces sigue leyendo

La clase Ball

En la parte anterior del tutorial dejamos el código listo para empezar lo más entretenido. Lo que llevamos hasta ahora inicializa el sistema y luego muestra el fondo que utilizaremos.

Ahora vamos a empezar definiendo la clase Ball que sera la que se encargue de representar a la bola del juego. Esta primera versión de la bola rebotará indistintamente en las cuatro murallas de nuestra pantalla. Veamos primero el constructor de la clase

  1. class Ball(pygame.sprite.Sprite):
  2.      def __init__(self):
  3.          pygame.sprite.Sprite.__init__(self)
  4.          self.image = load_image(‘ball.gif’, True)
  5.          self.rect = self.image.get_rect()
  6.          print self.rect
  7.          self.rect.centerx = SCREEN_WIDTH / 2
  8.          self.rect.centery = SCREEN_HEIGHT / 2
  9.          self.speed = [0.5, –0.5]

Veamos ahora el código línea por línea. Lo primero que notamos es que nuestra clase hereda de la clase Sprite de pygame. Esta clase representa los objetos gráficos que se moverán por nuestra pantalla. En la siguiente línea llamamos al constructor de la clase Sprite. Esto es MUY IMPORTANTE, pues si no lo haces, al ejecutar el programa saldrán errores muy raros y difíciles de entender si no sabes qué es lo que pasa.

Luego incializaremos algunas variables. Primero cargamos al imagen de la bola desde el archivo ball.gif (puedes descargarlo desde aquí). Para ello usamos nuestra función load_image que definimos en el tutorial anterior. Toda imagen leída con pygame tiene una referencia a un rectángulo. Este rectángulo es del ancho y alto de la imagen y lo utilizaremos para posicionarlo en el mundo del juego. Así pues, lo primero que hacemos es guardar una referencia a ese rectángulo usando el método get_rect de la clase Image. Por definición los rectángulos de las imágenes aparecen con su esquina inferior derecha en la coordenada (0,0). Lo primero que hacemos es trasladarlo al centro de la pantalla modificando el punto del centro (siguientes dos líneas). El centro delrectángulo puede ser modificado usando la propiedad center (un punto) o a través de las coordenadas del centro, centerx y centery.

Vale la pena aquí hacer ver lo versátil de la clase Rect (los rectángulos). Cada vez que modificas una de sus propiedades, el resto cambiará para adaptarse. Por ejemplo, si el lado izquierdo de unrectángulo es 50 y el derecho es 100 (un rectángulo de 50 pixeles de ancho) al hacer rect.centerx = 100 entonces ahora el lado izquierdo valdrá 75 y el derecho valdrá 125 (lo trasladamos 25 pixeles a la derecha). Esto es lo que usaremos para mover nuestros objetos por la pantalla.

Y en la última línea inicializaremos la velocidad de la pelota. La velocidad la manejaremos de manera separada para cada coordenada X e Y. Esto simplificará mucho nuestros cálculos.

Bien, veamos ahora el siguiente método de Ball.

  1.     def update(self, time):
  2.          self.rect.centerx += self.speed[0] * time;
  3.          self.rect.centery += self.speed[1] * time;
  4.          if self.rect.left <= 0 or self.rect.right >= SCREEN_WIDTH:
  5.              self.speed[0] = –self.speed[0]
  6.              self.rect.centerx += self.speed[0] * time;
  7.          if self.rect.top <= 0 or self.rect.bottom >= SCREEN_HEIGHT:
  8.              self.speed[1] = –self.speed[1]
  9.              self.rect.centery += self.speed[1] * time;

El método update será llamado en cada ciclo del juego. Su misión es actualizar las variables internas de la bola. Aquí es donde le asignamos «inteligencia» a nuestra pelota. El parámetro time representa el tiempo (en milisegundos) que ha pasado en nuestro juego desde la última vez que esta función fue ejecutada.

Lo primero es actualizar la posición de la bola. Como nos enseñaron en el colegio, si multiplicas la velocidad de un objeto por el tiempo que lleva moviéndose, obtendrás la posición del objeto después de ese tiempo. Así, lo primero será actualizar la coordenada x del centro aumentándola en su velocidad (self.speed[0]) multiplicada por el tiempo que ha pasado (time). Esto dejará esa coordenada donde debería encontrarse luego de viajar time milisegundos a self.speed[0] unidades. Luego hacemos lo mismo para la coordenada y.

Si dejáramos este método hasta aquí, nuestra pelota comenzaría a moverse pero muy pronto saldría de nuestra pantalla. Para evitar esto las siguientes líneas hacen el truco. Si luego de actualizar nuestra posición nos damos cuenta de que nos hemos pasado fuera de la pantalla entonces lo que hacemos es cambiar el sentido de la velocidad en esa coordenada y luego volver a sumarlo al centro (esto hace que nos «devolvamos» un poco).

SI YA HAZ LEÍDO HASTA AQUÍ, NO DESESPERES!!! FALTA POCO

Bien, ya solo nos falta utilizar todo lo que hemos escrito. Lo que haremos ahora es crear una bola y hacer que esta se mueva por la pantalla. Para esto, usaremos la clase Group de pygame. Un group es un «grupo» de sprites. Es muy parecido a las listas de de python pero tiene un par de «gracias» que los hacen muy útiles para nuestros propósitos. La idea de los groups es agrupar objetos gráficos parecidos en propiedades para manipularlos de manera conjunta. Veamos ahora el caso mas sencillo, un grupo con un solo objeto. En nuestro programa principal escribiremos

  1.       balls = pygame.sprite.Group()
  2.       ballSprite = Ball()
  3.       balls.add(ballSprite)

Con esto hemos creado el grupo balls y le hemos agregado una nueva bola. Podríamos agregar cuantas bolas quisieramos, pero como todas aparecen en el centro, se superpondrian y no veríamos diferencias. Un buen ejercicio es modificar el constructor de Ball para que reciba las coordenadas de inicio y luego agregar más de una bola al grupo.

Ahora introduciremos otra clase muy útil y sencilla de usar: Clock. Esto es todo lo que nos faltará para animar nuestra bola. Un clock es un «reloj», osea, un objeto que nos sirve para medir intervalos de tiempo. Cada vez que invocamos su método tick() este nos dirá cuanto tiempo ha pasado desde la vez anterior a la invocación. Así, lo primero que haremos en cada ciclo del programa principal es llamar a tick para ver cuánto tiempo ha pasado.

El último párrafo se resume en estas 3 líneas

  1.       clock = pygame.time.Clock()
  2.       while True:
  3.               time = clock.tick()

Inmediatamente después de esto, es el momento de que nuestros objetos se actualisen, es decir, que «usen su inteligencia». Para hacerlo más fácil, hacemos lo siguiente.

  1. balls.update(time)

El método update de Group recorre a todos los sprites del grupo y ejecutará el método update del sprite correspondiente pasándole como parámetro time que es el tiempo desde la actualización anterior.

Y finalmente, dibujaremos todos nuestros objetos, es decir, el fondo y la bola. Primero el fondo, pues si lo hiciéramos al revés entonces el fondo pisaría a la bola.

  1.               screen.blit(background_image, (0,0) )
  2.               balls.draw(screen);

La primera línea la conocemos de la primera parte del tutorial y en la segunda hay un poco de truco. Draw es otro de esos métodos que recorren los sprites del grupo. Pero esta vez no ejecutamos un método del sprite, sino que tomamos la imagen de este y la dibujaremos usando como referencia su rectángulo. Es por esta razón que todo objeto que hereda de Sprite debe tener siempre llenas las variables rect e image pues el método draw espera que estos tengan valores correctos.

Y listo!!! Corriendo el juego

Ahora ya estamos listos para correr nuestra primera versión del juego con movimiento. Para que no tengan que escribir todo lo anterior, les dejo aquí el código completo.

  1. import pygame
  2. from pygame.locals import *
  3.  
  4. SCREEN_WIDTH = 800
  5. SCREEN_HEIGHT = 600
  6.  
  7.  
  8. class Ball(pygame.sprite.Sprite):
  9.      def __init__(self):
  10.          pygame.sprite.Sprite.__init__(self)
  11.          self.image = load_image(‘ball.gif’, True)
  12.          self.rect = self.image.get_rect()
  13.          self.rect.centerx = SCREEN_WIDTH / 2
  14.          self.rect.centery = SCREEN_HEIGHT / 2
  15.          self.speed = [0.5, –0.5]
  16.  
  17.      def update(self, time):
  18.          self.rect.centerx += self.speed[0] * time;
  19.          self.rect.centery += self.speed[1] * time;
  20.          if self.rect.left <= 0 or self.rect.right >= SCREEN_WIDTH:
  21.              self.speed[0] = –self.speed[0]
  22.              self.rect.centerx += self.speed[0] * time;
  23.          if self.rect.top <= 0 or self.rect.bottom >= SCREEN_HEIGHT:
  24.              self.speed[1] = –self.speed[1]
  25.              self.rect.centery += self.speed[1] * time;
  26.    
  27.  
  28.  
  29. def load_image(filename, transparent = False):
  30.       try: image = pygame.image.load(filename)
  31.       except pygame.error, message:
  32.               raise SystemExit, message
  33.       image = image.convert()
  34.       if transparent:
  35.               color = image.get_at((0,0))
  36.               image.set_colorkey(color, RLEACCEL)
  37.       return image
  38. def game():
  39.       pygame.init()
  40.       screen = pygame.display.set_mode( (SCREEN_WIDTH,SCREEN_HEIGHT) )
  41.       pygame.display.set_caption( «demo1» )
  42.       background_image = load_image(‘back.jpg’);
  43.  
  44.       balls = pygame.sprite.Group()
  45.       ballSprite = Ball()
  46.       balls.add(ballSprite)
  47.       clock = pygame.time.Clock()
  48.       while True:
  49.               time = clock.tick()
  50.               balls.update(time)
  51. if __name__ == ‘__main__’:
  52.       game()

Si todo salió correctamente entonces deberías ver una pelota rebotando contra los bordes de la pantalla.

Un bonus: Agregando sonidos

Vamos a adelantarnos en nuestros tutoriales y aprender la manera más básica de agregar sonidos a nuestro juego. Para eso, pueden descargar este archivo de sonido y ponerlo en el directorio del juego. Luego, en el constructor de la clase bola de la siguiente manera.

  1.          self.ping = pygame.mixer.Sound(‘ping.wav’)

Esto carga el sonido en memoria y guarda una referencia para ser usada luego. Ahora, en el método update, busquen en donde se cambia la dirección de la velocidad. Este es el momento en que la bola choca y por lo tanto el momento de hacer que el sonido suene. Agreguen las siguientes lineas

  1.          self.ping.play()

Y cuando la pelota golpee contra los muros el sonido se escuchará.

Y después de esto… que más

Bueno, pues viene mucho más. No hemos hecho más que empezar. En la siguiente parte aprenderemos como mover objetos usando el mouse y como detectar coliciones entre objetos. Esto es más complicado así que merece un capítulo aparte.

Los espero en la siguiente parte del tutorial

Blogged with the Flock Browser

Aprendiendo a Programar en Python con PyGame para hacer Video Juegos

Aprendiendo a Programar en Python con PyGame para hacer Video Juegos

Blogged with the Flock Browser

Web Design Toolbox: 130+ New Tools to Make You a Better and Faster Designer

Web Design Toolbox: 130+ New Tools to Make You a Better and Faster Designer

Blogged with the Flock Browser

Introducción a TIC – Libro de clases

Intro to ICT

General Information and Communication Technology

Evolution

History Of Information and Communication Technology

History Of The Internet

Using The Internet

Searching The Internet

Computer Hardware, Networking,
and System Administration

Home Networking

Introduction To Networking

Purchasing Internet Service

Understand Home Network
Design

Network Security

Logic Circuits

Getting Down with Logic Circuits

Logic Circuits in Python – Part One

Logic Circuits in Python – Part Two

Computer Architecture

Internal Computer Hardware

Computer Hardware Peripherals

Mythical Machine Simulator

Booting Your Computer

Computer Software, Web
Application Development, and Multimedia

Software

Operating Systems

Computer Security

Backups

Web Browsers

Getting Down with Revision Control

Web Page Development

Getting Down with XHTML

Programming

Getting Down with Javascript

Gasp Python Course

Creating a GUI with pyGTK

Databases

SQL for Python Programmers

Using SQLite with the pyGTK phone GUI

Multimedia

Multimedia Design

Blogged with the Flock Browser

Ciencia infinita

Ciencia infinita

Este proyecto Ciencia infinita, propone una serie de actividades de carácter lúdico que desarrollen la creatividad e inicien a la gente menuda y a la gente joven en el método científico. Nos proponemos usar materiales domésticos y utilizar algunas claves de la educación informal como la divergencia y la autonomía en el aprendizaje.
No buscamos llenaros de contenidos, sino escuchar lo que ya sabéis, aprovecharlo y conocer métodos interesantes para discutir el conocimiento adquirido por vuestra propia experiencia en casa, o de vuestras investigaciones en Internet, o en los documentales televisivos.
Que disfrutéis.

Esta es la portada del primer libro de la colección: “Ciencia Infinita”.
Puedes ampliar la información sobre cada experimento que tienes en el libro, y entrar en los enlaces que te proponemos en cada capítulo si pinchas en el enlace correspondiente:

PRESENTACIÓN

PELOS CABEZONES>

PELOS HÚMEDOS

PELOS RECICLADOS

PELOS Y COMPAÑÍA

PELOS ELÉCTRICOS

PELOS RESISTENTES

PELOS SALUDABLES

PELOS DE COLORES

PELOS ELÁSTICOS

PELOS CON CHICLE

CRÉDITOS

Escrito con el Navegador Flock

Tags: , ,

500 Libros de Colección

500 Libros de Colección

Libros:
1. 1984 – George Orwell
2. 2001 – Una odisea espacial – Arthur C. Clarke
3. 2010 – Odisea dos – Arthur C. Clarke
4. 2061 Odisea tres – Arthur C. Clarke
5. 3001 Odisea final – Arthur C. Clarke
6. 62 Modelo para armar – Julio Cortazar
7. A orillas del río Piedra me senté y llore – Paulo Coelho
8. A través del espejo – Lewis Carrol
9. Abducción – Robin Cook
10. Acoso – Michael Crichton
11. Aforismos – Friedrich Nietzsche
12. Agua Mansa – Martín Gil
13. Al otro lado del tiempo – Richard Bach
14. Alba de saturno – Arthur C. Clarke
15. Alcanza el mañana – Arthur C. Clarke
16. Alicia en el país de las maravillas -Lewis Carrol
17. Almuerzo en el restaurante Gotham – Stephen King
18. Amante liberal – Miguel de Cervantes Saavedra
19. Amistad Funesta – José Martí
20. Amistades peligrosas – Choderlos de Laclos
21. Ana Karenina – León Tolstoi
22. Ante la bandera – Julio Verne
23. Antes del Edén – Arthur C. Clarke
24. Antífonas – Sófocles
25. Antología Poética – Mario Benedetti
26. Apología – Socrates
27. Así habló Zaratustra – Friedrich Nietzsche
28. Autobiografía – San Ignacio de Loyola
29. Aventura de tres Rusos y tres Ingleses en el África Austral –
Julio Verne
30. Azul – Rubén Darío
31. Banquete -Platón
32. Beethoven – Maynard Solomon
33. Bestiario – Julio Cortazar
34. Bhagavad Gita – Srila Atulananda
35. Bodas de sangre – Federico García Lorca
36. Bosque Mitago – Robert Holdstock
37. Bóvedas de acero – Isaac Asimov
38. Brida – Paulo Coelho
39. Bruto o de los ilustres oradores – Marco Tulio Cicerón
40. Camino de Perfección – Santa Teresa de Jesús
41. Canto General – Pablo Neruda
42. Cantos de vida y esperanza – Rubén Darío
43. Carrie – Stephen King
44. Carta a su padre – Franz Kafka
45. Carta de una desconocida – Stefan Zweig
46. Cartas – Sor Juana Inés de la Cruz
47. Casamiento engañoso – Miguel de Cervantes Saavedra
48. Causa de muerte – Patricia D. Cornwell
49. Celoso estremeño – Miguel de Cervantes Saavedra
50. Cementerio de animales – Stephen King
51. Centurias – Michel de Nostradamus
52. Cien Años de Soledad – Gabriel García Márquez
53. Cien sonetos de amor – Pablo Neruda
54. Cinco semanas en globo – Julio Verne
55. Cita con Rama – Arthur C. Clarke
56. Claro de Tierra – Arthur C. Clarke
57. Como agua para chocolate – Laura Esquivel
58. Cómo se filosofa a martillazos – Friedrich Nietzsche
59. Compendio de la Historia Universal – César Cantú
60. Confesiones – San Agustín
61. Contacto – Carl Sagan
62. Cosmos – Carl Sagan
63. Crimen y castigo – Fedor Dostoiewski
64. Crítica de la razón pura – Emmanuel Kant
65. Crónica de una Muerte Anunciada – Gabriel García Márquez
66. Crónicas Vampiricas 1 – Entrevista con el Vampiro – Anne Rice
67. Crónicas Vampiricas 2 – Lestat el Vampiro – Anne Rice
68. Crónicas Vampiricas 3 – La reina de los condenados – Anne Rice
69. Cuento de navidad – Charles Dickens
70. Cuentos – Charles Perrault
71. Cuentos de Canterbury – Geoffrey Chaucer
72. Cuentos de Eva Luna – Isabel Allende
73. Cuentos del planeta tierra – Arthur C. Clarke
74. Cultura y sociedad – Herbert Marcuse
75. Cumbres borrascosas – Emily Brontë
76. David Copperfield – Charles Dickens
77. De amor y de muerte – Isabel Allende
78. De la ira – Lucio Anneo Séneca
79. De la tierra a la luna – Julio Verne
80. De los nombres de Cristo – Fray Luis de León
81. De mi vida – Friedrich Nietzsche
82. Decamerón – Giovanni Boccaccio
83. Del sentimiento trágico de la vida – Miguel de Unamuno
84. Desde mi Celda – Gustavo Adolfo Bécquer
85. Devoradores de cadáveres – Michael Crichton
86. Diálogo en el infierno entre Maquiavelo y Montesquieu – Maurice
Joly
87. Diario del Che en Bolivia – Ernesto Guevara
88. Diccionario del ****** – Ambrose Bierce
89. Dios y el Estado – Mijail Bakunin
90. Discurso del método – René Descartes
91. Discurso sobre el origen de la desigualdad – Juan Jacobo
Rousseau
92. Discurso sobre las ciencias y las artes – Juan Jacobo Rousseau
93. Divina comedia – Dante Alighieri
94. Doce cuentos peregrinos – Gabriel García Márquez
95. Dolores Claiborne – Stephen King
96. Don Juan Tenorio – José Zorrilla y Moral
97. Don Quijote de la Mancha – Miguel de Cervantes Saavedra
98. Dos años de vacaciones – Julio Verne
99. Drácula – Abraham Stoker
100. Dragón Rojo – Thomas Harris
101. Ecce homo – Friedrich Nietzsche
102. Edipo rey – Sófocles
103. El universo en una cáscara de nuez – Stephen Hawking
104. El abanico de Lady Windermere – Oscar Wilde
105. El adolecente – Fedor Dostoieswski
106. El ahorcado de Saint Pholien – Georges Simenon
107. El alcalde de Zalamea – Pedro Calderón de la Barca
108. El aleph – Jorge Luis Borges
109. El alquimista – Paulo Coelho
110. El Amor en los Tiempos del Cólera – Gabriel García Márquez
111. El anticristo – Friedrich Nietzsche
112. El Arte de amar – Ovidio
113. El arte de la guerra – Sun Tzu
114. El artista del hambre – Franz Kafka
115. El Búho que no podía ulular – Robert Fisher y Beth Kelly
116. El caballero de la armadura oxidada – Robert Fisher
117. El cartero – Charles Bukowski
118. El Cartero de Neruda – Antonio Skármeta
119. El castillo de los Cárpatos – Julio Verne
120. El cazador de jaguares – Lucius Shepard
121. El cazador de sueños – Stephen King
122. El centro del infierno – Héctor Álvarez Murena
123. El Cerebro de Broca – Carl Sagan
124. El Ciclo del Hombre Lobo – Stephen King
125. El conde de Montecristo – Alejandro Dumas
126. El Contrato Social – Juan Jacabo Rousseau
127. El Corán – Mahoma
128. El Coronel no Tiene Quien le Escriba – Gabriel García Márquez
129. El Cuento de la Isla Desconocida – José Saramago
130. El Divino Narciso – Sor Juana Inés de La Cruz
131. El Dr. Jekyll y Mr. Hyde – Robert L. Stevenson
132. El drama de la iluminación cósmica en el sutra del loto blanco –
Sangharákshita
133. El Escarabajo de Oro – Edgar Allan Poe
134. El fantasma de Canterville – Oscar Wilde
135. El Fantasma de la ópera – Gaston Leroux
136. El faro del mundo – Julio Verne
137. El fin de la infancia – Arthur C. Clarke
138. El forastero misterioso – Mark Twain
139. El fugitivo – Stephen King [seudónimo Richard Bachman]
140. El gran cambiazo – Roald Dahl
141. El Gran Libro de los Chakras
142. El grillo del hogar – Charles Dickens
143. El Guardavía – Charles Dickens
144. El hacedor – Jorge Luis Borges
145. El Hombre bicentenario – Isaac Asimov
146. El hombre de la mascara de hierro – Alejandro Dumas
147. El hombre invisible – Herbert George Wells
148. El hombre que corrompió Hadleyburg – MarkTwain
149. El huésped – Albert Camus
150. El informe de Brodie – Jorge Luis Borges
151. El intruso – Janet Dailey
152. El jardín de Rama – Arthur C. Clarke y Gentry Lee
153. El Jugador – Fédor Dostoievski
154. El Kybalion – Tres Iniciados
155. El libro de arena – Jorge Luis Borges
156. El Libro de las Emociones – Laura Esquivel
157. El libro del Fenshui
158. El llano en llamas – Juan Rulfo
159. El loco – Gibrán Khalil Gibrán
160. El malestar en la cultura – Sigmund Freud
161. El martillo de Dios – Arthur C. Clarke
162. El Milagro más Grande del Mundo – Og Mandino
163. El mito de la caverna – Platón
164. El mundo pérdido – Arthur Conan Doyle
165. El mundo perdido – Michael Crichton
166. El nacimiento de la tragedia – Friedrich Nietzsche
167. El Nombre de la Rosa – Umberto Eco
168. El origen de las especies – Charles Darwin
169. El otoño del patriarca – Gabriel García Márquez
170. El Padrino – Mario Puzo
171. El paraíso pérdido – John Milton
172. El Patriotismo – Mijail Bakunin
173. El Péndulo De Foucault – Umberto Eco
174. El plan infinito – Isabel Allende
175. El príncipe – Nicolás Maquiavelo
176. El príncipe y el mendigo – Mark Twain
177. El principito – Antoine De Saint-Exupéry
178. El profeta – Gibrán Khalil Gibrán
179. El pueblo aéreo – Julio Verne
180. El regreso del Rey Arturo – Molly Cochran
181. El resplandor – Stephen King
182. El retrato de Dorian Gray – Oscar Wilde
183. El rey Lear – William Shakespeare
184. El sabueso de los Baskerville – Arthur Conan Doyle
185. El secreto de Wilhelm Storitz – Julio Verne
186. El Señor de las moscas – William Goldin
187. El Señor de los Anillos – El Hobbit – J.R.R. Tolkien
188. El Señor de los Anillos – El Retorno del Rey I – J.R.R. Tolkien
189. El Señor de los Anillos – El Retorno del Rey II – J.R.R.
Tolkien
190. El Señor de los Anillos – El Silmarillion – J.R.R. Tolkien
191. El Señor de los Anillos – La Comunidad del anillo I – J.R.R.
Tolkien
192. El Señor de los Anillos – La Comunidad del anillo II – J.R.R.
Tolkien
193. El Señor de los Anillos – Las Dos Torres I – J.R.R. Tolkien
194. El Señor de los Anillos – Las Dos Torres II – J.R.R. Tolkien
195. El Señor del Tiempo 1 – El iniciado – Louise Cooper
196. El Señor del Tiempo 2 – El Proscrito – Louise Cooper
197. El Señor del Tiempo 3 – El Orden y el caos – Louise Cooper
198. El signo de los cuatro – Arthur Conan Doyle
199. El silencio de los inocentes – Thomas Harris
200. El sol desnudo – Isaac Asimov
201. El sueño del príncipe – Fedor Dostoiewski
202. El Talisman – Stephen King
203. El tulipán negro – Alejandro Dumas
204. El Túnel – Ernesto Sábato
205. El último acto – Roald Dahl
206. El umbral de la noche – Stephen King
207. El vendedor más grande del mundo – Og Mandino
208. El viento del sol – Arthur C. Clarke
209. El visitante – Roald Dahl
210. El Vizconde de Bragelonne – Alejandro Dumas
211. Emilio o la Educación – Juan Jacobo Rosseau
212. En las profundidades – Arthur C. Clarke
213. Encuentro en Zaratustra – H.Beam Piper
214. Enrique IV – William Shakespeare
215. Ensayos – José Ortega y Gasset
216. Ensayos – Octavio Paz
217. Entremeses – Miguel de Cervantes Saavedra
218. Envida – Virgilio
219. Equilibrio de poder – Tom Clancy
220. Erasmo de Rotterdam, Triunfo y Tragedia – Stefan Zweig
221. Esfera – Michael Crichton
222. Espanto en las alturas -Arthur Conan Doyle
223. Estado de sitio – Tom Clancy
224. Este es mi pueblo – Albert Einstein
225. Estudio escarlata – Arthur Conan Doyle
226. Ética a Nicomaco – Aristóteles
227. Eugenia de Franval – Marques de Sade
228. Eutidemo -Platón
229. Evangelios apócrifos – Varios
230. Fábulas – Félix M. Samaniego
231. Fábulas Libertinas – La Fontaine
232. Fantomas contra los vampiros multinacionales – Julio Cortazar
233. Fausto – Goethe W. Johan
234. Ficciones – Jorge Luis Borges
235. Ficciones 1956 – Jorge Luis Borges
236. Fouché – Stefan Zweig
237. Frankenstein – Mary W. Shelley
238. Fronteras del infinito – Lois McMaster Bujold
239. Fuente ovejuna – Lope de Vega
240. Genealogía de la moral – Friedrich Nietzsche
241. Germinal – Emilio Zola
242. Grandes esperanzas – Charles Dickens
243. Guerra y paz – León Tolstoi
244. Guillermo Tell – Federico Schiller
245. Hacia la Fundación – Isaac Asimov
246. Hamlet – William Shakespeare
247. Hannibal – Thomas Harris
248. Harén – Diane Carey
249. Harry Potter y el Cáliz de fuego – J.K. Rowling
250. Harry Potter y el Prisionero de Azkaban – J.K. Rowling
251. Harry Potter y la Cámara secreta – J.K. Rowling
252. Harry Potter y la Piedra filosofal – J.K. Rowling
253. Hija de la Fortuna – Isabel Allende
254. Historia de dos ciudades – Charles Dickens
255. Historia de la estupidez humana – Paul Tabori
256. Historia de la vida del buscón – Francisco de Quevedo
257. Historia de un buen Brama – Voltaire
258. Historia del Tiempo – Stephen Hawking
259. Historia general de las Indias – Francisco López de Gómara
260. Historia universal de la infamia – Jorge Luis Borges
261. Historias de cronopios y famas – Julio Cortazar
262. Historias de fantasmas – Charles Dickens
263. Historias Fantasticas – Stephen King
264. Hölderlin, Kleist y Nietzsche – Lucha contra el demonio
265. Homero y la filología clásica – Friedrich Nietzsche
266. Huckleberry Finn – Mark Twain
267. Insomnia – Stephen King
268. Intriga y seducción – Jennifer Blake
269. Jane Eyre – Charlotte Brontë
270. Jaque al poder – Tom Clancy
271. Jesús, El hijo del hombre – Gibrán Khalil Gibrán
272. Juan Salvador Gaviota – Richard Bach
273. Justine – Marqués de Sade
274. La Amante Cautiva – Shirlee Busbee
275. La Araucana – Don Alonso de Ercilla y Zúñiga
276. La cabaña del tio Tom – Harriet B. Stowe
277. La Carga del Escepticismo – Carl Sagan
278. La carta robada – Edgar Allan Poe
279. La casa de los espíritus – Isabel Allende
280. La catacumba nueva – Arthur Conan Doyle
281. La caverna – José Saramago
282. La Caza de Hackers – Bruce Sterling
283. La caza del Octubre Rojo – Tom Clancy
284. La Celestina – Fernando de Rojas
285. La chica que amaba a Tom Gordon – Stephen King
286. La ciencia Eterna – Tantra
287. La ciudad de las bestias – Isabel Allende
288. La ciudad y las estrellas – Arthur C. Clarke
289. La Dama de las camelias – Alejandro Dumas
290. La espada rota – Poul Anderson
291. La Ética – Aristóteles
292. La expedición – Stephen King
293. La Fierecilla domada – William Shakespeare
294. La fiesta del chivo – Mario Vargas Llosa
295. La Galatea – Miguel de Cervantes Saavedra
296. La Gitanilla – Miguel de Cervantes Saavedra
297. La Gran Moral – Aristóteles
298. La Granja de Animales – George Orwell
299. La Granja De Cuerpos – Patricia D. Cornwell
300. La Guerra de Guerrillas – Ernesto Guevara
301. La guerra de los mundos – H.G. Wells
302. La historia de los Silmarils – J.R.R. Tolkien
303. La Ilíada – Homero
304. La Importancia de llamarse Ernesto – Oscar Wilde
305. La increíble y triste historia de la cándida Eréndira – Gabriel
García Márquez
306. La interpretació n de los sueños – Sigmund Freud
307. La isla del tesoro – Robert L. Stevenson
308. La Larga Marcha – Stephen King
309. La mala hora – Gabriel García Márquez
310. La máquina del tiempo – Herbert George Wells
311. La memoria de Shakespeare – Jorge Luis Borges
312. La metamorfosis – Franz Kafka
313. La mitad siniestra – Stephen King
314. La Momia – Anne Rice
315. La muerte de Lord Edgware – Agatha Christie
316. La mujer del collar de terciopelo (mil y un fantasmas) –
Alejandro Dumas
317. La Nausea – Jean Paul Sartre
318. La niebla – Stephen King
319. La niebla – Stephen King
320. La nueva Atlántida – Francis Bacon
321. La odisea – Homero
322. La piel de Zapa – Honorato de Balzac
323. La Quinta Montaña – Paulo Coelho
324. La rebelión de los brujos – L. Pauweds y J. Bergier
325. La Rebelión de Lucifer – J.J. Benitez
326. La Red Del Cazador – Helen MacInnes
327. La reina Margot – Alejandro Dumas
328. La républica – Platón
329. La resaca – Robert L. Stevenson
330. La Rosa de España – Shirlee Busbee
331. La rueda del tiempo 1 – El ojo del mundo – Robert Jordan
332. La rueda del tiempo 2 – El despertar de los héroes – Robert
Jordan
333. La Santa Biblia – Antiguo Testamento
334. La Santa Biblia – Nuevo Testamento
335. La senda del perdedor – Charles Bukowsky
336. La tempestad – William Shakespeare
337. La tía Tula – Miguel de Unamuno
338. La torre oscura I – Stephen King
339. La torre oscura II – Stephen King
340. La torre oscura III – Las tierras baldías – Stephen King
341. La torre oscura IV – La bola de cristal – Stephen King
342. La tregua de basura – Katty Tyers
343. La vida es un sueño – Pedro Calderón de la Barca
344. La Vida Nueva – Dante Alighieri
345. La voz del maestro – Gibrán Khalil Gibrán
346. La vuelta al mundo en 80 días – Julio Verne
347. La zona muerta – Stephen King
348. Las arenas de Marte – Arthur C. Clarke
349. Las armas secretas – Julio Cortazar
350. Las aventuras de Sherlock Holmes – Arthur Conan Doyle
351. Las dos doncellas – Miguel de Cervantes Saavedra
352. Las guerras de los Judíos – Flavio Josefo
353. Las Indias negras – Julio Verne
354. Las manzanas – Agatha Christie
355. Las venas abiertas de América Latina – Eduardo Galeano
356. Lazarillo de Tormes – Anónimo
357. Leyendas – Gustavo Adolfo Bécquer
358. Leyes de Murphy
359. Libro de poemas – Federico García Lorca
360. Lituma en los Andes – Mario Vargas Llosa
361. Lobo Estepario – Hermann Hesse
362. Los Crímenes de la Rue Morge – Edgar Allan Poe
363. Los hermanos Karamazov – Fedor Dostoiewski
364. Los hombres son de Marte las mujeres son de Venus – John Gray
365. Los Hornos de Hitler – Olga Lengyel
366. Los miserables – Víctor Hugo
367. Los mundos perdidos – Clark Ashton Smith
368. Los secretos de corazón – Gibrán Khalil Gibrán
369. Los tigres de la Malasia – Emilio Salgari
370. Los tres mosqueteros – Alejandro Dumas
371. Los tres mosqueteros (continuación) – Alejandro Dumas
372. Los Viajes de Gulliver – Jonathan Swift
373. Lucky Starr y los anillos de Saturno – Isaac Asimov
374. Macbeth – William Shakespeare
375. Madame Bovery – Gustave Flaubert
376. Magallanes – Stefan Zweig
377. Magia Prohibida – Jo Beverly
378. Maleficio – Stephen King [seudónimo Richard Bachman]
379. Manifiesto del partido comunista – Carl Marx y Federich Engels
380. Manual de cortesía sexual – Lord Badmigton
381. Manual del guerrero de la luz – Paulo Coelho
382. María – Jorge Isaacs
383. María Antonieta – Stefan Zweig
384. María Estuardo – Federico Schiller
385. Martín Fierro – José Hernández
386. Más allá del bien y del mal – Friedrich Nietzsche
387. Memorias del subsuelo – Fedor Dostoieswki
388. Metafísica – Aristóteles
389. Mi Lucha -Adolfo Hitler
390. Middlemarch – George Eliot
391. Mientras escribo – Stephen King
392. Miguel Strogoff – Julio Verne
393. Mil y una noches – Anónimo
394. Mis creencias – Albert Einstein
395. Misery – Stephen King
396. Montado en la bala – Stephen King
397. Moral a Eudemo – Aristóteles
398. Muchas Vidas Muchos Maestros – Brian Weiss
399. Mujercitas – Louisa May Alcott
400. Naufragios – Alvar Nuñez Cabeza de Vaca
401. Niebla – Miguel de Unamuno
402. Noches Blancas – Fedor Dostoiewski
403. Noticia de un secuestro – Gabriel García Márquez
404. Novelas Ejemplares – Miguel de Cervantes Saavedra
405. Nuestra señora de París – Victor Hugo
406. Ojos de perro azul – Gabriel García Márquez
407. Oliver Twist – Charles Dickens
408. Otello – William Shakespeare
409. Parque Jurásico – Michael Crichton
410. Paula – Isabel Allende
411. Pedro Páramo – Juan Rulfo
412. Pepita Jiménez – Juan Valera
413. Perra – Roald Dahl
414. Persiles y Sigismunda – Miguel De Cervantes Saavedra
415. Pesadillas y Alucinaciones – Stephen King
416. Peter Pan – J.M. Barrie
417. Poemas – Federico García Lorca
418. Poemas – Rubén Darío
419. Poética – Aristóteles
420. Política – Aristóteles
421. Posesión – Stephen King [seudómino Richard Bachman]
422. Post-mortem – Patricia D. Cornwell
423. Posturas del Kamasutra – Anónimo
424. Prisionera del deseo – Jennifer Blake
425. Profesías de Nostradamus – Michel de Nostradamus
426. Proyecciones Astrales
427. Pulp – Charles Bukowski
428. Punto crítico – Michael Crichton
429. Quien se ha llevado mi queso – Johnson Spencer
430. Rabia – Stephen King [seudónimo Richard Bachman]
431. Rama II – Arthur C. Clarke y Gentry Lee
432. Rama revelada – Arthur C. Clarke y Gentry Lee
433. Rayuela – Julio Cortazar
434. Recopilación – Antón Chejov
435. Relato de un naufrago – Gabriel García Márquez
436. Rescate en el tiempo – Michael Crichton
437. Resurrección – León Tolstoi
438. Retrato en sepia – Isabel Allende
439. Ricardo II – William Shakespeare
440. Rimas – Gustavo Adolfo Bécquer
441. Robin Hood – Anónimo
442. Robinson Crusoe – Daniel Defoe
443. Rojo y Negro – Stendhal
444. Romancero Gitano – Federico García Lorca
445. Romeo y Julieta – William Shakespeare
446. Sandokan – Emilio Salgari
447. Seis problemas para don Isidro Parodi – Jorge Luis Borges
448. Seis sombreros para pensar – Edward de Bono
449. Serenata – Jennifer Blake
450. Sexo para uno – Betty Dodson
451. Sherlock Holmes – Arthur Conan Doyle
452. Siddharta – Hermann Hesse
453. Sobre héroes y tumbas – Ernesto Sábato
454. Sobre la teoría de la relatividad – Albert Einstein
455. Sociología de la Religión – Max Weber
456. Sócrates – Platón
457. Sol naciente – Michael Crichton
458. Solares – Stanislaw Lem
459. Sombras del Imperio – Steve Perry
460. Sonetos de amor – William Shakespeare
461. Star Wars – El resurgir de la fuerza oscura – Timothy Zahn
462. Star Wars – Heredero del Imperio – Timothy Zahn
463. Star Wars – la última orden – Timothy Zahn
464. Sueño de una noche de San Juan – William Shakespeare
465. Sueño de una noche de verano – William Shakespeare
466. Sueños – Don Francisco Quevedo
467. Tao Te King – Lao Tse
468. Tarzán el señor de la jungla – Edgar Rice Burroughs
469. Teoría y praxis – Emmanuel Kant
470. Testamento – Michel de Nostradamus
471. Tierras vírgenes – Joseph Rudyard Kipling
472. Todos los fuegos el fuego – Julio Cortazar
473. Tom Sawyer – Mark Twain
474. Tótem y Tabú – Sigmund Freud
475. Trato de Argel – Miguel de Cervantes Saavedra
476. Tres muertes – León Tolstoi
477. Tus zonas erróneas – Dyer Wayner
478. Ulises – James Joyce
479. Un Ambiente Extraño – Patricia D. Cornwell
480. Un descenso al maelstrom – Edgar Allan Poe
481. Un Tal Lucas – Julio Cortazar
482. Un yanki en la corte del rey Arturo – Mark Twain
483. Una Ciudad Flotante – Julio Verne
484. Utopía – Tomas Moro
485. Veinte mil leguas de viaje submarino – Julio Verne
486. Veinte poemas de amor y una canción desesperada – Pablo Neruda
487. Venus Prime I – Maxima tension – Arthur C. Clarke y Paul Preuss
488. Venus Prime II � Torbellino – Arthur C. Clarke y Paul Preuss
489. Venus Prime IV – Arthur C. Clarke y Paul Preuss
490. Veronika decide morir – Paulo Coelho
491. Viaje a la Luna – Federico Garcia Lorca
492. Viaje al centro de la tierra – Julio Verne
493. Viaje de un naturalista – Charles Darwin
494. Viajes -Marco Polo
495. Vida de la Virgen María – Sor María de Jesús
496. Vivir para contarla – Gabriel García Márquez
497. William Wilson – Edgar Allan Poe
498. X-Files Chinga – Stephen King y Chris Carter
499. Yo acuso – Emilio Zola
500. Yo, Robot – Isaac Asimov

Descarga:
http://rapidshare.com/files/74723594/500_Libros_By_Eduman.part1.rar
http://rapidshare.com/files/74943428/500_Libros_By_Eduman.part2.rar
http://rapidshare.com/files/74790769/500_Libros_By_Eduman.part3.rar

Escrito con el Navegador Flock

Tags: ,

30 innovaciones que cambiaron el mundo en 30 años

30 innovaciones que cambiaron el mundo en 30 añosEl Nightly Business Report, un programa de negocios que se emite regularmente por la cadena PBS (Public Broadcasting Service) realizó una investigación con Knowledge@Wharton para seleccionar las 30 innovaciones más importantes de los últimos 30 años.

La lista, en orden de importancia:

1. Internet, banda ancha y World Wide Web (navegador y html)
2. computadora personal (PC) y laptop
3. Teléfonos celulares
4. E-mail
5. ADN y mapeo del genoma humano
6. Imagen por resonancia magnética
7. Microprocesadores
8. Fibra óptica
9. Software de oficina (hojas de cálculo y procesadores de palabras)
10. Cirugía no invasiva con láser y robótica (laparoscopía)
11. Software y servicios de fuente abierta (como Linux y Wikipedia)
12. Diodos emisores de luz
13. Pantalla de cristal líquido (LCD)
14. Sistemas sistemas de posicionamiento global (GPS(
15. Compra online/ecommerce/remates online (ej. eBay)
16. Compresión de archivos mediales (jpeg, mpeg, mp3)
17. Microfinanzas
18. Energía solar fotovoltaica
19. Turbinas eólicas a gran escala
20. Redes sociales vía Internet
21. Interfaz gráfica (GUI)
22. Fotografía/videografía digital
23. Identificación por radiofrecuencia (RFID) y aplicaciones, como etiquetas pasivas
24. Plantas genéticamente modificadas
25. Bio combustibles
26. códigos de barra y escáners
27. Cajeros automáticos (ATM)
28. Stents
29. Memoria flash SRAM (memoria estática de acceso aleatorio)
30. Medicamentos anti retrovirales para el SIDA

30 innovaciones que cambiaron el mundo en 30 años

Escrito con el Navegador Flock

Tags:

Python, manuales y tutoriales

http://es.diveintopython.org/index.html

Diez películas para educar a tus hijos como pequeños geeks

Diez películas para educar a tus hijos como pequeños geeks

Del departamento de Eduacación para el Geekerío, una lista de diez películas geek para educar a tus hijos adecuadamente, 10 Geeky Movies to Raise Your Kids On:

  1. La Guerra de las Galaxias, pero como debe ser empezando por lo que ahora se conoce como el Episodio IV.
  2. Harry Potter y la piedra filosofal, como una magnífica introducción a la literatura fantástica.
  3. The Last Starfighter, que aparte de tener unas imágenes creadas por ordenador nada malas para la época demostraba por qué puede ser útil ser bueno con los videojuegos.
  4. Mi vecino Totoro, para intentar escapar un poco de lo que se produce en Hollywood.
  5. Time Bandits, otra gran historia de un niño marginado que se sale con la suya.
  6. El Cristal Oscuro, otra película fantástica fantástica para niños aunque los personajes sean todos marionetas.
  7. Juegos de guerra, que por supuesto no podía faltar en esta lista ya que además ocupa el puesto #2 en nuestro Top 10 de películas geek.
    Juegos de Guerra / War Games
  8. Chitty Chitty Bang Bang. Inventores (medio) locos, piratas, castillos… Basada en un libro de Ian Fleming, el padre de James Bond.
  9. Los Goonies, una banda de amigos que tienen que ingeniárselas para salvar su barrio y de paso encontrar el tesoro de un malvado pirata.
  10. Regreso al futuro, una película de viajes en el tiempo que hasta se puede entender. Y las otras dos de la serie tampoco están mal.

Y aunque no tengas hijos también puedes verlas en plan maratón para el próximo fin de semana 😉

Otros listados de películas de ciencia ficción:

Escrito con el Navegador Flock

Tags: , ,

Cómo Pensar como un Informático: El aprender con Python

Cómo Pensar como un Informático: El aprender con Python

Cómo Pensar como un Informático

El aprender con Python
2da Edición

por Jeffrey Elkner, Allen B. Downey y Chris Meyers

ilustrado por Udit Bhatnager y Chris Schmeelk

traducido por Gregorio Inda

Prefacio

Capítulo 1El camino del programa

Capítulo 2
Variables, expresiones y sentencias

Capítulo 3Funciones

Capítulo 4Condicionales

Capítulo 5Funciones productivas

Capítulo 6Iteración

Capítulo 7Cadenas

Licencia de Documentación Libre de GNU

Indice

Descargue el archivo fuente tipo tar comprimido con gzip en formato de Lore
y HTML aquí.

Blogged with the Flock Browser

Tags: , , , ,

Tests sobre componentes del PC

El tinglado » Tests sobre componentes del PC

Blogged with the Flock Browser

Tags:

Cómo y por qué enseñar programación a niños?


Técnica de Solución de Problemas Simulando una Computadora.

2. Fundamentos Teóricos según Piaget sobre el Desarrollo Cognositivo del Niño.


En éste capítulo se pretende dar una explicación breve y general sobre el desarrollo cognoscitivo que presenta el niño, de acuerdo a la teoría de desarrollo que marca Piaget.

Jean Piaget dedicó varios de sus trabajos al estudio de las matemáticas y por ande la lógica. Tales estudios van siguiendo un fundamento teórico, el cual es parte de las investigaciones sobre el desarrollo de las estructuras cognoscitivas en el niño.

El niño desde que nace, va desarrollando estructuras cognoscitivas las cuales se van configurando por medio de las experiencias.

El pensamiento del niño sigue su crecimiento, llevando a cabo varias funciones especiales de coherencia como son las de clasificación, simulación, explicación y de relación.

Sin embargo estas funciones se van rehaciendo conforme a las estructuras lógicas del pensamiento, las cuales siguen un desarrollo secuenciado, hasta llegar al punto de la abstracción. Es en este momento, cuando el pensamiento del niño trabajaría el campo de las matemática, y que su estructura cognoscitiva puede llegar a la comprensión de la naturaleza hipotética deductiva.

Piaget concibe la inteligencia como adaptación al medio que nos rodea. Esta adaptación consiste en un equilibrio entre dos mecanismos indisociables: la acomodación y la asimilación.

El desarrollo cognoscitivo comienza cuando el niño va realizando un equilibrio interno entre la acomodación y el medio que lo rodea y la asimilación de esta misma realidad a sus estructuras. Este desarrollo va siguiendo un orden determinado, que incluye cuatro periodos de desarrollo, el senso-motor, el preconcreto, el concreto y el formal, cada uno de estos periodos está constituido por estructuras originales, las cuales se irán construyendo a partir del paso de un estado a otro. «Este estadio constituye, pues, por las estructuras que lo definen, una forma particular de equilibrio y la evolución mental se efectúa en el sentido de una equilibración más avanzada».

El ser humano estaría siempre en constante desarrollo cognoscitivo, por lo tanto cada experiencia nueva consistirá en reestablecer un equilibrio, es decir, realizar un reajuste de estructuras.

Ahora bien, ¿cuál es el papel que juegan la acomodación y la asimilación para poder llegar a un estado de equilibrio?. El niño, al irse relacionando con su medio ambiente, irá incorporando las experiencias a su propia actividad, y es aquí donde interviene el mecanismo de la asimilación puesto que el niño asimilaría el medio externo a sus estructuras cognoscitivas ya construidas, sin embargo las tendrá que reajustar con las experiencias ya obtenidas, lo que provoca una transformación de estructuras, es decir, se dará el mecanismo de la acomodación.

No obstante, para que el pensamiento pase a otros niveles de desarrollo, deberá presentarse un tercer mecanismo, se trata del «equilibrio», el cual es da el balance que surge entre el medio externo y las estructuras internas del pensamiento.

La asimilación de los objetos externos es progresiva y se realiza por medio de todas las funciones del pensamiento, a saber la percepción, la memoria, la inteligencia, práctica, el pensamiento intuitivo y la inteligencia lógica. Todas estas asimilaciones que implican una acomodación, van generando una adaptación al equilibrio, lo cual conlleva una adaptación cada vez más adecuada al medio ambiente.

Al conocer la evolución de las estructuras cognoscitivas se torna más fácil comprender el papel que juegan los mecanismos de adaptación y acomodación en el desarrollo educativo.

Piaget marcó el inicio de las etapas de desarrollo con el periodo senso-motriz, cada periodo está dado por seis estudios. Cada uno de ellos consta de ciertas características las cuales se tornan cada vez más complejas.

El niño pequeño, desde que nace, mediante percepciones de movimientos irá entrando poco a poco a una asimilación sensorio-motriz. Cuando nace, el primer movimiento que presenta es el reflejo de succión, el cual presentará un avance progresivo, es decir, en los primeros días, cuando la madre comienza a darle pecho, el presentará pequeñas problemas para succionar, sin embargo a través de algunos días irá asimilando dicha acción.

Al llegar a las dos o tres semanas el niño comenzará a presentar lo que Piaget llamó «inteligencia práctica» que se hace exclusivamente en la manipulación de objetos. Esta manipulación le permitirá percibir movimientos, los que estarán organizadas en «esquemas» de acción. Mientras el niño siga manejando los objetos y experimentando diversas conductas las que harán que se desarrollen y multipliquen los esquemas de acción, sin embargo no se debe perder de vista que esta asimilación está en un nivel sensorio-motriz.

En el transcurso del primer año, el niño presentará un marcado egocentrismo, esto provoca que la causalidad vaya implícita en su propia actividad de niño, no hay relación entre un acontecimiento con otro, no obstante, con base en la experiencia, podría comprobar que existe una pausa para cada suceso. Hablando con respecto al nivel del niño, se da cuenta de que cuando tira de un mantel y se encuentra algún objeto encima de éste, el objeto caerá al suelo, o si jala un cordón cuyo extremo tiene una campana sabrá que la campana sonará. Por lo tanto, el niño reconoce las relaciones de causalidad ante su objetivo y localiza, pues, las causas»

Un suceso importante en el desarrollo cognoscitivo del niño es la aparición del lenguaje, el niño utilizará la expresión verbal para poder relatar sus acciones, lo cual conlleva otros acontecimientos también importantes. Uno de ellos es el inicio de la socialización. Este es el momento en que el niño se relacionará más cercanamente con el medio social.

Otro suceso interesante presentado también en esta etapa es la interiorización de la palabra, es decir, que el pequeño tendrá en la mente su propia interpretación de una palabra, hasta llegar a interiorizar acciones, lo cual hace que se genera el pensamiento.

De las dos a los siete años de edad el niño entrará a la etapa pre-operacional concreta presentando dos formas de pensamiento formadas por meras asimilaciones, es decir, que el pensamiento va percibiendo acciones pero sin incorporarlas a nuevas estructuras y la siguiente forma es cuando el pensamiento formará esquemas, obtenidos a través de la incorporación de nuevas estructuras, de este modo el niño se irá adaptando a la realidad. Este último tipo de pensamiento se impondrá ante el pensamiento anterior y poco a poco llegar a estructurarse el pensamiento formal.

A medida que el niño va teniendo experiencias concretas y vaya manipulando su medio ambiente, presentará un comportamiento pre-lógico. Piaget nos dice que «el niño utilizará la lógica por el mecanismo de la intuición, simple interiorización de las percepciones y los movimientos en forma de imágenes representativas»

A partir de los siete u ocho años de edad, el niño dejará de actuar impulsivamente ante los nuevos acontecimientos, y de creer indiscriminadamente todo relato, suplirá esta conducta por un acto de reflexión.

El niño no guardará satisfecho ante las respuestas recibidas contra cualquier pregunta que haga, es en este momento cuando el niño se detendrá a pensar antes de realizar cualquier acción. El niño realizará un diálogo interno consigo mismo, es precisamente lo que Piaget llama «reflexión».

El ejercicio mental que se realiza al diseñar algoritmos ayuda al desarrollo del proceso de reflexión y que el construir un algoritmo de alguna escena el niño se detendrá a pensar en la sucesión de una serie de pasos que integran tal escena.

Ahora bien, a partir de la edad anteriormente mencionada, también el niño se encuentra en pleno desarrollo de la sensibilización, dejando atrás el egocentrismo, esto permitirá que surja la capacidad para construir nuevos esquemas. Esto último es realmente importante puesto que comienza a surgir los albores de la infancia.

Piaget nos dice que «la lógica constituye precisamente el sistema de relaciones que permite la coordinación de instintos de vida entre todos los puntos de vista correspondientes a individuos distintos y terminan donde los que corresponden a percepciones e intuiciones sucesivas del mismo individuo»  Y es precisamente la lógica lo que constituye la construcción de algoritmos.

El avance que va presentando el pensamiento, en relación con las etapas anteriores, es evidente. Sin embargo no surge simplemente por el hecho de pasar de un año a otro, sino que se tienen que sentar algunos conceptos básicos como son los de clasificación, relación, explicación, relación y contaminación, las cuales se presentan en el momento en que el pensamiento puede deducir el punto de partida de una acción.

Por ejemplo, podemos decir que el niño ha adquirido el concepto de conservación cuando sabe que el material puede sufrir transformaciones, conservando el mismo volumen y el espacio. Si le presentaran al niño dos vasos con agua y se le incorpora a uno de éstos de estas un terrón de azúcar cuando el niño pruebe que el terrón sigue en el vaso, a pesar de que no se vea, es que el pensamiento del niño tiene la noción de la conservación.

Los demás conceptos también los va adquiriendo poco a poco, manejando, y por ende, conociendo su medio ambiente.

En el transcurso de los ocho a los diez años sucede que el niño entre a la etapa de las operaciones concretas, donde poco a poco irá presentando un desarrollo cognoscitivo cada vez más profundo.

A partir de una serie de operaciones, el niño llega a otro nivel de pensamiento, los problemas que se le presentaban en la etapa anterior, ahora son difícilmente resueltas gracias a las interiorizaciones. Estas mismas dirigen el pensamiento a una forma general de equilibrio y se comenzarán a formar como se dijo anteriormente, otra serie de operaciones como son: «reuniones y disociaciones de clases, clasificación y almacenamiento de relaciones, variaciones, correspondencias»

No obstante que exigen una variedad muy rica de operaciones en esta etapa, no se debe perder de vista que el niño así se encuentra en la etapa concreta, es decir, que el campo de acción del niño es muy limitado puesto que sólo actuará sobre los objetos y no sobre hipótesis o enunciados verbales. Sin embargo, al realizar una serie de ejercicios presentados en forma concreta, el niño podrá ejercitar su pensamiento para poder llegar a otro modo de razonamiento con base en voces firmes. Llegando así a la última etapa de desarrollo, la etapa formal, donde el pensamiento actúa en un plano hipotético-deductivo.

La serie de ciclos de los que se habló con anterioridad, se refieren a las técnicas de solución de problemas, es decir, a la proposición de algoritmos, los cuales se podrán enseñar en la etapa de las operaciones concretas. En esta etapa los algoritmos se presentan en forma gráfica y formados por pocas acciones de tal forma que el niño vaya familiarizándose con otro tipo de ejercicios. A continuación se describe la etapa séptima en la que el niño podría aprender las estrategias de resolución de problemas.

Séptima Etapa: en la que el Niño podrá Aprender la Técnica para Realizar Algoritmos (Capacidad de Abstracción).


El pensamiento del niño funciona de igual manera que el del adulto, inclusive presenta las mismas funciones. Sin embargo, las estructuras lógicas que configuran a estas son susceptibles de desarrollo y variación.

Es importante destacar que dentro de la teoría Piagetiana, y con base en sus investigaciones, se llega a concluir que el pensamiento está compuesto por estructuras y estas se encuentran determinadas por un orden rígido de solución, por el cual cada etapa empieza en un momento determinado y ocupa un periodo preciso en la vida del niño.

Piaget nos dice que «cada etapa, por la que al ser humano pasa tiene distintas características, correspondientes al nivel de desarrollo.

Desde los primeros años de edad del niño hasta los trece o catorce años encontramos una manifiesta transformación del pensamiento al formular una pregunta a los niños normales, uno pequeño y otro mayor, se puede hacer una comparación entre ambas respuestas y notaremos claramente un grado más alto de maduración en el niño mayor. Ahora bien, al igual que las respuestas espontáneas de los más niños, también la resolución de diversos problemas dependen de la edad.

Hablando en términos generales, todos los problemas pueden tener distintos grados de complicación, pueden ir delo más sencillo a lo más complejo. Sin embargo, para llega a la solución de éstos se requiere tener una visión general del problema a resolver. Al enseñar al niño un «todo de resolución de problemas», que es lo que se pretende en el curso, se tiene que considerar la edad óptima en que el niño puede legar a un grado de generalidad con respecto a un problema.

Retomando la teoría de Piaget, se tiene que la etapa donde se presentan las características requeridas para seguir el método de resolución de problemas, es la etapa de pensamiento concreto.

Sin embargo es de gran importancia describir las características que presentó la etapa de desarrollo concreta, ya que toda estructura cognoscitiva que caracteriza a cada estadio no surge dela nada, sino de una organización anterior.

De este modo podemos apreciar como el pensamiento del niño, poco apoco, va incorporando todo tipo de esquemas cognoscitivos, hasta llegar a realizar operaciones formales.

A partir de que el niño entra en la fase de las operaciones concretas, «logrará percibir un hecho desde varios puntos de vista, y esto es lo que hace que el niño adquiera conciencia de la reversibilidad, la cual es esta posibilidad permanente de regresar al punto de partida de la operación dada».  El niño alcanza un nuevo nivel de pensamiento y es en este elemento cuando el niño entra al nivel operacional, donde adquiere la capacidad mental de ordenar y relacionar la experiencia como un todo organizado.

Es importante señalar que los resultados que se obtuvieron en el curso se puede apreciar que los niños entre once y trece años presentan mayor facilidad para acomodar un algoritmo en desorden, lo cual confirma los principios anteriormente señalados.

Cuando el pensamiento del niño entra en el campo de las operaciones concretas, «sucede que las estructuras cognoscitivas se van incorporando hasta alcanzar un nivel de verdadera generalidad, fe este modo el pensamiento se prepara para que el niño alcance a ver el total de un problema dado y para llegar a cada nivel, realizará una serie de combinaciones. Estas combinaciones podemos concretarlas en las siguientes funciones:

«El pensamiento del niño:

Concibe la acción
Deduce la acción a seguir
Asociatividad, (El resultado dependerá del camino recorrido).
Reversibilidad, (Percibe Ia acción del final, al inicio del camino recorrido).
Una acción repetida no producirá nada nuevo.

De este modo el pensamiento de irá ejercitando para poder llegar a otro nivel de abstracción».

Sin embargo, todavía al inicio de la fase de las operaciones concretas, el pensamiento del niño, no llega a realizar operaciones propiamente reversibles, debido a que no tiene una visión completa de un acontecimiento, no ha encontrado el camino para reunir diversas acciones, percepciones y anticipaciones representativas.

Dentro de la etapa de las operaciones concretas, el pensamiento del niño, al ir realizando las combinaciones mencionadas se concentrará en reunir, unas con otras, las diversas acciones, percepciones y anticipaciones representativas, de tal forma que el pensamiento, las situará en un todo organizado. De este modo e puede apreciar que se ha llegado a un equilibrio, donde el niño comienza a seguir un acontecimiento desde el principio hasta llegar al final el mismo.Es decir, las acciones dejan de pasar de un estado perceptivo a otro, dando saltos sin ningún orden sucesivo.

Es en este punto cuando surge lo que Piaget ha llamado con el nombre de «Agrupamiento», el cual «reemplaza cada coordinación de saltos y de paradas por un sistema mecánico de movimientos regulares, el cual permite su presentación y suprime toda discontinuidad».

Es importante señalar que cuando el agrupamiento llega a ser posible en el plano deductivo, se presentan todas sus manifestaciones, es decir, tanto las agrupaciones de relación como las de clase, se elaboran todas simultáneamente, de este modo haciendo una síntesis de ambos agrupamientos, se derivan los grupos numéricos. (clasificación, asociación).

Hablando específicamente de la edad del niño, podemos decir que cuando pasa a la etapa concreta, es capaz de efectuar las operaciones de todos estos agrupamientos y grupos, siempre y cuando se presente en forma concreta.

En el caso de niño que ha pasado a la etapa formal, es decir, hacia los once o doce años, las mismas operaciones son posibles en un plano simplemente verbal (Hipotético-Deductivo). Cabe aclarar que es precisamente en este momento cundo el pensamiento del niño se libera definitivamente de sus orígenes senso-motores y de la propia acción.

Hablando específicamente sobre la elaboración de algoritmos numéricos y conceptuales, podemos apreciar que la edad óptima en la que el niño puede aprender a construirlos, (basándonos en los fundamentos anteriormente mencionados), será a partir delos diez a once años de edad puesto que ya tendrá una visión general del problema que se le presente.

Blogged with the Flock Browser

Tags: , , , ,

Juego Binario

http://forums.cisco.com/CertCom/game/binary_game_page.htm

Informática Escuela ORT

Blogged with the Flock Browser

Tags: , ,

Visual Basic y más – Pagina de Pablo Trinchinetti

Pagina de Pablo Trinchinetti

Curso Tema Archivo
2º Polimodal Clases de Abril Clase1Clase2
Planificacion Material del Consulta para todo el Año Apunte para clases
  Los primeros Ejercicios que hacemos en clase (entregar como TP1) Primeros Ejercicios para Practica
  No quedo claro que es una variable… mirate esto!!! Que son las Variables
  Resumen de la clase Condicionales (IF y SELECT)
  *** Repaso previo a la prueba *** Modos de Programacion
  Subprogramas y Funciones Nuestras Propias Herramientas
  Como aprovechar un LISTBOX Control LISTBOX
  Ciclos y Bucles Bucles
  Vectores y Matrices (1º Parte) Vectores
  Vectores y Matrices (2º Parte) Matrices
  Formularios Multiples – Repaso de Mitad de Año Formularios Multiples
  Para los que tengan que dar final de años anteriores aca les dejo un
Trabajo Practico de Visual
TP_VB-Finales.pdf
     
  Guia de Visual Basic para aquellos que no se engancharon a tiempo #1 VB6_Guia01
  Guia de Visual Basic para aquellos que no se engancharon a tiempo #2 VB6_Guia02
  Guia de Visual Basic para aquellos que no se engancharon a tiempo #3 VB6_Guia03
  Guia de Visual Basic para aquellos que no se engancharon a tiempo #4 VB6_Guia04
  Guia de Visual Basic para aquellos que no se engancharon a tiempo #5 VB6_Guia05
   
9º A / B / C Manual de NQC (Robotica) Manual de NQC
Planificacion Manual de Construccion de Robots (Robotica) Constructopedia
  Manual de NQC Avanzado (Robotica) Avanzado de NQC
  Trabajo Practico 3 y 4 de Base de Datos TP3y4
  Trabajo Practico 5 de Base de Datos – CONSULTAS TP5
  Manual Basico de Frontpage 2003 Manual
  Manual Medio de Fronpage 2003 Manual
   
8º A / B / C Material de estudio sobre Evolucion de las Computadoras Evolucion de las Computadoras
Planificacion ¿Que es una valvula? Corte de una valvula
  Resumen de Generaciones de Computadoras Las 4 Generaciones
  Trabajo Practico de Historia de la Informatica Evolucion de la Informatica
  Textos para Trabajar en Clases RobotsEstradaAnimal
  Trabajos Practicos de Procesadores de Texto Uno – Dos – Tres – Cuatro
  ¿Que es la INTERNET? Presentacion
  ¿Como Buscar informacion por la Internet? Presentacion
  TRABAJO PRACTICO BUSQUEDA DEL TESORO (1º Parte) Busqueda Uno
  Apunte sobre ¿Que es Internet? Apunte adicional para Estudio
Trabajo Practico y Guia para la Pelicula Juegos de Guerra
Cuadro sobre tipos de Redes Tipos de Redes
La Banda Ancha mas Rapida del Mundo La mas Ancha
¿A que velocidad anda mi coneccion a Internet? ¿Cuanto es 1 Mega?
  Apunte de Programacion 1º Parte (Robolab). Robolab_1.pdf
  Apunte de Programacion 2º Parte (Robolab). Robolab_2.pdf
Blogged with the Flock Browser

Tags: , ,

Juego de Lógica con las Leyes de robótica de Asimov

Photography imported on the site Flickr.com by...

Image via Wikipedia

Logic Exercises (Dennis G. Jerz, Seton Hill University)

Tres leyes de la robótica

1. Un robot no debe dañar a un ser humano o, por su inacción, dejar que un ser humano sufra daño.

2. Un robot debe obedecer las órdenes que le son dadas por un ser humano, excepto si estas órdenes entran en conflicto con la Primera Ley.


3. Un robot debe proteger su propia existencia, hasta donde esta protección no entre en conflicto con la Primera o la Segunda Ley.

En ciencia ficción las tres leyes de la robótica son un conjunto de normas escritas por Isaac Asimov, que la mayoría de los robots de sus novelas y cuentos están diseñados para cumplir. En ese universo, las leyes son «formulaciones matemáticas impresas en los senderos positrónicos del cerebro» de los robots (lo que hoy llamaríamos ROM). Aparecidas por primera vez en el relato Runaround (1942)

Eres un robot, programado de acuerdo a las leyes de la robótica, como se ha señalado anteriormente.
En un pedazo de papel en blanco, esbozar sus lógicas reacciones a las situaciones siguientes:

1. Un enorme árbol está a punto de caer sobre un niño jugando en el otro lado de la calle. Pero hay un guardia de tráfico con un cartel de «Stop» , le impide cruzar para llegar a los niños. ¿Qué hacer? Explica cada paso de su razonamiento.

2. La situación es la misma que en # 1, además ahora te das cuenta de que el árbol te aplastará si usted tratar de salvar al niño. De hecho, lo aplastará antes de que pueda llegar a los niños. Sobre la base de estas leyes, ¿qué hacer?

3. En una situación completamente diferente, su propietario le ordena saltar delante de un autobús en exceso de velocidad.

4. The situation is the same as in #3, except now your owner’s ex-girlfriend is on the bus, you are a huge industrial robot with glittering tritanium armor plates, and you weigh twice as much as the bus does.
La situación es la misma que en el # 3, con excepción de ahora la ex-novia de su propietario va en el autobús, usted es un enorme robot industrial con brillante armadura tritanium placas, y que pesa el doble que el autobús.

5. Igual que el # 4, excepto que ahora el autobús está a punto de atropellar a su propietario.

6. Asimov anexó la Zeroth Ley: «Un robot no puede hacer daño a la Humanidad o, por inacción, permitir que la Humanidad sufra daño.», y las demás leyes se modificaron para evitar violar la misma. Describa una situación en la que un robot podría encontrar dificultades para determinar si esta ley se aplica.

Blogged with the Flock Browser

Tags: ,

Programación para niños – Jason R Briggs · Snake Wrangling for Kids

Programación para niños en Python

Snake Wrangling for Kids

Jason R Briggs · Snake Wrangling for Kids

Snake Wrangling for Kids

cover thumbnail

Learning to Program with Python.

Copyright © 2007. All Rights Reserved.

Snake Wrangling for Kids” is a printable electronic book, for children 8 years and older, who would like to learn computer programming. It covers the very basics of programming, and uses the Python programming language to teach the concepts.

There are 3 different versions of the book (one for Mac, one for Linux and one for Windows), and the printable 1.4MB PDFs can be downloaded from the following links for free (zipped size is 1MB):

SWFK – Linux Edition
SWFK – Mac Edition
SWFK – Windows Edition

Printed versions can be obtained from Lulu via the following links:

SWFK – Linux (Printed Edition)
SWFK – Mac (Printed Edition)
SWFK – Windows (Printed Edition)

Please note: this is a self-edited (obviously unpublished) manuscript (with help from feedback from the Python community), and as such may not be quite as polished as I would like. Feedback is welcome, and I’ll update the book whenever necessary. If your kids are having trouble understanding something, please let me know, and I’ll use the feedback to hopefully make improvements.

All updates will be announced here (or the feed subscription is http://www.briggs.net.nz/log/feed).

The original combined version (including all 3 operating systems) of the book can still be found here.


Blogged with the Flock Browser

Tags: , ,

A %d blogueros les gusta esto: