Actualización automática de recursos

Por fin he tenido un poco de tiempo para hacer la tan esperada entrada (o no tanto) sobre la actualización automática de recursos :)

Bueno, antes de nada vamos a hacer un repaso de lo que vamos a conseguir, así tendremos una visión general y nos resultará más fácil entenderlo todo.

-Lo que pretendemos con esta entrada es que los recursos de nuestra granja (carne, papas, trigo…) vayan aumentando a medida que pasa el tiempo y según el nivel de construcción del edificio al que pertenecen.

-También lo que haremos es que al aumentar un edificio de nivel (si tenemos suficiente dinero para hacerlo), se nos reste de nuestro dinero.

-El dinero lo vamos a conseguir según el nivel de los edificios de la granja, cada vez que subamos un nivel de cualquier edificio nuestros ingresos aumentarán más deprisa (toma ya!).

-Cada edificio tiene un tope de capacidad de recursos (cuando se llena el almacén de cada edificio ya no aumentan los recursos), dicho tope aumenta con cada nivel nuevo de edificio.

Aunque parezca algo complicado, veréis que no lo es tanto, todo consiste en aplicar un poco de lógica. ;)

Aquí un avance de como quedará la nueva versión de “Granja” con sus recursos operativos:

Imagen 1

Empezamos!

La base de datos

Para que todo funcione correctamente tenemos que agregar dos campos en la tabla usuarios (si aún no los tenéis) con sus tipos de datos correspondientes:

last_update int(11) NOT NULL
dinero flota NOT NULL

Además, en la tabla edificios también tienen que estar los siguientes campos creados.

tipo_recurso varchar(20) NOT NULL
prod_hora int(25) NOT NULL
cantidad int(25) NOT NULL

Quizá de los campos que habéis visto el único que hay que explicar y que es menos obvio pero más importante es “last_update”. Este campo sirve para guardar en la Base de Datos el tiempo en segundos cada vez que se actualizan los recursos.

Esto sirve para que al actualizar los recursos cada vez, podamos mirar en ese campo (last_update) la última vez que actualizamos, así sabemos cuanto tiempo ha pasado y mediante una sencilla regla de tres sabemos la cantidad que tenemos que aumentar a los recursos, así que la aumentamos y guardamos el nuevo tiempo actual para la próxima vez (siempre es igual).

Realmente el guardar el tiempo de la última actualización cada vez que actualizamos los recursos es el gran valor de esta entrada en el blog, aunque veréis que para que todo funcione se necesitan hacer bastantes cosas más, sobre todo cambios en los códigos creados con anterioridad.

La manera de explicar esta vez va a se diferente, explicaremos delante y al final de cada código, así será más fácil de entender puesto que lo que más hemos hecho son cambios y añadidos en códigos ya creados para que todo encaje perfectamente.

includes/constantes.php
Empezaremos por modificar el archivo que contiene las constantes, pero antes de nada una adverténcia:

OJO CON LAS COMILLAS DOBLES Y SIMPLES QUE AQUÍ A VECES SALEN COMO LES DA LA GANA

En este archivo que está dentro de la carpeta includes, vamos a cambiar el array edificios por este otro donde especificamos los recursos que tiene cada edificio. Nos servirá para después al registrarnos como usuarios tener los datos necesarios para insertar nuestros tipos de recursos.

## Edificios de los que consta el juego.
$edificios = array(
Establo => array ( ‘recurso’ => ‘carne’),
Granero => array ( ‘recurso’ => ‘maiz’),
Campo => array ( ‘recurso’ => ‘papas’),
Molino => array ( ‘recurso’ => ‘trigo’),
Comercio=> array ( ‘recurso’ => ”));
?>

registro.php

Al registranos se guardan en las diferentes tablas nuestros datos para poder iniciar una partida en Granja, pues bien, además de esos datos ahora necesitaremos agregar valores a dos campos más de la tabla (campos que hemos añadido al principio del tutorial)

Así que vamos a editar el registro y cambiamos el “mysql_query” que hace el insert de los datos del usuario y que está encima del foreach y el mismo “foreach” que hay justo debajo (más o menos todo está a la mitad de la página) por esto otro:

mysql_query(“INSERT INTO usuarios (usuario,email,contrasena,fecha_ingreso,cod_unico_usuario,validado,nombre_registrado, dinero, last_update) VALUES (‘$usuario’,'$email’,'$contrasena’,'$fecha_ingreso’,'$cod_unico_usuario’,'$validado’,'$nombre_registrado’, 100, $last_update)”) or die(“Error de registro”);
foreach ($edificios as $edificio=>$propiedad){

mysql_query(“INSERT INTO edificios (usuario, edificio, nivel, costo, capacidad, tipo_recurso, prod_hora, cantidad) VALUES (‘$usuario’,'$edificio’, $nivel, 100, 100,’”.$propiedad['recurso'].”‘, 0, 0)”) or die(“Error de registro”);
}

El primer insert del mysql_query lo que hace ahora es simplemente añadir dos valores más en los nuevos campos (en naranja) que antes hemos creado (dinero y last_update)

El dinero lo iniciamos a 100 monedas y también iniciamos el tiempo en last_update para que así ya vaya actualizando recursos nada más registrar la nueva cuenta.

En el “foreach” (en verde) lo que hacemos es insertar ahora dos datos iniciales más (prod_hora y cantidad) que no significan otra cosa que la producción de recursos que obtendremos cada hora y la cantidad de recursos que tenemos acumulada.

includes/granja_funciones.php

En este archivo que está dentro de la carpeta includes, hemos creado tres IMPORTANTÍSIMAS nuevas funciones, y como estas funciones necesitan trabajar con las constantes que tenemos en includes/constantes.php, lo que haremos es escribir arriba de todo y debajo de la apertura de php (o sea debajo de <?php) lo siguiente:

require(‘includes/constantes.php’);

Ahora la primera función que vamos a añadir en este archivo es:

function muestraRecursosUsuario($usuario){

global $edificios;

actualizaRecursos($usuario);

conectar_base_datos();

$consulta = mysql_query(“SELECT * FROM usuarios WHERE usuario = ‘$usuario’”);

$row = mysql_fetch_assoc($consulta);

$dinero = $row['dinero'];

$consulta = mysql_query(“SELECT * FROM edificios WHERE usuario = ‘$usuario’ AND edificio = ‘Comercio’”);

$row = mysql_fetch_assoc($consulta);

$capacidad_comercio = $row['capacidad'];

if($capacidad_comercio == $dinero)

$color = ‘red’;

else

$color = ‘white’;

echo “<center><table border=0 bgcolor=’#ceb46e’><tr><td>”;

echo “<font color=’brown’><b>dinero: </b></font><font color=’$color’>”.number_format($dinero,2,’,',’.').”</font><br />”;/**********/// decimal = 3422.37847623;  Mostrará 3.422,38

foreach ($edificios as $edificio=>$propiedad){

if ($propiedad['recurso'] !=”){

$consulta = mysql_query(“SELECT * FROM edificios WHERE usuario = ‘$usuario’ AND edificio = ‘$edificio’”);

$row = mysql_fetch_assoc($consulta);

$cantidad = $row['cantidad'];

$capacidad = $row['capacidad'];

if($capacidad == $cantidad)

$color = ‘red’;

else

$color = ‘white’;

echo “<font color=’brown’><b>”.$propiedad['recurso'].”: </b></font><font color=’$color’>”.number_format($cantidad,2,’,',’.').” </font>”;/**********/// decimal = 3422.37847623;  Mostrará 3.422,38

}

}

echo “</td></tr></table></center>”;

}

No me voy a enrollar mucho explicando esta función porque lo que hace es evidente, mostrar los recursos del usuario haciendo las consultas necesarias en las tablas.

Quizá destacar la primera línea “global $edificios;”, con global lo que hacemos es convertir en una variable global (accesible desde cualquier lugar) el array $edificios (el que tenemos en constantes).

Lo convertimos en global para poder utilizarlo dentro de la función en la que estamos ( Ala!, no te acostarás sin saber una cosa más ;P ).

La segunda función que escribiremos es la FUNCIÓN de TODAS las FUNCIONES, el corazón de todo este entramado de ficheros y códigos, el cerebro que hace que todo funcione a las mil maravillas, yo era menos feliz cuando no existía esta función… ejem, vale, ya paro. O_o’

Esta función controla que los recursos se vayan actualizando y que no se pasen los límites de capacidad de recursos de los edificios.

Aquí la tenéis:

function actualizaRecursos($us) {

conectar_base_datos();

//1.-Miramos la última vez que se actualizó

$consulta = mysql_query(“SELECT * FROM usuarios WHERE usuario = ‘$us’”);

$row = mysql_fetch_assoc($consulta);

$last_update = $row['last_update'];

//2.-Miramos el tiempo transcurrido desde el la última actualización de recursos

$tiempo_actual = time();

$seg_transcurridos = ($tiempo_actual-$last_update); //desde que se actualizó por última vez

//3.-Miramos los niveles (para saber cuanto dinero ganamos), capacidad y cantidad de recursos de los edificios

$consulta = mysql_query(“SELECT * FROM edificios WHERE usuario = ‘$us’ AND edificio=’Establo’”);

$row = mysql_fetch_assoc($consulta);

$nivel_establo = $row['nivel'];

$cant_carne = $row['cantidad'];

$cap_carne = $row['capacidad'];

$consulta = mysql_query(“SELECT * FROM edificios WHERE usuario = ‘$us’ AND edificio=’Granero’”);

$row = mysql_fetch_assoc($consulta);

$nivel_granero = $row['nivel'];

$cant_maiz = $row['cantidad'];

$cap_maiz = $row['capacidad'];

$consulta = mysql_query(“SELECT * FROM edificios WHERE usuario = ‘$us’ AND edificio=’Campo’”);

$row = mysql_fetch_assoc($consulta);

$nivel_campo = $row['nivel'];

$cant_papas = $row['cantidad'];

$cap_papas = $row['capacidad'];

$consulta = mysql_query(“SELECT * FROM edificios WHERE usuario = ‘$us’ AND  edificio=’Molino’”);

$row = mysql_fetch_assoc($consulta);

$nivel_molino = $row['nivel'];

$cant_trigo= $row['cantidad'];

$cap_trigo = $row['capacidad'];

$consulta = mysql_query(“SELECT * FROM edificios WHERE usuario = ‘$us’ AND edificio=’Comercio’”);

$row = mysql_fetch_assoc($consulta);

$nivel_comercio = $row['nivel'];

$cap_dinero = $row['capacidad'];

//4.-Miramos la cantidad de dinero actual

$consulta = mysql_query(“SELECT * FROM usuarios WHERE usuario = ‘$us’”);

$row = mysql_fetch_assoc($consulta);

$cant_dinero = $row['dinero'];

//5.-calculamos nueva cantidad de recursos

$nivel_dinero = $nivel_establo + $nivel_granero + $nivel_campo + $nivel_molino + $nivel_comercio;

$total_dinero = calcula_recursos($cant_dinero, $nivel_dinero, $seg_transcurridos);

if ($total_dinero > $cap_dinero)

$total_dinero = $cap_dinero;

$total_carne = calcula_recursos($cant_carne, $nivel_establo, $seg_transcurridos);

if ($total_carne > $cap_carne)

$total_carne = $cap_carne;

$total_maiz = calcula_recursos($cant_maiz, $nivel_granero, $seg_transcurridos);

if ($total_maiz > $cap_maiz)

$total_maiz = $cap_maiz;

$total_papas = calcula_recursos($cant_papas, $nivel_campo, $seg_transcurridos);

if ($total_papas > $cap_papas)

$total_papas = $cap_papas;

$total_trigo = calcula_recursos($cant_trigo, $nivel_molino, $seg_transcurridos);

if ($total_trigo > $cap_trigo)

$total_trigo = $cap_trigo;

$total_madera = calcula_recursos($cant_madera, $nivel_comercio, $seg_transcurridos);

//6.-Actualizamos recursos

$sql = “UPDATE edificios SET cantidad = $total_carne WHERE usuario = ‘$us’ AND edificio=’Establo’”;

mysql_query($sql) or die(“Error al actualizar carne”);

$sql = “UPDATE edificios SET cantidad = $total_maiz WHERE usuario = ‘$us’ AND  edificio=’Granero’”;

mysql_query($sql) or die(“Error al actualizar maiz”);

$sql = “UPDATE edificios SET cantidad = $total_papas WHERE usuario = ‘$us’ AND  edificio=’Campo’”;

mysql_query($sql) or die(“Error al actualizar papas”);

$sql = “UPDATE edificios SET cantidad = $total_trigo WHERE usuario = ‘$us’ AND  edificio=’Molino’”;

mysql_query($sql) or die(“Error al actualizar trigo”);

$sql = “UPDATE usuarios SET dinero = $total_dinero WHERE usuario = ‘$us’”;

mysql_query($sql) or die(“Error al actualizar dinero”);

//7.-actualizamos tiempo de actualización (valga la redundancia)

$sql = “UPDATE usuarios SET last_update = $tiempo_actual WHERE usuario = ‘$us’”;

mysql_query($sql) or die(“Error al actualizar tiempo de actualización”);

}

Esta función se podía haber separado en otras más pequeñas, pero para no liarnos tanto y como la he dejado bien ordenadita y me gusta así, pues así se queda :)

La función está toda comentada, pero vamos a explicar lo que hace paso a paso:

1.- Miramos (mediante una consulta, el campo last_update de la tabla usuarios) cuando fue la última vez que hicimos la actualización de recursos (1hora, 2 minutos, 10 horas o 2 segundos… quien sabe).

2.- El tiempo en segundos que hemos obtenido en la anterior consulta nos sirve para restárselo al tiempo actual que también obtenemos en segundos con la función “time();” y así obtenemos el tiempo que ha transcurrido desde la última actualización.

3.- Ahora mediante otra consulta obtenemos el nivel, la capacidad y los recursos de cada edificio.

Estos datos nos servirán para hacer los cálculos necesarios a la hora de aumentar los recursos y el dinero por hora.

4.- Hacemos una consulta para tener en una variable el dinero que tenemos actualmente almacenado en la Base de Datos (así luego le podemos sumar las ganancias obtenidas hasta ahora).

5.- Actualizamos los recursos, que no es más que hacer el cálculo mediante una sencilla regla de tres (de eso se encargará la función que nos falta).

Lo importante de este punto nº5 son los “if” (en verde), estos condicionales son los que evitan que sobrepasemos el límite de recursos en cada edificio.

Por lo tanto nunca nos pasaremos de recursos en el edificio, cuando lleguemos al límite se nos mostrarán los recursos de color rojo, y si no aumentamos el edificio no seguiremos ganando recursos.

6.- Simplemente actualizamos las nuevas cantidades de recursos y el nuevo tiempo de actualización “last_update” (la última vez que hemos actualizado, o sea ahora)

Y pasamos a la última función de este archivo:

##función que calcula los recursos

function calcula_recursos($cant_recurso_actual, $nivel_edificio, $seg_transcurridos){

//calculamos nueva cantidad de recursos

$recurso_hora = $nivel_edificio*10;

$ganancias = ($seg_transcurridos * $recurso_hora)/3600;//ganancias por segundo (se calcula mediante regla de tres)

$cant_recurso_actual += $ganancias;

$total_recursos = number_format($cant_recurso_actual,2,’.',”);// decimal = 3422.37847623;  Mostrará 3.422,38

return $total_recursos;

}

Esta función lo que hace es recibir de la función anterior (a la hora de calcular los recursos, en el punto 5) una serie de parámetros ($cant_recurso_actual, $nivel_edificio, $seg_transcurridos) y con ellos calcular mediante una sencilla regla de tres la nueva cantidad de recursos que tendremos.

main.php

Pasamos ahora a modificar el archivo main.php, lo que haremos aquí es prepararlo para poder mostrar los recursos en pantalla.

Lo primero que tenemos que hacer es buscar la línea donde tenemos el:

require (‘includes/granja_funciones.php’);

Y ELIMINARLA. Entonces ese mismo require lo pegáis debajo de require(‘seguridad.php’);

Os quedará así (los puntos suspensivos no eh?!)

require(‘seguridad.php’);

require (‘includes/granja_funciones.php’);

Esto lo hacemos porque a partir de ahora necesitaremos acceder antes a las funciones del archivo “granja_funciones.php”.

Justo debajo del require “require (‘includes/granja_funciones.php’);” que acabáis de pegar, tenéis que pegar la función que se encarga de actualizar los recursos:

actualizaRecursos($us);

Esta función “actualizaRecursos” actualiza los recursos del usuario que le pasamos por parámetros, es la que se encarga de actualizar los recursos cada vez que refrescamos la página.

Bien, atención ahora que esta es complicadilla. Mejor os copio todo el “Body” y os marco (en naranja) donde está el cambio para que lo veáis bien, entonces sólo tenéis que substituir todo el código del body por este que os paso.

<body>

<center><h1>Granja</h1></center>

<table align=”center”>

<tr>

<td style=”vertical-align: top”>

<center><h3>Menú</h3></center>

<ul>

<li><a href=’mapa2.php?x=1&y=1′>Mapa</a></li>

<li><a href=’mensajeria.php?id=band’>Mensajería</a></li>

<li><a href=’ver_ofertas.php’>Ver ofertas</a></li>

<li><a href=’nueva_oferta.php’>Publicar ofertas</a></li>

<li><a href=’ranking.php’>Ranking</a></li>

<li><a href=’perfil.php’>Perfil</a></li>

<li><a href=’cuenta.php’>Cuenta</a></li>

<li><a href=’salir.php’>Salir</a></li>

</ul>

</td>

<td><?php muestraRecursosUsuario($us); ?>

<div>

<img src=”img/granja_fondo.jpg” />

<?php

muestraGranja();

?>

</div>

</td>

</tr>

</table>

</body>

Lo que hacemos es simplemente mostrar los recursos de la granja en la parte donde están el menú y las imágenes de la granja.

timer_proceso3.php

Lo que vamos a hacer aquí es añadir una función nueva y dentro de una función ya existente en el archivo, llamaremos a esta nueva función.

La función que añadiremos es la siguiente:

function restaCostos(){

$us = $_SESSION['usuario'];

$ev = @$_GET['ev'];

//consultamos el coste a restar

$consulta = mysql_query(“SELECT * FROM edificios WHERE usuario = ‘$us’ and edificio = ‘$ev’”);

$row = mysql_fetch_assoc($consulta);

$costo = $row['costo'];

//consultamos el dinero al que restaremos

$consulta = mysql_query(“SELECT * FROM usuarios WHERE usuario = ‘$us’”);

$row = mysql_fetch_assoc($consulta);

$dinero = $row['dinero'];

if ($dinero>=$costo){

$dinero = ($dinero – $costo);

$sql = “UPDATE usuarios SET dinero = $dinero WHERE usuario = ‘$us’”;

mysql_query($sql) or die(“Error al restar costos”);

}else{

echo “<br><center>No tienes suficientes dinero para ampliar el $ev<center>”;

echo “<br><center><a href=’main.php’>Principal</a></center>”;

exit();

}

}

Esta función se encarga de restar dinero cada vez que ampliamos un edificio, además comprueba que tengamos el dinero suficiente antes de ampliarlo. La función está bastante clara con los comentarios que tiene y los mensajes (echos) que retorna en caso de no tener dinero suficiente.  Para cualquier duda le preguntáis a Borisigna… xD  no, es broma, a mí, a mí ;)

Ahora buscamos la función “function tiempo_construccion($h_, $m_, $s_)” y la cambiamos enterita por esta otra:

function tiempo_construccion($h_, $m_, $s_){

$us = $_SESSION['usuario'];

$ev = $_GET['ev'];

$tiempo_actual = time();

$tiempo_en_segundos = ($h_ * 3600) + ($m_ * 60) + $s_;

$tiempo_termino = $tiempo_actual + $tiempo_en_segundos;

/*restamos coste del edificio*/

restaCostos();

mysql_query(“INSERT INTO evento (usuario,tiempo,evento) VALUES (‘$us’, ‘$tiempo_termino’,'$ev’)”);

procesar_tiempo_restante();

}

Realmente sólo hemos agregado una línea (en naranja), pero sustituyéndola toda vamos más rápidos ;)

La línea agregada es la que se encarga de llamar a la función anterior para restar los costes del edificio una vez que le hemos dado a ampliar edificio.

constructor.php

En el constructor lo primero que haremos es buscar esta línea:

require (‘includes/granja_funciones.php’);

La cortamos e igual que hemos hecho antes la pegamos debajo de:

require(‘seguridad.php’);

Como he comentado antes esto lo hacemos porque en adelante necesitaremos acceder antes a las funciones de granja_funciones.

Ahora añadimos la siguiente línea (en rojo): justo antes de empezar la tabla:

Justo debajo de esta línea:

(echo “<center><h1>$ev_array[2]</h1></center>”;)

muestraRecursosUsuario($us);

y encima de esta:

(echo “<table align=’center’ border=’1′>”;)

Veamos ahora como quedará el constructor:

Imagen granja 2

Ya terminamos!!… Puff! ya estoy agotado de tanto cambio por aquí y por allá, pero aún me va a dar tiempo de ir al cine y todo! jeje… ;P

nueva_oferta.php

Para finalizar en este archivo sólo hay que cambiar la línea del:

<select name=’recurso’><option>Carne</option><option>Trigo</option><option>Vegetales</option></select>

Por esta otra que es muy parecida.

<select name=’recurso’><option value=’carne’>Carne</option><option value=’maiz’>Maíz</option><option value=’papas’>Papas</option><option value=’trigo’>Trigo</option></select>

Lo único que hacemos es variar algunos parámetros para adaptarlos al código que necesitamos más adelante.

En fin, eso es todo, pero antes de despedirme me gustaría deciros para que funcione todo correctamente debéis registraros en “Granja” con un usuario nuevo, los usuarios de antiguos tienen inicializados insuficientes parámetros para que tofo funcione bien.

Hemos hecho cambios vitales en el archivo del registro para inicializar nuevos campos en algunas tablas, así que ya sabéis.

Y ala!, a conseguir muchos recursos y a cuidar la granja para que sea próspera y fructífera!  :)

Cualquier duda ya sabéis, aquí mismo las cortas y en el FORO las exteeensas.

Antes de irme dejad que os cuente una anécdota que tuve al entrar a la “Granja” el otro día… por lo visto olvidé de poner límite de capacidad para el edificio de trigo y cuando entré después de bastante tiempo (soy una persona muy atareada) tenía más de 22 MILLONES de recursos en trigo xD

Me he montado una panadería ;P

Hasta pronto!

Spanisher.-

PD: OJO CON LAS COMILLAS DOBLES Y SIMPLES QUE AQUÍ A VECES SALEN COMO LES DA LA GANA


Vendiendo y comprando recursos

Es común en los juegos de navegador poder enviar o vender recursos producidos. En nuestro juego de la GRANJA vamos a ser capaces de vender nuestra producción a un determinado jugador o, simplemente, incluir nuestra oferta dentro de un stock global. Veamos cómo lo haremos.

Utilizaremos el mercado tanto para publicar ofertas, como para realizar las ventas. Empezaremos por lo más sencillo que es publicar nuestras ofertas y ver las ofertas de los demás jugadores.

Necesitaremos una tabla especial dentro de nuestra base de datos para almacenar las ofertas. La llamaremos ofertascomercio para no crear confusiones. Tendrá por lo menos 6 campos (puedes hacer más si necesitas). Como siempre un id, jugador (quien publica la oferta), recurso, cantidad, valor, fecha, detalle. Todos los recursos caerán dentro de la misma tabla y todos los jugadores almacenarán sus ofertas aquí. En el campo detalle, queremos que el jugador agregue cierto texto haciendo una especie de publicidad a su recurso (una opción interesante y que no he visto en otros juegos de navegador). Como vemos, necesitaremos un input para ingresar la cantidad, otro para el valor, un textarea para el detalle y un botón de envío (submit), lo demás lo define el script automáticamente.

Estructura de la base de datos: ofertascomercio

CREATE TABLE IF NOT EXISTS `ofertascomercio` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`jugador` varchar(20) NOT NULL,
`recurso` varchar(20) NOT NULL,
`cantidad` int(10) NOT NULL,
`valor` int(20) NOT NULL,
`fecha` varchar(20) NOT NULL,
`detalle` varchar(250) NOT NULL,
PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Entonces, cada vez que un jugador publique una oferta, insertamos lo necesario en la tabla y si queremos ver las ofertas, hacemos consulta a todos los registros y los mostramos. Hasta aquí todo fácil, continuemos.

Necesitaremos agregar enlaces en la página que muestre el comercio. Un enlace se llamará “Ver ofertas de recursos” y el otro “Publicar oferta”. Crearemos la página en la que podremos publicar una oferta.

Código: nueva_oferta.php

<?php
session_start();
if (!isset($_SESSION['usuario']))
{
header("Location: index.php");
}
else
{
$us = $_SESSION['usuario'];
require('seguridad.php');
conectar_base_datos();
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$row = mysql_fetch_array($consulta);
echo "Bienvenido: <b>$row[7]</b>";
$recurso = @$_POST['recurso'];
$cantidad = @$_POST['cantidad'];
$valor = @$_POST['valor'];
$detalle = @$_POST['detalle'];
$fecha = date('h:i:s d-m-Y');
$jugador = $row[7];
echo "<html>
<head><title>Publicar Nueva Oferta</title>
</head>
<body>
<center><h1>Publicar Nueva Oferta</h1></center>";
if($cantidad == NULL || $valor == NULL || $detalle == NULL)
{
echo "
<p>Completa los datos requeridos para iniciar una oferta. Puedes usar el campo de detalle
para hacerte publicidad.</p>
<form action='nueva_oferta.php' method='POST'>
<table align='center'>
<tr>
<td>
Recurso:
</td>
<td>
<select name='recurso'><option>Carne</option><option>Trigo</option><option>Vegetales</option></select>
</td>
</tr>
<tr>
<td>
Cantidad:
</td>
<td>
<input type='text' name='cantidad' size='8' maxlength='10'>
</td>
</tr>
<tr>
<td>
Valor:
</td>
<td>
<input type='text' name='valor' size='8' maxlength='10'>
</td>
</tr>
<tr>
<td>
Detalle:
</td>
<td>
<textarea name='detalle'></textarea>
</td>
</tr>
</table>
<center><input type='submit' value='Publicar'></center>
</form>
<center><a href='constructor.php?ev=Comercio'>Volver</a></center>
";
}
else
{
$consulta = mysql_query("SELECT * FROM ofertascomercio WHERE jugador = '$jugador' and detalle = '$detalle'
 and valor = '$valor' and cantidad = '$cantidad' and recurso = '$recurso'");
if(mysql_num_rows($consulta) > 0)
{
echo "<center>Ya tienes una oferta idéntica publicada";
echo "<a href='nueva_oferta.php'>Volver</a></center>";
}
else
{
mysql_query("INSERT INTO ofertascomercio (jugador,recurso,cantidad,valor,fecha,detalle) VALUES
('$jugador','$recurso','$cantidad','$valor','$fecha','$detalle')");
echo "<center>Oferta Publicada<br><a href='nueva_oferta.php'>Volver</a></center>";
}
}
echo "</body></html>";
}
?>

Empezamos con la clásica comprobación de inicio de sesión. Lo demás es lo mismo que hacemos siempre: sentencias en respuesta a existencia de ciertas variables. No me dedicaré a profundizar más, si hay dudas consultar. En sí, este código no tiene mayor complejidad para quien sabe lo básico de PHP. Una vez que se han llenado los campos, procedemos a insertar los datos en la tabla ofertascomercio. Pueden agregar comprobaciones para los datos llenados o bloquear la cantidad de ofertas por jugador, pero dejaremos esto como está.

Pasaremos a revisar ahora el código que nos mostrará las ofertas. La página se llamará ver_ofertas.php y lo que hará es muy simple, pedirá los datos a la tabla ofertascomercio y los mostrará en una tabla donde se incluirá un botón que permita “aceptar la oferta” y comprar. Vamos a agregar una paginación si es que los datos son muchos tal cual se hizo cuando creamos el “Ranking”. Para calcular el tiempo nos basaremos en 2 parámetros para calcular el tiempo que demorarán en llegar, la distancia en coordenadas de las aldeas involucradas (vendedor y comprador) y el nivel del Comercio del comprador. Mostraremos este tiempo al momento de mostrar la oferta para que el usuario comprador vea si le sale a cuentas.

Código: ver_ofertas.php

<?php
session_start();
if (!isset($_SESSION['usuario'])) {
header("Location: index.php");
} else {
$us = $_SESSION['usuario'];
require('seguridad.php');
conectar_base_datos();
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$row = mysql_fetch_array($consulta);
echo "Bienvenido: <b>$row[7]</b>";
}
?>
<html>
<head><title>Ver ofertas</title>
</head>
<body>
<?php
if(!isset($_GET['pag']))
{
$pag = 1;
}
else
{
$pag = $_GET['pag'];
}
$registrosPagina = 10;
if($pag == 1)
{
$listaInicio = 0;
}
else
{
$listaInicio = $registrosPagina * ($pag - 1);
}
echo "<center><h2>Ofertas de recursos</h2></center>";
$lugar = ($pag * $registrosPagina) - $registrosPagina;
if(@$_GET['ver'] != 'user')
{
echo "<center><a href='ver_ofertas.php?ver=user'>Ver mis ofertas</a></center>";
echo "<table align='center' border='1'><tr><td></td><td><b>Jugador</b></td><td><b>Recurso</b></td><td>
<b>Cantidad</b></td><td><b>Valor</b></td><td><b>Tiempo</b></td><td><b>Acción</b></td></tr>";
$result = mysql_query("SELECT * FROM ofertascomercio ORDER BY id DESC LIMIT $listaInicio, $registrosPagina");
while($rs = mysql_fetch_array($result))
{
if($rs[1] == $row[7])
{
}
else
{
$lugar += 1;
// Cálculo del tiempo estimado de envío
$con_com = mysql_query("SELECT * FROM mapa2 WHERE usuario = '$row[7]'");
$a_com = mysql_fetch_assoc($con_com);
$x_com = $a_com["x"];
$y_com = $a_com["y"];
$us = $_SESSION['usuario'];
$con_c_com = mysql_query("SELECT * FROM edificios WHERE usuario = '$us' and edificio = 'Comercio'");
$a_c_com = mysql_fetch_assoc($con_c_com);
$c_com = $a_c_com["nivel"];
$con_ven = mysql_query("SELECT * FROM mapa2 WHERE usuario = '$rs[1]'");
$a_ven = mysql_fetch_assoc($con_ven);
$x_ven = $a_ven["x"];
$y_ven = $a_ven["y"];
//Distancia entre los puntos  d = raiz((x1-x2)^2+(y1-y2)^2)
$d = sqrt(($x_ven-$x_com)*($x_ven-$x_com) + ($y_ven-$y_com)*($y_ven-$y_com));
// ====================================
$seg_tot = intval(($d / ($c_com / 2)) * (360 - (2 * $c_com)));
$h = intval($seg_tot/3600);
$m = intval(($seg_tot / 60) - ($h * 60));
$s = $seg_tot - ($h * 3600) - ($m * 60);
$tiempo = "$h:$m:$s";
echo "<tr><td>$lugar</td><td>$rs[1]</td><td>$rs[2]</td><td>$rs[3]</td><td>$rs[4]</td><td>$tiempo</td><td>
<a href='comprar.php?id=$rs[0]'>Comprar</a></td></tr>";
}
}
echo "</table>";
$result = mysql_query("SELECT * FROM ofertascomercio");
$totalRegistros = mysql_num_rows($result);
$totalPaginas = ceil($totalRegistros / $registrosPagina);
$paginaAnterior = $pag - 1;
$paginaSiguiente = $pag + 1;
if ($paginaSiguiente > $totalPaginas)
{
$paginaSiguiente -= 1;
}
if ($paginaAnterior < 1)
{
$paginaAnterior += 1;
}
echo "<br><center><a href='ver_ofertas.php?pag=$paginaAnterior'>Anterior</a> ";
for ($i = 1; $i <= $totalPaginas; $i++)
{
echo " <a href='ver_ofertas.php?pag=$i'>$i</a> ";
}
echo " <a href='ver_ofertas.php?pag=$paginaSiguiente'>Siguiente</a></center>";
}
else
{
echo "<center><a href='ver_ofertas.php'>Ver todas las ofertas</a></center>";
echo "<table align='center' border='1'><tr><td></td><td><b>Jugador</b></td><td><b>Recurso</b></td>
<td><b>Cantidad</b></td><td><b>Valor</b></td><td><b>Detalle</b></td><td><b>Acción</b></td></tr>";
$result = mysql_query("SELECT * FROM ofertascomercio WHERE jugador = '$row[7]' ORDER BY id 
DESC LIMIT $listaInicio, $registrosPagina");
while($rs = mysql_fetch_array($result))
{
$lugar += 1;
echo "<tr><td>$lugar</td><td>$rs[1]</td><td>$rs[2]</td><td>$rs[3]</td><td>$rs[4]</td>
<td>$rs[6]</td><td><a href='comprar.php?id=$rs[0]&ac=borrar'>Borrar</a></td></tr>";
}
echo "</table>";
$result = mysql_query("SELECT * FROM ofertascomercio WHERE jugador = '$row[7]'");
$totalRegistros = mysql_num_rows($result);
$totalPaginas = ceil($totalRegistros / $registrosPagina);
$paginaAnterior = $pag - 1;
$paginaSiguiente = $pag + 1;
if ($paginaSiguiente > $totalPaginas)
{
$paginaSiguiente -= 1;
}
if ($paginaAnterior < 1)
{
$paginaAnterior += 1;
}
echo "<br><center><a href='ver_ofertas.php?ver=user&pag=$paginaAnterior'>Anterior</a> ";
for ($i = 1; $i <= $totalPaginas; $i++)
{
echo " <a href='ver_ofertas.php?ver=user&pag=$i'>$i</a> ";
}
echo " <a href='ver_ofertas.php?ver=user&pag=$paginaSiguiente'>Siguiente</a></center>";
}
?>
<center><a href='constructor.php?ev=Comercio'>Volver</a></center>
</body>
</html>

La función de ver_ofertas.php es, básicamente, mostrar la gama de ofertas publicadas por todos los usuarios. Para ello, consulta la tabla ofertascomercio de nuestra base de datos y devuelve todos los registros dentro de tablas usando while(). Además, en base a que pueden haber publicadas muchas ofertas dentro del juego, paginamos los resultados mostrando sólo 10 registros por página (ver código destacado en ROJO). Existe un enlace que nos lleva a “Ver mis ofertas”, con lo cuál, el usuario puede ver todas las ofertas de recursos publicadas a su nombre. Se utiliza como parámetro ver=user, quien indica que se muestren todos los registros donde el usuario se encuentra registrado como jugador, es decir, quien publicó la oferta. Dentro de las ofertas generales, dentro de cada registro correspondiente, se inserta un vínculo titulado como “Comprar” que hace alusión a la página comprar.php, quien envía como parámetro id, correspondiente a la id única de cada registro de oferta almacenada dentro de la base de datos.

Por último, nos queda algo complejo. Sabemos que en los juegos de navegador las compras no son instantáneas y se requiere cierto tiempo hasta que llegan los comerciantes con los recursos, entonces necesitaremos algo similar al Timer y que podamos mostrar el tiempo que tardan los comerciantes en llegar dentro del edificio Comercio. (Aquí es cuando hubiese sido fácil crear el timer como una clase e implementarlo everywhere). Algo interesante que hemos hecho dentro de la página ver_ofertas.php y que utilizaremos más adelante, es el cálculo en tiempo de lo que tardarán los recursos en llegar a nuestra granja. Lo que se hace es obtener los puntos de ubicación en el mapa x e y de quien ofrece la oferta y el usuario, usando un poco de matemática básica hacemos uso de la clásica ecuación de distancia entre dos puntos (d = raíz((x1-x2)+(y1-y2))) y el nivel de comercio del comprador (el usuario que ve las ofertas); agregamos todo en una sola ecuación (código en Verde), con ello, obtenemos los segundos totales que demorarán los mercaderes. Estos segundos los transformamos  a horas, minutos y segundos (código en Azul). Esta forma de calcular el tiempo la utilizaremos nuevamente más adelante.

Continuando con lo referente al Comercio, venta, envío, publicación y compra de recursos nos centraremos en la página comprar.php y que ya hicimos alusión. Comprar.php más que una página es un código que gestionará todo lo referente a la compra, es decir, comprobar que el usuario, que ha hecho click en el vínculo de Comprar dentro de las ofertas de recursos, tenga la suficiente cantidad de dinero como para formalizar la compra, si no la tiene, se muestra el error, si la tiene, se prosigue a la configuración de lo que veremos más adelante. Necesitaremos una tabla extra, la que llamaremos viajes_comercio. Veamos su estructura:

Tabla: viajes_comercio

CREATE TABLE IF NOT EXISTS `viajes_comercio` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`jugador` varchar(50) NOT NULL,
`tiempo` int(50) NOT NULL,
`recurso` varchar(20) NOT NULL,
`cantidad` int(50) NOT NULL,
`vendedor` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

La tabla viajes_comercio sirve para almacenar todo lo relativo a los movimientos de recursos. Vemos que consta de sólo 6 campos. El campo más importante es el tiempo, que lo calculábamos almacenándolo como segundos totales y luego, cuando lo queríamos mostrar, lo pasábamos a horas, minutos y segundos (algo parecido a lo que se hizo con el timer). Veamos ahora la estructura de la página comprar.php

Página: comprar.php

<?php
session_start();
if(!isset($_SESSION['usuario']))
{
header("Location: index.php");
}
else
{
$us = $_SESSION['usuario'];
require('seguridad.php');
conectar_base_datos();
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$row = mysql_fetch_array($consulta);
echo "Bienvenido: <b>$row[7]</b>";
$id = $_GET['id'];
$ac = @$_GET['ac'];
if($ac == 'borrar')
{
// Borramos registro
$us_md5 = md5($row[7]);
if($us == $us_md5)
{
mysql_query("DELETE FROM ofertascomercio WHERE id = '$id' and jugador = '$row[7]'");
header("Location: constructor.php?ev=Comercio");
}
}
else
{
$consulta = mysql_query("SELECT * FROM ofertascomercio WHERE id = '$id'");
$a = mysql_fetch_assoc($consulta);
$vendedor = $a["jugador"];
$recurso = $a["recurso"];
$cantidad = $a["cantidad"];
$valor = $a["valor"];
// Buscamos la cantidad de recursos del usuario comprador
$consulta_dinero = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$array = mysql_fetch_assoc($consulta_dinero);
$dinero = $array["dinero"];
if($valor > $dinero)
{
echo "<center>No tienes dinero suficiente</center>";
}
else
{
$con_com = mysql_query("SELECT * FROM mapa2 WHERE usuario = '$row[7]'");
$a_com = mysql_fetch_assoc($con_com);
$x_com = $a_com["x"];
$y_com = $a_com["y"];
$us = $_SESSION['usuario'];
$con_c_com = mysql_query("SELECT * FROM edificios WHERE usuario = '$us' and edificio = 'Comercio'");
$a_c_com = mysql_fetch_assoc($con_c_com);
$c_com = $a_c_com["nivel"];
$con_ven = mysql_query("SELECT * FROM mapa2 WHERE usuario = '$vendedor'");
$a_ven = mysql_fetch_assoc($con_ven);
$x_ven = $a_ven["x"];
$y_ven = $a_ven["y"];
//Distancia entre los puntos  d = raiz((x1-x2)^2+(y1-y2)^2)
$d = sqrt(($x_ven-$x_com)*($x_ven-$x_com) + ($y_ven-$y_com)*($y_ven-$y_com));
// ====================================
$seg_tot = intval(($d / ($c_com / 2)) * (360 - (2 * $c_com)));
// Arreglos de dinero
$dinero_final = $dinero - $valor;
mysql_query("UPDATE usuarios SET dinero = '$dinero_final' WHERE usuario = '$us'");
$dinero_vendedor = mysql_query("SELECT * FROM usuarios WHERE usuario = '$vendedor'");
$a_dinero_vendedor = mysql_fetch_assoc($dinero_vendedor);
$dinero_vendedor_mod = $a_dinero_vendedor["dinero"];
$dinero_final_vendedor = $dinero_vendedor_mod + $valor;
$vendedor_ = md5($vendedor);
mysql_query("UPDATE usuarios SET dinero = '$dinero_final_vendedor' WHERE usuario = '$vendedor_'");
$t = time();
$tiempo = $t + $seg_tot;
// Actualizamos los registros
mysql_query("INSERT INTO viajes_comercio (jugador,tiempo,recurso,cantidad,vendedor) 
VALUES ('$row[7]','$tiempo','$recurso','$cantidad','$vendedor')");
mysql_query("DELETE FROM ofertascomercio WHERE id = '$id' and jugador = '$vendedor'");
header("Location: constructor.php?ev=Comercio");
}
}
}
?>

Revisemos rápidamente, accedemos a comprar.php de dos formas, para borrar un registro propio (dentro de las ofertas del comercio) y cuando cliqueamos el botón de Comprar dentro de la gama de ofertas. Si accedemos desde Borrar, pasamos como parámetro además del id de la publicación, el ac, que viene a ser como la acción, en este caso: borrar . Si definimos ac=borrar (código Rojo), procedemos a borrar el registro dentro de la tabla ofertascomercio, sí y sólo sí, somos el jugador que publicó esa oferta. Lo siguiente, es calcular la distancia entre la aldea de quien publicó la oferta y el usuario que está comprando (código Azul), tal como se hizo con anterioridad. En Naranjo, vemos el código que, a fin de cuentas, inserta los registros en la tabla viajes_comercio, borra el registro de la oferta (porque ya está comprado el recurso) y redirecciona a la página del edificio Comercio. Nos damos cuenta que una vez formalizada la compra, el proceso es IRREVERSIBLE. Pueden hacerlo reversible, pero eso implica unos códigos más.

Luego de todo lo anterior, resta buscar una forma de mostrar lo que está ocurriendo con nuestros recursos, es decir, indicar los movimientos de recursos, que en nuestro caso, los hemos llamado importaciones y exportaciones. Construiremos un código que introduciremos dentro de la carpeta includes de nuestro directorio. Accederemos a ella mediante un include llamado desde el Comercio.

Código: timer_comercio.php

<?php
$consulta = mysql_query("SELECT * FROM viajes_comercio WHERE 
jugador = '$row[7]' or vendedor = '$row[7]' ORDER BY id");
$lugar = 0;
echo "<center><h2>Recursos en viaje</h2></center>";
echo "<table align='center' border='1'>";
echo "<tr><td></td><td><b>Recurso</b></td><td><b>Cantidad</b>
</td><td><b>Llegada en</b></td><td>Tipo</td></tr>";
while($array = mysql_fetch_assoc($consulta))
{
$lugar = $lugar + 1;
$faltan = $array["tiempo"] - time();
if($faltan < 0)
{
$id = $array["id"];
mysql_query("DELETE FROM viajes_comercio WHERE (jugador = '$row[7]' 
and id = '$id') or (vendedor = '$row[7]' and id = '$id')");
header("Location: constructor.php?ev=Comercio");
}
else
{
$h_faltan = intval($faltan/3600);
$m_faltan = intval(($faltan / 60) - ($h_faltan * 60));
$s_faltan = $faltan - ($h_faltan * 3600) - (($m_faltan) * 60);
$recurso = $array["recurso"];
$cantidad = $array["cantidad"];
$tipo = $array["vendedor"];
if($tipo == $row[7])
{
$tipo = "Exportación";
}
else
{
$tipo = "Importación";
}
echo "<tr><td>$lugar</td><td>$recurso</td><td>$cantidad</td><td>
<div id='timer$lugar'></div></td><td>$tipo</td></tr>";
echo "<script lenguage='javascript'>
var h$lugar = $h_faltan;
var m$lugar = $m_faltan;
var s$lugar = $s_faltan;
function mover$lugar()
{
s$lugar--;
if(h$lugar == 0 && m$lugar == 0 && s$lugar < 0)
{
document.getElementById('timer$lugar').innerHTML = 'Finalizado!';
window.location.reload();
}
else
{
if(s$lugar < 0)
{
s$lugar = 59;
m$lugar--;
}
if(m$lugar < 0)
{
m$lugar = 59;
h$lugar--;
}
document.getElementById('timer$lugar').innerHTML = h$lugar + ':' + m$lugar + ':' + s$lugar;
setTimeout('mover$lugar()', 1000);
}
}
mover$lugar();
</script>";
}
}
echo "</table>";
?>

Lo que hicimos fue generar un timer muy similar al creado, haciendo un script para cada proceso que compete al usuario, de manera que se vaya actualizando el tiempo restante. Por último, es bueno indicar que el archivo constructor.php se modificó.

Página: constructor.php

<?php
session_start();
if (!isset($_SESSION['usuario'])) {
header("Location: index.php");
} else {
$us = $_SESSION['usuario'];
require('seguridad.php');
conectar_base_datos();
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$row = mysql_fetch_array($consulta);
echo "Bienvenido: <b>$row[7]</b>";
}
?>
<html>
<head><title>Construcción</title>
</head>
<body>
<?php
if (!isset($_GET['ev'])) {
header("Location: main.php");
}
$ev = $_GET['ev'];
if ($ev == "Establo" || $ev == "Molino" || $ev == "Campo" || 
$ev == "Granero" || $ev == "Comercio") {
$us = $_SESSION['usuario'];
$ev = $_GET['ev'];
$peticion_datos_ev = mysql_query("SELECT * FROM edificios WHERE 
usuario = '$us' and edificio = '$ev'");
$ev_array = mysql_fetch_array($peticion_datos_ev);
include ('includes/granja_funciones.php');
echo "<center><h1>$ev_array[2]</h1></center>";
echo "<table align='center' border='1'>";
echo "<tr><td rowspan='4'>".muestraImagenEdificio($ev,0)."</td></tr>";
echo "<tr><td><b>Nivel:</b></td><td>$ev_array[3]</td></tr>";
echo "<tr><td><b>Capacidad:</b></td><td>$ev_array[5]</td></tr>";
echo "<tr><td><b>Costo siguiente Nivel:</b></td><td>$ev_array[4]</td></tr>";
if($ev == "Comercio")
{
echo "<tr><td colspan='2'>Opciones:</td><td><a href='nueva_oferta.php'>
Publicar Nueva oferta</a><br><a href='ver_ofertas.php'>Ver ofertas</a>
<br><a href='enviar_recurso.php'>Enviar Recursos</a></td></tr>";
echo "<tr><td colspan='3'>";
include('includes/timer_comercio.php');
echo "</td></tr>";
}
echo "</table>";
$peticion_evento = mysql_query("SELECT * FROM evento WHERE usuario = '$us' 
and evento = '$ev'");
if (mysql_num_rows($peticion_evento) > 0) {
echo "<br><center><b>Una ampliación en curso:</b>
 <a href='timer_proceso3.php?ev=$ev'>Ver</a></center>";
} else {
echo "<br><center><a href='timer_proceso3.php?ev=$ev'>Subir Nivel</a>
</center>";
}
} else {
header("Location: main.php");
}
?>
<br><center><a href='main.php'>Principal</a></center>
</body>
</html>
Espero que les halla servido. No duden en consultar las dudas aquí en comentarios y consultas mayores en el foro.

World Map (Mapa del Mundo)

Una de las características principales de los juegos de navegador, es mostrar el mapa navegable de la ubicación de los demás jugadores. Ciertamente, y si queremos hacer un buen mapa, necesitaríamos de AJAX por 2 razones principales: 1) evitar la recarga completa de la página y 2) Mostrar datos de los jugadores en cada cuadrante, como el dueño, alianza y alguna característica de la tierra (ubicación). Usar AJAX no es para nada complejo, sin embargo, el potencial de AJAX es mucho más elevado de lo que lo usaremos aquí.

Para empezar necesitamos crear una tabla en la base de datos que se llamará mapa2. Esta tabla contendrá 6 campos. La estructura de la tabla es la siguiente:

CREATE TABLE IF NOT EXISTS `mapa2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`usuario` varchar(20) NOT NULL,
`x` int(3) NOT NULL,
`y` int(3) NOT NULL,
`nombre` varchar(20) NOT NULL,
`tipo` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
);

Una vez que creamos la tabla como hemos indicado, tenemos que insertar los preregistros de todas las ubicaciones que queremos que existan. En nuestro caso, crearemos un mapa global de 100 x 100 sólo con valores positivos, entonces tenemos que insertar 10000 registros, uno para cada coordenada… No, no se preocupen, sé que es bastante tedioso, pero para hacerlo fácil y con un solo enter, usaremos el siguiente código, que no es parte del juego, pero que insertará los registros en la base de datos en aproximadamente 5 segundos (menos mal). El código se llamará insertar_registros.php, lo ponemos en el directorio, lo ejecutamos y esperamos que aparezca el “Listo”, comprobamos que se insertaron los 10000 registros en la tabla y ya podemos eliminarlo.

Código: insertar_registros.php

<?php
include('seguridad.php');
conectar_base_datos();
for ($a = 1; $a <= 100; $a++)
{
for ($i = 1; $i <= 100; $i++) { mysql_query("INSERT INTO mapa2(usuario,x,y,nombre,tipo) VALUES ('-','$i','$a','Terreno Libre','-')"); } } ?>

Una vez que tenemos listo lo anterior entramos de lleno a la elaboración del mapa.

Si bien es cierto, empezamos programando sólo con PHP y MySQL, vemos que ya se nos  hace inminente utilizar Javascript, AJAX y CSS, pero no nos complicaremos demasiado. Vamos a revisar el código raíz que nos creará el mapa utilizando CSS y un poco de lógica.

Código: mapa2.php

<?php
session_start();
if(!isset($_SESSION['usuario']))
{
header("Location: index.php");
}
else
{
$us = $_SESSION['usuario'];
require('seguridad.php');
conectar_base_datos();
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$row = mysql_fetch_array($consulta);
echo "Bienvenido: <b>$row[7]</b>";
echo "<html><head><title>Mapa 2</title><script type='text/javascript' src='ajax.js'></script><link href='estilos_mapa.css' rel='stylesheet' type='text/css'></head><body>";
echo "<center><h1>Mapa del Mundo</h1></center>";
if($_GET['x'] < 1 || $_GET['x'] > 100 || $_GET['y'] < 1 || $_GET['y'] > 100)
{
echo "<center><h3>Mapa Fuera de Rango</h3><p>Sólo valores entre 1 y 100 para X e Y.</p></center>";
}
else
{
$y = $_GET['y'] - 2;
echo "<table align='center' class='mapa2'>";
for($a = 0; $a < 5; $a++)
{
$x = $_GET['x'] - 2;
echo "<tr>";
for($b = 0; $b < 5; $b++)
{
$consulta = mysql_query("SELECT * FROM mapa2 WHERE x = '$x' and y = '$y' ORDER BY x, y");
$array = mysql_fetch_array($consulta);
echo "<td >";
if($x > 100 or $y > 100 or $x < 1 or $y < 1)
{
echo "";
}
else
{
echo "<div onmouseover=\"iniciarConsulta('mapa2_con.php?x=$x&y=$y');\" onmousemove=\"cursor('consulta')
;\" onmouseout=\"esconder('consulta');\" style='width: 50px; height:50px;'>
<a href='mapa2.php?x=$array[2]&y=$array[3]'>$array[2]/$array[3]</a></div>";
}
echo "</td>";
$x++;
}
echo "</tr>";
$y++;
}
}
$x_ = $_GET['x'];
$x_1 = $_GET['x'] - 1;
$x1 = $_GET['x'] + 1;
$y_ = $_GET['y'];
$y_1 = $_GET['y'] - 1;
$y1 = $_GET['y'] + 1;
echo "</table>";
echo "<table align='center'><tr><td colspan='3'>";
if($_GET['y'] <= 1)
{
echo "";
}
else
{
echo "<center><a href='mapa2.php?x=$x_&y=$y_1'><img src='img/flecha_up.png'></a></center>";
}
echo "</td></tr><tr><td>";
if($_GET['x'] <= 1)
{
echo "";
}
else
{
echo "<a href='mapa2.php?x=$x_1&y=$y_'><img src='img/flecha_left.png'></a>";
}
echo "</td><td><form action='mapa2.php' method='GET'>X : <input type='text' name='x' size='1' maxlength='3'> Y: <input type='text' name='y' size='1' maxlength='3'><input type='submit' value='IR'></form>";
echo "<td>";
if($_GET['x'] >= 100)
{
echo "";
}
else
{
echo "<a href='mapa2.php?x=$x1&y=$y_'><img src='img/flecha_right.png'></a>";
}
echo "</td></tr><tr><td colspan='3'>";
if($_GET['y'] == 100)
{
echo "";
}
else
{
echo "<center><a href='mapa2.php?x=$x_&y=$y1'><img src='img/flecha_down.png'></a></center>";
}
echo "</td></tr></table><div class='anuncio' id='consulta'></div><center><a href='main.php'>Volver</a></center></body></html>";
}
?>

Lo primero que llama la atención es que mapa2.php debe recibir 2 parámetros por medio de GET (en el URL). Estos parámetros se pasan así, por ejemplo: mapa2.php?x=3&y=28. Los parámetros son la coordenada donde queremos ubicar el centro de mapa. Lo que hace el código es crear una tabla HTML que contenga un espacio para cada coordenada especificando la variable x e y propia de un mapa cartesiano (x/y). Vemos que utilizamos el bucle for (texto azul) para crear la tabla de 5 x 5 cuadrados. Si queremos agrandar el mapa, tenemos que aumentar los números en las sentencias for($a=0;$a < 6;$a++). Así para un mapa de 7×7 aumentamos el valor del dígito rojo a 8. De lo demás se encarga PHP y si analizamos detenidamente las sentencias en los bucles for, vemos que no es nada del otro mundo.

Luego vemos ciertas comprobaciones if ubicadas abajo de los bucles for (texto en verde), estas comprobaciones verifican que los números de las coordenadas no se salgan de ciertos límites (mayores que 100 ó menores que 1), si pasan, las flechas de navegación en el mapa, se eliminan, para tratar de evitar que el usuario siga donde no debe. De todas formas, esto no evita que lo haga. Por ello, existe un código que muestra un mensaje que dice “Fuera de Rango” (Naranjo), este mensaje aparece cuando el usuario fuerza entrar a ver zonas del mapa indebidas.  Vemos además una serie de funciones llamadas cuando creamos la tabla por medio de los bucles for. Estas funciones vendrán definidas en el código Javascript que ahora crearemos.

Código: js_ajax.js

function objetoAjax()
{
var xmlhttp = false;
try
{
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e)
{
try
{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(E)
{
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest != 'undefined')
{
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
function iniciarConsulta(datos)
{
divConsulta = document.getElementById('consulta');
ajax = objetoAjax();
ajax.open("GET", datos);
ajax.onreadystatechange = function()
{
if(ajax.readyState == 4)
{
divConsulta.innerHTML = ajax.responseText
}
}
ajax.send(null)
}
function cursor(ev)
{
document.getElementById(ev).style.display="inline";
document.getElementById(ev).style.position="absolute";
document.getElementById(ev).style.left=event.clientX+10;
document.getElementById(ev).style.top=event.clientY;
}
function esconder(event)
{
document.getElementById(event).style.display="none";
}

La primera función (crear_ajax()) es una función universal para iniciar el objeto Ajax. La segunda función (iniciarConsulta(datos)) es quien inicia la petición Ajax a la base de datos. A pesar de que esta función puede ser más compleja y entregar, por ejemplo, cosas mientras dura la consulta (como imagen de carga), la estructura que usamos aquí es simple y rígida. Hace alusión a un <div> con identidad (id) consulta, entonces, una vez que la función tiene la respuesta de la base de datos (ajax.readyState == 4), inserta por medio de innerHTML la respuesta dentro del contenedor (ajax.responseText).  Existen más códigos numéricos en Ajax, para conocer más al respectro recomiendo este enlace: Ver. Las últimas 2 funciones son puramente DHTML utilizando Javascript y CSS. Son sólo para mostrar un contenedor con el valor del div donde tengamos posado el cursor del mouse. Esto se activa para cada cuadrado de la tabla del mapa y muestra los resultados de la consulta.

Ahora mostraremos el código CSS que dará un poco de “estilo” a la tabla creada:

Código: estilos_mapa.css

.mapa2 {
border: 1px solid black;
font-family: Verdana, Arial;
font-size: 12;
color: white;
}
.mapa2 td {
width: 50 px;
height: 50 px;
background: rgb(120,120,120);
vertical-align: bottom;
}
.mapa2 td:hover {
width: 50 px;
height: 50 px;
background: rgb(111,111,0);
}
.mapa2 a {
color: white;
text-decoration: none;
}
.anuncio {
font-family: Verdana, Arial;
font-size: 8 px;
padding: 5px 5px 5px 5px;
text-align: justify;
background: white;
border: 1 px solid red;
display: none;
}

¿Qué nos falta ahora?

Tenemos el código que hace el mapa, la tabla en la base de datos, el código Javascript y el CSS. Nos falta otra cosa primordial, el código que hará el resultado a mostrar y a quien llamará Ajax. El código es el siguiente:

Código: mapa2_con.php

<?php
include('seguridad.php');
conectar_base_datos();
$x = $_GET['x'];
$y = $_GET['y'];
$conectar = mysql_query("SELECT * FROM mapa2 WHERE x = '$x' and y = '$y'");
$a = mysql_fetch_array($conectar);
echo "<table align='center'><tr><td colspan='2'><center><b>$a[4]</b></center></td></tr>
<tr><td>Propietario:</td><td>$a[1]</td></tr>
<tr><td>Ubicaci&oacute;n:</td><td>($x/$y)</td></tr>
<tr><td>Tipo:</td><td>$a[5]</td></tr>
</table>";
?>

El código mapa2_con.php recibe 2 parámetros idénticos a los de mapa2.php, es decir, las coordenadas de cada ubicación. Entonces, Ajax recibe todo el resultado de esta página (mapa2_con.php) y lo muestra dentro del <div id=’consulta’> y este div se muestra en la ubicación del cursor gracias al código Javascript cuando posamos el cursor sobre cada td de la tabla.

Les recuerdo anexar un link en la página main.php que lleve a mapa2.php?x=&y=.

El mapa debiera verse así:

Apariencia del World Map de GranjaPodemos editar el CSS o el código que crea la tabla para poder poner imágenes a gusto de fondo o dependiendo del tipo de granja que haya elegido el usuario.

Representación gráfica de la granja

Hoy en día, la mayoría de juegos de navegador tienen una representación gráfica de sus ciudades, poblados, etc. Nuestra pequeña granja no va a ser menos, ha llegado el momento de dar un gran paso hacia delante, esto ya empieza a ponerse serio :)

Como esta parte es algo extensa, antes de nada, haremos un pequeño resumen de lo que vamos a conseguir:

1º- Crearemos las imágenes de nuestros edificios, por cada nivel de cada edificio necesitamos hacer una versión diferente (por ejemplo, en granero nivel 1, el granero es una casita, en nivel dos es una casita y al lado le dibujamos un montoncito de paja, etc…), pero nosotros para no perder mucho tiempo haciendo dibujitos, lo único que hemos hecho ha sido un primer dibujo y escribir el nivel que corresponda (nivel1, nivel2, …) vosotros ya haréis los edificios a vuestro gusto y antojo ;)

2º- Creamos el archivo de estilos que nos permitirá situar el fondo de la granja y cada edificio en el lugar que le toca.

3º- Crearemos el código PHP y archivos necesarios para saber que imagen se tiene que cargar en cada momento.

Las imágenes de los edificios las podéis conseguir aquí, no olvidéis que deben estar dentro de una carpeta que se llame  “img”.

IMPORTANTE: la representación gráfica de la granja solo funcionará con los nuevos usuarios que registremos, CON LOS ANTIGUOS NO FUNCIONARÁ porque no tienen en la tabla edificios una entrada de cada edificio asociada al “usuario”. (se explica mejor al final en la modificación de registro.php)

En este link del foro podéis ver un par de imágenes de como quedará nuestro juego de navegador una vez terminada la parte gráfica (debéis estar registrados para poder verlas).

Empezamos!

Para llevar a cabo nuestro objetivo, necesitaremos crear tres nuevos archivos y retocar tres más existentes.

Los nuevos archivos serán:

estilos.css

constantes.php

granja_funciones.php

Los archivos que retocaremos serán:

main.php

constructor.php

registro.php

Realmente los nuevos pasos son muy sencillos, es más difícil explicarlos que crearlos, lo que pasa es que son un poco largos (por eso he tardado tanto en publicarlo todo, jeje…) vamos a explicarlos a continuación.

No voy a explicar la parte de código que publicó Borisigna en su día sobre estos dos archivos para no hacer esta entrada del blog muy larga.

Lo primero que haremos es crear una carpeta para tener mejor organizado nuestro código, a esta la llamaremos“includes”. La llamamos así obviamente porque aquí guardaremos archivos que incluiremos en nuestra aplicación principal.

estilos.css

Este archivo es muy importante, es lo que hará que los edificios se muestren en el lugar correcto y que todo encaje.

/* edificios */

.granja{

position: relative;

}

a .establo, .granero, .campo, .molino, .comercio{

border: 0;

}

.establo{

position:absolute;

text-decoration:none;

top: 35px;

left: 220px;

z-index:2;

}

.granero{

position:absolute;

text-decoration:none;

top: 135px;

left: 50px;

z-index:1;

}

.campo{

position:absolute;

text-decoration:none;

top: 275px;

left: 200px;

z-index:2;

}

.molino{

position:absolute;

text-decoration:none;

top: 240px;

left:410px;

z-index:2;

}

.comercio{

position:absolute;

text-decoration:none;

top: 100px;

left: 460px;

z-index:2;

}

Lo que hacemos es crear una serie de etiquetas que podremos utilizar después en las capas “<DIV>” para situar los edificios en el lugar correspondiente. La etiqueta “.granja” es la que contendrá a todos los edificios, la hacemos de posición  relativa para que se sitúe en el lugar correcto según la resolución de pantalla que tenga el usuario.

Después creamos una por una las etiquetas de cada edifico a la que asignamos una posición absoluta, esto es importante, porque mantendrá siempre una posición fija para cada edificio dentro de la capa que utilizará la etiqueta“.granja”.

Con “text-decoration:none” estamos indicando que no aparezcan los links decorados como tales. Por lo tanto, las imágenes de los edificios que en realidad serán links porque las tendremos dentro de las etiquetas “<a> imagenedificio</a>” no aparecerán remarcadas (simplemente es para que no queden feas).

“top”“left” indican la posición de las imágenes de los edificios en pantalla.

“z-index“, aunque tal como tenemos montada ahora mismo la página no afecta para nada, es un parámetro muy importante. Indica la profundidad en que estará cada imagen de los edificios, cuanto más alto sea el número, más arriba quedará la imagen respecto a las que tengan un número más bajo.

Por ejemplo, si ponemos la imagen del granero con un “z-index:1″ y en la misma posición que la imagen del molino, y la imagen del molino tiene un “z-index:2″, verás que la imagen del molino aparece encima de la imagen del granero.

Esto es muy útil por si alguien se decide a crear la perspectiva de la granja en 3d o si quiere poner imágenes animadas “.gif” con fondo transparente encima de las estáticas. Por ejemplo algunos pajaros volando por encima de la granja.

El segundo archivo que vamos a crear tiene que ir dentro de la carpeta includes:

constantes.php

<?php

## Nivel máximo de los edificios.

define (‘MAX_NIVEL_EDIFICIOS’, 6);

## Edificios que se crean al registrar un usuario.

$edificios = array(Establo, Granero, Campo, Molino, Comercio);

?>

En este archivo tenemos sólo una variable “constante” donde únicamente le indicamos cual es el máximo nivel al que pueden llegar a ampliarse los edificios.

Para quien no lo sepa, una constante es una variable que no cambia de valor desde el inicio hasta el final de la aplicación. Por lo tanto no se le puede asignar un valor diferente al que tiene en el momento en el que es declarada.

Un ejemplo sería que si hoy decides comerte un helado de fresa, mientras te lo estás comiendo… ya no puedes cambiar por uno de limón ;P

Las constantes siempre se escriben en mayúsculas y sin el signo “$”, incluso a la hora de utilizarlas.

Nosotros hemos puesto un nivel máximo de 6 porque solo tenemos 6 dibujos diferentes de cada edificio (no tenía tiempo para hacer más dibujitos , jeje…).

Si alguien decidiera tener diferentes niveles máximos para sus edificios, simplemente debería crear las constantes necesarias.

Por ejemplo:

Define (‘MAX_NIVEL_MOLINO’, 10);

Y crear los nuevos dibujos de cada nivel.

Una opción muy interesante sería cambiar la imagen del dibujo por ejemplo cada 3 niveles, así no hay que hacer tantos edificios diferentes y en cambio podemos tener bastantes niveles de ampliación.

En este archivo también hemos creado el array “$edificios = array(Establo, Granero, Campo, Molino, Comercio)” que contiene los edificios de nuestra granja y que -ATENCIÓN- nos servirá para crear los nuevos valores en la tabla edificios de la Base de datos cada vez que registremos un usuario nuevo.

Pasamos ya al tercer archivo y que también va dentro de la carpeta “includes”, este archivo contiene las funciones que nos mostrarán la imagen que corresponda al nivel que tenemos de cada edificio. Es el siguiente:

granja_funciones.php

<?php
## Cargamos los nombres de todos los edificios para mostrar la imagen de todos en el poblado
function muestraGranja() {
//Montamos la consulta
$consulta = “SELECT * FROM edificios WHERE usuario =”‘.$_SESSION[usuario].”‘”;
//Hacemos la consulta y…
$sql = mysql_query($consulta);
$nombre_edificio = $row['edificio'];
echo $nombre_edificio;
while($row = mysql_fetch_assoc($sql)){
//…Montamos resultados
$nombre_edificio = $row['edificio'];
$nivel = $row['nivel'];
echo “<div title=’”.$nombre_edificio.” nivel “. $nivel .”‘><a href=’constructor.php?ev=”.$nombre_edificio.”‘><img class=’”.$nombre_edificio.”‘ src=’img/”.seleccionaImagenEdificio($nombre_edificio, $nivel).”‘ /></a></div>”;
}
}

## Muestra la imagen del edificio pasado por parámetros
function muestraImagenEdificio($nombre_edificio, $nivel){
$img_edificio = “<img src=’img/”.seleccionaImagenEdificio($nombre_edificio, $nivel).”‘ />”;
return $img_edificio;
}

## Se ocupa de seleccionar que imagen es la que tiene que mostrar según el nivel actual del edificio
function seleccionaImagenEdificio($edificio, $nivel){
if ($nivel==0){
$imagen = $edificio.$nivel.”.png”;
}else if ($nivel==1){
$imagen = $edificio.$nivel.”.png”;
}else if ($nivel==2){
$imagen = $edificio.$nivel.”.png”;
}else if ($nivel==3){
$imagen = $edificio.$nivel.”.png”;
}else if ($nivel==4){
$imagen = $edificio.$nivel.”.png”;
}else if ($nivel==5){
$imagen = $edificio.$nivel.”.png”;
}else if ($nivel==6){
$imagen = $edificio.$nivel.”.png”;
}
return $imagen;
}

?>

La función “muestraGranja()” se ocupa de seleccionar los nombres de los edificios que tenemos en la Base de datos, una vez obtenidos dichos nombres, hace un bucle donde por cada recorrido crea una capa (DIV) que contienen un enlace donde se muestra la imagen de cada edificio con la ayuda de la función “seleccionaImagenEdificio()

La función “seleccionaImagenEdificio()” nos sirve para saber que edificio mostrar según el nivel y nombre de edificio que le pasemos por parámetros.

main.php

<?php

session_start();

if(!isset($_SESSION['usuario']))

{

header(“Location: index.php”);

}

else

{

$us = $_SESSION['usuario'];

require(‘seguridad.php’);

conectar_base_datos();

$consulta = mysql_query(“SELECT * FROM usuarios WHERE usuario = ‘$us’”);

$row = mysql_fetch_array($consulta);

echo “Bienvenido: <b>$row[7]</b>”;

}

?>

<html>

<head><title>Principal: GRANJA</title>

<link href=”estilos.css” rel=”stylesheet” type=”text/css” />

</head>

<body>

<center><h1>Granja</h1></center>

<table align=”center”>

<tr>

<td style=”vertical-align: top”>

<center><h3>Menú</h3></center>

<ul>

<li><a href=’mensajeria.php?id=band’>Mensajería</a></li>

<li><a href=’ranking.php’>Ranking</a></li>

<li><a href=’perfil.php’>Perfil</a></li>

<li><a href=’cuenta.php’>Cuenta</a></li>

<li><a href=’salir.php’>Salir</a></li>

</ul>

</td>

<td>

<div class=”granja”>

<img src=”img/granja_fondo.jpg” />

<?php

include (‘includes/granja_funciones.php’);

muestraGranja();

?>

</div>

</td>

</tr>

</table>

</body>

</html>

Este archivo es casi igual que el “main.php” que creó Borisigna lo único que he cambiado para adaptarlo a la nueva versión de granja, es la posición de los elementos del menú y he añadido una capa “<div>” donde cargamos el fondo de la granja y las imágenes de cada edificio (el código de color NARANJA).

Vamos a ver ahora los cambios realizados en “constructor.php” (El código de color LILA):

constructor.php

<?php

session_start();

if (!isset($_SESSION['usuario'])) {

//header(“Location: index.php”);

} else {

$us = $_SESSION['usuario'];

require(‘seguridad.php’);

conectar_base_datos();

$consulta = mysql_query(“SELECT * FROM usuarios WHERE usuario = ‘$us’”);

$row = mysql_fetch_array($consulta);

echo “Bienvenido: <b>$row[7]</b>”;

}

?>

<html>

<head><title>Construcción</title>

</head>

<body>

<?php

if (!isset($_GET['ev'])) {

header(“Location: main.php”);

}

$ev = $_GET['ev'];

if ($ev == “Establo” || $ev == “Molino” || $ev == “Campo” || $ev == “Granero” || $ev == “Comercio”) {

$us = $_SESSION['usuario'];

$ev = $_GET['ev'];

$peticion_datos_ev = mysql_query(“SELECT * FROM edificios WHERE usuario = ‘$us’ and edificio = ‘$ev’”);

$ev_array = mysql_fetch_array($peticion_datos_ev);

include (‘includes/granja_funciones.php’);

include (‘includes/constantes.php’);

echo “<center><h1>$ev_array[2]</h1></center>”;

echo “<table align=’center’ border=’1′>”;

echo “<tr><td rowspan=’4′>”.muestraImagenEdificio($ev,0).”</td></tr>”;

echo “<tr><td><b>Nivel:</b></td><td>$ev_array[3]</td></tr>”;

echo “<tr><td><b>Capacidad:</b></td><td>$ev_array[5]</td></tr>”;

echo “<tr><td><b>Costo siguiente Nivel:</b></td><td>$ev_array[4]</td></tr>”;

echo “</table>”;

$peticion_evento = mysql_query(“SELECT * FROM evento WHERE usuario = ‘$us’ and evento = ‘$ev’”);

if (mysql_num_rows($peticion_evento) > 0) {

echo “<br><center><b>Una ampliación en curso:</b> <a href=’timer_proceso3.php?ev=$ev’>Ver</a></center>”;

} else {

if ($ev_array[3] >= MAX_NIVEL_EDIFICIOS){

echo “<br><center>Máximo nivel alcanzado</center>”;

} else {

echo “<br><center><a href=’timer_proceso3.php?ev=$ev’>Subir Nivel</a></center>”;

}

}

} else {

header(“Location: main.php”);

}

?>

<br><center><a href=’main.php’>Principal</a></center>

</body>

</html>

En color LILA vemos que hemos hecho dos “includes” para importar los dos archivos que necesitaremos más adelante, después simplemente llamamos a la función muestraImagenEdificio($ev,0) pasándole dos parámetros, el primero es el nombre del edificio a mostrar y en el segundo le decimos que muestre el edificio de nivel 0 (para mostrar la imagen del edificio en este apartado de la web ya nos va bien con la imagen del edificio en nivel 0, pero podríamos mostrar cualquier otro nivel).

Nos toca ahora hacer unos pequeños cambios al archivo “registro.php” para que todo acabe de encajar.

registro.php

<html>
<head><title>Página de Registro</title>
</head>
<body>
<center><h1>Formulario de Registro</h1></center>
<?php
require(‘seguridad.php’);
require(‘includes/constantes.php’);

$nombre_registrado = @$_POST['usuario'];
$usuario = encriptacion(@$_POST['usuario']);
$email = @$_POST['email'];
$contrasena = encriptacion(@$_POST['contrasena']);
if ($usuario == NULL || $email == NULL || $contrasena == NULL) {
echo “<center><h2>Debe completar todos los campos</h2></center>”;
} else {
if (!validacionemail($email)) {
echo “<center><h2>El email ingresado no es válido</h2></center>”;
} else {
conectar_base_datos();
$verificacion_existencia = mysql_query(“SELECT * FROM usuarios WHERE usuario = ‘$usuario’ or email = ‘$email’”);
if (0 < mysql_num_rows($verificacion_existencia)) {
echo “<center><h2>El nombre de usuario o el email ya existen en los registros</h2></center>”;
} else {
require(‘validacion.php’);
$cod_unico_usuario = substr(md5(rand()), 0, 16);
$validado = “NO”;
if (enviar_correo($email, $usuario, $cod_unico_usuario)) {
echo “<center>Un correo de validación fue enviado a $email</center>”;
} else {
$fecha_ingreso = date(“Y-m-d h:i:s”);
mysql_query(“INSERT INTO usuarios (usuario,email,contrasena,fecha_ingreso,cod_unico_usuario,validado,nombre_registrado) VALUES (‘$usuario’,'$email’,'$contrasena’,'$fecha_ingreso’,'$cod_unico_usuario’,'$validado’,'$nombre_registrado’)”) or die(“Error de registro”);

foreach ($edificios as $edificio){
mysql_query(“INSERT INTO edificios (usuario, edificio, nivel, costo, capacidad) VALUES (‘$usuario’,'$edificio’, 0, 100, 100)”) or die(“Error de registro”);
}

echo “<center><h2>Usuario Registrado Correctamente</h2><a href=’index.php’>Volver</a></center>”;
}
}
}
}

?>

<form action=’registro.php’ method=’POST’>
<table align=”center”>
<tr>
<td>
Nombre Usuario:
</td>
<td>
<input type=”text” name=”usuario” size=”15″ maxlength=”10″>
</tr>
<tr>
<td>
Contraseña:
</td>
<td>
<input type=”password” name=”contrasena” size=”15″ maxlength=”10″>
</td>
</tr>
<tr>
<td>
Email:
</td>
<td>
<input type=”text” name=”email” size=”15″ maxlength=”30″>
</td>
</tr>
</table>
<center><input type=”submit” value=”Registrarme”></center>
</form>
</body>
</html>

En color ROJO podemos ver las pocas líneas que hemos añadido, este paso es IMPORTANTÍSIMO ya que lo que hacemos es que cuando se crea un nuevo usuario se inician los datos de la tabla edificios asociados al nuevo “usuario”.

Por lo tanto y como he dicho al principio, es importante que sepamos que a partir de ahora, la representación gráfica de la granja solo funcionará con los nuevos usuarios que registremos, NO CON LOS ANTIGUOS.

Y por fin hemos terminado, hasta aquí todo lo que tiene que ver con la representación gráfica de la granja, espero que me haya explicado bien, y si no queda muy claro, como dijo alguien algún día..

“Ayudadme a entender lo que digo y os lo explicaré mejor;)

Recursos

Crearemos una página donde se mostrarán los recursos que poseemos, es decir, dinero, capacidad de alimento, carne, vegetales, etc. Lo que buscamos es poder tener una noción global de lo que poseemos sin tener que recurrir a varias páginas para hacerlo.

Muchos pensarán que es mejor incluir esta parte directamente en la página principal (main.php), pero eso queda a gusto de ustedes, ya saben que no es difícil hacer eso.

Revisemos el código. Las explicaciones al final.

Página: recursos.php

<?php
session_start();
if(!isset($_SESSION['usuario']))
{
header("Location: index.php");
}
else
{
$us = $_SESSION['usuario'];
require('seguridad.php');
conectar_base_datos();
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$row = mysql_fetch_array($consulta);
echo "Bienvenido: <b>$row[7]</b>";
}
?>
<html>
<head><title>Recursos Globales</title>
</head>
<body>
<center><h2>Tus Recursos</h2></center>
<?php
$c = mysql_query("SELECT * FROM edificios WHERE usuario = '$us'");
while($a = mysql_fetch_assoc($c))
{
$edi = $a["edificio"];
$nvl = $a["nivel"];
$rec = $a["recurso"];
$cap = $a["capacidad"];
$tre = $a["tipo_recurso"];
$pho = $a["prod_hora"];
echo "<table align='center' border='0'>";
echo "<tr><td><b>Edificio</b></td><td>: <a href='constructor.php?ev=$edi'>$edi</a></td></tr>";
echo "<tr><td><b>Tipo Recurso</b></td><td>: $tre</td></tr>";
echo "<tr><td><b>Nivel</b></td><td>: $nvl</td></tr>";
echo "<tr><td><b>Producción</b></td><td>: $pho / hora</td></tr>";
echo "<tr><td><b>Recurso</b></td><td>: $rec/$cap</td></tr>";
echo "</table><br>";
}
?>
<center><a href='main.php'>Volver</a></center>
</body>
</html>

Como pueden ver, el código es super sencillo. Básicamente, lo que hacemos es pedir a la Tabla edificios los atributos de cada edificio dependiendo del usuario y los arreglamos en una tabla para mostrarlos. Lo único que puede hacer problemas es la tabla. Necesitarán una tabla con las siguientes características:

Tabla: edificios

Todos los datos los obtenemos de ella. Si quieren agregar más cosas a esta página pueden hacerlo fácilmente insertando más campos en la tabla edificios y expresándolos dentro del while como echo. Además, he incluido un enlace que lleva directamente a la página de constructor.php para poder ampliar el edificio.

Para regocijo de spanisher, he creado los arrays aludiendo al nombre del registro en la Tabla de la base de datos, jeje, bueno… en verdad es un beneficio para todos.

Si quieren agregar algo que muestre los recursos y la capacidad de ellos que poseen en la página principal, les dejo este pequeño código que pueden insertarlo en la parte superior de la página main.php, por ejemplo.

<?php
$c = mysql_query("SELECT * FROM edificios WHERE usuario = '$us'");
echo "<table align='center'><tr>";
while($a = mysql_fetch_assoc($c))
{
$edi = $a["edificio"];
$nvl = $a["nivel"];
$rec = $a["recurso"];
$cap = $a["capacidad"];
$tre = $a["tipo_recurso"];
$pho = $a["prod_hora"];
echo "<td><center>$tre<br>$rec/$cap</center></td>";
}
echo "</tr></table>";
?>


Escrito en Tutorial. Etiquetas: . 2 Comentarios »

Perfil de Usuarios

Ya es hora de que creemos un perfil de usuarios simple. El perfil de usuarios que aquí exponemos es bastante simple, pero se pueden agregar muchas más cosas siguiendo la lógica con la que hemos agregado las aquí expuestas.

Primero que todo (como siempre), el código completo, en seguida las explicaciones.

Página: perfil.php


<?php
session_start();
if(!isset($_SESSION['usuario']))
{
header("Location: index.php");
}
else
{
$us = $_SESSION['usuario'];
require('seguridad.php');
conectar_base_datos();
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$row = mysql_fetch_array($consulta);
echo "Bienvenido: <b>$row[7]</b>";
}
?>
<html>
<head><title>Perfil de Usuario</title>
</head>
<body>
<?php
function depurar($a)
{
$array = array("<",">","#","href");
$b = str_replace($array,'',$a);
return $b;
}
$id = @$_GET['id'];
if($id == NULL)
{
$us = $_SESSION['usuario'];
$c = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$array = mysql_fetch_array($c);
header("Location: perfil.php?id=$array[7]");
}
else
{
$id = @$_GET['id'];
$c = mysql_query("SELECT * FROM perfiles WHERE usuario = '$id'");
if(mysql_num_rows($c) > 0)
{
$array = mysql_fetch_array($c);
echo "<center><h3>Perfil de <u>$array[1]</u></h3></center>";
echo "<table align='center'><tr><td>Jugador:</td><td>$array[1]</td>";
echo "<tr><td>Dinero:</td><td>$array[2]</td></tr>";
echo "<tr><td>Clan:</td><td>$array[3]</td></tr>";
echo "<tr><td>Descripción:</td><td>$array[4]</td></tr>";
echo "</table>";
}
else
{
echo "<center>Perfil no disponible o inexistente</center>";
echo "<center><a href='main.php'>Volver</a></center>";
}
}
$ac = @$_GET['ac'];
if($ac == 'mod')
{
$us = $_SESSION['usuario'];
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$row = mysql_fetch_array($consulta);
$des = depurar($_POST['descripcion']);
mysql_query("UPDATE perfiles SET descripcion = '$des' WHERE usuario = '$row[7]'");
header('Location: perfil.php');
}
?>
<hr>
<center><h3>Modifica tu perfil</h3></center>
<form action='perfil.php?ac=mod' method='POST'>
<table align='center'>
<tr>
<td>
Descripción:
</td>
<td>
<textarea name='descripcion'>Tu perfil...</textarea>
</td>
</tr>
</table>
<center><input type='submit' value='Actualizar'></center>
</form>
<center><a href='main.php'>Volver</a></center>
</body>
</html>

Si tienen problemas con los mysql_fetch_array, cámbienlos los mysql_fetch_assoc e ingresan a los datos por el nombre del campo en la base de datos en vez del número del registro. Como es clásico, el código en ROJO es el que comparten todas las páginas y sólo verifica el inicio de sesión. En VERDE el código PHP bastante elemental. En AZUL la maqueta HTML.

La función depurar($a), cambia los caracteres del tipo <, >, # y href ingresados al modificar el perfil, por espacios en blanco para evitar los ataques mediante HTML a otros jugadores.

Lo que hacemos es acceder a los registros más útiles en un perfil, como son: nombre de usuario, clan, dinero y (lo más interesante) una descripción que hace el propio usuario en su perfil, la que es modificable a gusto. Un aspecto importante es que se accede a los perfiles de los usuarios directamente desde el Ranking (para eso los link en esa página).

No creo que tengan mayores inconvenientes. Interesante sería que agregaran la apariencia del personaje (mediante imagen) y alguna opción para enviarle mensajes personales directamente.

Tabla necesaria: perfiles

Tabla: perfilesImportante:

En la página ranking.php hemos modificado algo, el código correcto es este:

echo "<tr><td>$lugar</td><td><a href='perfil.php?id=$rs[7]'>$rs[7]</a></td><td>$rs[8]</td></tr>";

“LOS PERFILES NO SE VEN PORQUE DEBEN SER ACTIVADOS CUANDO SE CREA LA CUENTA, POR AHORA NO HEMOS INTEGRADO ESA FUNCIÓN. DE TODAS FORMAS EL PERFIL DEL JUGADOR BORIS ESTA ACTUALIZADO Y PUEDEN VER SU FUNCIONAMIENTO”

Escrito en Tutorial. Etiquetas: . 3 Comentarios »

Juegos de Navegador en Base al Blog

Invito a todos los creadores de juegos de navegador que vayan siguiendo (o no siguiendo) este blog, a que publiquen los links con sus avances. Así todos podremos tener ideas de los demás para el desarrollo de nuevo propio proyecto.

ESPERAMOS SUS AVANCES!!!!

Éxito

Escrito en Extra. Etiquetas: . 5 Comentarios »

Editar Cuenta de Usuario

Agradecimientos a  Spanisher por la creación de esta entrada y su incondicional apoyo a la gestión del blog y el foro


En esta nueva entrada vamos a ver como editar la cuenta de usuario que hemos creado al registrarnos en la aplicación “Granja”.

Los pasos son muy sencillos, accederemos a una sección de la web donde se nos darán dos opciones, “editar tus datos” y “cambiar contraseña”.

Los nuevos archivos son tres y no son nada extensos. Ahora pasamos a detallarlos, primero el código y después la explicación, como siempre.

cuenta.php

<?php
session_start();
if(!isset($_SESSION['usuario']))
{
header("Location: index.php");
}
else
{
$us = $_SESSION['usuario'];
require('seguridad.php');
conectar_base_datos();
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$row = mysql_fetch_assoc($consulta);
echo "Bienvenido: <b>".$row['nombre_registrado']."</b>";
}
?>
<html>
<head><title>Principal: GRANJA</title>
</head>
<body>
<center><h1>Granja</h1></center>
<table align="center">
<tr>
<td>
<center><h3>Cuenta</h3></center>
<ul>
<li><a href='editar_cuenta.php'>Editar tus datos</a></li>
<li><a href='cambiar_contrasena.php'>Cambiar contraseña</a></li>
</ul>
</td>
</tr>
</table>
<br><center><a href='main.php'>Volver</a></center>
</body>
</html>

El código en ROJO como siempre es el que siempre utilizaremos para verificar sesión y dar un mensaje de bienvenida al usuario, esta vez utilizamos mysql_fetch_assoc” para recuperar los datos de las Base de Datos por el nombre de columna y no por su número, así facilitamos las cosas para un futuro. La explicación a este código se ha hecho es posts anteriores.

En color AZUL simplemente tenemos dos enlaces que nos llevan a las páginas donde podremos editar nuestros datos o cambiar la contraseña y un tercer enlace más que nos devolverá a la página anterior “main.php”.

editar_cuenta.php

<?php
session_start();
if (!isset($_SESSION['usuario'])) {
header("Location: index.php");
} else {
require('seguridad.php');
conectar_base_datos();
$us = $_SESSION['usuario'];
if (isset($_REQUEST['guardar'])){
//recogemos los datos
$nombre_edit = $_POST['nombre'];
$email_edit = $_POST['email'];
if (!validacionemail($email_edit)) {
echo "<center><font color='red'>El email ingresado no es válido</font></center>";
} else {
if ($nombre_edit =='' or $email_edit ==''){
//comprobamos que los campos no estén vacíos
echo "<center><font color='red'>Todos los campos son obligatorios</font></center>";
}else{
$sql = "UPDATE usuarios SET nombre_registrado='$nombre_edit', email ='$email_edit' WHERE usuario = '$us'";
@$resultado = mysql_query($sql) or die ("No se han podido actualizar los datos, error: ".mysql_error());
}
}
}       

$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$row = mysql_fetch_assoc($consulta);
$nombre = $row['nombre_registrado'];
$email = $row['email'];
echo "Bienvenido: <b>$nombre</b>";
if (@$resultado)
echo "<center><font color='green'>Datos actualizados correctamente</font></center>";
}
?>
<html>
<head><title>Principal: GRANJA</title>
</head>
<body>
<center><h1>Granja</h1></center>
<table align="center">
<tr>
<td>
<center><h3>Editar datos de tu cuenta</h3></center>
<form action='editar_cuenta.php' method='POST'>
<table align="center">
<tr>
<td>
Nombre Usuario:
</td>
<td>
<input size="15" maxlength="50" value="<?php echo $nombre ?>">
</tr>
<tr>
<td>
Email:
</td>
<td>
<input size="15" maxlength="30" value="<?php echo $email ?>">
</td>
</tr>
</table>
<center><input type="submit" value="Guardar"></center>
</form>
</td>
</tr>
</table>
<br><center><a href='cuenta.php'>Volver</a></center>
</body>
</html>

Una vez dentro de la sección “Editar cuenta” de nuevo tenemos en código de color ROJO la comprobación de sesión y el mensaje de bienvenida, pero esta vez aprovechamos la consulta para recoger un valor más y poder mostrar el nombre de usuario y el email en el formulario que tenemos al final del archivo (marcamos estos dos pedazos de código php también en ROJO).

En código VERDE observamos la parte más interesante del código, primero comprobamos que se haya pulsado el botón “guardar” (que la variable no esté sin iniciar) con la línea if (isset($_REQUEST['guardar'])), esta variable la obtenemos al enviar el formulario pulsando el botón guardar, esta es la línea de código que lo realiza:

<center><input value=”Guardar”></center>

Seguidamente se recogen los datos enviados desde el formulario y comprobamos que la dirección de email sea correcta.

ATENCIÓN: Para comprobar si el mail es correcto hemos puesto la función “validacionemail($email)” en el archivo “seguridad.php” debido a que esta última la hemos utilizado varias veces y así vaciamos un poco de código php nuestro archivo. La función que debéis copiar es la siguiente:

function validacionemail($email) {

if (ereg(“^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@+([_a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]{2,200}\.[a-zA-Z]{2,6}$”, $email)) {

return true;

} else {

return false;

}

}

Continuamos, si el email no es correcto se muestra un aviso, y si es correcta se procede a comprobar que se hayan llenado todos los campos, ya que si se dejara alguno vacío nos quedaría también vacío en la Base de Datos, y eso podría dar al traste más adelante a nuestra aplicación Granja.

Si los datos están rellenados, hacemos un UPDATE a la Base de Datos y así guardamos los nuevos valores.

En VERDE también podemos ver que si la actualización se ha hecho correctamente nos mostrará un mensaje de “ok”, esta es la línea:

if ($resultado)
echo "<center><font color='green'>Datos actualizados correctamente</font></center>";

La parte AZUL es el formulario donde se nos permitirá cambiar los datos de nuestra cuenta de usuario.

El formulario al cargar ya nos mostrará los datos actuales en el campo de texto ya que antes los hemos recuperado de la Base de Datos en la consulta que hemos hecho en la parte ROJA del código.

Código de la página: cambiar_contrasena.php

<?php
session_start();
if (!isset($_SESSION['usuario'])) {
header("Location: index.php");
} else {
require('seguridad.php');
conectar_base_datos();
$us = $_SESSION['usuario'];
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$row = mysql_fetch_assoc($consulta);
$nombre = $row['nombre_registrado'];
$email = $row['email'];
echo "Bienvenido: <b>$nombre</b>";
if (isset($_REQUEST['cambiar'])){
//si hemos pulsado "Cambiar contrseña"
if ($_POST['contrasena_actual'] == '' or $_POST['contrasena_nueva'] == '' or $_POST['contrasena_repite'] == ''){
//comprobamos que los campos no estén vacios
echo "<center><font color='red'>Todos los campos son obligatorios</font></center>";
}else{
//Si hemos pulsado "cambiar", iniciamos cambio de contraseña
$contrasena_actual = encriptacion($_POST['contrasena_actual']);
$contrasena_nueva = encriptacion($_POST['contrasena_nueva']);
$contrasena_repite = encriptacion($_POST['contrasena_repite']);
$query = "SELECT * FROM usuarios WHERE usuario='$us' AND contrasena='$contrasena_actual'";
$consulta = mysql_query($query);
if (mysql_num_rows($consulta) > 0) {
//Si la contraseña vieja existe
if ($contrasena_nueva == $contrasena_repite){
//Si nueva contraseña y repite nueva contraseña coinciden
$resultado = "UPDATE usuarios SET contrasena='$contrasena_nueva' WHERE usuario = '$us'";
mysql_query($resultado) or die ("No se ha podido cambiar la contraseña, error: ".mysql_error());
echo "<center><font color='green'>Contraseña actualizada correctamente</font></center>";
}else{
echo ("Error: Contraseña nueva y repetición de contraseña nueva no coinciden");
}
} else {
echo ("Error: Contraseña inválida");
}
}
}
}
?>
<html>
<head><title>Principal: GRANJA</title>
</head>
<body>
<center><h1>Granja</h1></center>
<table align="center">
<tr>
<td>
<center><h3>Cambiar contraseña</h3></center>
<form action='cambiar_contrasena.php' method='POST'>
<table align="center">
<tr>
<td>
Contraseña actual:
</td>
<td>
<input type="password" name="contrasena_actual" size="15" maxlength="10">
</tr>
<tr>
<td>
Nueva contraseña:
</td>
<td>
<input type="password" name="contrasena_nueva" size="15" maxlength="10">
</td>
</tr>
<tr>
<td>
Repite nueva contraseña:
</td>
<td>
<input type="password" name="contrasena_repite" size="15" maxlength="10">
</td>
</tr>
</table>
<center><input type="submit" name="cambiar" value="Cambiar Contraseña"></center>
</form>
</td>
</tr>
</table>
<br><center><a href='cuenta.php'>Volver</a></center>
</body>
</html>

Ahora nos dedicaremos a cambiar la contraseña de nuestra cuenta, para eso tenemos que hacer una serie de comprobaciones:

1.- Que no se hayan dejado campos en blanco (esto dejaría nuestra cuenta a servicio de todo el mundo ya que se podría entrar sin escribir ninguna contraseña).

2.- Pediremos la contraseña actual y comprobaremos que exista (no vaya a ser que nos hayamos dejado la página abierta y en nuestra ausencia algún gracioso nos cambie la contraseña).

3.- Si la contraseña actual es válida (existe en la Base de Datos) verificaremos que la nueva contraseña ha sido escrita correctamente (haremos repetir la nueva contraseña al usuario para asegurarnos que la ha escrito bien).

Manos a la obra, la parte ROJA del código nos hace la comprobación de sesión y nos muestra el mensaje de bienvenida.

En la parte VERDE lo primero que hacemos es comprobar que se haya pulsado el botón “Cambiar”, si lo hemos hecho quiere decir que hemos iniciado el cambio de contraseña.

Seguidamente si hemos pulsado “Cambiar” se comprueba que se hayan llenado todos los campos del formulario, si no es así se muestra mensaje de aviso, en cambio si se han llenado se recogen los datos enviados por el método POST del formulario y se hace una consulta a la Base de Datos para saber si la contraseña actual que se ha insertado corresponde a la contraseña del usuario.

Si la contraseña es correcta comprobamos que la nueva contraseña y la repetición de la nueva contraseña sean iguales (así nos aseguramos que hemos escrito la nueva contraseña correctamente).

Y seguidamente hacemos un UPDATE a la Base de Datos con la nueva contraseña.

Si la “contraseña actual” no fuera la correcta, o si la “contraseña nueva” no coincidiese con la “repetición de la contraseña nueva” se mostraría un aviso.


Finalmente En la parte AZUL del código tenemos un simple formulario con tres campos:

  • Contraseña actual (donde escribimos la contraseña vieja)
  • Nueva contraseña (para la nueva contraseña)
  • Repite nueva contraseña (repetimos la nueva contraseña por si nos hemos equivocado en la primera)

Acabamos con la opción de volver donde un link nos llevará de nuevo al menú de nuestra cuenta si le clicamos.

Aviso importante: Revisar los cambios efectuados a la entrada de registro.php

La función validacionemail($email) de esta entrada fue eliminada del código porque ya se incluye en seguridad.php

Ranking

Importante para cualquier juego de navegador es que los usuarios puedan ver cómo se encuentran con respecto a los demás jugadores y una forma clásica de hacerlo es mediante Ranking. El Ranking clasifica a los jugadores de acuerdo a alguna característica, facultad o posesión. Lo más común es clasificar mediante posesión. En este ejemplo, clasificaremos a los usuarios de acuerdo a la cantidad de dinero que posean.

Básicamente, el código para el Ranking consistirá en una simple consulta a la base de datos cuya respuesta será devuelta en una tabla ordenada por dinero (ORDER BY dinero).

Veamos el código…

Página: ranking.php

<?php
session_start();
if(!isset($_SESSION['usuario']))
{
header("Location: index.php");
}
else
{
$us = $_SESSION['usuario'];
require('seguridad.php');
conectar_base_datos();
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$row = mysql_fetch_array($consulta);
echo "Bienvenido: <b>$row[7]</b>";
}
?>
<html>
<head><title>Ranking de Jugadores</title>
</head>
<body>
<?php
if(!isset($_GET['pag']))
{
$pag = 1;
}
else
{
$pag = $_GET['pag'];
}
$registrosPagina = 25;
if($pag == 1)
{
$listaInicio = 0;
}
else
{
$listaInicio = $registrosPagina * ($pag - 1);
}
$result = mysql_query("SELECT * FROM usuarios ORDER BY dinero DESC LIMIT $listaInicio, $registrosPagina");
echo "<center><h2>Ranking de Jugadores</h2></center>";
echo "<table align='center' border='0'><tr><td><b>Lugar</b></td><td><b>Jugador</b></td><td><b>Dinero</b></td></tr>";
$lugar = ($pag * $registrosPagina) - $registrosPagina;
while($rs = mysql_fetch_array($result))
{
$lugar += 1;
echo "<tr><td>$lugar</td><td><a href='perfil.php?id=$rs[7]'>$rs[7]</a></td><td>$rs[8]</td></tr>";
}
echo "</table>";
$result = mysql_query("SELECT * FROM usuarios");
$totalRegistros = mysql_num_rows($result);
$totalPaginas = ceil($totalRegistros / $registrosPagina);
$paginaAnterior = $pag - 1;
$paginaSiguiente = $pag + 1;
if ($paginaSiguiente > $totalPaginas)
{
$paginaSiguiente -= 1;
}
if ($paginaAnterior < 1)
{
$paginaAnterior += 1;
}
echo "<br><center><a href='ranking.php?pag=$paginaAnterior'>Anterior</a> ";
for ($i = 1; $i <= $totalPaginas; $i++)
{
echo " <a href='ranking.php?pag=$i'>$i</a> ";
}
echo " <a href='ranking.php?pag=$paginaSiguiente'>Siguiente</a></center>";
echo "<center><a href='main.php'>Volver</a></center>";
?>
</body>
</html>

El código realiza consultas a la tabla usuarios de la base de datos del juego. Lo primero es una simple inserción de los registros devueltos por la consulta en una tabla para su orden. Seguido, se ejecuta una especie de paginación simple para mostrar determinadas cantidades de usuarios por página. Por último, se calcula la cantidad de páginas en la que caben los resultados y se agregan los enlaces correspondientes para navegar por las páginas.

Una sección importante y que es modificable a gusto es la cantidad de registros que se mostrarán por página. Para cambiar la cantidad de resultados sólo deben modificar el número que está definido en el siguiente fragmento del código: $registrosPagina = 25; En este caso, muestra 25 registros por página, pero pueden modificarlo para que muestre los registros que gusten.

Otra parte importante, es que en la parte donde muestra el nombre con los jugadores los marca como link. Este link dirigirá a la página del perfil del usuario (perfil.php?id=codigo_usuario_unico). Esta página aún no la he desarrollado, pero pronto estará a disposición, así es que no teman porque eso no funciona aún.

Paginación: en lenguaje PHP y MySQL podríamos definirlo como la división de ciertos resultados en varias páginas para facilitar la carga y lectura de estos resultados. Principalmente, se mejora la lectura para los usuarios por sobre la optimización de la carga. La paginación se utiliza bastante, especialmente en las páginas de búsqueda como Google o Youtube. Ejemplo de paginación en Youtube:

Paginación en Youtube

Consultas sobre el código realizarlas por comentarios o en el foro.

Muchas otras funcionalidades pueden ser añadidas a el Ranking, como por ejemplo, poder tener un enlace al perfil de cada usuario donde poder ver sus impresiones, logros, producción, etc. También, agregar opciones para enviarle mensajes instantáneos directos. Todas esas características no son difíciles de agregar y de ustedes depende integrarlas y adaptarlas.

Buena suerte.

IMPORTANTE:

Se ha añadido un nuevo campo a la tabla usuarios. Aviso para que lo agreguen al final.

dinero INT(100)

Además, se ha agregado un link a la página ranking.php desde main.php. Aviso para que lo consideren.

Escrito en Tutorial. Etiquetas: . 5 Comentarios »

Sistema de Mensajería instantánea

Nos dedicaremos ahora a hacer un Sistema de Mensajería instantánea bien simple, que cumplirá con lo siguiente:

- Enviar mensaje a cualquier jugador por medio de su nombre.

- Eliminar mensajes de la bandeja de entrada cuando gusten.

Manos a la obra. Como siempre, el código primero y los por menores después. No hay que preocuparse, no hay nada nuevo en la programación de este sistema de mensajería.

Página: mensajeria.php

<?php
session_start();
if(!isset($_SESSION['usuario']))
{
header("Location: index.php");
}
else
{
$us = $_SESSION['usuario'];
require('seguridad.php');
conectar_base_datos();
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$row = mysql_fetch_array($consulta);
echo "Bienvenido: <b>$row[7]</b>";
}
?>
<html>
<head><title>Mensajería</title>
</head>
<body>
<center><a href='mensajeria.php?id=band'>Bandeja de Entrada</a> | 
<a href='mensajeria.php?id=envi'>Enviados</a></center>
<?php
$us = $_SESSION['usuario'];
$id = $_GET['id'];
$msj = @$_GET['msj'];
if($id == 'band')
{
echo "<center><h3>Bandeja de Entrada</h3></center>";
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$row0 = mysql_fetch_array($consulta);
$bandeja = mysql_query("SELECT * FROM mensajeria WHERE destinatario = '$row0[7]' ORDER BY id") or die("Error");
if(0 < mysql_num_rows($bandeja))
{
while($row = mysql_fetch_array($bandeja))
{
echo "<table align='center' border='1'>";
echo "<tr><td>Remitente:</td><td>$row[1]</td></tr>";
echo "<tr><td>Asunto:</td><td>$row[3]</td></tr>";
echo "<tr><td>Fecha:</td><td>$row[5]</td></tr>";
echo "<tr><td>Mensaje:</td><td>$row[4]</td></tr>";
echo "</table><center><a href='mensajeria.php?id=borra&msj=$row[0]'>Borrar Mensaje</a></center><br>";
}
}
else
{
echo "<center>No hay mensajes en la bandeja de entrada</center>";
}
}
else
{
if($id == 'envi')
{
echo "<center><h3>Elementos Enviados</h3></center>";
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$row0 = mysql_fetch_array($consulta);
$enviados = mysql_query("SELECT * FROM mensajeriaenviados WHERE remitente = '$row0[7]' ORDER BY id");
if(mysql_num_rows($enviados) > 0)
{
while($row = mysql_fetch_array($enviados))
{
echo "<table align='center' border='1'>";
echo "<tr><td>Para:</td><td>$row[2]</td></tr>";
echo "<tr><td>Asunto:</td><td>$row[3]</td></tr>";
echo "<tr><td>Fecha:</td><td>$row[5]</td></tr>";
echo "<tr><td>Mensaje:</td><td>$row[4]</td></tr>";
echo "</table><center><a href='mensajeria.php?id=borraenv&msj=$row[0]'>Borrar Mensaje</a></center><br>";
}
}
else
{
echo "<center>No existen elementos enviados</center>";
}
}
else
{
if($id == 'borra')
{
mysql_query("DELETE FROM mensajeria WHERE id = '$msj'");
header("Location: mensajeria.php?id=band");
}
else
{
if($id == 'envio')
{
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario = '$us'");
$row = mysql_fetch_array($consulta);
$usu = $row[7];
$des = $_POST['destinatario'];
$asu = $_POST['asunto'];
$men = $_POST['mensaje'];
$fec = date('d-m-Y H:i:s');
$est = 0;
mysql_query("INSERT INTO mensajeria (remitente,destinatario,asunto,mensaje,fecha,estado) 
VALUES ('$usu','$des','$asu','$men','$fec','$est')");
mysql_query("INSERT INTO mensajeriaenviados (remitente,destinatario,asunto,mensaje,fecha,estado) 
VALUES ('$usu','$des','$asu','$men','$fec','$est')");
echo "<center>Mensaje Enviado con éxito</center>";
}
else
{
if($id == 'borraenv')
{
mysql_query("DELETE FROM mensajeriaenviados WHERE id = '$msj'");
header("Location: mensajeria.php?id=band");
}
}
}
}
}
?>
<hr>
<center><h2>Enviar Mensaje Instantáneo</h2></center>
<form action='mensajeria.php?id=envio' method='POST'>
<table align='center'>
<tr>
<td>
Destinatario:
</td>
<td>
<input type='text' name='destinatario' maxlenght='30' size='20'>
</td>
</tr>
<tr>
<td>
Asunto:
</td>
<td>
<input type='text' name='asunto' maxlenght='50' size='20'>
</td>
</tr>
<tr>
<td>
Mensaje:
</td>
<td>
<textarea name='mensaje'></textarea>
</td>
</tr>
</table>
<center><input type='submit' value='Enviar'></center>
</form>
<center><a href='main.php'>Volver</a></center>
</body>
</html>

Las tablas dentro de la base de datos para que funcione el Sistema de Mensajería son las siguientes:

1) mensajeriaenviados:

Tabla: mensajeriaenviados2) mensajeria:

Tabla: mensajeria

***Pronto la descripción del código***

Escrito en Tutorial. Etiquetas: . 20 Comentarios »
Seguir

Get every new post delivered to your Inbox.

Únete a otros 66 seguidores