miércoles, 2 de septiembre de 2015

Montar un servidor web con PHP y MySQL en Android con AndroPHP

Existen momentos en que solo tenemos a mano nuestro dispositivo Android (como por ejemplo una Tablet) y tenemos que seguir trabajando en el desarrollo web que tenemos entre manos, pero imagínate que no tienes conexión a Internet. Entonces… ¿tienes un problema, no?
Pues no, existe una aplicación llamada AndroPHP para Android que te permitirá crear un servidor web en Android, y aun mejor: gratis.
Puedes encontrar AndroPHP en Google Play como cualquier otra aplicación para Android, aunque por desgracia, el autor ha dejado de actualizar la aplicación y tampoco aparece en su página personas.
AndroPHP 1
Después de instalar AndroPHP podremos ver una interfaz como esta que nos permitirá iniciar o apagar el servidor:
AndroPHP 2
Si pulsamos el botón “Settings” que puedes ver abajo, podras acceder a esta otra interfaz que te permitirá configurar AndroPHP, aunque sus opciones no son muchas son las básicas:
  • Cambiar el puerto de escucha del servidor web.
  • Cambiar la carpeta donde se encuentran los archivos que se van a poder visualizar a través del servidor web.
  • Y activar o desactivar el acceso como usuario root al servidor web.
Como puedes ver en la siguiente imagen AndroPHP también incluye PHPMyAdmin para administrar el contenido de las bases de datos y permitir al usuario crear nuevas, modificar las asistentes o borrarlas (por ejemplo para instalar algún CMS).
AndroPHP 3
Sobre AndroPHP puedes instalar cualquier gestor de contenidos desarrollado en PHP con base de datos MySQL siempre que las extensiones necesarias estén instaladas y activadas, ya que el único problema es que no deja modificar las extensiones ni la configuración del servidor (PHP, Apache o MySQL), algo que se hecha bastante en falta para realizar pruebas o incluso barajar la posibilidad de poner un servidor Android a funcionar con un proyecto en producción.

martes, 25 de agosto de 2015

Cambiar Estado de los pedidos en prestashop usando el objeto



Para poder cambiar el estado de los pedidos en prestashop, vamos a usar el objeto class de la plataforma

<?php
require_once '../classes/order/Order.php';
require_once '../classes/order/OrderHistory.php';
   
$objOrder = new Order(1); //ID del Pedido
$history = new OrderHistory();
$history->id_order = (int)$objOrder->id;
$history->changeIdOrderState(2, (int)($objOrder->id)); //ID del estado a cambiar
echo 'done'; 
?>

otra forma mas simple seria

<?php
require_once '../classes/order/Order.php';
require_once '../classes/order/OrderHistory.php';
   
$order = new Order(1);//ID del Pedido      
$order->setWsCurrentState((int)2); //ID del estado a cambiar  
echo 'done'; 
?>


jueves, 20 de agosto de 2015

8 juegos desarrollados en HTML5



En el mercado de los juegos a través del navegador, Flash mantiene un amplio dominio, sin embargo, con la llegada de HTML5 se abre una nueva ventana, desde la que se ve un futuro prometedor para esta forma de generar entretenimiento.
Aunque aún le falta mucho camino por recorrer, HTML5 tiene a su favor, entre muchas otras, tres ventajas importantes que sin duda alguna lo perfilan como lamejor alternativa para desarrollar juegos de navegador en los años venideros.
  • Es un estándar abierto y gratuito, por lo que está al alcance de cualquiera. A diferencia de Flash, los desarolladores ya no tendrán que pagar por software exclusivo y costoso para poder crear juegos.
  • No requiere instalar complementos, es soportado por la mayoría de navegadores modernos independientemente del sistema operativo, por lo cual es posible disfrutar de los juegos desarrollados en HTML5 casi encualquier plataforma.
  • Cuenta con el apoyo de los más grandes del mundo tecnológico. Google, Microsoft y Apple han manifestado su total respaldo a HTML5.
