rackbike
Usuario (Estados Unidos)

El chile pertenece al género Capsicum de las plantas, en México se le conoce con el nombre del chile, en otros paises latinoamericanos se le conoce como ají, guidilla o pimiento, la sustancia encargada de hacer picoso un chile se le conoce como Capsaicina así como otros compuestos que forman un grupo llamado capsaicinoides. Cuando los capsaicinoides se consumen generalmente se unen a los repcetores de dolor que existen en la boca y garganta produciendo la sensación de calor, cuando dichos receptores se activan, envían una señar al cebrero indicando que se esta consumiendo algo caliente el cual responde con un proceso similar a la elevación de temperatura en el cuerpo liberando sudoración, elevando el pulso cardiaco y liberando endorfinas. Tanto los humanos como los mamíferos encuentran esa sensación de calor y dolor desagradable al consumir chile, por otro lado, los aves no tienen la misma sensibilidad a la capsaicina y es por es que es común verlos alimentandose de las semillas de los chiles. El picor de los chiles se mide en la Escala Scoville que fue nombrada así por el químico estadounidense Wilbur Scoville al desarrollar el Examen Organoléptico Scoville en 1912 el cual consiste en una solución con extracto del chile, que es diluida en agua azucarada hasta que la capsaicina ya no puede ser detectada. De esta forma los chiles que son dulces o que no contienen capsaicina tienen valor 0 en la escala Scoville, el valor Scoville de un chile Habanero oscila entre 200,000–300,000 SHU lo cual significa que el extracto fue diluído 300,000 veces antes que la Capsaicina fuese indetectable. Los chiles más picosos del mundo. Aunque según botánicos especializados en el área calculan que existen entre 2000 y 3000 tipos de chiles se cree que existen más, esta gran diversidad se ha clasificado en solo 5 especies domesticadas y cerca de 22 espontáneas o silvestres, a su vez se clasifican en chiles frescos y chiles secos. En 2007 un estudio revelo que se había encontrado el chile más picoso del mundo y que hasta la fecha sigue posicionado en el primer lugar, tal chile es conocido como Bhut Jolokia, Naga Morich, Ghost Pepper, Ghost Chili o Bih Jolokia y crece originariamente en la región Assam, India, y algunos estudios revelan que el picor de este chile supera los 850,000 o alcanzar los 1,001,304 puntos en la escala Scoville, superando por mucho en picor al chile Habanero que tiene entre 200,000 y 300,000 mil unidades Scoville y por lo tanto es peligroso consumirlo directamente sin mezclarlo con otro compuesto para bajar el picor, la mitad de un chile Bhut Jolokia puede condimentar los alimentos para 50 personas y aún así dejarla muy picosa. Lista de los chiles más

