<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Juan Gestal</title>
	<atom:link href="http://www.gestal.es/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gestal.es</link>
	<description>Un blog personal sobre programación e informática</description>
	<lastBuildDate>Fri, 11 Mar 2011 22:42:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Backbeat 3.2 [Script para mIRC]</title>
		<link>http://www.gestal.es/backbeat-3-2/</link>
		<comments>http://www.gestal.es/backbeat-3-2/#comments</comments>
		<pubDate>Fri, 11 Mar 2011 16:25:30 +0000</pubDate>
		<dc:creator>juangestal</dc:creator>
				<category><![CDATA[mIRC Scripts]]></category>

		<guid isPermaLink="false">http://www.gestal.es/?p=21</guid>
		<description><![CDATA[A finales de la década de 1990 Internet se hizo un hueco en nuestras vidas. El juego en red estaba de moda, los salones recreativos de capa caída y los cibercafés proliferaban como hongos por nuestras ciudades. Fue una época maravillosa en la que todo el mundo quería jugar al Quake, navegar por Internet o [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/backbeat32.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/backbeat32-560x407.png" alt="" title="backbeat32" width="560" height="407" class="aligncenter size-medium wp-image-67" /></a></p>
<p>A finales de la década de 1990 Internet se hizo un hueco en nuestras vidas. El juego en red estaba de moda, los salones recreativos de capa caída y los cibercafés proliferaban como hongos por nuestras ciudades. Fue una <a href="http://www.pixfans.com/cibercafes-la-epoca-dorada/"><strong>época maravillosa</strong></a> en la que todo el mundo quería jugar al Quake, navegar por Internet o conocer gente hablando por el chat. Para charlar online el lugar preferido por la mayoría era el <a href="http://www.irc-hispano.es/"><strong>IRC-Hispano</strong></a> y, por lo general, nos conectábamos a los servidores utilizando el <a href="http://www.mirc.com/"><strong>mIRC</strong></a>. </p>
<p>El <strong>mIRC</strong> cambió mi vida, se trataba de un programa capaz de interpretar scripts y gracias a esa característica aprendí a hacer una de las cosas que más me gustan: <strong>programar</strong>. Recuerdo que empecé sin manual y sin tener mucha idea leyendo códigos que me sonaban a chino y que poco a poco, a medida que pasaban los días, iba entendiendo cada vez mejor. Y así fui aprendiendo. </p>
<p>Por aquél entonces existían una serie de scripts que ya gozaban de cierta fama: <strong>7th Sphere</strong>, <strong>Orbital</strong>, <strong>IRcap</strong>, <strong>El Brujo</strong>, <strong>Phanatic</strong>, <strong>Killer Zombie</strong>&#8230; Muchos de ellos estaban orientados a atacar a la gente con <em>nukes</em>, <em>floods</em> y demás. El IRC no era un sitio tranquilo y los enfrentamientos eran frecuentes por lo que convenía &#8220;estar armado&#8221;. Al menos hasta que la gente del IRC Hispano decidió ocultar las IPs de los usuarios acabando de un plumazo con la juerga.</p>
<p>En aquél entonces no había tarifas planas de conexión, así que mi ordenador (un flamante Pentium II @ 450 Mghz) se pasaba un montón de tiempo desconectado de la red, por lo que me monté en local un servidor de IRC y <strong>comencé a programar mi propio script</strong>. El <strong>Backbeat 3.2</strong> (para mIRC 5.91) es el resultado de miles de líneas de código, de noches enteras sin dormir y de la evolución de las versiones anteriores (Jim Script, BeatleScript, BravoScript, Backbeat 2 y BaT). Hay que tener en cuenta que en aquél entonces tendría entre 15 y 18 años, y por lo tanto no disponía de ciertos conocimientos teóricos (orientación a objetos, algoritmos, recursividad&#8230;) que aprendí más tarde en la carrera y que de haberlos sabido en aquél entonces me hubieran facilitado enormemente la vida.</p>
<h3>Descargar</h3>
<ul>
<li><strong><a href="http://www.gestal.es/upload/proyectos/backbeat32.zip">Backbeat 3.2</a></strong></li>
</ul>
<p>El script <strong>incluye el mIRC 5.91</strong> y pesa poco más de un mega. </p>
<p>A continuación describiré las características más destacables del script y los paneles de configuración de los que disponía para adaptar al gusto de cada usuario cada una de sus características.</p>
<p><span id="more-21"></span><br />
<h3>Panel de utilidades</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/panelUtilidades.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/panelUtilidades.png" alt="" title="panelUtilidades" width="405" height="311" class="aligncenter size-full wp-image-52" /></a></p>
<p>Muchos scripts acabaron transformándose en &#8220;<em>pequeños sistemas operativos</em>&#8221; que disponían de casi todas las aplicaciones que hacían falta para estar en Internet. Incluso algunos implementaron mediante una <strong>librería DLL</strong> un navegador web dentro de una ventana. Lo cierto es que llegar a ese extremo siempre me pareció excesivo, sin embargo la tendencia de entonces marcó que el Backbeat 3.2 disponga de utilidades como una calculadora, un escáner de puertos, un visor de imágenes o un cliente télnet entre otras cosas.</p>
<h3>Panel de control</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/panelConfiguracion.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/panelConfiguracion.png" alt="" title="panelConfiguracion" width="406" height="311" class="aligncenter size-full wp-image-51" /></a></p>
<p>La <strong>configuración</strong> es uno de los aspectos críticos de cualquier script que aspirase a ser utilizado por un amplio número de usuarios. Lo cierto es que el objetivo de muchos de los &#8220;<em>scripters</em>&#8221; era el conseguir tener una cuota grande de gente que utilizase tu script, sin embargo era complicado llegar al nivel de los &#8220;pesos pesados&#8221; (IRcap, Orbital, Phanatic&#8230;). Pero bueno, al menos en mi caso conseguí tener un número considerable de usuarios y decenas de miles de descargas.</p>
<p>Como uno no sabía muy bien qué era lo siguiente que le tocaría implementar en su día decidí crear un <strong>panel de control</strong> imitando un poco el de Windows a modo de índice de las secciones configurables y bueno, resultó ser un método cómodo que cumplió su objetivo.</p>
<h3>Configuración de la titlebar</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/titlebarConfig.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/titlebarConfig.png" alt="" title="titlebarConfig" width="426" height="325" class="aligncenter size-full wp-image-65" /></a></p>
<p>En la <strong>barra del título</strong> se solían mostrar valores como el lag, el número de privados abiertos, el topic del canal. Este formulario permitía al usuario configurar la información que estaría a la vista.</p>
<h3>Theme manager</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/themeManager.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/themeManager.png" alt="" title="themeManager" width="276" height="415" class="aligncenter size-full wp-image-64" /></a></p>
<p>En la época en la que implementé este gestor de themes surgió una iniciativa en <a href="http://mircscripts.org"><strong>mIRCScripts.org</strong></a> y en diversos foros extranjeros para la elaboración de un sistema llamado <em>MTU</em> (creo). Se trataba de un <strong>intento de independizar el código del script del diseño</strong> y marcar unas pautas para la creación de themes que fuesen compatibles con todos los scripts que implementasen dicha característica. La idea era muy buena, pero no me arrepiento de no haber participado ya que los scripts que pasaron por mis manos que utilizaban dicho sistema estaban llenos de fallos, al igual que los themes. Yo opté por un sistema de themes propio que también independizaba código de diseño y que finalmente dispondría de sólo dos temas distintos: <strong>BaT</strong> (por defecto) e <strong>Illusion</strong> (un theme de un script extrajero que me gustó y adapté).</p>
<p>Lo cierto es que el tema &#8220;Illusion&#8221; (sin desmerecer al BaT de <strong>Fulg0re</strong>) era precioso, con su fondo negro y sus letras verdosas&#8230; Utilizaba el tipo de letra &#8220;Terminal&#8221;, pero la versión &#8220;gordita&#8221; de MS-DOS, ya que la tipografía &#8220;Terminal&#8221; de Windows era demasiado delgada, por lo que había que hacer un truco para poder borrar esa tipografía del sistema y utilizar la versión de la consola.</p>
<h3>Telnet</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/telnet.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/telnet-560x358.png" alt="" title="telnet" width="560" height="358" class="aligncenter size-medium wp-image-69" /></a></p>
<p>El <strong>cliente telnet</strong> era el típico ejemplo que uno programaba cuando empezaba a trabajar con conexiones y puertos. Quizás lo único que tiene de especial el cliente es que es <strong>multisesión</strong>.</p>
<h3>Teclas rápidas</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/teclasRapidas.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/teclasRapidas.png" alt="" title="teclasRapidas" width="306" height="275" class="aligncenter size-full wp-image-62" /></a></p>
<p>Nunca he sido muy partidario de las <strong>teclas rápidas</strong>, aunque sí de las combinaciones de teclas. El caso es que este formulario permitía configurarlas al gusto del consumidor.</p>
<h3>Servidor !seen</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/seen.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/seen.png" alt="" title="seen" width="206" height="185" class="aligncenter size-full wp-image-57" /></a></p>
<p>Los <strong>servidores !seen</strong> dentro de los clientes ofrecían una característica muy interesante que no cubrían los servidores de IRC. Servían para que un usuario pudiese consultar la última vez que había vista una persona concreta: <em>!seen nickname</em>.</p>
<p>Como la mayoría de scripts lo implementaron, yo también creé un servidor <strong>!seen con protección anti-flood</strong>, que en el canal <strong>#scripting</strong> había gente con muy mala baba intentando explotar las vulnerabilidades de los códigos de los demás. </p>
<h3>Visor de logs</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/visorLogs.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/visorLogs-560x358.png" alt="" title="visorLogs" width="560" height="358" class="aligncenter size-medium wp-image-68" /></a></p>
<p>Los <strong>lectores de logs</strong> (lectores de conversaciones antiguas) se implementaban en una de las &#8220;ventanas nativas&#8221; del mIRC mostrando en la barra de la derecha los nicks y en la parte de la izquierda el texto.</p>
<h3>Snake</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/snakeGame.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/snakeGame.png" alt="" title="snakeGame" width="200" height="200" class="aligncenter size-full wp-image-59" /></a></p>
<p>Este <em>mini-clón</em> del <strong>Snake de los Nokia</strong> lo programé en una tarde y lo publiqué como AddOn el 06/05/01 (ya llovió) en la web <a href="http://www.mircscripts.org/comments.php?cid=956">mIRCScripts</a>. Recuerdo que un tal <strong>Sharek</strong> me propuso que dejásemos de hacer AddOns y demás scripts &#8220;de gestión&#8221; y que nos dedicásemos a hacer videojuegos para el mIRC. Lo cierto es que quizás debí haberlo escuchado. En aquella época el tiempo no era un bien escaso y seguro que podría haber hecho algo interesante. De todas formas, tambień estuve programando otro juego simple, un <strong>4 en raya</strong> que permitía el juego a dobles y que utilizaba una GUI propia, pero lamentablemente perdí el código cuando estaba casi acabado. </p>
<h3>Protecciones de flood en canales</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/proteccionFloodCanales.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/proteccionFloodCanales.png" alt="" title="proteccionFloodCanales" width="486" height="415" class="aligncenter size-full wp-image-54" /></a></p>
<p>Las <strong>protecciones de flood de los canales</strong> siempre han sido uno de los aspectos que más valoran los operadores de canales grandes ya que el script puede encargarse de echar a la gente que está molestando.</p>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/proteccionFloodCanalesKickBans.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/proteccionFloodCanalesKickBans.png" alt="" title="proteccionFloodCanalesKickBans" width="486" height="415" class="aligncenter size-full wp-image-55" /></a></p>
<p>Como echar a la gente de los canales se volvía repetitivo, los scripts solían disponer de un <strong>fichero &#8220;.txt&#8221; con frases divertidas</strong> y también de un contador de kicks para indicar el grado de bordería. </p>
<h3>Protección de flood personal</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/proteccionPersonal.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/proteccionPersonal.png" alt="" title="proteccionPersonal" width="535" height="474" class="aligncenter size-full wp-image-56" /></a></p>
<p>Las <strong>protecciones personales</strong> del script eran bastante eficaces. La mayor dificultad que encontré a la hora de codificarlas fue integrarlas con otros servicios como el del servidor !seen.</p>
<h3>Portscan</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/Portscan.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/Portscan.png" alt="" title="Portscan" width="464" height="415" class="aligncenter size-full wp-image-53" /></a></p>
<p>El <strong>7th Sphere</strong>, uno de los scripts más emblemáticos y antiguos del mIRC, incluía por defecto una serie de herramientas de IRC-War como el famoso <strong>click.exe</strong>, capaz de lanzar <em>nukes</em>. Entre sus programas incluía un escáneador de puertos y por eso creé una versión nativa del programa.   </p>
<h3>Nick completion</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/nickCompletio.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/nickCompletio.png" alt="" title="nickCompletio" width="245" height="166" class="aligncenter size-full wp-image-50" /></a></p>
<p>Los <strong>nick completion</strong> valían para resaltar el nombre de alguno de los participantes de la charla, con diferentes estilos aunque casi todos bastante sencillos para no incordiar al personal.</p>
<h3>Reproductor mp3</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/mp3Player.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/mp3Player.png" alt="" title="mp3Player" width="306" height="367" class="aligncenter size-full wp-image-49" /></a></p>
<p>En el IRC además de charlar también se podían compartir archivos y una buena forma de compartir música era mostrar en el canal la canción que uno estaba escuchando para que, si a alguno le interesaba, pudiera pedirla. Lo normal es que el script se la mandara al usuario automáticamente. Recuerdo haber programado un bot cuya misión era entrar en redes inglesas al canal <em>#beatles</em> y solicitar automáticamente canciones, algunas de ellas eran versiones muy raras del cuarteto de Liverpool.</p>
<p>Pero <strong>el concepto inicial de mostrar lo que se reproduce y compartir desapareció</strong> rápidamente. Muchos scripts simplemente mostraban el título, duración y autor de las canciones pero <strong>no ofrecían una forma automatizada para solicitar el tema</strong>. Por lo tanto&#8230; ¿a quién le importaba saber lo que el resto estaba escuchando? A nadie, pero los canales se llenaron de colores mostrando los tags de los mp3. Por este motivo me negué a programar un reproductor mp3 para el script, sin embargo, por petición de ciertos usuarios me vi obligado a incluír uno, así que le pedí a <strong>Tig0ti</strong> el suyo porque funcionaba bien y porque no mostraba la reproducción activa en los canales.</p>
<h3>Mensaje del día</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/motd.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/motd.png" alt="" title="motd" width="326" height="125" class="aligncenter size-full wp-image-48" /></a></p>
<p>El <strong>mensaje del día</strong> tenía muy pocas frases y consejos (andaba escaso de imaginación), por lo que convenía desactivarlo cuanto antes.</p>
<h3>Modos de usuario</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/modosUsuario.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/modosUsuario.png" alt="" title="modosUsuario" width="326" height="165" class="aligncenter size-full wp-image-47" /></a></p>
<p>El formulario del mIRC para configurar los <strong>modos personales</strong> era excesivamente simple, así que creé una versión también bastate sencilla pero útil ya que automatizaba el cambio de modos.</p>
<h3>Menús con iconos</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/menusIconos.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/menusIconos.png" alt="" title="menusIconos" width="446" height="395" class="aligncenter size-full wp-image-46" /></a></p>
<p>El <strong>uso de librerías externas (DLL) para dotar al mIRC de más funcionalidades</strong> se puso muy de moda ya que permitía hacer cosas distintas, en este caso <strong>decorar con iconos los menús</strong>. </p>
<h3>Medidor de lag</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/medidorLag.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/medidorLag.png" alt="" title="medidorLag" width="218" height="235" class="aligncenter size-full wp-image-45" /></a></p>
<p>En aquella época el retardo en las conversaciones era frecuente y tener un buen <strong>medidor de lag</strong> (retraso) era fundamental para saber porqué se había parado todo de repente.</p>
<h3>Lista de usuarios remotos</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/listaUsuariosRemotos.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/listaUsuariosRemotos.png" alt="" title="listaUsuariosRemotos" width="366" height="395" class="aligncenter size-full wp-image-44" /></a></p>
<p>La <strong>lista de usuarios remotos</strong> identificaba a una serie de nicks por sus máscaras y realizaba acciones automáticas sobre ellos. Así quise yo crear una configuración de usuarios donde se pudiesen añadir BOTs, listas de auto-op, listas de kickban y otras cosas. En definitiva esto era un &#8220;todo en uno&#8221;, pero lo cierto es que lo hice bastante abstracto y había gente que me pedía que implementase de una vez una lista de kickban cuando ya estaba implementada. Lo admito, culpa mía.</p>
<h3>Lista de redes y servidores</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/listaRedesServidores.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/listaRedesServidores.png" alt="" title="listaRedesServidores" width="486" height="225" class="aligncenter size-full wp-image-43" /></a></p>
<p>Casi todos los scripts de la época disponían de un <strong>formulario con redes y servidores</strong> que remplazase al del mIRC original, que por cierto no era nada cómodo.</p>
<h3>Jezzball</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/Jezzball.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/Jezzball.png" alt="" title="Jezzball" width="503" height="367" class="aligncenter size-full wp-image-42" /></a></p>
<p>El <strong>Jezzball</strong> es un clásico juego de Windows que llevaba en un disquete para entretenerme cuando se ponía aburrida la clase de informática (que en realidad era de ofimática). Como es un juego al que le tengo mucho cariño y además era perfecto para entretenerse cuando había mucho lag o cuando no había nadie conocido con quien charlar, lo incluí en el script.</p>
<h3>Bat SMS!</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/BatSMS.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/BatSMS.png" alt="" title="BatSMS" width="305" height="324" class="aligncenter size-full wp-image-28" /></a></p>
<p>A finales de la década de 1990 también se empezaron a popularizar los teléfonos móviles y los mensajes SMS. En un primer momento los <strong>SMS eran gratis</strong> y de esa época data esta utilidad para enviar mensajes que saqué también como AddOn independiente y que llegó a ser <strong>aplicación de la semana</strong> dentro de su categoría en <strong><a href="http://softonic.com">Softonic.com</a></strong>.</p>
<p>Esta utilidad pudo haberse convertido en algo más popular, sin embargo recuerdo que cuando la programé cursaba 3º de BUP, año en el que mi madre me castigó sin tocar el ordenador entre semana para que estudiase para los exámenes. Cuando pude subir la versión final del Bat SMS! ya existían otras aplicaciones que hacían lo mismo, y la aplicación que al final se llevó la fama fue el genial <strong>WinSMS</strong> de <strong>Azrael</strong>.</p>
<h3>Floodbots</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/floodBots.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/floodBots-560x353.png" alt="" title="floodBots" width="560" height="353" class="aligncenter size-medium wp-image-70" /></a></p>
<p>El <strong>Floodbots</strong> también lo lancé como AddOn independiente. Se trata de una herramienta que permite<strong> cargar varios clones en un servidor para sembrar el caos</strong> realizando acciones masivas y ataques de flood. Lo utilicé para probar las protecciones de mi script y no le puse soporte para proxys porque el IRC-Hispano tenía un mecanismo de control de clones y, como era el lugar donde chateaba, no me apetecía que la gente utilizase mis armas contra mi. Sin embargo, esto suponía un problema con los cybercafés que habían contratado clones, ya que en ellos sí se podía utilizar esta aplicación. Hace unos años no sé quién me comentó que las altas esferas del IRC-Hispano habían incluso discutido mi <em>baneo</em> de la red. No entiendo porqué, si sólo se trataba de una inofensiva herramienta para la auditoría >:-)</p>
<h3>Envío de emails</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/envioEmails.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/envioEmails.png" alt="" title="envioEmails" width="406" height="465" class="aligncenter size-full wp-image-40" /></a></p>
<p>Esta utilidad de <strong>envío de emails</strong> resultó ser bastante divertida ya que permitía mandar mensajes anónimos a la gente o con un remitente falso a través de los servidores SMTP que no requiriesen identificación. Un utensilio perfecto para mover los hilos en las sombras o, simplemente, para enviar emails, al gusto de cada uno.</p>
<h3>Encriptación de texto</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/encriptacionTexto.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/encriptacionTexto.png" alt="" title="encriptacionTexto" width="418" height="307" class="aligncenter size-full wp-image-38" /></a></p>
<p>Nunca llegué a utilizar esta característica pero la implementé porque podría resultarle útil a algún usuario. Requería un cambio de clave inicial y a partir de ahí todo lo que se hablase se codificaría utilizando una librería dll programada por <strong>ais</strong>.</p>
<h3>Generador de DNIs</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/dni.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/dni.png" alt="" title="dni" width="136" height="105" class="aligncenter size-full wp-image-37" /></a></p>
<p>Como mucha gente sabe, las letras del final de los DNI son información redundante que sirve para comprobar que el número está bien. Es decir, a partir de un número de DNI se puede obtener la letra que le corresponde, y este cálculo lo empleaban algunos formularios de webs que requerían que la gente se diese de alta, así que era cómodo contar con un <strong>generador de DNIs válidos</strong> a mano para evitar proporcionar información personal.</p>
<h3>Lista de archivos descargados</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/descargas.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/descargas.png" alt="" title="descargas" width="486" height="385" class="aligncenter size-full wp-image-36" /></a></p>
<p>Este formulario simplemente <strong>lista todos los archivos de la carpeta de descargas</strong>. Lo cirto es que hubiera sido quizás más conveniente invocar directamente al navegador.</p>
<h3>CTCP Reply</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/ctcpReply.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/ctcpReply.png" alt="" title="ctcpReply" width="506" height="365" class="aligncenter size-full wp-image-35" /></a></p>
<p><strong>Linux</strong> entonces no era ni tan fácil de utilizar, ni tan fácil de instalar como ahora. De hecho, los que lo utilizaban eran considerados como &#8220;hackers&#8221; (bueno, a veces no tanto). Linux era un sistema raro y se rumoreaba en los cibercafés que era el mejor, el más rápido y el más estable, aunque sólo estaba al alcance de los mejores. Mientras, el resto de los mortales, nos conformábamos con el Windows 98. </p>
<p>El caso es que el final de los años 90 era una época en la que mucha gente quería aparentar, y por eso qué mejor forma de hacerlo que <strong>falseando el CTCP VERSION</strong> para que la gente pensase que utilizaban Linux en lugar de mIRC aunque no fuese verdad. Mucha gente vivía de la boquilla, de ir fantasmeando de un lado a otro, y cuando lo arrinconaban en un ciber y la gente descubría que en realidad no sabía nada (o al menos no tanto como presumía), pues el sujeto se iba a otro lado y volvía a fantasmear de nuevo (saludos, <em><strong>Spirou</strong></em>). Será por cibers, en Santiago de Compostela recuerdo haber contado más de 30 locales.</p>
<h3>Configuración general</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/confGeneralGeneral.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/confGeneralGeneral.png" alt="" title="confGeneralGeneral" width="446" height="355" class="aligncenter size-full wp-image-33" /></a></p>
<p>La <strong>configuración general</strong> quizá hubiera sido bueno modularla en formularios más pequeños puesto que su nombre es poco intuitivo teniendo en cuenta la modularidad del resto del script. Quizás mantuve esta estructura porque en la versión 2.1 del Backbeat disponía de un formulario enorme para configurar todos los aspectos del script. </p>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/confGeneralDCC.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/confGeneralDCC.png" alt="" title="confGeneralDCC" width="446" height="355" class="aligncenter size-full wp-image-32" /></a></p>
<p>El <strong>DCC </strong>era la forma de <strong>transferir ficheros</strong> en el IRC, y como es obvio siempre había gente malintencionada distribuyendo virus, por lo que una protección que rechazase archivos susceptibles de serlo por su nombre pues era fácil de implementar e interesante. </p>
<p>Una de las principales funcionalidades de todo script era intentar realizar acciones automatizadas para que el usuario pudiese concentrarse en lo que realmente importaba: chatear.</p>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/confGeneralAutoentrada.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/confGeneralAutoentrada.png" alt="" title="confGeneralAutoentrada" width="446" height="355" class="aligncenter size-full wp-image-31" /></a></p>
<p>La <strong>autoentrada</strong> en canales era otro de esos pequeños detalles que mejoraban la experiencia, sin embargo se me pasó darle soporte para canales con password aunque se podía resolver con una pequeña chapuza que dejaba la clave visible. De todas formas hay pocas veces en las que se necesitaría esa característica.</p>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/confGeneralAntispam.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/confGeneralAntispam.png" alt="" title="confGeneralAntispam" width="446" height="355" class="aligncenter size-full wp-image-30" /></a></p>
<p>Utilizar scripts era algo muy frecuente, especialmente en el caso del IRcap, Phanatic, etc, que inundaban los canales de publicidad en los mensajes de &#8220;quit&#8221;, es decir. Un buen <strong>sistema antispam</strong> era algo fundamental, y éste cumplía muy bien con su cometido: permitir conversar de una forma clara y limpia, sin interrupciones.</p>
<h3>Calculadora</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/calculadora.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/calculadora.png" alt="" title="calculadora" width="216" height="190" class="aligncenter size-full wp-image-29" /></a></p>
<p>La <strong>calculadora</strong> era una utilidad que servía de bien poco ya que quizás fuese más interesante abrir directamente la calculadora de Windows. La programé porque se la vi a mi amigo <em>Quetzal</em> en su script, el <strong>Quetzal Script</strong>, que llegó a salir en un CD de una revista de informática de la época.</p>
<h3>Away</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/awayGeneral.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/awayGeneral.png" alt="" title="awayGeneral" width="316" height="265" class="aligncenter size-full wp-image-23" /></a></p>
<p>El estado de <strong>away</strong> eran otra de esas cosas curiosas del IRC. A la gente le gustaba mostrar su presencia cuando estaba y también cuando no estaba, y los canales se inundaban de mensajes recordando, a veces de manera repetitiva, que un tal fulanitoAway se había marchado a comprar pan, por poner un ejemplo irrelevante. Y por culpa de esta manía de la gente, la de anunciar que no estaban, los sistemas de away tenían que ser altamente personalizables.</p>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/awayMensajes.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/awayMensajes.png" alt="" title="awayMensajes" width="316" height="265" class="aligncenter size-full wp-image-25" /></a></p>
<p>Había determinados <strong>canales elitistas</strong> en los que se prohibían un montón de cosas, entre ellas molestar al personal los sistemas de away, por lo que había que dar la opción a mostrarlos en unos sitios y en otros no.</p>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/awayLog.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/awayLog.png" alt="" title="awayLog" width="315" height="265" class="aligncenter size-full wp-image-24" /></a></p>
<p>El log registraba <strong>ciertos eventos interesantes</strong> (como ser nombrado en un canal, ser expulsado, haber recibido mensajes privados&#8230;) para mostrar un resumen al usuario de todo lo relevante que había pasado cuando volviese a su equipo.</p>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/awayPage.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/awayPage.png" alt="" title="awayPage" width="316" height="265" class="aligncenter size-full wp-image-26" /></a></p>
<p>Lo cierto es que esta característica casi nadie la utilizaba. Era una forma de avisar remotamente al usuario que estaba away para que volviese si se encontraba cerca de la máquina, y es también la única característica del script que utiliza sonido.</p>
<h3>Autoidentificación</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/autoidentificacion_Hispano.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/autoidentificacion_Hispano.png" alt="" title="autoidentificacion_Hispano" width="387" height="342" class="aligncenter size-full wp-image-22" /></a></p>
<p>Identificación automática en los servidores del IRC-Hispano y de DalNet. Pensé en añadir más redes, pero lo cierto es que tampoco merecía la pena hacerlo. Había pocos usuarios del Backbeat en otras redes y además triunfaban otros scripts extranjeros. Que yo recuerde, el más internacional era el <a href="http://ircap.com/"><strong>IRcap</strong></a> con su siempre cuidado apartado gráfico.</p>
<h3>Créditos</h3>
<p><a href="http://www.gestal.es/wp-content/uploads/2011/03/creditos.png"><img src="http://www.gestal.es/wp-content/uploads/2011/03/creditos.png" alt="" title="creditos" width="326" height="325" class="aligncenter size-full wp-image-34" /></a></p>
<p>Y por último, la <strong>ventana de créditos del script</strong> con los reconocimientos a toda la gente que había colaborado de una u otra forma en el proyecto. Con algunas personas aún a día de hoy mantengo el contacto pero con otras lo he perdido. Son cosas que forman parte de la vida y, aunque pasen los años, <strong>siempre recordaré con mucho cariño la época del IRC, del chat y de los scripts</strong>.</p>
<blockquote><p><em>NoTsCaPe betatester<br />
chungo y a bocapo por sus gráficos<br />
Tonic por el detector de clones<br />
^MoRpH-x^ por el trivial <img src='http://www.gestal.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Tig0ti por el addOn de mp3<br />
Estepario por los ASCII<br />
Quetzal por la calculadora<br />
Hommer__ por estar ahí (en todos mis canales <img src='http://www.gestal.es/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> )<br />
Tambien me ayudaron: Fulg0re, hPm, tabo, Sharek, Locorl y DraZen<br />
Por las dll a ais, DragonZap, Necroman y danielson<br />
Y a los canales #100scripts, #fiesta, #ayuda_IRC y #scripting</em>
</p></blockquote>
<p>Un abrazo de vuestro amigo <strong>Jimmy_RAY</strong> <img src='http://www.gestal.es/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.gestal.es/backbeat-3-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Snake en Java</title>
		<link>http://www.gestal.es/snake-en-java/</link>
		<comments>http://www.gestal.es/snake-en-java/#comments</comments>
		<pubDate>Sat, 05 Mar 2011 23:42:10 +0000</pubDate>
		<dc:creator>juangestal</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.gestal.es/?p=18</guid>
		<description><![CDATA[El Snake es un videojuego clásico que salió a mediados de lá década de 1970 en los salones recreativos, y que más tarde en 1998 sería incluído de serie en los terminales móviles de Nokia. Una versión del título llamada Nibbles, gozó también de gran popularidad en MS-DOS ya que QBasic lo traía como programa [...]]]></description>
			<content:encoded><![CDATA[<p>El <strong>Snake</strong> es un videojuego clásico que salió a mediados de lá década de 1970 en los salones recreativos, y que más tarde en 1998 sería incluído de serie en los terminales móviles de <strong>Nokia</strong>. Una versión del título llamada <strong>Nibbles</strong>, gozó también de gran popularidad en <strong>MS-DOS</strong> ya que <strong>QBasic</strong> lo traía como programa de ejemplo.</p>
<p><img src="http://www.gestal.es/wp-content/uploads/2011/03/snake.png" alt="" title="snake" width="560" height="374"  /></p>
<p>Dejando a un lado al simplísimo Pong, podemos pensar en el Snake como en <strong>uno de los juegos más fáciles de programar</strong>. A continuación expongo el código fuente de una simplísima versión del juego que programé en <strong>lenguaje Java</strong>, aunque admito que quizá no está muy ordenado ya que lo escribí de madrugada. </p>
<p><span id="more-18"></span><br />
<h3>Descargar</h3>
<ul>
<li><strong><a href="http://www.gestal.es/upload/proyectos/Snake.java.zip">Snake.java.zip</a></strong></li>
</ul>
<h3>Snake.java</h3>
<pre class="brush: java">
/*
 * SNAKE en Java (1.0 alpha)
 *
 * Autor: Juan Gestal (Jimmy)
 * Fecha: 16/09/09
 *
 * Web: http://www.gestal.es
 */

package org.sp.Snake;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;

public class Snake extends JFrame implements Runnable {

	// Altura y anchura de la ventana
	public static int W = 600;
	public static int H = 400;

	// Tablero
	public static int CV = 15; // Casillas verticales
	public static int CH = 28; // Casillas horizontales
	public static int CT = 20; // Tamaño de las casillas
	public static int CX = 20; // Posición X del comienzo del tablero en la
								// pantalla
	public static int CY = 60; // Posición Y del comienzo del tablero en la
								// pantalla

	// Juego

	public static int juego[][] = new int[CH][CV];
	public static int MAX_LONG_SNAKE = 40;
	public static int snake[][] = new int[MAX_LONG_SNAKE + 1][2];
	public static int snakeLongAct;
	public static int snakeMov = 1;

	// Comprobaciones

	public static boolean gameOver = false;
	public static int puntuacion = 0;

	// Tecla pulsada
	public static int tecla = snakeMov;
	// Retardo

	public static int retardo = 200;

	public void pintarTablero(Graphics g) {

		for (int x = 0; x &lt; CH; x++) {
			for (int y = 0; y &lt; CV; y++) {

				switch (juego[x][y]) {

				case 0: // La casilla está vacía
					g.setColor(Color.white);
					g.fillRect(x * CT + CX, y * CT + CY, CT, CT);
					break;
				case 1: // La casilla es un borde
					g.setColor(Color.black);
					g.fillRect(x * CT + CX, y * CT + CY, CT, CT);
					break;
				}
			}
		}
	}

	public void pintarSerpiente(Graphics g) {

		for (int i = 0; i &lt; snakeLongAct; i++) {

			int x = snake[i][0];
			int y = snake[i][1];

			if (i == 0)
				g.setColor(Color.blue);
			else
				g.setColor(Color.magenta);

			g.fillRect(x * CT + CX, y * CT + CY, CT, CT);
		}
	}

	public void paint(Graphics g) {

		g.setColor(new Color(255, 0, 0));
		g.fillRect(0, 0, W, H);
		pintarTablero(g);
		pintarSerpiente(g);
		g.setColor(Color.black);
		g.drawString(&quot;PUNTUACION:&quot; + puntuacion, 20, 50);

		if (gameOver) {
			g.drawString(&quot;GAME OVER: Pulsa la tecla R para volver a jugar&quot;,20,380);
		}
	}

	public static void main(String[] args) {

		Snake snk = new Snake();
		crearVentana(snk);

		inicializarJuego();
		inicializarSerpiente();
		ponerManzana();

	}

	public static void crearVentana(Snake snk) {
		snk.setVisible(true);
		snk.setBounds(0, 0, W, H);
	}

	public static void inicializarJuego() {

		// Inicializamos el tablero de juego

		for (int x = 0; x &lt; CH; x++) {
			for (int y = 0; y &lt; CV; y++) {
				juego[x][y] = 0;
			}
		}

		// Fijamos los bordes
		for (int x = 1; x &lt; CH; x++) {
			juego[x][0] = 1;
			juego[x][CV - 1] = 1;
		}
		for (int y = 0; y &lt; CV; y++) {
			juego[0][y] = 1;
			juego[CH - 1][y] = 1;
		}

	}

	public static void inicializarSerpiente() {

		// Situamos la serpiente en su posición inicial

		int mitadVertical = CV / 2;

		snake[0][0] = 4;
		snake[0][1] = mitadVertical;

		snake[1][0] = 3;
		snake[1][1] = mitadVertical;

		snake[2][0] = 2;
		snake[2][1] = mitadVertical;

		snakeLongAct = 3; // Fijamos la longitud inicial

	}

	public Snake() {

		Thread hilo = new Thread(this);
		hilo.start();

		this.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				super.keyPressed(e);
				tecla = e.getKeyCode();

				// Tenemos que comprobar siempre que no vaya en dirección
				// contraria
				switch (e.getKeyCode()) {
				case 39: { // Derecha
					if (snakeMov != 3)
						snakeMov = 1;
					break;
				}
				case 40: { // Abajo
					if (snakeMov != 4)
						snakeMov = 2;
					break;
				}
				case 37: { // Izquierda
					if (snakeMov != 1)
						snakeMov = 3;
					break;
				}
				case 38: { // Arriba
					if (snakeMov != 2)
						snakeMov = 4;
					break;
				}
				case &#039;r&#039;:
				case &#039;R&#039;: {
					puntuacion = 0;
					snakeMov = 1;
					gameOver=false;
					inicializarJuego();
					inicializarSerpiente();
					ponerManzana();
					break;

				}
				}

			}
		});
	}

	public void run() {

		while (true) {

			try {
				Thread.sleep(retardo);

			} catch (Exception e) {

			}

			// Comprobar movimiento
			comprobaciones();

			if (!gameOver) {
				movimientoSerpiente();
			}
			repaint();
			// Repintar
		}
	}

	public void comprobaciones() {

		int sx = snake[0][0];
		int sy = snake[0][1];

		switch (snakeMov) {

		case 1:
			sx = snake[0][0] + 1;
			break;
		case 2:
			sy = snake[0][1] + 1;
			break;
		case 3:
			sx = snake[0][0] - 1;
			break;
		case 4:
			sy = snake[0][1] - 1;
			break;
		}

		for (int x = 0; x &lt; CH; x++) {
			for (int y = 0; y &lt; CV; y++) {
				if ((x == sx) &amp;&amp; (y == sy)) {
					if ((juego[x][y] == 1)) { // Choca contra la pared
						gameOver = true;
					}
					if (juego[x][y] == 1000) { // Comemos manzana

						juego[x][y] = 0; // Quitamos la manzana

						if (snakeLongAct &lt; MAX_LONG_SNAKE) { // Si es posible
																// crecer,
																// crecemos
							snakeLongAct++;

						}
						puntuacion += 10; // Aumentamos los puntos
						ponerManzana(); // Colocamos una nueva manzana
					}
				}
			}
		}
		for (int i = 0; i &lt; snakeLongAct; i++) {

			if ((sx == snake[i][0]) &amp;&amp; (sy == snake[i][1]))
				gameOver = true;
		}
	}

	public void movimientoSerpiente() {

		for (int i = snakeLongAct; i &gt; 0; i--) {
			snake[i][0] = snake[i - 1][0];
			snake[i][1] = snake[i - 1][1];
		}
		switch (snakeMov) {

		case 1:
			snake[0][0] = snake[0][0] + 1;
			break;
		case 2:
			snake[0][1] = snake[0][1] + 1;
			break;
		case 3:
			snake[0][0] = snake[0][0] - 1;
			break;
		case 4:
			snake[0][1] = snake[0][1] - 1;
			break;
		}
	}

	public static void ponerManzana() {

		boolean manzanaPuesta = false;

		while (!manzanaPuesta) {

			// Generamos una posición aleatoria en el tablero

			int xManzana = (int) (Math.random() * CH);
			int yManzana = (int) (Math.random() * CV);

			// Comprobamos que no haya nada en la posición

			if (juego[xManzana][yManzana] == 0) { // Es una casilla libre, hay
													// que mirar que en ella no
													// se encuentre la serpiente
				boolean estaSerpiente = false;

				for (int i = 0; i &lt; snakeLongAct; i++) {

					if ((snake[i][0] == xManzana) &amp;&amp; (snake[i][1] == yManzana))
						estaSerpiente = true;
				}
				if (!estaSerpiente) { // Podemos poner la manzana
					juego[xManzana][yManzana] = 1000;
					manzanaPuesta = true;
				}

			}
		}

	}

}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.gestal.es/snake-en-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bicola circular en C++</title>
		<link>http://www.gestal.es/bicola-circular-en-c/</link>
		<comments>http://www.gestal.es/bicola-circular-en-c/#comments</comments>
		<pubDate>Sat, 05 Mar 2011 21:11:30 +0000</pubDate>
		<dc:creator>juangestal</dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.gestal.es/?p=16</guid>
		<description><![CDATA[Una bicola o doble cola es una estructura de datos que permite la inserción y el borrado por ambos extremos, el izquierdo y el derecho. En una de las prácticas que me propusieron hace tiempo, cuando cursé la asignatura de Estructura de Datos, fue precisamente la implementación de una bicola con la particularidad de que [...]]]></description>
			<content:encoded><![CDATA[<p>Una <strong>bicola</strong> o <strong>doble cola</strong> es una <strong>estructura de datos</strong> que permite la inserción y el borrado por ambos extremos, el izquierdo y el derecho. </p>
<p>En una de las prácticas que me propusieron hace tiempo, cuando cursé la asignatura de Estructura de Datos, fue precisamente la implementación de una bicola con la particularidad de que ésta tenía que ser <strong>circular</strong> y estar implementada sobre un <strong>array</strong> que, a medida que se introdujesen los valores, se fuese <strong>redimensionando</strong> solicitando más memoria al sistema para poder almacenarlos.</p>
<p>Así que a continuación dejo el <strong>código fuente</strong>, por si a algún estudiante le sirve de ayuda y para probar de paso la inserción de código fuente en el blog con el plugin <a href="http://thislab.com/2007/12/16/release-wordpress-plugin-syntaxhighlighter-plus/"><strong>SyntaxHighlighter Plus</strong></a>.</p>
<p><span id="more-16"></span></p>
<h3>Descargar</h3>
<ul>
<li><strong><a href="http://www.gestal.es/upload/proyectos/bicola-cpp.zip">bicola-cpp.zip</a></strong></li>
</ul>
<h3>Breve explicación</h3>
<ul>
<li>Para hacer circular el array he utilizado dos métodos privados: <strong>goLeft()</strong> y <strong>goRight()</strong>, que utilizo para desplazarme para un lado o otro (izquierda o derecha) a partir de un puntero pasado como argumento (<strong>pi</strong> o <strong>pd</strong>).</li>
<li><strong>pi</strong> Es un puntero que siempre apunta al elemento de la izquierda.</li>
<li><strong>pd</strong> Es un puntero que siempre apunta al elemento de la derecha.</li>
<li><strong>p</strong> Es un puntero que apunta a la primera posición del array.</li>
<li>Si intento desplazarme a la derecha y no hay más posiciones, el método <strong>goRight()</strong> me mandará al principio del array (&#8220;p&#8221;).</li>
<li>El método <strong>goLeft()</strong> hace justo lo contrario: si intento avanzar hacia la izquierda y no hay más posiciones me mandará al último elemento del array.</li>
<li>Con los métodos <strong>goLeft()</strong> y <strong>goRight()</strong> solvento el problema del desplazamiento circular por el array.</li>
<li><strong>getMem()</strong> Es el método encargado de pedir memoria.</li>
<li><strong>getLeft()</strong> Nos devuelve el elemento izquierdo.</li>
<li><strong>getRight()</strong> Nos devuelve el elemento derecho.</li>
<li><strong>putLeft()</strong> Inserta un elemento por la izquierda.</li>
<li><strong>putRight()</strong> Inserta un elemento por la derecha.</li>
</ul>
<h3>Bicola.h</h3>
<pre class="brush: cpp">
/*
 * Programa:	Bicola
 * Autor:		Juan Gestal
 * Web:			http://www.gestal.es
 */

class Bicola {

      int t;
      int n; 

      int *p,*pi,*pd;

      void Bicola::goLeft(int **q);
      void Bicola::goRight(int **q);
      void Bicola::getMem();

      public:
             Bicola();
             ~Bicola();
             void putLeft(int e);
             void putRight(int e);
             int getLeft();
             int getRight();
};
</pre>
<h3>Bicola.cpp</h3>
<pre class="brush: cpp">
/*
 * Programa:	Bicola
 * Autor:		Juan Gestal
 * Web:			http://www.gestal.es
 */

#include &quot;bicola.h&quot;

Bicola::Bicola() {
               t=5; //tamaño
               n=0; //número de elementos
               p = new int[t]; //&quot;p&quot; apunta a un nuevo array de enteros de tamaño t
               pi=pd=p; //El puntero izquierdo &quot;pi&quot; y el puntero derecho &quot;pd&quot; se inicializan a &quot;p&quot;
}
Bicola::~Bicola() {
                delete []p;
}

/*
 * putLeft() Introduce un elemento en la Bicola por la izquierda. Si no hay memoria
 * llama a la función getMem() para pedirla.
 */

void Bicola::putLeft(int e) {
     if (n &gt;= t)
        getMem();

     if (n == 0) {
        p[0]=e;
     }
     else {
          goLeft(&amp;pi);
          *pi=e;
     }
     n++;
}

/*
 * putRight() Introduce un elemento en la Bicola por la derecha. Si no hay memoria
 * llama a la funciÛn getMem() para pedirla.
 */

void Bicola::putRight(int e) {
     if (n &gt;= t)
        getMem();

     if (n == 0) {
        p[0]=e;
     }
     else {
          goRight(&amp;pd);
          *pd=e;
     }
     n++;
}

/*
 * getLeft() devuelve el elemento izquiedo de la bicola.
 * Si se produce un error por que no hay elementos devuelve -1.
 */

int Bicola::getLeft() {
    if (n &gt; 0) {
       int i=*pi;
       if (n &gt; 1) goRight(&amp;pi);
       n--;
       return i;
    }
    else return -1;
}

/*
 * getRight() devuelve el elemento de la derecha de la bicola.
 * Si se produce un error por que no hay elementos devuelve -1;
 */

int Bicola::getRight(){
    if (n &gt; 0) {
       int i=*pd;
       if (n &gt; 1) goLeft(&amp;pd);
       n--;
       return i;
    }
    else return -1;
}

/*
 * goLeft() desplaza el puntero recibido como argumento una posición a la izquierda.
 * En el caso de que se le pase un argumento que apunte al principio del array &quot;p&quot;,
 * lo manda a la última posición.
 */

void Bicola::goLeft(int **q) {
    if (p == *q)
       *q=&amp;p[t-1];
    else
        (*q)--;
}

/*
 * goRight() desplaza el puntero recibido como argumento una posiciÛn a la derecha.
 * En el caso de que se le pase un argumento que apunte al final del array &quot;p&quot;,
 * lo manda a la primera posiciÛn.
 */

void Bicola::goRight(int **q) {
     if (&amp;p[t-1] == *q)
        *q=p;
     else
         (*q)++;
}

/*
 * getMem() es la funciÛn que pide memoria. Cada vez que se le llama amplia la capacidad del array &quot;p&quot;
 * en 5 posiciones.
 */

void Bicola::getMem() {
     int i;
     int *q = new int[t+5];

     for(i=0;pi != pd;i++) {
             q[i]=*pi;
             goRight(&amp;pi);
     }
     q[i]=*pi;

     delete []p;

     pi=p=q;
     pd=p+(n-1);
     t=t+5;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.gestal.es/bicola-circular-en-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sokoban [versión preliminar]</title>
		<link>http://www.gestal.es/sokoban-version-preliminar/</link>
		<comments>http://www.gestal.es/sokoban-version-preliminar/#comments</comments>
		<pubDate>Sat, 05 Mar 2011 20:02:07 +0000</pubDate>
		<dc:creator>juangestal</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.gestal.es/?p=12</guid>
		<description><![CDATA[(Link directo al archivo sokoban.swf, para jugar a pantalla completa o descargar el título.) El Sokoban (encargado de almacén en japonés) siempre ha sido uno de mis puzzles favoritos. Lo cierto es que tenía ganas de hacer mi propia versión, y cuando el verano pasado aprendí a utilizar Flash, fue en el primer juego en [...]]]></description>
			<content:encoded><![CDATA[<div align="center"><object width="580" height="450" data="http://www.gestal.es/wp-content/uploads/2011/03/sokoban.swf" type="application/x-shockwave-flash"><param name="id" value="FlashGame" /><param name="quality" value="hight" /><param name="src" value="http://www.gestal.es/wp-content/uploads/2011/03/sokoban.swf" /></object></div>
<p>(<em>Link directo al archivo <a href="http://www.gestal.es/wp-content/uploads/2011/03/sokoban.swf"><strong>sokoban.swf</strong></a>, para jugar a pantalla completa o descargar el título.</em>)</p>
<p>El <a href="http://es.wikipedia.org/wiki/Sokoban"><strong>Sokoban</strong></a> (<em>encargado de almacén</em> en japonés) siempre ha sido uno de mis puzzles favoritos. Lo cierto es que tenía ganas de hacer mi propia versión, y cuando el verano pasado aprendí a utilizar Flash, fue en el primer juego en el que pensé para afianzar los conocimientos de programación en ActionScript adquiridos con los (totalmente recomendables) libros:</p>
<ul>
<li>VAN DER SPUY, <em>Rex. Game Design with flash</em>.1a ed. New York: Friendsof, 2009. 586 p. ISBN: 978-1-4302-1821-0</li>
<li>SHUPE, Rich; ROSSER, Zevan. <em>Learning ActionScript 3.0 a beginner&#8217;s guide</em>.1 ed. Canadá: O&#8217;Reilly Media, Inc., 2008. 363 p. ISBN: 978-0-596-52787-7</li>
</ul>
<p>Si algo me sorprendió de la plataforma de Adobe es la posibilidad de desarrollar de una forma tan rápida y cómoda juegos y aplicaciones. Ya la había tocado hace años, aunque desde un perfil más cercano al de animador que al de programador.</p>
<p>Y con esta <strong>versión preliminar del Sokoban</strong> me quito en parte una espinita que tengo clavada desde hace tiempo. De todas formas debo admitir que <strong>el juego no está finalizado</strong>, todavía me queda por implementar las siguientes características principales:</p>
<ul>
<li><strong>Sonido:</strong> Actualmente el juego es muy silencioso, diría yo.</li>
<li><strong>Paso atrás:</strong> No hay nada más frustrante que equivocarte al desplazarte a una casilla y que por culpa de ella, no se pueda solucionar el puzzle. Por ahora el que se equivoque lo pagará caro.</li>
<li><strong>Escena final:</strong> Si alguien supera todos los niveles se encontrará con un error en lugar de unas felicitaciones.</li>
</ul>
<p>En cuanto solvente estas dos características y ponga un poco de orden en el <strong>código fuente</strong>, también lo publicaré en la página para el que quiera utilizarlo de ejemplo. De todas formas el juego es perfectamente &#8220;jugable&#8221;. Así que estás invitado a echar una partidita. El objetivo es sencillo, hay que cubrir los pentágonos amarillo anaranjados con las cajas y así ordenar el almacén.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gestal.es/sokoban-version-preliminar/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>¡Hola Mundo!</title>
		<link>http://www.gestal.es/%c2%a1hola-mundo-2/</link>
		<comments>http://www.gestal.es/%c2%a1hola-mundo-2/#comments</comments>
		<pubDate>Mon, 06 Sep 2010 14:24:45 +0000</pubDate>
		<dc:creator>juangestal</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.gestal.es/?p=6</guid>
		<description><![CDATA[¡Muy buenas! Este es el primer post de mi nuevo blog personal, un lugar donde trataré de recopilar y ordenar mis proyectos. Para el que no me conozca, me presento. Me llamo Juan Gestal (aunque mucha gente en Internet me conoce como Jimmy) y me encanta la informática, el mus y el zumo de naranja [...]]]></description>
			<content:encoded><![CDATA[<p>¡Muy buenas! Este es el primer post de mi nuevo blog personal, un lugar donde trataré de <strong>recopilar y ordenar mis proyectos</strong>. </p>
<p>Para el que no me conozca, me presento. Me llamo <strong>Juan Gestal</strong> (aunque mucha gente en Internet me conoce como Jimmy) y me encanta la informática, el mus y el zumo de naranja natural (y quizás muchas otras cosas, aunque no tantas). Empecé a programar cuando tenía 14 o 15 años haciendo scripts (BaCKBEAT o BAT) y addons (una especie de plugins) para el mIRC. En aquella época había tiempo para todo. También mantenía una página web personal que actualicé varias veces en html estático (web 1.0 le llaman) pero con más clase que las de GeoCities: no tenía un obrero diciendo &#8220;en construcción&#8221; ni estaba optimizada sólo para Netscape. Una de las versiones aún <a href="http://usuarios.multimania.es/canalscripting/jimmyray/">sigue online</a>, rodeada de esos molestos banners de publicidad y con otra URL diferente a la original.</p>
<p>Ya ha llovido desde entonces, y a lo largo de estos años he hecho cosas interesantes y otras no tanto. He finalizado proyectos y he dejado otros a medias por falta de tiempo. Intentaré recopilarlos y subirlos, por si a alguien le interesan o le sirven de ayuda.</p>
<p>Actualmente soy el administrador de <a href="http://pixfans.com"><strong>Pixfans.com</strong></a>, donde escribo artículos sobre la <strong>cultura y la historia de los videojuegos</strong>. Puedes pasarte a leerlos, quizás alguno te parezca interesante. También ando haciendo mis pinitos en Flash, donde trato de programar algún videojuego interesante aunque creo que este tema irá para largo&#8230;</p>
<p>Y con esta breve presentación doy por finalizada la primera entrada de este blog personal. Voy a pasarme por galerías de themes a ver si encuentro alguno sencillo y claro ¡y a poner esto un poco en orden!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gestal.es/%c2%a1hola-mundo-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