Otra característica importante de HTML5 es que puede combinarse fácilmente con otras tecnologías para sacarle mayor provecho, tal es el caso de Javascript, lenguaje en el cual se han escrito varios frameworks con clases exclusivas para video juegos, útiles para agregar características como detección de colisiones, animaciones multicapa y acceso a la aceleración por hardwarerecientemente incorporada a algunos navegadores.
El número de juegos en HTML5 disponibles en el mercado actualmente no es muy grande, y aun hay mucho que mejorar en el apartado de rendimiento, consumo de CPU y memoria, sin embargo algunos de los que se han hecho hasta ahora son realmente buenos y sirven de anticipo de lo que podemos esperar en los próximos meses, pero ¿qué tal si le damos un vistazo a algunos de ellos?
  • Chain Reaction: Es un juego tan simple como adictivo, consta de una cuadricula donde rebotan en todas direcciones una cantidad determinada de pequeñas partículas circulares. El objetivo, como su nombre lo indica, es generar una reacción en la cual dichas partículas chocan entre ellas hasta desaparecer por completo.
  • Torus: Basado en Tetris, pero con una genial variación. En Torus, los bloques no se apilan en un plano frente a la pantalla, sino forman un cilindro, que a su vez podemos girar para buscar la mejor ubicación para nuestra siguiente jugada.
  • Entanglement: Este adictivo juego consiste en rotar piezas en forma de hexágono con diferentes patrones sobre ellas, con el objetivo de formar la linea de mayor longitud posible antes de que esta toque alguno de los extremos del tablero. Tiene una música muy relajante y podemos usar nuestra cuenta de Google para almacenar los puntajes que obtengamos.
  • Canvas Rider: Este juego aprovecha al máximo el nuevo elemento canvasde HTML5, consiste en conducir una bicicleta a través de increíbles escenarios dibujados por los propios jugadores. En esencia es muy simple, pero entretenido y muestra el potencial de combinar HTML5 y Javascript.
  • TankWorld: Sus gráficos no son impresionantes, pero es un shooter 3D bastante interesante construido enteramente en HTML5 y Javascript. En el manejamos un pequeño tanque de guerra, con el objetivo de capturar la bandera mientras destruimos otros tanques con las diferentes armas disponibles.
  • Angry Birds: Uno de los juegos más populares para dispositivos móviles, también está disponible en HTML5 para disfrutar desde el navegador. Esteport fue desarrollado con la intensión de demostrar el soporte de Google Chrome para este lenguaje.
  • Cut the Rope: Como lo hiciera Google con el Angry Birds para Chrome, Microsoft ha querido hacer su propia demostración para Internet Explorer 9. Para quienes no lo conocen, Cut the Rope es un juego bastante popular en plataformas móviles como iPhone y Android, que tiene por protagonista un pequeño monstruo verde llamado Om Nom, al que debemos alimentar con un caramelo tras cortar cuerdas para liberarlo, además de estallar algunas burbujas, capturar estrellas y otros divertidos retos que van apareciendo a medida que avanzamos de nivel. Se puede probar desde cualquier navegador con soporte para HTML5, aunque en cierto punto nos pide que usemos IE9 para disfrutar de más niveles.
  • Fieldrunners: Debo confesar que es uno de mis favoritos, los gráficos son geniales y cuenta con varios modos de juego. El objetivo del juego es proteger una base militar usando torres que disparan diferentes tipos de munición, está muy bien logrado y garantiza muchas horas de entretenimiento. Aunque el juego es pago (lo que demuestra que también se gana dinero con juegos desarrollados en HTML5) podemos disfrutar de un nivel totalmente gratis.
También hay que destacar que los últimos doodles, como se le conoce a las versiones que Google saca de su logotipo para conmemorar fechas importantes, han sido posibles gracias a HTML5. Uno para destacar, es el doodle creado para celebrar los 30 años de Pac-Man con el que podemos jugar y disfrutar otro de los grandes clásicos.
A manera de extra, les comento que otros juegos clásicos como Command & Conquer: Tiberian Dawn y Wolfenstein 3D están siendo portados a HTML5, no están muy maduros aún, pero vale la pena hacerles seguimiento y ver en que terminan.

Libreria CheckboxTree

Seguramente te habrás visto en la necesidad de hacer un formulario que comtemple un selector de categorías o elementos jerárquicos pero seguramente te ha resultado difícil utilizar una manera efectiva para dejárselo lo más sencillo posible al usuario final. En mi caso siempre me viene a la cabeza utilizar un select o checkboxes pero no es del todo intuitivo.
Existe un pluign de jQuery llamado CheckboxTree muy ligero y sirve principalmente para manejar árboles con checkboxes y te permite crear un árbol de checkboxes como el siguiente:
checkboxtree-categories-prestashop

Características del plugin jQuery CheckboxTree

  • Rápido y ligero
  • Fácil de implementar y configurar
  • Hijos expandibles o ocultables
  • Totalmente compatible con jQuery / jQueryUI
  • Personalización con jQueryUI

Libreria Tabulous.js


Tabulous.js es un plugin jQuery para crear tabs o pestañas que se puede utilizar con cualquier contenido disponiendo de efectos de transición bastante atractivos.
Una de las principales ventajas de este plugin es que es muy sencillo de instalar y personalizar para tu página Web.
Los archivos necesarios los puedes descargar de su página oficial.
En la página donde lo quieres utilizar tendrás que incluir la hoja de estilos que incluye el paquete dentro del <head>:
<link href='css/tabulous.css' rel='stylesheet' type='text/css'>
Seguidamente en el <body> de tu página deberás añadir allí donde quieras los tags HTML, como por ejemplo:
<div id="tabs">
    <ul>
        <li><a href="#tabs-1" title="">Tab 1</a></li>
        <li><a href="#tabs-2" title="">Tab 2</a></li>
        <li><a href="#tabs-3" title="">Tab 3</a></li>
    </ul>
 
    <div id="tabs_container">
 
        <div id="tabs-1">
            <p>Your contente tab 1...</p>
        </div>
 
        <div id="tabs-2">
            <p>Your contente tab 2...</p>
        </div>
 
        <div id="tabs-3">
            <p>Your contente tab 3...</p>
        </div>
 
    </div><!--End tabs container-->
 
</div><!--End tabs-->
Ahora tan solo te queda incluir la librería jQuery si no la tuvieras, el plugin y su llamada antes de la etiqueta de cierre </body>:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="js/tabulous.js"></script>
<script type="text/javascript">
$(document).ready(function($) {
    $('#tabs').tabulous({
     effect: 'scale'
    });
});
</script>

miércoles, 19 de agosto de 2015

Gestión de bases de datos MySQL y Microsoft SQL

HeidiSQL

HeidiSQL es una aplicación ligera basada en Windows para la gestión de bases de datos MySQL y Microsoft SQL. Le permite ver y editar los datos, crear y editar tablas, vistas, procedimientos, triggers y eventos programados. Además, puede exportar la estructura y los datos ya sea para SQL archivo, portapapeles o a otros servidores.
database
Es una aplicación que va fenomenal para exportar e importar bases de datos extensas en megas. Aunque a veces se cuelgue, tiene más potencia que la herramienta phpMyAdmin.

viernes, 14 de agosto de 2015

Como hackean nuestra web


Por qué han recurrido los cibercriminales a los ataques de JavaScript malicioso

