Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Programar Juegos En Php

Iniciado por tamat, 09 de Enero de 2006, 01:01:21 AM

« anterior - próximo »

Parzival

 No sé, yo la verdad no lo veo tan complejo. Por ejemplo, en los juegos que puse en mi primer post, al construir un edificio no te deja construir ninguno más y no hay manera de hacer trampas, guardas en la base de datos la hora a la que empezaste a hacer el edificio y comparas la diferencia de la hora actual con esa, si no sobrepasa el valor mínimo para la construcción del edificio sigues sin poder hacer nada más...

Si no, otra manera de hacerlo para que no te dé problemas el botón "atrás" es utilizar AJAX, la base de datos se actualiza sin tener que llamar a una página nueva. Pero aún así creo que el tema está en organizar bien la base de datos, que por mucho que abuses de ella en estos juegos y aunque parezca lo contrario, la verdad es que no hay ni la mitad de movimiento de datos que puede haber en un foro como este.

* Josepzin: gracias, y saludos a todos!
Eduardo Veiga

jazcks

 yo por ejemplo utilizo ajax en segun que sitios (registro, login...) para evitar un poco eso, llamadas innecesarias a paginas, aunque si alguien quiere hacer trampas las hará, ya que se puede ver a que fichero se llama en ajax, y volver a reproducirlo fuera del contexto del juego.
Lo de las construcciones está claro, lo haces por tiempo, pero como solventas el tema de por ejemplo comprar algo "instantaneo"?, es decir haces pulsas un link y te dan 1 unidad y te quita lo que sea de dinero. Es un script que en teoria es llamado una vez, si te hacen F5 a mitad de carga de pagina sabe dios lo que pasa...en el mejor caso te dan 2 unidades y te descuentan 2 veces el dinero,pero pueden salir cosas raras...

RedHan

 
Citar... pero como solventas el tema de por ejemplo comprar algo "instantaneo"?, es decir haces pulsas un link y te dan 1 unidad y te quita lo que sea de dinero. Es un script que en teoria es llamado una vez, si te hacen F5 a mitad de carga de pagina sabe dios lo que pasa...en el mejor caso te dan 2 unidades y te descuentan 2 veces el dinero,pero pueden salir cosas raras ...

Tampoco es tan complicado controlar eso en un script, tan solo tiene que hacer algo parecido a esto:

1.- Recoges los parámetros mandados al script. (Uno de los cuales es la IP del ordenador que ha hecho la llamada al script y otro la fecha/hora del momento en que hizo la llamada).
2.- Abres conexión con la base de datos.
3.- Compruebas si para esa IP, esa fecha/hora se encuentra en la Base de datos.
4.- Si se encuentra en la BD y la fecha/hora para esa IP es mayor a la de la BD, se guarda la fecha recibida en el parámetro, en la base de datos:
 5.- Se hacen el resto de acciónes (dar 1 unidad y quitar x dinero).
6.- Si para la IP recibida, la fecha/hora recibida no se encuentra en la Base de datos, no se hace nada.
7.- Se cierra la conexión con la base de datos.
8.- Se devuelve el código HTML de la página de respuesta al navegador.

Como las ejecuciones de los scripts en php se ejecutan en el servidor y no se pueden cancelar "a la mitad" una vez se ha llamado al script. (si se llama dos veces al mismo script lo que ocurre es que se ejecutará completamente 2 veces en el servidor).

De modo que si en algún momento se pulsa F5 en el navegador, ocurrirá que como los parametros recibidos por el script son los mismos que en la primera llamada y como en la primera ejecución ya se ha guardado esa fecha/hora para esa IP en la base de datos, no se hará nada y se devolverá la página sin hacer dos veces la misma acción, a efectos del juego.

No sé si me explico bien, pero creo que más o menos la idea se entiende, no?  :P  
- RedHan --

jazcks

 
Citar
4.- Si se encuentra en la BD y la fecha/hora para esa IP es mayor a la de la BD, se guarda la fecha recibida en el parámetro, en la base de datos:
5.- Se hacen el resto de acciónes (dar 1 unidad y quitar x dinero).
6.- Si para la IP recibida, la fecha/hora recibida no se encuentra en la Base de datos, no se hace nada.

gracias redhan, pero creo que el 4 y el 6 van al reves no?

4-si se encuentra, no se hace nada (ya se ha hecho antes),
6-si no se encuentra, se hace y si guarda esa fecha/ip

ya imaginaba algo asi, pero yo creía que php si se puede parar a mitad de ejecución... :P



RedHan

 cierto, el 4 y el 6 van al revés. Me despisté  :P  
- RedHan --

Parzival

