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:
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:
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