Los ataques a sitios web se han convertido en un negocio muy rentable. Antes, los cibercriminales infectaban sitios web para llamar la atención o demostrar sus habilidades pero, hoy en día, es cuestión de dinero. Engañar a los usuarios desprevenidos a través de internet resulta fácil y efectivo.
Los cibercriminales disponen de técnicas sofisticadas, como las inyecciones de código JavaScript, para la difusión de malware a través de internet.

Funcionamiento del código Java Script malicioso: descargas automáticas o drive-by

El código JavaScript sirve para infectar sitios web porque es el lenguaje de programación que apuntala la red en la actualidad. Por lo general, suele instalarse en el lado cliente como parte de un navegador web para mejorar las funciones de interfaces de usuario y sitios web dinámicos. Hoy en día, dadas las funciones de la Web 2.0, navegar por internet sin compatibilidad con JavaScript es prácticamente imposible.
Los cibercriminales se aprovechan de esta situación infectando sitios web legítimos y populares, visitados por un gran número de usuarios, para desviar a las víctimas a páginas web maliciosas sin su conocimiento. Así empieza el proceso de infección: al visitar estos sitios maliciosos, nuevos scripts se encargan de aprovechar las vulnerabilidades del lado cliente.
El código JavaScript inyectado sirve para ocultar el desvío de forma más efectiva que otros métodos de ataque más sencillos, como los ataques de iframe. Los ataques con código JavaScript malicioso han aumentado de forma considerable en los últimos tres o cuatro años y, actualmente, casi todos los ataques incluyen este tipo de código, pero son más complejos.
Internet es el medio favorito de los cibercriminales para la difusión de malware y, cada pocos segundos, aparecen nuevos sitios web infectados. Mediante la inyección de código JavaScript malicioso en páginas web legítimas, pueden desviar los navegadores de las víctimas de forma imperceptible y cargar contenido y programas maliciosos desde un servidor remoto. Las infecciones de este tipo se denominan descargas automáticas o drive-by y presentan numerosos retos para la seguridad tanto de las empresas como de los usuarios.


¿Cómo se producen los ataques con JavaScript malicioso? 


• En primer lugar, los cibercriminales inyectan código en páginas web legítimas. El código inyectado puede ser un elemento HTML de iframe o una secuencia de comandos en línea, siendo estos últimos los más frecuentes en la actualidad.

• Cuando la víctima visita la página web comprometida, el código inyectado hace que el navegador descargue contenido malicioso de forma silenciosa desde otro sitio remoto. El proceso es imperceptible para la víctima.

• Normalmente, el contenido cargado está compuesto de varios componentes diseñados para aprovechar las vulnerabilidades del lado cliente. Por ejemplo, puede ser una mezcla de contenido HTML, JavaScript, Flash, PDF y Java. El paquete suele crearse y administrarse mediante un kit para el aprovechamiento de vulnerabilidades, conocido como paquete de exploits.

• Los criminales compran estos paquetes de exploits a los expertos que los crean con la intención de infectar a los usuarios con programas maliciosos.

El aspecto más importante del proceso es que las técnicas de ingeniería social ya no son necesarias. El usuario no necesita hacer clic en ningún enlace enviado por correo electrónico ni visitar páginas web peligrosas. Lo único que tiene que hacer es visitar una página web legítima comprometida.

Los usuarios que visitan un sitio secuestrado no tienen manera de saber que el sitio está comprometido porque el código malicioso es invisible y se ejecuta tan pronto como la página se carga en el navegador.

El código suele utilizar otras secuencias de comandos para buscar más componentes maliciosos que se encargarán de aprovechar las vulnerabilidades conocidas del navegador o del sistema operativo para infectarlo, robar datos o introducirlo en una red de bots.

El alcance de estos ataques no debe subestimarse, ya que están dirigidos a todo tipo de sitios, desde sitios del gobierno hasta instituciones educativas, conocidos portales de noticias, blogs y redes sociales.

Dado que los proveedores de seguridad ofrecen soluciones para la detección de este tipo de código malicioso, los atacantes lo modifican constantemente para evitar que los atrapen. Los cibercriminales utilizan el código JavaScript como "pegamento" en este tipo de ataques web por las posibilidades que ofrece para ocultar o camuflar el código y la carga


Cómo afectan estos ataques a las empresas

El código JavaScript malicioso puede afectar a las empresas de varias formas. Los responsables informáticos deben mantenerse alerta y protegerse contra este tipo de ataques para evitar, sobre todo, que: 

• Los usuarios se conviertan en víctimas del malware: los equipos administrados pueden infectarse a través de descargas automáticas, resultados contaminados de búsquedas y otros tipos de ataques.

• El sitio web de la empresa se vea comprometido: los cibercriminales pueden comprometer los sitios web administrados y, como resultado, los clientes que los visiten se verán expuestos al código malicioso. 

Ambas situaciones provocan grandes repercusiones en la empresa, tanto en lo relativo a los costes, como a la productividad, la reputación de la compañía o la seguridad de los datos. Cuando los usuarios son víctimas del malware, el departamento informático debe invertir tiempo y dinero en restablecer el rendimiento de los equipos. Además, la productividad de los usuarios se resiente y pueden dañarse muchos archivos. 

Pero las repercusiones de las infecciones van más allá: la integridad de los datos también puede verse en peligro. Una vez que se ejecutan en los equipos de las víctimas, muchas familias de programas maliciosos permiten que los cibercriminales accedan de forma remota a los sistemas para robar datos o infectarlos con otros tipos de malware. 

Cuando la víctima es el sitio web de la empresa, los clientes no culpan a los cibercriminales de las infecciones resultantes, sino a la propia empresa, lo que puede afectar a la reputación corporativa, generar publicidad negativa y provocar la pérdida de confianza por parte de clientes, socios e inversores. 