Cita de: "RedHan"1.- Recoges los parámetros mandados al script. (Uno de los cuales es la IP del ordenador que ha hecho la llamada al script y otro la fecha/hora del momento en que hizo la llamada).
2.- Abres conexión con la base de datos.
3.- Compruebas si para esa IP, esa fecha/hora se encuentra en la Base de datos.
4.- Si se encuentra en la BD y la fecha/hora para esa IP es mayor a la de la BD, se guarda la fecha recibida en el parámetro, en la base de datos:
No sería mejor cambiar lo de IP por el login del tio y compararlo con una variable de sesion (por ejemplo $_SESSION['s_login']) iniciada con el login cuando se registra en el juego? Más que nada por si estoy haciendo un edificio que tarda 5 horas y me desconecto y me conecto en el curro, la ip va  a ser distinta... Además, lo de la fecha/hora va bien si tienes una conexión rápida que nada más mandar los datos ya te cargue la página o/y si el servidor no está saturado y no deja el proceso en una cola. Porque si no siempre te va a dar que la fecha/hora va a ser distinta, aunque sea por un segundo. En cualquier caso el problema estará en el cliente por hacer el gañán al querer hacer trampas refrescando la web, y gastará el doble de material, en realidad no va a poder hacer trampas de ninguna manera.

En definitiva, todo eso es a lo que me refería yo, pero cuando dijo jazcks de hacer la actualización de la base de datos por procedures empezaba a dudar si el php se pararía a mitad de ejecución, cosa que al final descarté por parecerme ilógico: ¿cuántos miles de páginas están alojadas en un sólo servidor y tirando todas de php continuamente?

Salu2
Eduardo Veiga

tamat

 A mi el tema de controlar que el usuario no se dedique a pasar parametros o hacer refresh no me preocupa tanto. Existen muchos metodos, yo por ahora uso el de tener campos ocultos con identificativos en cada posible acción (tanto si es form como enlace), y cuando le planteo al jugador una posible acción meto ese identificativo en la sesión, cuando el jugador realiza una acción chequeo el id que recibo junto con la acción, si ese id ya lo usó antes entonces es un refresh (o algo peor) y la nueva acción queda descartada, si el numero se lo ha sacado de la manga (rollo poniendolo a mano) lo detecto porque no está en la sessión así que no hago la acción y le doy un toque.

Esos numeros los puedo ir generando y guardando en la sesion con algun atributo asociado que diga si está usado o no. Es un metodo simple pero no veo como podría ser saltado. Además no tengo que preocuparme de controlarlo en cada parte, basta que el codigo encargado de pillar los request lo tenga siempre controlado y listos.

Volviendo al topic, a mi me preocupa más reescribir mucho código. Actualmente tengo varios phps con clases genericas, por ejemplo tengo un sistema de modulos, son clases que se instancian en cada petición (intento que sean lo más ligeras posibles) y al hacerlo se autoregistran en un array, despues chequeo el REQUEST y en función de los datos que recibo el sistema determina a qué modulo va dirigido el mensaje y se lo envio. Luego el modulo puede generar una salida y almacenarla en otro contenedor.

Despues con esos datos monto la página. Es un metodo que me permite agregar nuevas funcioanlidades sin necesidad de tener que cambiar más que las cuatro lineas que anclan el módulo al sistema.

Cosas así son las que yo necesito. No quiero tener 40 phps, ni phps kilometricos con cientos de peticiones. No quiero tener querys SQL por toda la aplicación, de hecho uso un sistema FACADE para acceder a la DB que me permite contener bastante los accesos y ahorrarme problemas.

Tambien uso AJAX pero no me soluciona nada, al reves, porque para computar la acción a veces necesito volver a recargar todos los datos y es igual de costoso para el servidor (aunque aquí reconozco que mi problema es no hacer un uso optimo de las sesiones).

Por cierto Parzival, interesante que comentes lo de los ticks, porque es otro problema que no se muy bien como resolver. Solo se me ocurre que cuando se haga una petición si ya ha pasado el tiempo de hacer el tick entonces lo hago y despues computo la petición, pero me preocupa qué pasaría si pasase más de un tick sin que hubiese ninguna petición, o qué pasa si quiero enviar un mail a todos al final de cada día?. Tambien puedo forzarlas con algun proceso desde mi máquina pero me parece un tanto chapucero. A la larga se que lo mejor sería albergarlo en local y tener procesos pero como por el momento me tengo que valer de un host con php pues no hay más remedio.

En fin, lo dicho. Busco ideas que agilicen el desarrollo mediante técnicas avanzadas de programación (patrones, templates, etc).
Por un stratos menos tenso

Parzival

 Para los ticks hoy en día la mayoría de empresas de hosting de pago te permiten añadir tareas programadas. Basta con que te hagas un script en php para actualizarlos y listo. Supongo que es la única forma de poder hacerlo a menos que no tengas un server privado.
Eduardo Veiga

RedHan

 tamat, para lo de los ticks, miraté por ahí lo referente a los CRON. Seguro que eso despeja tus dudas.
- RedHan --






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.