XNA Pong game
Muy simple y solo como ejemplo de la primera aplicación que hice.
Crear el proyecto
Crear los sprites con los que se jugara, muy simples ya que solo están como ejemplo:
Crear la clase que manejara a los jugadores: Paddle
- /// <summary>
- /// Creata una paleta
- /// </summary>
- class Paddle
- {
- /// <summary>
- /// Variable con la posicion
- /// </summary>
- public Point pos;
- /// <summary>
- /// Velocidad de la paleta
- /// </summary>
- public int speed;
- /// <summary>
- /// Constructor
- /// </summary>
- /// <param name="x"></param>
- /// <param name="y"></param>
- public Paddle(int x, int y)
- {
- /// La paleta inicia en la posicion que se le pase al constructor
- pos = new Point(x, y);
- /// Velocidad por defecto
- speed = 3;
- }
- }
Crear la clase que maneja el objeto : Ball
- /// <summary>
- /// Creaa un objeto con la pelota
- /// </summary>
- class Ball
- {
- /// <summary>
- /// Posicion de la pelota
- /// </summary>
- public Point pos;
- /// <summary>
- /// Velocidad horizontal y vertical
- /// </summary>
- public int h_speed, v_speed;
- /// <summary>
- /// Constructor
- /// </summary>
- /// <param name="x"></param>
- /// <param name="y"></param>
- public Ball(int x, int y)
- {
- /// La posicion inicial de la pelota se le pasa al constructor
- pos = new Point(x, y);
- /// La velocidad inicial y la direccion es randomica
- Random rand = new Random();
- h_speed = rand.Next(3, 7);
- if (rand.Next(0, 2) == 0) h_speed *= -1;
- rand = new Random();
- v_speed = rand.Next(3, 7);
- if (rand.Next(0, 2) == 0) v_speed *= -1;
- }
- }
En la clase Game1.cs, crear variables que contengan a los “jugadores” y la pelota, además una variable que maneje generación de valores randomicos y una con el estado del teclado.
- GraphicsDeviceManager graphics;
- SpriteBatch spriteBatch;
- Texture2D t_paddle1, t_paddle2, t_ball;
- Paddle paddle1;
- Paddle paddle2;
- Ball ball;
- Random rand = new Random();
- KeyboardState currentState;
Crear un método que inicializa las posiciones de los Sprites en el juego, se llama ResetGame, e incluimos una llamada desde el constructor:
- /// <summary>
- /// Allows the game to perform any initialization it needs to before starting to run.
- /// This is where it can query for any required services and load any non-graphic
- /// related content. Calling base.Initialize will enumerate through any components
- /// and initialize them as well.
- /// </summary>
- protected override void Initialize()
- {
- // TODO: Add your initialization logic
- base.Initialize();
- ResetGame();
- }
- /// <summary>
- /// Inicializa los valores del juego
- /// </summary>
- void ResetGame()
- {
- paddle1 = new Paddle(10, 200);
- paddle2 = new Paddle(770, 200);
- ball = new Ball(385, 285);
- }
En el método LoadContent, que se ha generado automáticamente agregamos la carga de nuestros Sprites:
- /// <summary>
- /// LoadContent will be called once per game and is the place to load
- /// all of your content.
- /// </summary>
- protected override void LoadContent()
- {
- // Create a new SpriteBatch, which can be used to draw textures.
- spriteBatch = new SpriteBatch(GraphicsDevice);
- // TODO: use this.Content to load your game content here
- t_paddle1 = Content.Load<Texture2D>("paddle");
- t_paddle2 = Content.Load<Texture2D>("paddle");
- t_ball = Content.Load<Texture2D>("ball");
- }
En el método Draw, agregamos:
- /// <summary>
- /// This is called when the game should draw itself.
- /// </summary>
- /// <param name="gameTime">Provides a snapshot of timing values.</param>
- protected override void Draw(GameTime gameTime)
- {
- GraphicsDevice.Clear(Color.CornflowerBlue);
- // TODO: Add your drawing code here
- spriteBatch.Begin();
- spriteBatch.Draw(t_paddle1, new Rectangle(paddle1.pos.X, paddle1.pos.Y, t_paddle1.Width, t_paddle1.Height), Color.CornflowerBlue);
- spriteBatch.Draw(t_paddle2, new Rectangle(paddle2.pos.X, paddle2.pos.Y, t_paddle2.Width, t_paddle2.Height), Color.CornflowerBlue);
- spriteBatch.Draw(t_ball, new Rectangle(ball.pos.X, ball.pos.Y, t_ball.Width, t_ball.Height), Color.CornflowerBlue);
- spriteBatch.End();
- base.Draw(gameTime);
- }
Si se compila y ejecuta en este momento, tenemos el siguiente resultado:
Movimientos Humano y Computadora, Detección de colisiones
Dado que se jugara HumanoVsComputadora, lo primero que se hace es capturar la entrada de teclado y actualizar el movimiento de la paleta del Humano, además validamos que no salgamos de los límites de la ventana, esto lo hacemos desde un nuevo método, UpdatePaddles:
- void UpdatePaddles()
- {
- /// Capturamos las pulsaciones del teclado
- currentState = Keyboard.GetState();
- Keys[] currentKeys = currentState.GetPressedKeys();
- /// Solo hacer caso de las teclas que requerimos
- foreach (Keys key in currentKeys)
- {
- if (key == Keys.Up)
- paddle1.pos.Y -= paddle1.speed;
- if (key == Keys.Down)
- paddle1.pos.Y += paddle1.speed;
- if (key == Keys.Escape)
- this.Exit();
- }
- /// Varificar que no salimos de la ventana
- if (paddle1.pos.Y <= 10) paddle1.pos.Y = 10;
- if (paddle2.pos.Y <= 10) paddle2.pos.Y = 10;
- if (paddle1.pos.Y + t_paddle1.Height >= Window.ClientBounds.Height - 10)
- paddle1.pos.Y = Window.ClientBounds.Height - t_paddle1.Height - 10;
- if (paddle2.pos.Y + t_paddle2.Height >= Window.ClientBounds.Height - 10)
- paddle2.pos.Y = Window.ClientBounds.Height - t_paddle2.Height - 10;
- }
La “inteligencia” de la computadora, se reduce a que su paleta sigue la posición Vertical de la pelota, por lo que el anterior método quedaría así:
- void UpdatePaddles()
- {
- /// Capturamos las pulsaciones del teclado
- currentState = Keyboard.GetState();
- Keys[] currentKeys = currentState.GetPressedKeys();
- /// Solo hacer caso de las teclas que requerimos
- foreach (Keys key in currentKeys)
- {
- if (key == Keys.Up)
- paddle1.pos.Y -= paddle1.speed;
- if (key == Keys.Down)
- paddle1.pos.Y += paddle1.speed;
- if (key == Keys.Escape)
- this.Exit();
- }
- /// La paleta de la computadora solo sigue a la pelota
- paddle2.speed = ball.h_speed;
- if (paddle2.pos.Y + (t_paddle2.Height / 2) > ball.pos.Y)
- paddle2.pos.Y -= paddle2.speed;
- else if (paddle2.pos.Y + (t_paddle2.Height / 2) < ball.pos.Y)
- paddle2.pos.Y += paddle2.speed;
- /// Varificar que no salimos de la ventana
- if (paddle1.pos.Y <= 10) paddle1.pos.Y = 10;
- if (paddle2.pos.Y <= 10) paddle2.pos.Y = 10;
- if (paddle1.pos.Y + t_paddle1.Height >= Window.ClientBounds.Height - 10)
- paddle1.pos.Y = Window.ClientBounds.Height - t_paddle1.Height - 10;
- if (paddle2.pos.Y + t_paddle2.Height >= Window.ClientBounds.Height - 10)
- paddle2.pos.Y = Window.ClientBounds.Height - t_paddle2.Height - 10;
- }
Ahora se requiere mover la pelota, se lo hace desde un nuevo método UpdateBall:
- void UpdateBall()
- {
- /// Actualiza la posicion de la pelota
- ball.pos.X += ball.h_speed;
- ball.pos.Y += ball.v_speed;
- /// Verificar limites
- /// Inferior
- if (ball.pos.Y > (Window.ClientBounds.Height - 10 - t_ball.Height))
- ball.v_speed *= -1;
- /// Superior
- if (ball.pos.Y < 10)
- ball.v_speed *= -1;
- }
Finalmente implementamos un “detector de colisiones”, que simplemente compara las posiciones de los Sprites de la pantalla, y según eso calcula la nueva dirección de la pelota, velocidad después de “golpearla” y si una de las paletas no ha alcanzado a golpear la bola, en cuyo caso el juego comienza de nuevo, llamando al método ResetGame:
- void CheckCollisions()
- {
- /// Verificar si la pelota esta yendo a la izquierda
- if (ball.h_speed < 0)
- {
- /// Verifica si la pelota a rebasado la paleta
- if (ball.pos.X < paddle1.pos.X + 20)
- {
- /// Si la pelota no fue golpeada, fin del juego
- if ((ball.pos.Y + t_ball.Height < paddle1.pos.Y) || (ball.pos.Y > paddle1.pos.Y + t_paddle1.Height))
- {
- ResetGame();
- }
- else
- {
- /// Se golpea la pelota, se cambia su direccion
- /// y se le da una velocidad inicial randomica, entre 3 y 7
- if (ball.h_speed < 0)
- ball.h_speed = rand.Next(3, 7);
- else ball.h_speed = rand.Next(-6, -2);
- if (ball.v_speed < 0)
- ball.v_speed = rand.Next(3, 7);
- else ball.v_speed = rand.Next(-6, -2);
- }
- }
- }
- else
- {
- /// Verifica si la pelota a rebasado la paleta
- if (ball.pos.X + t_ball.Width > paddle2.pos.X)
- {
- /// Si la pelota no fue golpeada, fin del juego
- if ((ball.pos.Y + t_ball.Height < paddle2.pos.Y) || (ball.pos.Y > paddle2.pos.Y + t_paddle2.Height))
- {
- ResetGame();
- }
- else
- {
- /// Se golpea la pelota, se cambia su direccion
- /// y se le da una velocidad inicial randomica, entre 3 y 7
- if (ball.h_speed < 0)
- ball.h_speed = rand.Next(3, 7);
- else ball.h_speed = rand.Next(-6, -2);
- if (ball.v_speed < 0)
- ball.v_speed = rand.Next(3, 7);
- else ball.v_speed = rand.Next(-6, -2);
- }
- }
- }
- }
Implementamos la lógica de actualización del juego, desde le método Update:
- /// <summary>
- /// Allows the game to run logic such as updating the world,
- /// checking for collisions, gathering input, and playing audio.
- /// </summary>
- /// <param name="gameTime">Provides a snapshot of timing values.</param>
- protected override void Update(GameTime gameTime)
- {
- // Allows the game to exit
- if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
- this.Exit();
- // TODO: Add your update logic here
- UpdatePaddles();
- UpdateBall();
- CheckCollisions();
- base.Update(gameTime);
- }
F5 y a jugar!
Los fuentes, aquí:
Importar archivos de texto con LINQ
Zanahorias, 5,0 .50Naranjas, 6, 1.25Manzanas, 7, 2.50
1: public static IEnumerable<string> ReadLinesFromFile(string filename)2: {3: using (StreamReader reader = new StreamReader(filename))4: {5: while (true)6: {7: string s = reader.ReadLine();8: if (s == null)9: break;10: yield return s;11: }12: }13: }
1: var products = from line in ReadLinesFromFile(@"c:\import.txt")2: let item = line.Split(’,’)3: select new4: {5: Producto = item[0],6: Cantidad = Convert.ToInt32(item[1]),7: Precio = Convert.ToDecimal(item[2]),8: Total = Convert.ToInt32(item[1]) * Convert.ToDecimal(item[2])9: };
Y finalmente pasamos el resultado a un DataGrid:
1: GridView1.DataSource = products;2: GridView1.DataBind();
Hola mundo con Smart Client Software Factory
- Crear un nuevo proyecto de aplicación de Smart Client
- En Visual Studio 2010, seleccione Nuevo en el menú Archivo y, a continuación, haga clic en Project.
- En el cuadro de diálogo New Project Smart Client Development.
- Seleccione la aplicación Smart Client (C #) Visual Studio template.
- En el cuadro Nombre, escriba HelloWorldApplication, a continuación, haga clic en Aceptar.
- En el asistente, acepte la configuración predeterminada, seleccione Show documentation after recipe completes y a continuación, haga clic en Finish.
- Crear un módulo de Hello World
- En el Explorador de soluciones, haga clic en la solución, seleccione Smart Client Software Factory, a continuación, haga clic en Add Business Module (C#).
- En el cuadro de diálogo Agregar nuevo proyecto, HelloWorldModule en el cuadro Nombre.
Haga clic en Aceptar. - En el asistente, acepte la configuración predeterminada, seleccione Show documentation after recipe completes y a continuación, haga clic en Finish.
- Añadir la vista
- En el Explorador de soluciones, haga clic en HelloWorldModule, seleccione Smart Client Software Factory, a continuación, haga clic en Add View (with presenter).
- En el cuadro de diálogo Add View (with presenter), escriba HelloWorldView en el cuadro Ver, seleccione Show documentation after recipe completes y a continuación, haga clic en Finish.
- En el Explorador de soluciones, haga doble clic en el archivo HelloWorldView.cs para poder ver el Diseñador. Arrastre un cuadro de texto en la vista, y escribir Hola Mundo.
- Configurar HelloWorldView para mostrar la vista en el Shell
- En el Explorador de soluciones, abrir ModuleController.cs en el proyecto HelloWorldModule.
- Agregue el siguiente código .
- using HelloWorldApplication.Infrastructure.Interface.Constants;
- En el método AddViews agregue el siguiente código.
- HelloWorldView hwview = ShowViewInWorkspace< HelloWorldView >(WorkspaceNames.RightWorkspace);
- F5 compilar y ejecutar...
Como ganar siempre al jugar piedra,papel y tijeras
1) Rock it – Muchos tienen la tendencia de hacer “Piedra” en su primera lanzada. Si están jugando contra una de estas personas, lancen papel.
2) Tijeras revertidas – Jugadores experimentados tirarán papel (basándose en la primera regla). Tenemos que contrarrestarlos con Tijeras.
3) Copycat – Jugadores con poca experiencia (o cansados) van a tirar subconscientemente la forma contra la que perdieron en la última ronda. Contrarrestar con su opuesto
4) Dobles Rocas – Cuando vean a alguien lanzar dos rocas, sepan que el próximo lanzamiento será Tijeras o Papel. Las personas detestan ser predecibles y una firme indicación de ello es lanzar lo mismo tres veces. Contrarrestar con Piedra.
5) Descubrimientos en los dedos – Cuando el oponente se prepara a lanzar, fijarse en los dedos cuidadosamente. Los dedos se tensarán o moverán de acuerdo a la forma del lanzamiento. Para Piedra, los dedos estarán tensos. Para papel, estarán sueltos y para Tijeras, sólo los dedos utilizados para la forma estarán sueltos.
6) Papel por favor – El Papel es el menos usado en un match. Utilízenlo como una opción inesperada. El papel es sólo tirado el 29.6% del tiempo, mientras que la roca tiene un 35.4% y las tijeras, 35%.
7) Preparación previa – Ver al oponente jugar contra otros. Tienen una forma favorita, o mantienen una plantilla a la hora de lanzar
8 ) Spock & Roll – Cuando todo parezca perdido, vayan por el Spock. Es inesperado y altamente ilegal, pero también imposible de contrarrestar.
Amistad
Extender un IList para devolver un Datatable
- /// <summary>
- /// Exiende un metodo sobre una Lista para devolver un Dataset
- /// con las columnas del objeto de la lista
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="pList"></param>
- /// <returns></returns>
- public static DataTable ConvertTo<T>( this IList<T> pList )
- {
- DataTable table = CreateTable<T>();
- Type entityType = typeof( T );
- PropertyDescriptorCollection properties = TypeDescriptor.GetProperties( entityType );
- foreach ( T item in pList )
- {
- DataRow row = table.NewRow();
- foreach ( PropertyDescriptor prop in properties )
- row[prop.Name] = prop.GetValue( item );
- table.Rows.Add( row );
- }
- return table;
- }
- /// <summary>
- /// Devuelve un item de tipo T
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="pRow">The p row.</param>
- /// <returns></returns>
- private static T CreateItem<T>( DataRow pRow )
- {
- T obj = default( T );
- if ( pRow == null )
- return obj;
- obj = Activator.CreateInstance<T>();
- foreach ( DataColumn column in pRow.Table.Columns )
- {
- PropertyInfo prop = obj.GetType().GetProperty( column.ColumnName );
- object value = pRow[column.ColumnName];
- prop.SetValue( obj, value, null );
- }
- return obj;
- }
- /// <summary>
- /// Crea un DataTable con columnas del tipo T
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <returns></returns>
- private static DataTable CreateTable<T>()
- {
- Type entityType = typeof( T );
- DataTable table = new DataTable( entityType.Name );
- PropertyDescriptorCollection properties = TypeDescriptor.GetProperties( entityType );
- foreach ( PropertyDescriptor prop in properties )
- table.Columns.Add( prop.Name, prop.PropertyType );
- return table;
- }
Extender un Datatable para devolver un IList
Necesito pasar el contenido de un Datatable a un IList de tipo T, aprovechando la facilidad de extender clases, quedo así:
- /// <summary>
- /// Extiende un metodo sobre el objeto Datatable para devolver un IList
- /// </summary>
- public static IList<T> ConvertTo<T>(this DataTable pDataTable) where T : new()
- {
- PropertyInfo[] entityImportProperties = typeof(T).GetProperties();
- IList<T> colEntityImportList = new List<T>();
- if (pDataTable == null)
- return null;
- if (pDataTable.Rows.Count == 0)
- return colEntityImportList;
- foreach (DataRow actualRow in pDataTable.Rows)
- {
- T objNewImportEntity = new T();
- foreach (PropertyInfo propertyEntityImport in entityImportProperties)
- if (propertyEntityImport.CanRead)
- for (int i = 0; i <= pDataTable.Columns.Count - 1; i++)
- if (pDataTable.Columns[i].ColumnName == propertyEntityImport.Name)
- if (actualRow[propertyEntityImport.Name] == null)
- {
- if (actualRow[propertyEntityImport.Name] == DBNull.Value)
- propertyEntityImport.SetValue(objNewImportEntity, null, null);
- else
- propertyEntityImport.SetValue(objNewImportEntity, actualRow[propertyEntityImport.Name], null);
- break;
- }
- colEntityImportList.Add(objNewImportEntity);
- }
- return colEntityImportList;
- DataTable vSystemModulesTable = SystemManager.GetDataTable();
- IList<SystemModule> vColSystem = vSystemModulesTable.ConvertTo<SystemModule>();
- }
Y se usa, de esta manera:
- DataTable vSystemModulesTable = SystemManager.GetDataTable();
- IList<SystemModule> vColSystem = vSystemModulesTable.ConvertTo<SystemModule>();
Full-Text Search
1: Select Name From Person WhereName Like '%Juan%Perez%'
Podría dar un error si no esta habilitada la funcionalidad, si esto sucede ejecutar el SP
- sp_fulltext_database 'enable'
Crisis de los vídeo juegos
El siguiente articulo fue tomado de Wikipedia ya que al parecer sera borrado de ahí. Al ser muy interesante opte por copiarlo aquí.
La Crisis del videojuego de 1983 fue un suceso que marcó el mundo de los videojuegos para siempre y poniendo en riesgo la existencia de estos hasta llevarlos al punto de casi desaparecer.
Ocurrió a finales de 1983 e inicios de 1984 seguidos de 3 largos años de "oscuridad" donde la actividad de los videojuegos se redujo a las consolas vendidas y que funcionaban en los hogares de todo el mundo. Cientos de juegos se cancelaron en 1983 y los que lograron alcanzar las tiendas se hundieron al fracasar.
A principios de los años 1980 se empieza a detectar la primera crisis, que afectó sobre todo al sector de empresas derivadas de los juegos tipo arcade. Una de las causas fue la abundancia de consolas de videojuegos y microordenadores, los clientes optaban por comprar los juegos originales y piratas antes que derrochar el dinero en los recreativos.
Las empresas respondieron con la creación de sus propias consolas o desarrollando para las existentes.
La segunda decisión fue la de mejorar las máquinas recreativas añadiéndole una nueva forma de jugar, en vez de jugar con un joystick el jugador lo hacía más real mentiendose en un coche o montándose en una moto que mediante unos sensores representaba en el juego los giros, la aceleración, etc.
Fue entonces cuando se abandonó la primera crisis del videojuego y las máquinas recreativas tomaron otro plano respecto de los usuarios y fueron avanzando según las nuevas tecnologías
Causas
- La extensa cobertura y exageración de los medios de comunicación que hablaban de un "fracaso total", lo que provocó un desinterés repentino y salió la creencia de muchos videojugadores diciendo que los videojuegos solo fueron una moda.
- La agresiva propaganda de la Commodore 64, una computadora personal que decía: "Por qué comprarle a tus hijos un videojuego y distraerlos de la escuela cuando puedes adquirir para él una computadora personal que los prepara para el colegio"
- El fracaso de los dos escasamente aceptados juegos que estropearon la entonces exitosa Atari 2600.
- La falta de profesionalidad de los medios de comunicación. Incluso al tratarse de periódicos como el New York Times, lo cierto es que la capacidad de un reportero para informar sobre videjuegos era muy escasa.
- Ningún juego tenía derechos de autor. Uno podía hallar en una consola una versión muy buena del Pac-Man, y días después se llevaría un engaño absoluto al probar el juego en una Atari 2600.
- Sobresaturación del mercado. Viendo un potente mercado naciente, varias compañías como Mattel lanzaron consolas y videojuegos mediocres. Ni la industria pornográfica se quedó atrás lanzando el controvertido "Custer's Revenge"
Atari: Pac-Man y E.T.
Pacman
Una ironía de la vida, pero el más recordado personaje de los videojuegos, junto con Mario Bros., puso en peligro los videojuegos como los conocemos. Es cierto, los de Atari quisieron pasar al éxito de su base original (Las arcade) a su consola exitosa y se apoyaban en esta fórmula: Videojuego más vendido + consola más exitosa = muchas ganancias.
Pero el juego salió a la venta como producto final sin haber sido testeado y el resultado fue un desastre: pésimos gráficos, control defectuso y de los 4 fantasmas uno era de color estable y los otros 3 parpadeaban dándole al jugador la impresión de que solo había un fantasma.
Habían algunas explicaciones: la pantalla era horizontal y no vertical, algo obvio porque hablamos de televisores. Pero el problema surgía al ver los gráficos: los puntos eran rayas, colores malos, los fantasmas parpadeaban y Pac-Man solo veía a izquierda y derecha. Ni al bajar o subir miraba abajo.
E.T.
El juego está considerado uno de los peores de la historia. Se acercaba Navidad y para tener ventas disparadas los de Atari decidieron sacar un nuevo juego, estaba diseñado por Howard Scott Warshaw (Creador de un gran título llamado "Hit Yar's Revenge".El tiempo de elaboración fue el ridículo récord de 6 semanas y se le estimaron como al Pac-Man Atari grandes ventas, y aunque se vendió bien hubo una superproducción y quedaron bastantes en los almacenes. Se dice que los cartuchos sin vender fueron enterrados por Atari en un lugar remoto en Nuevo Mexico aunque esto ha sido desmentido por Atari.
La trama era casi tan torpe como el juego en sí. Originalmente planearon hacer un juego estilo Pac-Man, pero será por su fracaso de Pac-Man anterior, o por las prisas, que lanzaron algo nuevo. Bien simple: E.T. debía encontrar tres pedazos de un teléfono espacial para llamar a su nave para que lo rescatara. Pero hubieron errores: los primeros glitches (De la nada salían hoyos), jugabilidad casi imposible y hasta cambios en los colores; E.T. era mostaza y no marrón, pese a que el color era posible en la Atari 2600.
Reacciones inmediatas Como pasa frente a toda crisis, los efectos son inmediatos. Viendo el mercado saturado de consolas y de videojuegos, los gamers no sabían como distinguir un "buen" juego de un "mal" juego. La prensa "videojuegil" aún no había sido inventada.
La prensa, por primera vez en la historia, hace que los videojuegos salgan en los periódicos de todo el mundo. Las noticias son lamentables: despidos, pérdidas millonarias, devoluciones. En unos días, lo que antes era un mercado naciente se convirtió en una crisis global. Los efectos más duros fueron en Estados Unidos, donde era fácilmente pirateable una consola. Japón no sufrió el impacto de la crisis hasta unos meses después, con la escasez de videojuegos los productores estadounidenses envían los títulos devueltos. Pese a todo, el mercado japonés soporta un poco más con las arcades, pero el negocio de las consolas se viene abajo. No es hasta 1983 que el mercado vuelve a nacer. Lo curioso, y lo inexplicable de toda la crisis, fue como un personaje cuyo oficio era ser fontanero, pudo salvar el mercado.
La caída de Atari
En 1983 se produce uno de los episodios más desconocidos y curiosos de la historia de los videojuegos. Mientras en Atari se trabajaba en el nuevo chip MARIA, que debía ser la base de la nueva generación de consolas, se recibe una carta de Minoru Arakawa, presidente de Nintendo, quien está interesado en entrar en el mercado de Estados Unidos con su nueva consola Famicom, por lo que invita a una representación de Atari a conocer a fondo su producto, en vistas de llegar a un acuerdo comercial. Los representantes de la compañía americana viajan a Kyoto en abril para ver una demostración unos meses antes de su lanzamiento en Japón, y prueban unas versiones beta de Donkey Kong Jr. y Popeye. La cúpula directiva de Atari de todos modos debate si seguir adelante con la propuesta de Nintendo, o esperar a que el chip MARIA esté listo para lanzar de nuevo una consola propia, ya que ambos chips parecen estar a la par en precio y capacidades. Se decide alargar las negociaciones lo máximo posible, hasta que la primera versión estable de MARIA esté acabada (a principios del verano). Así que a mediados del mes de mayo, una delegación de Atari se desplaza de nuevo a Kyoto para negociar un preacuerdo entre ambas compañías, por el que Atari fabricará y distribuirá mundialmente la consola, a cambio del pago de regalías a Nintendo. Atari adelantará 5 millones de dólares y se compromete a fabricar 2 millones de unidades en los cuatro años siguientes. Además Nintendo deberá producir 4 títulos según las exigencias de Atari para la campaña navideña.
El acuerdo definitivo debe firmarse en junio en el Consumers Electronics Show de Las Vegas, pero en dicho evento todo se viene abajo cuando el presidente de Atari Ray Kassar presencia una demo del nuevo ordenador personal de Coleco, Adam, con una versión de Donkey Kong. Los derechos de dicho juego para ordenador eran propiedad de Atari, mientras Coleco solo tenía los derechos para versiones de consola. Kassar se enfurece con Nintendo, a quien acusa de estar haciendo doble juego, mientras Nintendo hace lo propio con Coleco, a quien acusa con llevar a juicio si no deja de usar inapropiadamente el juego.
Tras la celebración del Consumers Electronic Show, Atari entra en una espiral de acontecimientos que hacen que ya nunca llegue a firmarse dicho acuerdo, y llevan a la compañía prácticamente a la bancarrota, lo que hizo que Nintendo acometiera su propia distribución años más tarde. En julio, Ray Kassar se ve obligado a dimitir de su puesto, junto con el vicepresidente Dan Groth, debido a la acusación de aprovechar información privilegiada para vender parte de sus acciones horas antes de anunciar los malos resultados del ejercicio de 1982, que provocaron una caída del valor de las mismas en un 40%, Kassar devolvió el dinero, y fue absuelto de las acusaciones, pero la presidencia de la compañía había cambiado ya de manos, y Kassar se retiró tras el escándalo a un segundo plano, sin volver a ocupar jamás ningún cargo directivo.
La presidencia recae entonces en James J. Morgan, vicepresidente de Phillip Morris, quien se ve obligado a lidiar con la situación más delicada que la joven industria iba a padecer: la crisis de 1983 que desembocó en un cambio radical del mercado del videojuego tal y como se había conocido en los 5 años anteriores.
El Fin de la Caída y el inicio de la 3º Generación
La caída finalizó al salir al mercado el NES (Nintendo Entertainment System) que, con sus grandes títulos como Super Mario Bros, Metroid y The Legend of Zelda, atrajo mucha gente a la industria, revivió el interés, rompió la creencia de los videojuegos como una moda y abrió la 3º generación de videojuegos. Actualmente la NES se encuentra entre una de las consolas más apreciadas por los videojugadores, aunque todavía existen algunos afortunados que conservan una de las antiguas Atari.
Frases Simpson
2. ¡Oh, así que ahora tienen internet en los ordenadores!
3. ¡Bart, con 10.000$ seremos millonarios! Podremos comprar todo tipo de cosas útiles, como… ¡Amor!
4. Solo porque no me importe no significa que no entienda.
5. Normalmente no rezo, pero si estás ahí, por favor, sálvame Superman.
6. Hijo, si realmente quieres algo en esta vida, tienes que luchar por ello. ¡Ahora silencio! Van a anunciar los números de la lotería.
7. Bueno, es la 1 de la madrugada. Mejor ir a casa y pasar algo de tiempo de calidad con mis hijos.
8. Quizá, solo por una vez, alguien me llame ‘Señor’ sin añadir “Está usted montando una escena”.
9. Marge, no desalientes al niño. Es importante aprender a escaquearse en la vida. Eso no separa de los animares. Excepto de la comadreja.
10. Donnas. ¿Hay algo que no puedan hacer?
11. Sabéis hijos, un reactor nuclear es como una mujer. Solo tienes que leer el manual y apretar los botones adecuados.
12. Lisa, si no te gusta tu trabajo, no lo ganas. Solo ve todos los días y hazlo a medias. Ese es el modo americano.
13. ¿Cuándo voy a aprender? La solución a todos los problemas de la vida no está en el fondo de una botella. ¡Está en la TV!
14. Hijo, cuando participes en eventos deportivos, no importa si ganas o pierdes: sino en ¡cuánto te emborrachas!
15. Me voy al asiento trasero de mi coche, con la mujer que amo, ¡Y no volveré en 10 minutos!
16. [Con los extraterrestres] ¡Por favor, no me comáis! Tengo mujer e hijos ¡Comeros a ellos!
17. ¿Qué necesitamos de un psiquiatra? Ya sabemos que nuestros hijos están locos.
18. Marge, eres tan hermosa como la Princesa Leia y tan lista como Yoda.
19. Hijos, lo intentáste al máximo y fracasáste. La lección es: no intentarlo nunca.
20. El único monstruo aquí es el montruo del juego que ha esclavizado a tu madre. Le llamaré Jugón y es hora de arrancar a tu madre de sus garras de neón.
21. Cuando miro las caras sonrientes de los niños, solo se que están planeando golpearme con algo.
22. Hoy estoy teniendo el mejor día de mi vida, y ¡todo se lo debo a no ir a la iglesia!
23. Lisa, si la biblia no nos ha enseñado nada, y no tiene porqué, es porque la chicas deben practicar deportes de contacto, como lucha en aceite caliente y boxeo sexy y demas…
24. Bart, no quiero asustarte, pero, el Coco, el coco esta en nuestra casa.
10 tipos de programadores
#1: Gandalf
Este tipo de programador se parece a alguno de los pocos candidatos para interpretar a Gandalf en el Señor de los anillos. El (¡o incluso ella!) tiene barba larga, un gorro destartalado, y puede llevar una capa en invierno. Por suerte para el equipo, esta persona es tan experta como Gandalf en la magia. Desafortunadamente para el equipo, tendrán que aguantar horas de historias sobre como él o ella anduvo por un arduo camino en la nieve para dejar las tarjetas perforadas en la sala de ordenadores. El tipo Gandalf es el luchador más duro, pero tienes que dejarle en la retaguardia y llamarle sólo en momentos de desesperación.
#2: El Mártir
El cualquier otra profesión, El Mártir es simplemente un adicto al trabajo. Pero en el mundo del desarrollo, El Mártir va más allá e incluso a otra dimensión. Los adictos al trabajo al menos van a casa a ducharse y dormir. El Mártir se enorgullece de dormir en el escritorio rodeado de cajas vacías de pizza. El problema es que nadie nunca le ha pedido a El Mártir que trabaje así. E intentan culpar al resto del equipo con frases como “Sí, vete a casa y disfruta de la cena. Yo terminaré esta noche el trabajo de las próximas tres semanas”.
#3: Fanboy
Observemos al Fanboy. Si te arrincona, te encontrarás inmerso en una lectura de tres horas sobre la superioridad de Dragonball Z comparada con Gundam Wing, o porqué la Playstation 3 es mejor que la XBOX360. El sitio de trabajo de un Fanboy está repleto de posters, figuritas y otros chismes relacionados con alguna obsesión, normalmente importada de Japón. No sólo son difíciles de tratar, sino que gastan tanto tiempo en su obsesión (tanto dentro como fuera del trabajo) que no tienen ni idea de cuando hacer el trabajo para el cual fueron contratados.
#4: Vince Neil (Vocalista de Mötley Crüe)
Este cuarentón parece un flashback a lo peor de los años 80. Gran melena, vaqueros rotos lavados a la piedra y una bandana aquí o allí, Vince se sienta en la oficina canturreando canciones de Bon Jovi y Def Leppard durante todo el día, no sería tan malo si “Pour Some Sugar on Me” no fuera asquerosamente pegadiza.
Generalmente Vince es una persona divertida con la que trabajar, y tiene mucha experiencia, pero nunca maduró. Pero Vince se convierte en un fastidio cuando intenta rememorar el estilo de vida rocanrrolero con el pelo y las zapatillas altas. Es bastante difícil trabajar con alguien que va a trabajar resacoso todos los días.
#5: El Ninja
El ninja es el Jugador Más Valioso en tu equipo, y nadie lo sabe. Como los asesinos legendarios, no sabes si El Ninja está en el edificio o trabajando, pero descubres algún indicio por la mañana. Conectas el servidor de control de código y ves que a las 4 de la madrugada, El Ninja metió código que arreglaba el problema en el que habías planeado trabajar toda la semana, ¡y ni siquiera sabías que El Ninja conociera ese proyecto! Mientras tú estabas en Otra Reunión De Esas, El Ninja estaba trabajando.
Los Ninjas son muy sigilosos, podrías no saber ni su nombre, pero sabes que en cada proyecto parecen desenvolverse sin problemas. Pisando cuidadosamente, incluso. El Ninja es un guerrero solitario; no intentes forzarle a trabajar como a las masas.
#6: El Teórico
El teórico sabe todo sobre programación. Puede pasar cuatro horas leyendo la historia de un lenguaje de programación extraño o mostrando una prueba de porqué el código que escribes es peor que el óptimo y tarda tres nanosegundos más en ejecutarse. El problema es que El Teórico no sabe nada sobre Desarrollo Software. Cuando El Teórico escribe código, éste es tan “elegante” que los simples mortales no captan su esencia. Su técnica favorita es la recursividad, y cada bloque de código está contraído al máximo, a pesar de los plazos y de la legibilidad.
El Teórico también se distrae con facilidad. Una tarea simple que debería hacerse en una hora, lleva a los Teóricos tres meses, cuando deciden que las herramientas existentes no son suficientes y deben construir nuevas herramientas para construir nuevas librerías para construir un nuevo sistema que cumpla los mejores y más altos estándares. El Teórico puede volverse uno de tus mejores jugadores, si le dejas jugar con los límites del proyecto y parar de gastar tiempo buscando el Mejor Algoritmo de Ordenación.
#7: El Cowboy del código
El Cowboy del código es una fuerza de la naturaleza imparable. Casi siempre es un buen programador y puede hacer el trabajo dos o tres veces más rápido que otros. El problema es que, al menos la mitad de esa velocidad viene por atajar malamente. El Cowboy del código piensa que tener el código bajo un control de versiones lleva mucho tiempo, guardar datos fuera del código lleva mucho tiempo, comunicarse con alguien más lleva mucho tiempo… ya sabes a lo que me refiero.
El Cowboy del código genera código desordenado, porque trabaja tan deprisa que la necesidad de refactorizar (simplificar y comentar) nunca ocurre. Es decir, siete páginas de funcionalidades parecidas a los ejemplos “no lo haga así” de un libro de texto de programación, pero que mágicamente funcionan. El Cowboy del código no funciona bien con otros. Y si pones dos Cowboys de código en el mismo proyecto, se garantiza que fallará, mientras que se lían en los cambios del otro y se disparan en los pies (?¿).
Pon un Cowboy del código en un proyecto donde conseguir cumplir plazos sea más importante que hacerlo bien, y el código estará listo justo antes del final del plazo. El Cowboy del código es en realidad sólo una bulliciosa versión de El Ninja. Mientras El Ninja ejecuta con precisión, El Cowboy del código es un toro enfurecido que corneará a todo el que se interponga en su camino.
#8: El Paracaidista
¿Conoces esas películas donde un único soldado es lanzado por el aire detrás de las líneas enemigas y se hace con los planes secretos de batalla? Esa persona en la industria del desarrollo de software es El Paracaidista. Es el último recurso que envías para salvar un proyecto moribundo. Los Paracaidistas carecen de la paciencia para trabajar en una misión larga, pero su ventaja es la extraña habilidad para aprender un código con el que no están familiarizados y trabajar con él. Otros programadores necesitarían semanas o meses para aprender lo suficiente para trabajar eficientemente en el proyecto: El Paracaidista necesita horas o días. Los Paracaidistas podrían no saber suficiente para trabajar en el corazón del código, pero la ausencia de tiempo significa que él tendrá éxito cuando el resto del equipo no lo tendría.
#9: El Evangelista
No importa qué tipo de entorno tengas, El Evangelista insiste que puede mejorarse echando abajo todas tus herramientas y procesos y reemplazándolas con otra cosa. El Evangelista es el opuesto de El Teórico. El Evangelista es franco, conoce muchísimo sobre desarrollo software, pero sabe poco sobre programación actual.
El Evangelista es secretamente un jefe de proyecto o un jefe de departamento pero carece del conocimiento o la experiencia para dar el salto. Así que mientras El Evangelista es capaz de depurar su rol como jefe, el resto necesita parapetarse en él para intentar revolucionar su lugar de trabajo.
#10: El Hombre Mediocre
“Suficientemente bueno” es lo que obtendrás del Hombre Mediocre. No dejes que su nombre te engañe; hay también mujeres que pertenecen al tipo El Hombre Mediocre. Siempre tarda más tiempo en producir peor código que cualquier persona del equipo. “Lento y apenas constante llega a la meta” podría describir un proyecto del Hombre Mediocre. Pero El Hombre Mediocre siempre es “suficientemente bueno” para seguir contratado.
Cuando entrevistas a este tipo, te hablará mucho sobre los proyectos en los que se ha involucrado pero no demasiado sobre su actual proyecto. Llegar a conocer al Hombre Mediocre es sencillo: Pregúntale sobre los detalles del trabajo que ha hecho, y de repente sufrirá amnesia. Déjale en la organización y podría llevar años deshacerse de él.
¿SOA está muerto?
Anne Thomas Manes escribió un obituario para SOA, con el argumento de que:
Ella continúa:
Si bien inicialmente SOA ha sido adaptada principalmente por técnicos, su base está mas en los negocios que en los problemas técnicos. Mas ellos fueron muchas veces introducidos (y a menudo ejecutaos) por los técnicos y vendedores, que estaban más interesados en la tecnología SOA (venta de software) que en su impacto sobre los negocios:
La incapacidad para mostrar un rápido ROI (retorno de la inversión) llevando a varios tomadores de decisiones de negocio de diferentes empresas a estar fuera de la SOA:
Esto significa un gran revés para la industria de TI:
Entonces ¿qué vendrá ahora? De acuerdo con Anne:
Su sugerencia es dejar de hablar de SOA y comenzar a hablar de los servicios (aunque ella no deja clara su definición de este término, lo que deja margen para la interpretación y las interpretaciones erradas).
El post obviamente despertó reacciones entre algunos líderes en este ámbito.
David Linthicum analizó lo que salió mal, parafraseando a:
- Falta de arquitectos cualificados que entienden SOA.
- Las grandes empresas de consultoría se centran en las tácticas y en las horas facturables mas que en los resultados.
- Los vendedores también se centran en la venta y no lo suficiente en la solución.
- Anuncia que SOA es una panacea para todos los males de IT.
Joe McKendrick observa que SOA es un estilo de arquitectura y no un producto:
Miko Matsumura apoya la sugerencia de Anne de cambiar la terminología, haciendo mas hincapié en el hecho de que el concepto de SOA, en particular la dimensión de negocios de SOA ciertamente sobrevivirá:
También advierte contra más de una reacción, que es tan común en la historia reciente de las IT:
Steve Jones interpreta la declaración de Anne como:
Steve entonces elabora la definición de servicio, promoviendo un enfoque de "primero el negocio" y los define como una funcionalidad que puede ser expuesta para su uso por otros:
Nick Gall, por otra parte, desacuerda con la forma con que Anne llevó ( "larga vida a los servicios"):
Él cita como ejemplo el éxito de Google, Amazon, e incluso Salesforce y le asigna a ellos, la mayoría de la influencia de la arquitectura web, comunidad web y modelos de negocio web "Web-orientation es una condición necesaria para la rápida integración de los datos y procesos de negocio, ellos permiten que los modelos de desarrollo para cada situación específica, tales como mashups, SaaS y cloud Computing".
Y, finalmente, en una visión similar, una explosión del pasado de 2005, la predicción de Don Box, que, aunque no estén conectadas en este debate, parece sugerir lo mismo: El término SOA será golpeado hasta la muerte y la industria del software invertirá o reciclará algunos términos iguales para reemplazarlo. Asegúrese de consultar el post original de Annes.
Parece claro que el cambio de nombre, probablemente no corrige los problemas actuales de SOA, pero se puede argumentar que con una reorientación en la arquitectura y los aspectos de negocio, SOA seguirá adelante.
CUANDO YO ERA TRENCITO
(La Paz, 1928)
Cuando era más pequeño, hace ya mucho tiempo, fui un trencito de verdad, como el que tengo en un libro; papá dice que es modelo de 1890. Lo guardo como recuerdo preciado porque él me dio la alegría más grande de esa época. El trencito tenía todo: su locomotora pequeña, donde casi no entraba el maquinista don Santiago y su ayudante Onofrio. ¡Uff…! Hacía mucho calor y apenas se podían mover para echar carbón al fogón que parecía un infierno. Tenía coche de primera y segunda, un coche comedor hermoso y, a veces, llevaba coches dormitorios. Nunca más seré tan feliz como en aquellos días.
II
Un día dije a papá que quería ser un trencito. Se burló con muchas carcajadas porque le parecía que tenía gracia. Muy chistoso. Me dolió bastante. No le dije nada, porque un hijo no debe lastimar nunca a su papá. Molesté todos los días; muchas veces lloré porque era injusto, sin embargo yo traté de ser lo más bueno posible. Cuando llegaba de su trabajo, mi tema era el tren. Los niños somos molestosos si no nos satisfacen, y somos tenaces para conseguir lo que deseamos, sobre todo, cuando nuestros deseos son justos, pero también los padres son como nosotros, ellos quieren que hagamos cosas que a nosotros no nos gustan. Cada vez volvía a solicitar con más decisión, entonces, papá se molestaba y me dirigía unas miradas, que cualquiera se iba directo a la cama a llorar su desencanto. Pasaba días y días entristecido, hasta que me enfermé y toda la culpa la tenía papá por no conceder mi deseo de ser un tren. Por supuesto que estaba a un paso de transformarme en cualquier momento que lo deseara, pero no quería sin la autorización de papá. Toda la vida había sido un niño obediente y estaba muy agradecido a mis padres que siempre me quisieron y me dieron muchas cosas lindas. Papá era muy bueno, pero, no sé por qué no quería que yo fuera tren.
III
Un día mamá se puso de mi parte, y muy molesta dijo a papá: "¡Ya! ¡Concédele su deseo! No se puede disgustar a un niño con esa terquedad tan absurda. ¡Sí! Es un absurdo -contestó papá-, porque es hacerle perder la realidad de la vida". Me miró y regañándome, dijo: "Un tren está hecho de fierro, de engranajes y pernos; un tren no tiene ojos ni boca, no tiene inteligencia ni corazón; tampoco va a la escuela ni al cine; un tren no tiene ni su papá ni su mamá".
Luego de un silencio largo… "¡Ya! ¡Vuélvete un tren si quieres!".
Sentí alrededor de mi cabeza las campanadas de San Francisco; risas y gritos de los recreos. Como una mañana de carnaval con el corso de niños disfrazados de pepinos y kusillos, que brincaban como si fueran de goma, al son de los pinquillos chillones. ¿Qué sería de los niños si no tuvieran mamá? La mía es muy buena.
IV
Me gusta vivir en la estación. Oír el sonido de los pitos, el traqueteo, el bullicio, las despedidas, la alegría de la gente que viaja.
Corríamos sobre rieles muy brillantes y, ¡qué sé yo! Por qué caminos desconocidos que se pierden en el horizonte del altiplano; subíamos cerros con muchas curvas, bordeando precipicios profundos, hasta llegar a las montañas cubiertas de nieve y el pito como una pelota roja rebotando de un cerro a otro. Y chas… chas… chasss… chasss, la locomotora cansada y apenas chasss… chasss… chasss… hasta llegar a la cumbre. El descenso era hasta llegar a la otra pampa y correr, correr siempre. Como yo era un tren, ya no podía ir a casa. Papá y mamá se quedaron muy tristes; las veces que venían a visitarme a la estación se les saltaban las lágrimas. Mamá no podía contener su llanto. Me sentía muy dolorido en esta situación, pero qué podía hacer si yo era un tren. Papá y mamá tenían que comprender que yo era más grande y que algún día tendría que irme de casa, como todos los hijos que se casan y se van con sus esposas. Yo era un tren y tenía que correr los caminos; además, que un tren no puede ser a la vez un niño y volver a ser, otra vez un tren.
Mamá algún día me comprendería. ¡Yo no los olvidaré nunca!
En la vida de trencito pasé mucho tiempo y así como cuando era más pequeño, no comprendía si los años eran días y los días meses; a un tren no le interesa el tiempo que pasa. Yo sólo recordaba el domingo porque todos íbamos a la iglesia, pero aprovechaba para escaparme a la estación, porque creo que es lógico que un niño, en proceso de volverse tren, vaya a la iglesia. Recordaba también que ese día me llevaban al circo a ver a los payasos, a los leones y a los trapecistas que me gustaban mucho. Ahora viajo con ellos y son mis amigos.
V
Una noche viajábamos por la pampa a mucha velocidad; la noche estaba tan oscura que parecía un terciopelo y sólo se oía el ruido del traqueteo monótono. Estuvimos con retraso en nuestro horario y teníamos que ganar el tiempo perdido. Un tren tiene que ser cumplido con su itinerario sino la gente se molesta, por eso corríamos mucho.
Repentinamente vi -a lo lejos-, en la oscuridad, una luz del tamaño de una cabeza de alfiler que crecía aceleradamente sin darnos tiempo a pensar en lo que podía ser. "Es un platillo volador", dijo Onofrio. "Déjate de boberías", le contestó el maestro Santiago; "no creo en esas fantasías". A cada instante era más grande, hasta que parecía que nos hubiera echado el sol sobre la cara. ¡Su luz encandilaba!… "¡Es un pla…! ¡Cuidado nos metimos en el carril del tren grande!… ¡Es el expreso que se nos viene encima!…".
Sentimos el pitazo agudo y ensordecedor. Todo sucedió en segundos. Un ruido atronador. Todo crujía, parecía el fin del mundo; nos sentimos expulsados a un lado de la vía y pasó la enorme locomotora diesel y sus coches que parecía de nunca terminar con su pito largo y agudo.
Cuando nos recuperamos de la confusión, vimos fierros retorcidos, carros inclinados fuera del carril, el agua de la locomotora desparramada, el vapor quemante que se iba al cielo; más allá estaba el humo como gelatina negra que se escurría entre las piedras. ¡Todo destruido!
Recogimos el agua, el humo y las ruedas retorcidas, los fierros que habían perdido sus formas. Y nos fuimos a buscar un mecánico. Ya era media noche y apenas pudimos llegar a donde don Panchito. Su casa estaba sin luz; pensamos que ya estaba durmiendo. No había más solución que despertarlo; llamamos varias veces ¡y nada! Volvimos a llamar, y nos contestó que no podía atendernos. Tanto le rogamos que tuvo que salir. Don Panchito era un excelente mecánico. Al fin apareció frente a nosotros, bien abrigado con una manta y una vela en la mano. Don Panchito es muy viejo y tiene que cuidarse de los resfríos. Le contamos el trágico accidente y no podíamos explicar cómo nos habíamos metido en la vía del gran tren expreso que parece un monstruo. Miró los fierros retorcidos y, muy crédulo, nos dijo: "Trataremos de repararlo; haré lo posible". En seguida se metió entre los fierros. Hora tras hora esperamos hasta el amanecer. Así, don Panchito salió cuando cantaban los gallos, con la vela en la mano. La luz le alumbraba sus grandes bigotes grises, sus ojos cansados y las manchas de grasa y hollín de su rostro. Nos dijo tristemente: "Me rindo; no se puede reparar. Está todo destruido".
VI
Nos quedamos vacilantes, con un largo silencio; nadie dijo nada. Yo sólo sentí que, por mis mejillas, corrían lágrimas y tenía ganas de llorar a gritos. Recién comprendí que todo había terminado.
No me quedaba más que volver a casa. Cuando toqué la puerta, mamá me abrió y sorprendida no pudo aguantarse y dio un grito de alegría, hasta asustar a papá el cual salió y me levantó en sus brazos, haciéndome dar varias vueltas en el aire. Lo importante para ellos era que yo hubiera vuelto a casa.
Ahora, todas las tardes, cuando vuelvo de la escuela, me siento en las gradas de la estación a mirar pasar los trenes, recordando los buenos tiempos. ¡El corazón se me encoge!
Dicen que soy un niño triste. No. Yo pienso que no. Lo que pasa es que quiero ser un tren.