Estas son las razones por las que "los malos" utilizan JavaScript malicioso y por las que "los buenos" deben protegerse.

Fuentes 

http://www.sophos.com/security/technical-papers/modern_web_attacks.html
http://www.sophos.com/security/technical-papers/malware_with_your_mocha.html
http://www.sophos.com/security/technical-papers/sophos-securing-websites.html
http://nakedsecurity.sophos.com/?s=malicious+javascript&x=0&y=0

jueves, 13 de agosto de 2015

Script para rastrear malware en Joomla



Se trata de JAMSS (Joomla! Anti-Malware Scan Script) un script programado para ayudar a todos los administradores de Joomla! a comprobar si su sistema  contiene malware, troyanos u otro código malicioso. El script utiliza patrones actuales de fingerprinting para identificar las amenazas malware más comunes, que puedan afectar a Joomla!. Este script no hace ninguna limpieza por su cuenta , solo informa sobre algún código sospechoso en Joomla!. JAMSS no es 100% preciso, tiene algunos falsos positivos por lo que debe ser utilizado con sabiduría y prudencia.


Como ejecutarlo:
Se sube el archivo “jamss.php” al webroot de la cuenta de hosting.
Se carga el archivo del escáner en el navegador usando una URL como esta:

http://www.<nombre del sitio web>.com/jamss.php

La secuencia de comandos se ejecutará durante varios segundos, incluso minutos, dependiendo del número de archivos y carga de trabajo del servidor web.

Si  se desea realizar un análisis en profundidad, que puede detectar las versiones más recientes de malware se utiliza el parámetro DeepScan = 1. Esta función busca en los archivos las funciones de PHP que utiliza el malware.

Ejemplo de ejecución en el navegador:

http://www. <nombre del  sitio web>.com/jamss.php?deepscan=1


Como interpretar los resultados:

El script inspecciona código contenido dentro de archivos y trata de identificar posibles códigos maliciosos usando muchas huellas digitales de malware conocido. Una vez que el script ha terminado de ejecutarse, generará y mostrará un informe para su revisión,  que puede poseer falsos positivos y que debe ser interpretados con el fin de determinar si algún resultado en particular es una potencial amenaza de malware.

Para cada potencial amenaza, el informe mostrará: la ruta de acceso al archivo en cuestión, el patrón que se adapta al código de malware y una breve descripción de lo que este código podría estar haciendo.

Si existe alguna duda acerca de un archivo identificado por JAMSS, el archivo debe ser descargado e inspeccionado para determinar si hay un problema con él.  Si existe sospecha de un archivo en Joomla! o archivos de extensiones: se descargaran todos los paquetes ZIP / TAR.XX y se comprobaran. A continuación, se remplazara el archivo sospechoso por el original correspondiente de Joomla !  y con la misma versión que se está ej

ecutando.  Si el archivo sospechoso no existe en los archivos originales de instalación de Joomla! o en los archivos de extensiones, se puede mover a una nueva carpeta segura (protegida por contraseña, o con permisos restrictivos) para que nadie tenga acceso y luego eliminarlo por completo, una vez que se determina que es un archivo que no necesita para el funcionamiento de Joomla!. 
En caso de dudas sobre archivos o extensiones que pertenecen a Joomla!, o qué hacer en caso de una infección, es muy recomendable utilizar los foros de Joomla!:

http://forum.joomla.org/viewtopic.php?f=621&t=582854

Y no realizar alguna acción que pueda comprometer la disponibilidad de nuestro sitio web. JAMSS es un script para usar con ciertos conocimientos de PHP y como un análisis rápido de malware.

Más información y descarga de JAMSS:

https://github.com/btoplak/Joomla-Anti-Malware-Scan-Script/tree/forum


Servicio Web que permite averiguar si una URL contiene spyware o malware.
http://vtroger.blogspot.com.es/2013/08/servicio-web-que-permite-averiguar-si.html

Crear Juego Snake con HTML5 Canvas y jQuery



En este tutorial vamos aprender como hacer el clásico juego Snake, donde una Serpiente crecía cada vez que se comía una manzana (un punto negro), supongo que este juego lo conocemos todos.
Se utilizara el elemento Canvas que nos brinda HTML5 y jQuery.

Crear la estructura HTML y el Canvas

Esta será la estructura de nuestro HTML.
<!doctype html>
 <html>
  <head>
   <title>Juego Snake</title>
   <script src="jquery.js" type="text/javascript"></script>
   <script src="snake.js" type="text/javascript"></script>
  </head>
  <body>
   <canvas id="pantalla"></canvas>
  </body>
 </html>
Y para comenzar con el JavaScript quien será que hará toda la programación solo almacenaremos en una variable el canvas, su contexto que es donde dibujaremos y haremos toda la magia, y le daremos un tamaño de 400px de ancho, 400px de alto.
$(document).ready(function(){

    //elemento jQuery del canvas
    var $canvas = $('#pantalla');

    //elemento DOM del canvas
    var canvas = $canvas[0];

    //dar dimensiones al canvas
    $canvas.width(400);
    $canvas.height(400);

    //obtener el contexto
    var ctx = canvas.getContext('2d');

});
Probemos si el canvas funciona dandole un color de fondo, agregamos la siguientes lineas después devar ctx = canvas.getContext('2d'); solo para ver si hasta el momento vamos bien.
ctx.fillStyle = '#fea';
ctx.fillRect(0, 0, 400, 400);
Esto nos debería mostrar un fondo amarillento en un recuadro 400×400 pixeles.

Vamos hacer que se mueva la serpiente