Cómo Hacer Una Página Web Cómo Hacer una Página Web Introducción ¿Qué entendemos por "hacer" una página web? Los fundamentos de una página web: el HTML Nuestra primera página utilizando un editor de páginas web Pasos para hacer una página web Reunir el material Diseñar la plantilla y la estructura del sitio web Implementar la página en el ordenador Publicar nuestra página en internet Para seguir aprendiendo Introducción Este tutorial está orientado a todas aquellas personas que no tengan conocimientos previos de edición web, o que utilicen el ordenador únicamente a nivel de usuario y no de programador. Hoy día publicar contenidos en la web por motivos profesionales o de ocio es algo habitual, y poseer unos conocimientos al menos esenciales puede resultarnos de gran ayuda en cualquier momento. Vamos a aprender, pues, el mecanismo para hacer una página web. ¿Qué entendemos por "hacer" una web? Hagámonos una pregunta : ¿queremos publicar contenidos al instante, donde nos interesa más el contenido que la apariencia? Por ejemplo: Podemos querer tener un cuaderno de bitácora donde publicar nuestras reflexiones, contar nuestro último viaje... Para ello un weblog (o blog) es adecuado. Son gratis y sólo tenemos que escribir el texto, el aspecto final lo proporciona el propio blog. Podemos querer publicar fotos con posibilidad de poner comentarios (y votar fotos y mucho más). Nada mejor que servicios como los de Flickr o Panoramio Intercambiar preguntas, dudas, opiniones, aficiones, etc. Para ello los foros son la mejor opción. Si lo anterior no cubre nuestras necesidades o si queremos desarrollar todo un sitio web de manera más artesanal, tenemos las siguientes opciones: Programar nuestra página web con una apariencia y un contenido estático, y publicarla. Por ejemplo, la página de nuestro pueblo, de nuestra pequeña empresa... Este tutorial trata de ello. Utilizar herramientas llamadas gestores de contenidos, que automatizan muchas de las tareas pero requieren conocimientos medios de programación. Programar una página web con lenguajes como PHP, JSP o ASP. Requieren conocimientos medios/altos de programación. Tras este breve repaso, ¡entremos en materia! Los fundamentos de una página web: HTML Una pagina web se compone de texto: el contenido literal (lo que queremos decir) y las llamadas etiquetas para dar la forma. Algunas de ellas son: Etiqueta Descripción <h1></h1> Escribir un título. Los subtítulos se consiguen con <h2></h2>... hasta <h5></h5> <p></p> Esctribir un párrafo <b></b> Texto en negrita <i></i> Texto en cursiva <center></center> Centrar cualquier elemento (texto, imagen, etc) <br /> Salto de línea <a href=""></a> Introducir un enlace (hipervínculo), para pulsar sobre él y navegar a otro sitio Para nuestra primera web abrimos un editor de texto (por ejemplo el Bloc de notas de Windows) y comenzamos escribiendo la siguiente estructura, obligatoria en toda página web: <html> <head> <title></title> </head> <body> </body> </html> Ahora demos contenido a la página. Escribamos lo siguiente, prestando atención para no equivocarnos <html> <head> <title>Pagina web de mi pueblo</title> </head> <body> <h1>Pagina web de Aldearriba del Pisuerga</h1> <h2>Bienvenida</h2> <p>Bienvenido a la pagina web de Aldearriba del Pisuerga, esperamos que sea de su agrado.</p> <h2>Historia</h2> <p>Los primeros pobladores datan de la <b>epoca celtibera</b>, pues se han localizado asentamientos junto al rio Pisuerga.</p> <h2>Festividades y tradiciones</h2> <p>Como en muchos pueblos, se celebra <b>San Isidro Labrador</b> cada 15 de mayo, asi como la <b>Fiesta de las <i>Animas</i></b> 15 dias antes el Miercoles de Ceniza</p> <p> <center>Esperamos verle pronto!!</center> </p> <p> <center>Pulse <a href="pagina2.html">aqui</a> para ir a otra pagina</center><br/> <center>Visite <a href="http://www.google.com">Google</a></center> </p> </body> </html> A continuación guardamos este texto en un fichero llamado pagina1.html, por ejemplo en el escritorio de Windows. Para hacerlo correctamente, una manera es ir al menú del Bloc de notas: Archivo | Guardar Como | y en el nombre de archivo a guardar poner entre comillas dobles el nombre del archivo: "pagina1.html". Esto es para que el Bloc de notas de Windows no guarde el fichero con el nombre pagina1.html.txt, un error común al principio: Hacemos doble click sobre el icono de nuestra nueva página web que estará en el escritorio, y debemos verlo de esta manera: Analizando con cuidado el ejemplo, observamos algunas cosas importantes: Todo documento HTML tiene una estructura base que hay que respetar Para dar formato al texto, hay que utilizar etiquetas HTML, que pueden anidarse Toda etiqueta tiene una parte de apertura <etiqueta> y otra de cierre, con una barra al principio </etiqueta> (salvo alguna excepción, como <br/> La extensión del archivo que contiene el código HTML debe ser: .html El navegador web interpreta el lenguaje HTML, aplica el formato y lo muestra por pantalla Si ponemos un enlace a una pagina web, hay que comenzar con http:// Si ponemos una página web situada junto con la actual, sólo es necesario escribir el nombre del fichero. En el ejemplo anterior, si pulsamos sobre Google, nos llevará al buscador. Si pulsamos sobre "Pulse aquí" para ir a la otra página, no la encontrará porque aún no la hemos creado. Vamos a hacerlo. Abrimos otro Bloc de notas y creamos una página web sencilla: <html> <head> <title></title> </head> <body> <h1>Esta es la pagina numero 2</h1> </body> </html> La guardamos con el nombre pagina2.html también en el escritorio, de la misma manera que hemos hecho con pagina1.html. Ahora, al pulsar en la palabra "aqui" de la frase "Pulse aqui para ir a otra pagina", se mostrará segunda página: Nuestra primera página utilizando un editor de páginas web En la sección anterior se han introducido los fundamentos de una página web. Pero hay mucho más, y no tiene sentido memorizar el lenguaje de etiquetas; es más práctico saber qué son para saber comprenderlas en el momento en que las tengamos a la vista. Vamos, pues, a utilizar herramientas para hacer nuestra página web de manera más rápida y, sobre todo, de manera visual (WISIWYG), evitando tener que escribir código fuente (como mucho, retocando). Estos editores de página web utlizarán lenguaje HTML y otras tecnologías adicionales, como las hojas de estilos en cascada (CSS), HTML dinámico o JavaScript. Un programa que recomiendo para empezar es Kompozer (una versión mejorada de NVU) por ser de libre uso y muy completo. Hay otros editores más habituales en nuestro entorno, como Microsoft Office Word que permiten que lo que hayamos escrito lo guardemos en formato HTML (menú Archivo | Guardar Como | Página Web), si bien el código HTML que genera no es muy limpio en algunos casos. Podemos descargar Kompozer desde http://kompozer.net/download.php, en la sección Latest stable version, versión WindowsWin32 binary, el fichero con nombre kompozer-X.X.X-win32.zip. Descomprimimos este fichero descargado en un directorio, entramos en él y ejecutamos el archivo kompozer.exe. El programa tiene el siguiente De manera visual podemos escribir texto, ponerlo en negrita, centrado, convertirlo en un enlace, un título, insertar una imagen, una tabla, dividir en marcos, etc. Asimismo abajo podemos ver las pestañas "Normal", "HTML Tags" y "Preview". Nosotros trabajaremos sobre el modo "Normal", pero podemos comprobar en todo momento el código HTML que se está escribiendo automáticamente por debajo, pulsando en la pestaña "HTML Tags". Para ver el aspecto final de lo que llevamos hecho, podemos pulsar sobre "Preview". Pasos para hacer una página web Aunque al principio dediquemos tiempo a hacer pruebas con el editor, escribiendo texto y poniendo imágenes y moviéndolo todo de sitio varias veces, cambiando colores para buscar una combinación que nos guste, la experiencia y la metodología propia de los desarrollos informáticos (bien aplicada es de gran utilidad), recomienda seguir los siguientes pasos: Reunir el material con el que vayamos a hacer la página web: textos, imágenes, etc. Diseñar sobre papel el aspecto de nuestro sitio web: dónde va el menú, el encabezado, el pie de página, el cuerpo... es decir, la plantilla (podemos inventarla o elegir una de los recursos gratuitos que hay en internet, pero esto requiere ya cierta de experiencia). Asimismo concretamos cuántas páginas tendrá nuestro sitio web y qué información contendrá. Una vez claro lo anterior, se traslada el diseño al ordenador, utilizando una herramienta como Kompozer. Vamos a hacer una página más completa siguiendo estos tres pasos. 1.- Reunir el material En nuestro ejemplo, usaremos el siguiente: Un texto de bienvenida: bienvenida.txt Un texto con historia del pueblo: historia.txt Un texto con turismo: turismo.txt Fotografías de algunos monumentos, tomadas con una cámara digital y reducidas en dimensiones y tamaño (que no ocupen más de 200 Kb), usando programas como Paint, GIMP o Image Resizer (tutorial) ... Una imagen de fondo: fondo.jpg Puedes descargar el material aquí: material_pagina_web.zip 2.- Diseñar la plantilla y la estructura del sitio web Una posible plantilla para la distribución del contenido es la siguiente: El sitio web estará compuesto por tres páginas individuales: bienvenida.html, con el texto de bienvenida e imagen de fondo historia.html, con el texto de la historia e imagen de fondo turismo.html, con el texto y las imágenes de turismo, y la imagen de fondo Una vez tenemos ya en mente nuestra web, vamos a utilizar las herramientas descritas anteriormente para implementarla. 3.- Implementar la página en el ordenador Creamos una carpeta por ejemplo en el Escritorio de Windows, que se llame paginaweb. Dentro, una subcarpeta denominada imagen, donde copiaremos las imagenes de los monumentos y el fondo. Este material lo hemos descargado antes desde material_pagina_web.zip. Ininiciamos Kompozer y vamos al menú File | New | dejamos seleccionado A blank document y pulsamos en Create. Guardamos esta pagina desde el menú File | Save As... Aparecerá un diálogo pidiendo el título de la página. Escribimos por ejemplo Página web de Aldearriba de Pisuerga, pulsamos Ok y guardamos la página en una carpeta en el Escritorio de Windows, paginaweb, con el nombre bienvenida (la extensión .html la pone automáticamente el editor). Comenzamos poniendo el fondo de la página accediendo al menú Format | Page Colors and Background... En la casilla Background Image navegamos hasta la imagen de fondo que estará en: imagen/fondo.jpg. Aseguremonos que la opción URL is relative to page location... queda marcada: A continuación escribimos el encabezado de la página. Por ejemplo, "Bienvenido a la pagina web de Aldearriba de Pisuerga", lo damos forma de encabezado de nivel 1 (desplegable izquierdo) y finalmente lo centramos. A continuación, debajo del título, insertamos una tabla, desde el menú Insert | Table... pulsamos sobre la pestaña Precisely y ponemos los siguientes datos, y pulsamos OK. En la celda izquierda escribimos: Menú: y debajo tres líneas, una cada una con "Bienvenida", "Historia" y "Turismo", dando el tamaño y tipo de letra que queramos, por ejemplo Helvetica, Arial (desplegable izquierdo, expandiendo "Variable Width". La tabla seguramente se descoloque; podemos ajustar su forma poniedo el cursor sobre los límites de la misma en la barra superior e izquierda, y arrastrando: Bajo la tabla escribimos el pie de página, con información de la última actualización: "Última actualización: 06 de agosto de 2009". Para finalizar con la plantilla base de la página, vamos a convertir las palabras bajo el menú izquierdo en enlaces reales. Por ejemplo, seleccionamos la palabra "Bienvenida" y vamos al menú Insert | Link... e introducimos en el área de texto: bienvenida.html y pulsamos OK Repetimos el proceso con "Historia", siendo la página historia.html y "Turismo" siendo la página turismo.html. Conviene indicar que estras tres páginas estarán juntas en la misma carpeta del Escritorio paginaweb y por eso no hace falta escribir la ruta de directorios de las páginas a las que enlazamos. Si estuviesen en otro directorio habría que poner la ruta. Si lo que queremos en enlazar con una página de internet, habrá que poner la dirección con formato http://...... En este punto tenemos completada la plantilla: Hasta aquí, el procedimiento es común para las tres páginas, y lo repetiremos para cada una de ellas, o bien haremos dos copias del fichero bienvenida.html en el mismo directorio paginaweb y lo renombraremos como historia.html y turismo.html. Como estamos editanto la página de bienvenida, en el cuerpo de la página vamos a pegar el texto del fichero bienvenida.txt, y lo damos formato al gusto El proceso para la página de historia es similar: sobre la plantilla, rellenamos el cuerpo con texto. Si hicimos copia del fichero bienvenida.html y cambiamos el nombre por historia.html, podemos abrir esta página desde Kompozer en el menú File | Open File y seleccionando historia.html. Un ejemplo del resultado final puede ser: De manera similar, abrimos la página de turismo y en el cuerpo insertaremos el texto e imágenes. Para insertar una imagen, ponemos el cursor antes de la primera palabra del primer párrafo "Transitando por..." y pulsamos en el menú Insert | Image para acceder a las propiedades de inserción. En la pestaña Location seleccionamos la imagen con el explorador y se inserta la ruta relativa a la página. Escribimos un texto alternativo, como se muestra en la imagen: En la pestaña Appearance podemos seleccionar la situación de la imagen respecto al texto: alineado medio, superior o inferior, a la izquierda, derecha, espacio alrededor de la imagen... La imagen del puente la dispondremos a la izquierda del párrafo y a su misma altura, separando unos píxeles el texto de la imagen. Estableceremos las siguientes propiedades: Pulsamos OK y vemos el resultado: Debajo del segundo párafo, y en el medio, insertaremos la imagen del rollo de justicia. Guardamos la página, y el aspecto final de la página de turismo será: En este punto podemos probar los enlaces del menú izquierdo. Si hemos seguido bien todos los pasos, es decir, hemos escrito bien los nombres de las páginas .html en el editor web y los ficheros .html en disco están al mismo nivel y con los nombres correctos, podremos pasar de una página a otra de nuestro pequeño sitio web. Publicar nuestra página en internet Una vez que la página está terminada y comprobamos que es correcta en nuestro equipo, es momento de publicarlo en internet. Si no disponemos de alojamiento web privado, podemos darnos de alta en un servicio de webhosting gratuito (que posiblemente inserte algo de publicidad en nuestras páginas). Sin ánimo de publicitar ninguna empresa, yo voy a explicar cómo se hace con Lycos. Accedemos a http://www.tripod.lycos.es/ y nos registramos. Recibiremos un correo de confirmación en nuestra cuenta de correo electrónico indicada. Al confirmar, accederemos a una página web donde podemos escoger el nombre de nuestro espacio web y el dominio: Una vez confirmado, podemos hacer inicio de sesión en Lycos y accedemos al panel de control. Para subir nuestra página web a nuestro espacio, podemos usar FTP habitual, a la dirección ftp.***, con nuestro nombre de usuario y contraseña. O bien podemos utilizar una herramienta online para subir los ficheros y gestionar nuestro espacio: el WebFTP. Usando WebFTP subimos primero las tres páginas .html, y luego creamos una nueva carpeta llamada imagen, donde subiremos en ella posteriormente las tres imágenes: ¡Ahora ya podemos visitar nuestra pequeña obra maestra en internet! http://***/aldearriba/bienvenida.html Para seguir aprendiendo Obviamente este tutorial ofrece unas pinceladas básicas sobre el proceso de construcción de una web. Ahora que tenemos unos mínimos fundamentos, podemos seguir estudiando y hacer páginas más elaboradas. A continuación ofrezco algunos recursos para profundizar en materia: HTML con Clase: Tutorial de HTML Cursos de ProgramacionWeb.com Manuales de Programación y Diseño web (gracias Carlos) Este tutorial está dedicado a Laura y a todas las personas que están aprendiendo. ¡Ánimo!

Hola Amigos en este post les voy a mostrar como armar una pc desde cero,osea sin nada puesto .. Aca te muestro con estos videos Videos: ENSANBLAJE DE LA PC: link: http://www.youtube.com/watch?v=avi4CFefiyU&feature=player_embedded MICROPROCESADOR: El MicroProcesador es la Unidad Central de Procesamiento es decir, es el administrador de nuestro Pc. Es quien va ha ejecutar el sistema operativo y los demás programas. link: http://www.youtube.com/watch?v=tSFM0_9wbCg&feature=player_embedded FAN: SOLUCIÓN TERMICA.- Evita que no se recaliente nuestro MicroProcesador link: http://www.youtube.com/watch?v=0i5m_BX0ttU&feature=player_embedded MEMORIA RAM: Dispositivo de almacenamiento. Es donde se van a almacenar temporalmente el sistema operativo y los demás programas link: http://www.youtube.com/watch?v=fsOfuffBuKg&feature=player_embedded PLACA: link: http://www.youtube.com/watch?v=-dG-IEUKumg&feature=player_embedded PANEL FRONTAL - PC-CHIPS E INTEL link: http://www.youtube.com/watch?v=C6b1d79Uy-M&feature=player_embedded DISCO DURO link: http://www.youtube.com/watch?v=dFA2ZknrhpY&feature=player_embedded LECTOR DE DVD link: http://www.youtube.com/watch?v=HPcfcvpE0gk&feature=player_embedded CONECTORES IDE Y SATA link: http://www.youtube.com/watch?v=qWJ7v0XwSsI&feature=player_embedded TARJETA DE VIDEO link: http://www.youtube.com/watch?v=vozHCU9Brc4&feature=player_embedded FUENTE DE PODER link: http://www.youtube.com/watch?v=cZ0QZdyp9dg&feature=player_embedded Bueno eso fue todo espero que le haya servido ...Suerte a todos.. NO SE OLVIDEN DE COMENTAR ...
Este es el programa para que puedas cambiar el LOGO SCREEN por una imagen que a ti te guste y se vea sorprendente. Cuando entres a cualquier usuario de tu equipo en ves de aparecer el fondo azul cambiara por la imagen que uses. cortito pero interesante
¿Sabía Ud. cuánto tiempo tardan en degradarse estos productos? 1 año: El “papel”, básicamente es celulosa. Si queda tirado sobre tierra y si le toca un invierno lluvioso, no tarda en degradarse. Lo ideal es reciclarlo para evitar que se sigan talando árboles para su fabricación. 1 a 2 años: Bajo los rayos del sol, una “colilla con filtro” puede demorar hasta dos años en desaparecer. El filtro es de acetato de celulosa y las bacterias del suelo, acostumbradas a combatir materia orgánica, no pueden atacarla de entrada. Si cae en el agua, la desintegración es más rápida, pero más contaminante. 5 años: Un trozo de “chicle” masticado se convierte en ese tiempo, por acción del oxigeno en un material duro que luego empieza a desquebrajarse hasta desaparecer. El chicle es una mezcla de gomas de resinas naturales, sintéticas, azúcar, aromatizantes y colorante artificiales. 10 años: Tiempo que tarda la naturaleza en transformar un “lata de gaseosa o de cerveza” al estado de óxido de hierro. Por lo general las latas tienen 210 micrones de espesor de acero recubierto de barniz y de estaño. A la intemperie hacen falta mucha lluvia y humedad para que el óxido la cubra. 30 años: Tarda un “aerosol” en degradarse, éste es uno de los elementos de los desechos domiciliarios más polémicos. Primero porque al ser un aerosol, salvo especificación contraria, ya es un agente contaminante por sus CFC (clorofluorcarbonados). Por lo demás su estructura metálica lo hace resistente a la degradación natural, el primer paso es la oxidación. 30 años: La aleación metálica que forma las “tapitas de botellas” puede parecer candidata a una degradación rápida porque tiene poco espesor. Pero no es así. Primero se oxidan y poco a poco su parte de acero va perdiendo resistencia hasta dispersarse. 30 años: Los “envases tetra-brik” no son tan tóxicos como uno imagina. En realidad el 75% de su estructura es de cartulina (celulosa), el 20 de polietileno puro de baja densidad y el 5 % de aluminio. Lo que tarda más en degradarse es el aluminio, la celulosa si está al aire libre, desaparece en poco más de un año. 100 años: De acero plástico, los “encendedores descartables” se toman su tiempo para convertirse en otra cosa. El acero, expuesto al aire libre, recién comienza a dañarse y enmohecerse levemente después de 10 años. El plástico en ese tiempo, ni pierde color 100 años: Junto con el plástico y el vidrio, “el telgopor” no es un material biodegradable. Está presente en gran parte de el envoltorio de artículos electrónicos. Y así como se recibe, en la mayoría de los casos se tira a la basura. Lo máximo que puede hacer la naturaleza con su estructura es dividirla. En moléculas mínimas. 100 años: Los “corchos de plástico” están hechos de polipropileno , el mismo material de las cañitas y envases de yogurt. Se puede reciclar más fácil que las botellas de agua mineral (que son de PCV, cloruro de polivinilo) y las que son de PET (tereftalato de polietileno). 150 años: Las bolsas de plásticos, por causa de su mínimo espesor, pueden transformarse más rápido que una botella de es e material. Las bolsitas en realidad, están hechas de polietileno de baja densidad. La naturaleza suele entablar una batalla dura contra ese elemento. Y por lo general pierde. 100 a 1.000 años: Las “botellas de plástico” son las más rebeldes a la hora de transformarse. Al aire libre pierden su tonicidad, se fragmentan y se dispersan. Enterradas duran más. La mayoría están hechas de PET, un material duro de roer: los microorganismos no tienen mecanismos para atacarlos. 1.000 años: Los “vasos descartables de polipropileno” contaminan menos que los de poliestileno –material de las cajitas de huevos- Pero también tardan en transformarse. El plástico queda reducido a moléculas sintéticas; invisibles pero siempre presentes. 1.000 años: “Pilas” sus componentes son altamente contaminantes y no se degradan. La mayoría tienen mercurio, otras también tienen cinc, cromo, arsénico, plomo o cadmio. Pueden empezar a separarse luego de 50 años al aire libre. Pero se las ingenian para permanecer como agentes nocivos. 4.000 años: La “botella de vidrio” en cualquiera de sus formatos, es un objeto muy resistente. Aunque es frágil porque con una simple caída puede quebrarse, para los componentes naturales del suelo es una tarea titánica transformarla. Formada por arena y carbonatos de sodio y calcio, es reciclable en un 100%.
Juego de tres en línea de multijugador en red Acrónimos de uso frecuente API: Interfaz de programación de aplicaciones HTTP: Protocolo de Transferencia de Hipertexto IP: Protocolo Internet SDK: Kit de desarrollo de software SQL: Lenguaje de Consulta Estructurado IU: Interfaz de Usuario XML: Extensible Markup Language Los juegos casuales son extremadamente populares y muy lucrativos, y es fácil saber por qué. No todas las personas de todos los grupos de edades están interesadas en jugar online videojuegos de disparos en primera persona contra hordas de adolescentes con reflejos tan rápidos como la velocidad de la luz. Algunas veces, es más interesante jugar videojuegos donde tiene tiempo para pensar y realizar una estrategia o donde la meta es cooperar unos con otros para ganar el juego. Lo genial sobre los videojuegos casuales desde la perspectiva de los desarrolladores es que son mucho más fáciles de construir que los videojuegos intensivos en gráficos de disparos en primera persona o de deportes. Así que es más fácil para un solo desarrollador, o para un grupo de desarrolladores, producir una primera versión de un nuevo videojuego original. En este artículo, pasamos a través de las bases para crear un juego de línea de tres casual de multijugador en red. El servidor del videojuego es una aplicación web basada en MySQL y PHP con una interfaz XML. La parte frontal es una aplicación nativa de Android que funciona en teléfonos de Android. Construyendo el fondo El fondo inicia con una base de datos simple de MySQL que tiene dos tablas. El Listado 1 muestra el esquema para la base de datos. Listado 1. db.sql DROP TABLE IF EXISTS games; CREATE TABLE games( id INT NOT NULL AUTO_INCREMENT, primary key ( id ) ); DROP TABLE IF EXISTS moves; CREATE TABLE moves( id INT NOT NULL AUTO_INCREMENT, game INT NOT NULL, x INT NOT NULL, y INT NOT NULL, color INT NOT NULL, primary key ( id ) ); La primera de las dos tablas es la tabla de los juegos, que sólo tiene el ID exclusivo del juego. En una aplicación de producción, probablemente tenga una tabla de usuarios, y la tabla de juegos incluye los IDs de usuario de ambos jugadores. Para hacerlo simple, sin embargo, renunciaré a este enfoque para concentrarme en las bases de almacenar los datos del juego, la comunicación entre el cliente y el servidor y la construcción de la parte frontal. La segunda tabla es la tabla de movimientos, que incluye los movimientos individuales para el juego dado, así que tiene cinco columnas. La primera columna es el ID exclusivo del movimiento. La segunda columna es el ID del juego al que aplica este movimiento. Después vienen las posiciones 'x' y 'y' del movimiento. Estos valores deben estar entre 0 y 2 para 'x' y 'y', ya que cuenta con una red de tres por tres. El último campo es el "color" del movimiento, que es un entero que indica X u O. Para construir la base de datos, primero use mysqladmin para crearla y después use el comando mysql para ejecutar el script db.sql como se muestra aquí: % mysqladmin --user=root --password=foo create ttt % mysql --user=root --password=foo ttt < db.sql Esta etapa crea una nueva base de datos llamada "ttt", que tiene el esquema del juego de tres en línea. ahora que tiene el esquema, necesita crear una forma de iniciar un juego. Para esto, usted cuenta con un script llamado start.php, como en el Listado 2. Listado 2. start.php <?php header( 'Content-Type:text/xml' ); $dd = new PDO('mysql:host=localhost;dbname=ttt', 'root', ''); $sql = 'INSERT INTO games VALUES ( 0 )'; $sth = $dd->prepare($sql); $sth->execute( array() ); $qid = $dd->lastInsertId(); $doc = new DOMDocument(); $r = $doc->createElement( "game" ); $r->setAttribute( 'id', $qid ); $doc->appendChild( $r ); print $doc->saveXML(); ?> El script comienza por conectarse a la base de datos. Después ejecuta una sentencia INSERT en la tabla de juegos y recupera el ID que fue generado. Desde ahí crea un documento XML, añade el ID a una etiqueta de juego y exporta el XML. Necesita ejecutar este script para poner un juego en la base de datos, ya que la simple aplicación de Android no tiene una interfaz para crear juegos. Este es el código: $ php start.php <?xml version="1.0"?> <game id="1"/> $ Ahora ya tiene su primer juego. Para ver la lista de juegos, use el script games.php que está en el Listado 3. Listado 3. games.php <?php header( 'Content-Type:text/xml' ); $dbh = new PDO('mysql:host=localhost;dbname=ttt', 'root', ''); $sql = 'SELECT * FROM games'; $q = $dbh->prepare( $sql ); $q->execute( array() ); $doc = new DOMDocument(); $r = $doc->createElement( "games" ); $doc->appendChild( $r ); foreach ( $q->fetchAll() as $row) { $e = $doc->createElement( "game" ); $e->setAttribute( 'id', $row['id'] ); $r->appendChild( $e ); } print $doc->saveXML(); ?> Este script, igual que el script.php, comienza por conectarse a la base de datos. Después de eso, consulta la tabla de juegos para ver qué está disponible. Y desde ahí crea un nuevo documento XML, añade una etiqueta de juegos, después añade etiquetas de juego para cada uno de los juegos disponibles. Cuando ejecuta este script desde la línea de comandos, ve algo como esto: $ php games.php <?xml version="1.0"?> <games><game id="1"/></games> $ También puede ejecutar este script desde el navegador web para ver la misma salida. ¡Excelente! Con la API de juegos fuera del camino, es momento de escribir el código de servidor para manejar los movimientos. Este código inicia con la construcción de un script ayudante llamado show_moves que obtiene los movimientos actuales para un juego dado y los exporta como XML. El Listado 4 muestra el código PHP para esta función de ayudante. Listado 4. show_moves.php <?php function show_moves( $dbh, $game ) { $sql = 'SELECT * FROM moves WHERE game=?'; $q = $dbh->prepare( $sql ); $q->execute( array( $game ) ); $doc = new DOMDocument(); $r = $doc->createElement( "moves" ); $doc->appendChild( $r ); foreach ( $q->fetchAll() as $row) { $e = $doc->createElement( "move" ); $e->setAttribute( 'x', $row['x'] ); $e->setAttribute( 'y', $row['y'] ); $e->setAttribute( 'color', $row['color'] ); $r->appendChild( $e ); } print $doc->saveXML(); } ?> El script toma un manejador de base de datos y el ID de juego. Desde ahí ejecuta el SQL para obtener la lista de movimientos. Después crea un documento XML con los movimientos para el juego dado. Usted creó esta función de ayudante porque hay dos scripts que la usan; el primero es un script moves.php que retorna los movimientos actuales para el juego especificado. El Listado 5 muestra este script. Listado 5. moves.php <?php require_once( 'show_moves.php' ); header( 'Content-Type:text/xml' ); $dbh = new PDO('mysql:host=localhost;dbname=ttt', 'root', ''); show_moves( $dbh, $_REQUEST['game'] ); ?> Este simple script incluye el código de la función de ayudante, se conecta a la base de datos y después invoca la función show_moves con el ID del juego especificado. Para probar este código, use el comando curl para invocar el script en el servidor desde la línea de comandos: $ curl "http://localhost/ttt/moves.php?game=1" <?xml version="1.0"?> <moves/> $ Desgraciadamente, aún no ha hecho ningún movimiento, así que no es una salida particularmente interesante. Para remediar eso necesita añadir el script final a la API del servidor. El Listado 6 muestra el script move.php. Listado 6. move.php <?php require_once( 'show_moves.php' ); header( 'Content-Type:text/xml' ); $dbh = new PDO('mysql:host=localhost;dbname=ttt', 'root', ''); $sql = 'DELETE FROM moves WHERE game=? AND x=? AND y=?'; $sth = $dbh->prepare($sql); $sth->execute( array( $_REQUEST['game'], $_REQUEST['x'], $_REQUEST['y'] ) ); $sql = 'INSERT INTO moves VALUES ( 0, ?, ?, ?, ? )'; $sth = $dbh->prepare($sql); $sth->execute( array( $_REQUEST['game'], $_REQUEST['x'], $_REQUEST['y'], $_REQUEST['color'] ) ); show_moves( $dbh, $_REQUEST['game'] ); ?> Este script comienza por incluir la función de ayudante y conectarse a la base de datos. Después ejecuta dos sentencias SQL. La primera elimina cualquier movimiento que pueda chocar con la que está siendo enviada. La segunda inserta una nueva fila en la tabla de movimientos para el movimiento especificado. El script después retorna la lista de movimientos al cliente. Esta etapa salva al cliente de tener que hacer dos solicitudes cada vez que hace un movimiento. El ancho de banda no es barato, así que siempre que pueda conglomerar solicitudes debe hacerlo. Para probar que todo esto funciona, puede hacer un movimiento: $ curl "http://localhost/ttt/move.php?game=1&x=1&y=2&color=1" <?xml version="1.0"?> <moves><move x="1" y="2" color="1"/></moves> Con el código del servidor del juego completo, puede construir la parte frontal de Android para este juego en red de multijugador. Volver arriba Construyendo la parte frontal de Android Primero, instale el SDK de Android, así como algunas versiones de la plataforma de Android, y después finalmente Eclipse y el plug-in de Eclipse de Android. Para nuestra suerte, todo esto está bien documentado en el sitio de Android (vea Recursos para obtener enlaces). Una cobertura a profundidad sobre cómo configurar su entorno de desarrollo requeriría todo este artículo y más. Después de que configure el entorno de desarrollo, lance Eclipse e inicie un nuevo proyecto de Android. Debe ver algo similar a la Figura 1. Figura 1. Creando la aplicación de Android en Eclipse La Figura 1 muestra el asistente de proyecto para aplicaciones de Android. Ingrese el nombre de un proyecto, seleccione el botón de selección Create new project in workspace y especifique la ubicación para el código con los elementos de UI. En la lista de comprobación Build Target, seleccione una plataforma de Android. Para este código, yo uso Android 2.3.1. El código es muy simple, así que puede usar cualquier versión que prefiera. Si no ve ninguna plataforma listada, entonces necesita descargar e instalar las plataformas como se indica en las instrucciones de configuración del SDK de Android. Tenga en cuenta que descargar todas estas plataformas requiere mucho, mucho tiempo. En la sección Properties , llene el nombre de la aplicación y el nombre del paquete. Yo usé "Tic Tac Toe" y "com.jherrington.tictactoe" en los campos respectivos. Después, marque el recuadro de selección Create Activity e ingrese un nombre para la actividad. Yo usé "TicTacToeActivity" como el nombre de la actividad. Haga clic en Finish para ver un nuevo proyecto que se parece a la Figura 2. Figura 2. Los archivos del proyecto TicTacToe La Figura 2 muestra los directorios de alto nivel y los archivos para una aplicación de Android (los directorios son src, gen, Android 2.3.1 y res y los archivos son assets, AndroidManifest.xml, default.properties y proguard.cfg). Los elementos importantes son: El directorio res, que contiene recursos El directorio src, que tiene el origen de Java™ El archivo manifest, que contiene la información biográfica sobre la aplicación Su primera edición es en el archivo manifest. La mayoría del archivo ya está correcto, pero necesita añadir el permiso de Internet, de forma que la aplicación pueda hacer solicitudes en Internet. El Listado 7 muestra el archivo manifest completado. Listado 7. AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.jherrington.tictactoe"> <uses-permission android:name="android.permission.INTERNET" /> <uses-sdk android:minSdkVersion="5" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name="TicTacToeActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> El único cambio fue añadir la etiqueta uses-permission en la parte superior del archivo. Su siguiente tarea es diseñar la IU. Para esto, ajuste el archivo layout.xml, que está contenido en el directorio res/layout. El Listado 8 muestra el nuevo contenido para este archivo. Listado 8. layout.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/linearLayout1"> <Button android:text="Play X" android:id="@+id/playx" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <Button android:text="Play O" android:id="@+id/playo" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> </LinearLayout> <com.jherrington.tictactoe.BoardView android:id="@+id/bview" android:layout_width="wrap_content" android:layout_height="wrap_content" ></com.jherrington.tictactoe.BoardView> </LinearLayout> Este es un diseño sencillo. La parte superior es un conjunto de dos botones envueltos en un diseño lineal con una orientación horizontal. Estos dos botones son los botones X y O que el usuario usa para especificar qué color está jugando. El resto del código está llenado con una clase BoardView, que muestra el tablero de tres en línea con el juego actual. El código para la clase BoardView está en el Listado 11. Con el diseño a la mano, es momento de escribir algo de código de Java para la aplicación. Esta codificación comienza con la clase TicTacToeActivity en el Listado 9. Las actividades son los componentes básicos de aplicaciones de Android. Cada aplicación tiene una o más actividades que representan los diversos estados de la aplicación. A medida que navega a través de la aplicación construye una pila de actividades que puede después sacar al usar el botón de retroceso en el teléfono. La aplicación TicTacToe tiene una sola actividad. Listado 9. TicTacToeActivity.java package com.jherrington.tictactoe; import java.util.Timer; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.widget.Button; import android.widget.Gallery; import android.widget.LinearLayout; public class TicTacToeActivity extends Activity implements OnClickListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button playx = (Button)this.findViewById(R.id.playx); playx.setOnClickListener( this ); Button playo = (Button)this.findViewById(R.id.playo); playo.setOnClickListener( this ); Timer timer = new Timer(); UpdateTimer ut = new UpdateTimer(); ut.boardView = (BoardView)this.findViewById(R.id.bview); timer.schedule( ut, 200, 200 ); } public void onClick(View v) { BoardView board = (BoardView)this.findViewById(R.id.bview); if ( v.getId() == R.id.playx ) { board.setColor( 2 ); } if ( v.getId() == R.id.playo ) { board.setColor( 1 ); } } } La actividad tiene dos métodos. El primero es el método onCreate, que construye la interfaz de usuario, conecta al manejador onClick a los botones X y O e inicia el temporizador de actualización. El temporizador de actualización es usado para renovar el estado del juego cada 200 milisegundos. Este dispositivo permite a ambos jugadores ver cuando el otro jugador se mueve. El manejador onClick establece el color actual del tablero con base en si el usuario hace clic en el botón X o en el botón O. La clase GameService, en el Listado 10, es una clase singleton que representa el servidor del juego y el estado actual del juego dado. Listado 10. GameService.java package com.jherrington.tictactoe; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import android.util.Log; public class GameService { private static GameService _instance = new GameService(); public int[][] positions = new int[][] { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }; public static GameService getInstance() { return _instance; } private void updatePositions( Document doc ) { for( int x = 0; x < 3; x++ ) { for( int y = 0; y < 3; y++ ) { positions[x][y] = 0; } } doc.getDocumentElement().normalize(); NodeList items = doc.getElementsByTagName("move"; for (int i=0;i<items.getLength();i++){ Element me = (Element)items.item(i); int x = Integer.parseInt( me.getAttribute("x" ); int y = Integer.parseInt( me.getAttribute("y" ); int color = Integer.parseInt( me.getAttribute("color" ); positions[x][y] = color; } } public void startGame( int game ) { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://10.0.2.2/ttt/moves.php"; try { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); nameValuePairs.add(new BasicNameValuePair("game", Integer.toString(game))); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); updatePositions( db.parse(response.getEntity().getContent()) ); } catch (Exception e) { Log.v("ioexception", e.toString()); } } public void setPosition( int game, int x, int y, int color ) { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://10.0.2.2/ttt/move.php"; positions[x][y] = color; try { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); nameValuePairs.add(new BasicNameValuePair("game", Integer.toString(game))); nameValuePairs.add(new BasicNameValuePair("x", Integer.toString(x))); nameValuePairs.add(new BasicNameValuePair("y", Integer.toString(y))); nameValuePairs.add(new BasicNameValuePair("color", Integer.toString(color))); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); updatePositions( db.parse(response.getEntity().getContent()) ); } catch (Exception e) { Log.v("ioexception", e.toString()); } } } Este código es algo del código más interesante en la aplicación. Primero, tiene el método updatePositions, que toma el XML retornado del servidor y busca los elementos de movimiento, después actualiza la matriz de posiciones con el conjunto de movimientos actual. La matriz de posiciones tiene un valor para cada posición en el tablero; cero indica un espacio vacío, 1 representa "O" y 2 es para "X". Las otras dos funciones, startGame y setPosition, son la forma en que se comunica con el servidor. El método startGame solicita el conjunto de movimientos actual del servidor y actualiza la lista de posiciones. El método setPosition publica el movimiento en el servidor al crear una solicitud de publicación HTTP y configurar los datos para la publicación usando una matriz de pares de valores de nombre, los cuales son después son codificados para transporte. Después analiza el XML de respuesta para actualizar la lista de posiciones. Si observa detenidamente, el IP usado para conectarse al servidor es realmente interesante. No es "localhost" o "127.0.0.1"; es "10.0.2.2", que es un alias para la máquina en la que se ejecuta el emulador. Ya que el teléfono de Android es en sí mismo un sistema de UNIX® , tiene sus propios servicios en localhost. Fascinante, ¿verdad? No es frecuente que sea tan claro que el teléfono no es en realidad un teléfono per se, sino una computadora en toda regla que se ajusta a la palma de su mano y sucede que tiene un teléfono integrado en él. Entonces, ¿dónde estamos? Usted tiene la actividad, que es el componente principal para la aplicación; tiene la configuración del diseño de IU; tiene el código de Java para conectarse al servidor. Ahora necesita dibujar el tablero del juego. Esto es realizado por la clase BoardView en el Listado 11. Listado 11. BoardView.java package com.jherrington.tictactoe; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; public class BoardView extends View { private int _color = 1; public void setColor( int c ) { _color = c; } public BoardView(Context context) { super(context); GameService.getInstance().startGame(0); } public BoardView(Context context, AttributeSet attrs) { super(context,attrs); GameService.getInstance().startGame(0); } public BoardView(Context context, AttributeSet attrs, int defStyle) { super(context,attrs,defStyle); GameService.getInstance().startGame(0); } public boolean onTouchEvent( MotionEvent event ) { if ( event.getAction() != MotionEvent.ACTION_UP ) return true; int offsetX = getOffset); int offsetY = getOffsetY(); int lineSize = getLineSize(); for( int x = 0; x < 3; x++ ) { for( int y = 0; y < 3; y++ ) { Rect r = new Rect( ( offsetX + ( x * lineSize ) ), ( offsetY + ( y * lineSize ) ), ( ( offsetX + ( x * lineSize ) ) + lineSize ), ( ( offsetY + ( y * lineSize ) ) + lineSize ) ); if ( r.contains( (int)event.get), (int)event.getY() ) ) { GameService.getInstance().setPosition(0, x, y, _color); invalidate(); return true; } } } return true; } private int getSize() { return (int) ( (float) ( ( getWidth() < getHeight() ) ? getWidth() : getHeight() ) * 0.8 ); } private int getOffset) { return ( getWidth() / 2 ) - ( getSize( ) / 2 ); } private int getOffsetY() { return ( getHeight() / 2 ) - ( getSize() / 2 ); } private int getLineSize() { return ( getSize() / 3 ); } protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.BLACK); canvas.drawRect(0,0,canvas.getWidth(),canvas.getHeight(), paint); int size = getSize(); int offsetX = getOffset); int offsetY = getOffsetY(); int lineSize = getLineSize(); paint.setColor(Color.DKGRAY); paint.setStrokeWidth( 5 ); for( int col = 0; col < 2; col++ ) { int cx = offsetX + ( ( col + 1 ) * lineSize ); canvas.drawLine(cx, offsetY, cx, offsetY + size, paint); } for( int row = 0; row < 2; row++ ) { int cy = offsetY + ( ( row + 1 ) * lineSize ); canvas.drawLine(offsetX, cy, offsetX + size, cy, paint); } int inset = (int) ( (float)lineSize * 0.1 ); paint.setColor(Color.WHITE); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth( 10 ); for( int x = 0; x < 3; x++ ) { for( int y = 0; y < 3; y++ ) { Rect r = new Rect( ( offsetX + ( x * lineSize ) ) + inset, ( offsetY + ( y * lineSize ) ) + inset, ( ( offsetX + ( x * lineSize ) ) + lineSize ) - inset, ( ( offsetY + ( y * lineSize ) ) + lineSize ) - inset ); if ( GameService.getInstance().positions[ x ][ y ] == 1 ) { canvas.drawCircle( ( r.right + r.left ) / 2, ( r.bottom + r.top ) / 2, ( r.right - r.left ) / 2, paint); } if ( GameService.getInstance().positions[ x ][ y ] == 2 ) { canvas.drawLine( r.left, r.top, r.right, r.bottom, paint); canvas.drawLine( r.left, r.bottom, r.right, r.top, paint); } } } } } La mayoría del trabajo aquí es realizado en el método onTouch, que responde al usuario tocando una célula particular en el tablero del juego, y el método onDraw, que pinta el tablero del juego usando el mecanismo de pintura de Android. El método onTouch usa las funciones de tamaño para definir un rectángulo para cada posición de célula. Después usa el método contains en el rectángulo para ver si el usuario hizo clic dentro de la célula. Si lo hizo, ejecuta una solicitud al servicio del juego para que haga un movimiento. La función onDraw usa las funciones de tamaño para dibujar las líneas del tablero y para dibujar cualquier X u O jugada. El singleton GameServer es usado para su matriz de posiciones, que tiene el estado actual de cada cuadro en el tablero del juego. La última clase que necesita es UpdateTimer, que usa el servicio del juego para actualizar las posiciones del tablero con sus últimos valores. El Listado 12 muestra el código para el temporizador. Listado 12. UpdateTimer.java package com.jherrington.tictactoe; import java.util.TimerTask; public class UpdateTimer extends TimerTask { public BoardView boardView; @Override public void run() { GameService.getInstance().startGame( 0 ); boardView.post(new Runnable(){ public void run(){ boardView.invalidate(); } }); } } El temporizador es iniciado por la clase TicTacToeActivity cuando la aplicación se inicia. Este temporizador es un mecanismo de sondeo. Esta no es la forma más eficiente para la comunicación entre el cliente y el servidor, pero es la más simple y confiable. La forma más eficiente es usar la versión 1.1 del protocolo de HTTP para mantener la conexión abierta y para que el servidor envíe actualizaciones al cliente cuando se hagan los movimientos. Este enfoque es mucho más complejo; requiere que el cliente y el servidor soporten el protocolo 1.1 y tiene problemas de escalabilidad con el número de conexiones. Ese enfoque está fuera del ámbito de este artículo. Para juegos simples de demostración como este, un mecanismo de sondeo funciona bien. Con el código hecho, puede probar la aplicación. Eso significa iniciar el emulador. Debe ver algo como la Figura 3 después de inicializar. Figura 3. Lanzando el emulador de Android Este es el emulador cargando una fantástica interfaz "A N D R O I D". Después de ser cargada, ve la pantalla power-on en la Figura 4. Figura 4. El emulador lanzado y listo para usarse Para entrar al teléfono, deslice el icono de bloqueo hacia la derecha. Esa acción lo lleva a la pantalla de inicio y generalmente lanza la aplicación que está depurando. En este caso, esta acción muestra la pantalla del juego en la Figura 5. Figura 5. El juego antes de que se hagan movimientos Dependiendo del estado de su servidor, puede ver o no ningún movimiento. En este caso, el juego estaba vacío. Los botones Play X y Play O están en la parte superior con el tablero del juego de línea de tres en el centro de la visualización. A continuación, haga clic en Play X, después haga clic en el cuadro del centro para ver algo como la Figura 6. Figura 6. X toma el cuadro del centro, por supuesto La Figura 6 muestra la visualización del tablero del juego con una X ahora llenando el cuadro del centro. Para verificar que el servidor estaba conectado, puede ejecutar el comando curl en el script moves.php en el servidor para obtener la lista más reciente de movimientos del juego. Para probar que funcionen las Os, haga clic en Play O y seleccione el cuadro de una esquina como en la Figura 7. Figura 7. O toma el cuadro de una esquina Puede jugar con Xs y Os. La aplicación se conecta al servidor para alojar el estado del juego en una ubicación compartida. Y debido al temporizador de actualización, cada usuario puede ver los movimientos realizados por el otro. Conclusión ¿Es este un juego completo? No realmente. No hay verificación de condición de victoria, los jugadores pueden sobrescribir posiciones y no hay verificación de turno. Pero las piezas de tecnología básicas están presentes: un servidor de juego con el estado almacenado compartido entre los jugadores y una aplicación gráfica nativa en un dispositivo móvil que se conecta al servidor del juego para proporcionar un interfaz para el juego. Puede usar este juego como un punto de partida para su propio juego y construirlo como desee. Sólo recuerde mantenerlo casual y divertido, y tal vez sea el creador del siguiente Words With Friends o multijugador de Angry Birds.