ya que sabemos que funciona el canvas, vamos a crear el juego en si, comenzando por hace que se mueva.
Pero antes vamos a acomodar el código desde ahora en un objeto de esta manera.
var Snake = (function(){

    //propiedades
    var $canvas = undefined;
    var canvas = undefined;
    var ctx = undefined;

    function iniciar_canvas()
    {
        //elemento jQuery del canvas
        $canvas = $('#pantalla');

        //elemento DOM del canvas
        canvas = $canvas[0];

        //dar dimensiones al canvas
        $canvas.prop('width', '400');
        $canvas.prop('height', '400');

        //obtener el contexto
        ctx = canvas.getContext('2d');
    }

})();
Así tenemos el canvas y el contexto en nuestro propio objeto o área donde no interferirá con otras variables que podrían existir y la podemos acceder de cualquier otra funciona que pertenezca a Snakeque es el encargado de todo el juego.
Definamos 4 propiedades mas para saber la posición, el color y el ancho de nuestra serpiente.
var posicion_x = 0;
var posicion_y = 0;
var color_serpiente = '#000000'; //color negro en hexadecimal
var ancho_serpiente = 10;
Definamos un nuevo método llamado iniciar_juego, el que se encargara de iniciar todo para el juego, por el momento solo iniciara las propiedades de posición, Snake.posicion_x y Snake.posicion_y y finalmente llamara el método principal ciclo, este se ejecutara dentro de iniciar_canvas.
function iniciar_juego()
{
    //iniciar propiedades
    posicion_x = 50;
    posicion_x = 30;

    //iniciar juego
    ciclo();
}
Definamos otro método llamado ciclo será nuestro método principal el cual se encargara de dibujar y hacer que todo se mueva, aunque tal vez no directamente todo pase en este método.
function ciclo()
{
    ctx.fillStyle = color_serpiente;
    ctx.fillRect(posicion_x, posicion_y, ancho_serpiente, ancho_serpiente);

    posicion_y += ancho_serpiente;
    posicion_x += ancho_serpiente;

    setTimeout(ciclo, 200);
}
Cada 0.2segundos (200 milisegundos) (5 frame por segundos) volvemos a ejecutar la función ciclo y esto creara el movimiento de nuestra serpiente. Pero si hasta ahora han estado intentando solo nos mostrara una linea como la imagen que esta debajo en vez de moverse parece que esta dibujando una linea en diagonal.
classic_snake_screenshot_1
Hasta ahora para poder obtener lo que vemos en la imagen de arriba, tenemos el código siguiente
var Snake = (function(){

    //propiedades
    var $canvas = undefined;
    var canvas = undefined;
    var ctx = undefined;

    var posicion_x = 0;
    var posicion_y = 0;
    var color_serpiente = '#000000'; //color negro en hexadecimal
    var ancho_serpiente = 10;

    function iniciar_canvas()
    {
        //elemento jQuery del canvas
        $canvas = $('#pantalla');

        //elemento DOM del canvas
        canvas = $canvas[0];

        //dar dimensiones al canvas
        $canvas.prop('width', '400');
        $canvas.prop('height', '400');

        //obtener el contexto
        ctx = canvas.getContext('2d');

        iniciar_juego();
    }

    function ciclo()
    {
        ctx.fillStyle = color_serpiente;
        ctx.fillRect(posicion_x, posicion_y, ancho_serpiente, ancho_serpiente);

        posicion_y += ancho_serpiente;
        posicion_x += ancho_serpiente;

        setTimeout(ciclo, 200);
    }


    return {
        iniciar_canvas: iniciar_canvas
    };

})();

//cuando el documento este cargado completamente ejecutar iniciar_canvas
$(document).ready(Snake.iniciar_canvas);
Para esto debemos “limpiar” nuestro canvas antes de volver a dibujar y re-posicionar nuestra serpiente, pero definamos nuestro color de fondo en este momento, con el clásico verde o algo parecido a ese verde como propiedad.
var color_fondo = '#A9CB95';

function ciclo()
{
    //limpiar pantalla
    ctx.fillStyle = color_fondo;
    ctx.fillRect(0, 0, 400, 400);

    //dibujar serpiente
    ctx.fillStyle = color_serpiente;
    ctx.fillRect(posicion_x, posicion_y, ancho_serpiente, ancho_serpiente);

    posicion_y += ancho_serpiente;
    posicion_x += ancho_serpiente;

    setTimeout(ciclo, 200);
}

La Serpiente

Ahora si vemos ver nuestra serpiente moverse diagonalmente en vez de dibujar una linea diagonal.
Vamos a mantener todo relacionado a la serpiente en si en un objeto, asi que si a volver a modificar un poco el codigo.
Crearemos otra propiedad llamada serpiente
var serpiente;

serpiente = function()
{

}
Y movemos todas las propiedades y metodo relacionado a este “objeto”.
function serpiente()
{
    var posicion_x = 0;
    var posicion_y = 0;
    var color_serpiente = '#000000';  //color negro en hexadecimal
}
No movemos ancho_serpiente porque le vamos a cambiar el nombre a ancho_cuadro ya que sera el mismo ancho de la comida y para mantener el valor en una sola variable se cambiara el nombre.
Agregaremos dos propiedades mas a la serpiente:
var cuerpo = [];
var tamano_inicial = 3;
Este tamaño inicial indica el tamaño inicial de la serpiente, digamos fuera de codigo que es el largo de la serpiente, la cantidad de cuadrito que tendra y el cuerpo sera un array conteniendo cada “cuadrito” de su cuerpo.
Entonces ya que estamos moviendo todo lo relacionado a la serpiente, moveremos el codigo que dibujaba la serpiente y lo llamaremos dibujar.
this.dibujar = function()
{
    //dibujar serpiente
    ctx.fillStyle = color_serpiente;
    ctx.fillRect(posicion_x, posicion_y, ancho_cuadrado, ancho_cuadrado);
}
Crear otro metodo para colocar su posición
this.colocar = function(x, y)
{
    posicion_x = x;
    posicion_y = y;
}
Ahora crearemos nuestro objeto serpiente y asignarle la posición en el metodo iniciar_juego, ahora este metodo se vera de esta forma:
function iniciar_juego()
{
    serpiente = new serpiente();

    //iniciar posicion
    serpiente.colocar(50, 50);

    //iniciar juego
    ciclo();
}
Entonces para mover la serpiente debemos sumarle el ancho del cuadro como soliamos hacer anteriormente, pero ahora no podemos acceder a la propiedad posicion_y ni posicion_x, pero total olvidemos eso ya que debemos crear un método que se llame mover el cual se encargara de mover la serpiente, ya que de por si ella comienza a moverse sola y solo el jugador elige en que dirección, pero siempre se estará moviendo.
function ciclo()
{
    //limpiar pantalla
    ctx.fillStyle = color_fondo;
    ctx.fillRect(0, 0, 400, 400);

    serpiente.dibujar();
    serpiente.mover();

    setTimeout(ciclo, 200);
}
En la serpiente tendremos el método mover que por ahora simplemente tendremos una linea de código
this.mover = function()
{
    posicion_x += ancho_cuadro;
}
Ahora tenemos la serpiente moviendose sola hacia la derecha, así comenzara el juego con la serpiente moviendose a la derecha, pero el es un simple cuadrito y este juego empieza con una serpiente de 3 cuadritos de largo lo cual hemos definido 2 variables anteriormente la cual manejara esto.
var cuerpo = [];
var tamano_inicial = 3;
Modificaremos 3 método las cuales son movercolocar y dibujar, a continuación lo veremos como van a quedar cada uno.
this.colocar = function(x, y)
{
    posicion_x = x;
    posicion_y = y;

    for(i=0;i&lt;tamano_inicial;i++)
        cuerpo.push([x - ( i * ancho_cuadro ), y]);
}

this.dibujar = function()
{
    //dibujar serpiente
    ctx.fillStyle = color_serpiente;
    for(i=0;i&lt;cuerpo.length;i++)
        ctx.fillRect(cuerpo[i][0], cuerpo[i][1], ancho_cuadro, ancho_cuadro);
}

this.mover = function()
{
    for(i=0;i&lt;cuerpo.length;i++)
        cuerpo[i][0] += ancho_cuadro;
}
Cuando coloquemos por primera vez nuestra serpiente vamos agregarle a su cuerpo 3 cuadritos, en la variable cuerpo que es un array que almacenara las posiciones de cada “cuadritos” que forman el cuerpo, al dibujar pues recorremos el array cuerpo para dibujar uno por uno cada parte del cuerpo, al igual en mover movemos cada parte una por una.
Con jQuery vamos a manejar los eventos de cuanto se teclea arriba, abajo, delante o atrás de esta manera.
var Direccion = {
    '38': 'arriba',
    '39': 'derecha',
    '40': 'abajo',
    '37': 'izquierda'
};

$(document).keydown(function(e){
    var tecla = e.which;

    if ( Direccion[ tecla ] )
        serpiente.cambiarDireccion( Direccion[ tecla ] );
});
Direcciones contiene los valores en numero de la tecla arriba=38, derecha=39, etc. Cuando se presione una tecla, y esa tecla pertenece a una Dirección (si es una tecla permitida) pues la cambiamos con el método cambiarDireccion (aun no creado todavía).
El método cambiarDireccion se encargada como si nombre le dice de cambiar la dirección de la serpiente.
Al objeto serpiente le crearemos otra propiedad llamada direccion que almacenara en que dirección actualmente se dirige, por defecto será hacia la derecha.
var direccion = 'derecha';

this.cambiarDireccion = function(nuevaDireccion)
{
    direccion = nuevaDireccion;
}
Cambiaremos nuestro método mover ya que ahora no solo se moverá a la derecha si no que dependerá a que dirección lo este haciendo, por lo tanto nuestro método mover quedara de esta manera.
this.mover = function()
{
    var nuevaPosicion = cuerpo[0].slice();
    switch( direccion )
    {
        case 'arriba':
            nuevaPosicion[1] -= ancho_cuadro;
            break;
        case 'derecha':
            nuevaPosicion[0] += ancho_cuadro;
            break;
        case 'abajo':
            nuevaPosicion[1] += ancho_cuadro;
            break;
        case 'izquierda':
            nuevaPosicion[0] -= ancho_cuadro;
            break;
    }

    cuerpo.unshift(nuevaPosicion);
    cuerpo.pop();
}
La nueva posición la determinaremos dependiendo de la posición actual de la cabeza y según su la dirección es donde se moverá, si aumentaremos su posición en x o y, o la aumentaremos. Después la nueva posición la entramos en el cuerpo como cabeza y la cola la sacamos.
Ah! pero no nos olvidemos de prohibir cambiar la dirección de nuestra serpiente a la contraria a la que se dirige, por lo tanto cambiemos el método cambiarDireccion:
this.cambiarDireccion = function(nuevaDireccion)
{
    if ( direccion == 'arriba' || direccion == 'abajo' )
        var direccionesPermitidas = ['derecha', 'izquierda']
    else
        var direccionesPermitidas = ['arriba', 'abajo'];

    if ( direccionesPermitidas.indexOf(nuevaDireccion) &gt;= 0 )
        direccion = nuevaDireccion;
}

Colocar Comida

Tenemos que crear un objeto que maneje la comida que la serpiente tiene que comerse, el objeto será como esta continuación.
//objeto para la comida
function comida()
{
    var posicion_x = 0;
    var posicion_y = 0;
    var color_comida = '#000000';
    var posicionAleatoria = [];

    this.colocar = function()
    {
        posicionAleatoria = this.conseguirPosicion();

        while ( serpiente.obtenerCuerpo().some(this.posicionOcupada) )
        {
            posicionAleatoria = this.conseguirPosicion();
        }

        posicion_x = posicionAleatoria[0];
        posicion_y = posicionAleatoria[1];
    }

    this.mostrar = function()
    {
        ctx.fillStyle = color_comida;
        ctx.fillRect(posicion_x, posicion_y, ancho_cuadro, ancho_cuadro);
    }

    this.conseguirPosicion = function()
    {
        var X = Math.floor(Math.random()*($canvas.width()/ancho_cuadro))*ancho_cuadro;
        var Y = Math.floor(Math.random()*($canvas.height()/ancho_cuadro))*ancho_cuadro;

        return [X, Y];
    }

    this.posicionOcupada = function(element)
    {
        return ( element[0] == posicionAleatoria[0] &amp;&amp; element[1] == posicionAleatoria[1] );
    }
}
Recuerda que también tenemos que crear una variable llamada comida que almacenara este objeto.posicionAleatoria almacenaremos la posición que generaremos aleatoriamente, y el métodoconseguirPosicion es la encargada de generar esta posiciones aleatoria, mientras queposicionOcupada verifica si esta posición no colisiona con una posición de la serpiente.
Ya que tenemos el método para posicionar la comida debemos crear un método que verifique si la serpiente se ha comido (colisiona) con la comida.
this.colision = function(x, y)
{
    if ( posicion_x == x &amp;&amp; posicion_y == y )
        return true;
}
Modificaremos el método mover de la serpiente para verificar esta colisión.
this.mover = function()
{
    var nuevaPosicion = cuerpo[0].slice();

    switch( direccion )
    {
        case 'arriba':
            nuevaPosicion[1] -= ancho_cuadro;
            break;
        case 'derecha':
            nuevaPosicion[0] += ancho_cuadro;
            break;
        case 'abajo':
            nuevaPosicion[1] += ancho_cuadro;
            break;
        case 'izquierda':
            nuevaPosicion[0] -= ancho_cuadro;
            break;
    }

    cuerpo.unshift(nuevaPosicion);
    cuerpo.pop();

    if ( comida.colision(nuevaPosicion[0], nuevaPosicion[1]) )
    {
        comida.colocar();

        var cola = cuerpo[cuerpo.length-1].slice();
        cuerpo.push(cola);
    }
}
No podemos permitir que se coma así misma ni tampoco choque con los bordes, esto significa que el juego ha terminado. Estos métodos se utilizara para comprobar la colisión.
this.comprobarColisiones = function()
{
    var cabeza = cuerpo[0].slice();
    var resto = cuerpo.slice(1);
    var fueraHorizontalmente = cabeza[0] &gt; ($canvas.width() - ancho_cuadro) || cabeza[0] &lt; 0;
    var fueraVerticalmente = cabeza[1] &gt; ($canvas.height() - ancho_cuadro) || cabeza[1] &lt; 0;

    if ( fueraHorizontalmente || fueraVerticalmente )
        return true;


    if ( resto.some(this.seComioAsiMisma) )
        return true;

    return false;
}

this.seComioAsiMisma = function(element, index, array)
{
    var cabeza = cuerpo[0].slice();
    if ( element[0] == cabeza[0] &amp;&amp; element[1] == cabeza[1] )
        return true;

    return false;
}
Y Ya tenemos todo, un juego básico y simple, le di unos últimos toques y el código final es el siguiente.

Código Final

HTML

<!doctype html>
 <html>
  <head>
   <title>Juego Snake</title>
   <script src="jquery.js" type="text/javascript"></script>
   <script src="snake.js" type="text/javascript"></script>
  </head>
  <body>
   <canvas id="pantalla"></canvas>
  </body>
 </html>

JavaScript

var Snake = (function(){

    //propiedades
    var $canvas = undefined;
    var canvas = undefined;
    var ctx = undefined;

    var fps = 5;
    var intervalo;
    var es_fin_juego = false;

    var color_fondo = '#A9CB95';
    var ancho_cuadro = 10;

    var serpiente;
    var comida;

    //objeto para la comida
    function comida()
    {
        var posicion_x = 0;
        var posicion_y = 0;
        var color_comida = '#000000';
        var posicionAleatoria = [];

        this.colocar = function()
        {
            posicionAleatoria = this.conseguirPosicion();

            while ( serpiente.obtenerCuerpo().some(this.posicionOcupada) )
            {
                posicionAleatoria = this.conseguirPosicion();
            }

            posicion_x = posicionAleatoria[0];
            posicion_y = posicionAleatoria[1];
        }

        this.colision = function(x, y)
        {
            if ( posicion_x == x &amp;&amp; posicion_y == y )
                return true;
        }

        this.mostrar = function()
        {
            ctx.fillStyle = color_comida;
            ctx.fillRect(posicion_x, posicion_y, ancho_cuadro, ancho_cuadro);
        }

        this.conseguirPosicion = function()
        {
            var X = Math.floor(Math.random()*($canvas.width()/ancho_cuadro))*ancho_cuadro;
            var Y = Math.floor(Math.random()*($canvas.height()/ancho_cuadro))*ancho_cuadro;

            return [X, Y];
        }

        this.posicionOcupada = function(element)
        {
            return ( element[0] == posicionAleatoria[0] &amp;&amp; element[1] == posicionAleatoria[1] );
        }
    }

    //objeto para la serpiente
    function serpiente()
    {
        var posicion_x = 0;
        var posicion_y = 0;
        var color_serpiente = '#000000';  //color negro en hexadecimal
        var direccion = 'derecha';

        var cuerpo = [];
        var tamano_inicial = 3;

        this.obtenerCuerpo = function()
        {
            return cuerpo;
        }

        this.dibujar = function()
        {
            //dibujar serpiente
            ctx.fillStyle = color_serpiente;
            for(i=0;i&lt;cuerpo.length;i++)
                ctx.fillRect(cuerpo[i][0], cuerpo[i][1], ancho_cuadro, ancho_cuadro);
        }

        this.colocar = function(x, y)
        {
            posicion_x = x;
            posicion_y = y;

            cuerpo = [];
            direccion = 'derecha';

            for(i=0;i&lt;tamano_inicial;i++)
                cuerpo.push([x - ( i * ancho_cuadro ), y]);
        }

        this.mover = function()
        {
            if ( this.comprobarColisiones() )
                fin_juego();

            var nuevaPosicion = cuerpo[0].slice();

            switch( direccion )
            {
                case 'arriba':
                    nuevaPosicion[1] -= ancho_cuadro;
                    break;
                case 'derecha':
                    nuevaPosicion[0] += ancho_cuadro;
                    break;
                case 'abajo':
                    nuevaPosicion[1] += ancho_cuadro;
                    break;
                case 'izquierda':
                    nuevaPosicion[0] -= ancho_cuadro;
                    break;
            }

            cuerpo.unshift(nuevaPosicion);
            cuerpo.pop();

            if ( comida.colision(nuevaPosicion[0], nuevaPosicion[1]) )
            {
                comida.colocar();

                var cola = cuerpo[cuerpo.length-1].slice();
                cuerpo.push(cola);
            }
        }

        this.comprobarColisiones = function()
        {
            var cabeza = cuerpo[0].slice();
            var resto = cuerpo.slice(1);
            var fueraHorizontalmente = cabeza[0] &gt; ($canvas.width() - ancho_cuadro) || cabeza[0] &lt; 0;
            var fueraVerticalmente = cabeza[1] &gt; ($canvas.height() - ancho_cuadro) || cabeza[1] &lt; 0;

            if ( fueraHorizontalmente || fueraVerticalmente )
                return true;


            if ( resto.some(this.seComioAsiMisma) )
                return true;

            return false;
        }

        this.seComioAsiMisma = function(element, index, array)
        {
            var cabeza = cuerpo[0].slice();
            if ( element[0] == cabeza[0] &amp;&amp; element[1] == cabeza[1] )
                return true;

            return false;
        }

        this.cambiarDireccion = function(nuevaDireccion)
        {
            if ( direccion == 'arriba' || direccion == 'abajo' )
                var direccionesPermitidas = ['derecha', 'izquierda']
            else
                var direccionesPermitidas = ['arriba', 'abajo'];

            if ( direccionesPermitidas.indexOf(nuevaDireccion) &gt;= 0 )
                direccion = nuevaDireccion;
        }
    }


    function iniciar_canvas()
    {
        //elemento jQuery del canvas
        $canvas = $('#pantalla');

        //elemento DOM del canvas
        canvas = $canvas[0];

        //dar dimensiones al canvas
        $canvas.prop('width', '400');
        $canvas.prop('height', '400');

        //obtener el contexto
        ctx = canvas.getContext('2d');

        ctx.fillStyle = '#fea';
        ctx.fillRect(0, 0, 400, 400);

        iniciar_juego();
    }

    function iniciar_juego()
    {
        es_fin_juego = false;

        serpiente = new serpiente();
        comida = new comida();

        //iniciar propiedades
        serpiente.colocar(50, 50);

        comida.colocar();

        //iniciar juego
        ciclo();
    }

    function fin_juego()
    {
        es_fin_juego = true;
        clearTimeout(intervalo);

        var x = $canvas.width() / 2;
        var y = $canvas.height() / 2;

        ctx.font = '30px Georgia';
        ctx.textAlign = 'center';
        ctx.fillStyle = '#F00';
        ctx.fillText('Fin del Juego!', x, y);
        ctx.font = '20px Georgia';
        ctx.fillStyle = '#000';
        ctx.fillText('Presiona R, para reiniciar', x, y + 30);

    }

    function ciclo()
    {
        //limpiar pantalla
        ctx.fillStyle = color_fondo;
        ctx.fillRect(0, 0, 400, 400);

        serpiente.dibujar();
        comida.mostrar();

        serpiente.mover();

        if ( ! es_fin_juego )
            intervalo = setTimeout(ciclo, 1000 / fps);
    }

    function reiniciar()
    {
        es_fin_juego = false;

        //iniciar propiedades
        serpiente.colocar(50, 50);

        comida.colocar();

        //iniciar juego
        ciclo();
    }

    var Direccion = {
        '38': 'arriba',
        '39': 'derecha',
        '40': 'abajo',
        '37': 'izquierda'
    };

    $(document).keydown(function(e){
        var tecla = e.which;

        if ( Direccion[ tecla ] )
            serpiente.cambiarDireccion( Direccion[ tecla ] );

        if ( tecla == 82 )// tecla R
            reiniciar();
    });

    return {
        iniciar_canvas: iniciar_canvas
    };

})();


$(document).ready(Snake.iniciar_canvas);
Espero que le haya servido de ayuda es algo sencillo, pero de apoco se aprende.

El código lo pueden encontrar en Github también Snake-Classico-Tutorial-Fuente
Copyright © CodeLab