2009-03-04 11 views
10

Quiero implementar puntajes altos en Internet para mi juego. Y brinde comentarios a los jugadores sobre el lugar que ocupan (no solo top100 o algo así). En SQL normales que se vería así:Cómo implementar altos puntajes de Internet en Google App Engine

SELECT COUNT (*) de las puntuaciones que los puntos>: newUsersPoints

y GQL tienen algo similar

db.GqlQuery ("SELECT * FROM Puntuación DONDE puntos >: 1 ", newUsersPoints) .count()

pero como count() está limitado solo a 1000, no será muy útil en mi caso. ¿Tiene alguna idea sobre cómo implementar esto?

tengo dos

Primero:

  1. Uso contadores sharding idea (http://code.google.com/intl/pl/appengine/articles/sharding_counters.html) Crear nueva "mesa" que almacena el número de puntuaciones son en cierto rango (from_points, to_points)

  2. Sumar todos los contadores de la tabla anterior donde rango.a_puntos < nuevosUsuariosPuntos

  3. Encuentra cuántos puntajes son más grandes que los puntajes en el rango donde el nuevo puntaje es db.GqlQuery ("SELECCIONAR * FROM Punta WHERE puntos>: 1 AND puntos> =: 2 Y puntos <: 3", nuevosUsersPoints, range.from_points , range.to_points) .count() + sumfrom2

  4. gama Búsqueda en el que la nueva puntuación es en e incrementar su contador

  5. de Split, que oscila contador es mayor que 1000 (o 999) de manera que 3. wouldn 'alcanzar el límite

  6. Agregar nueva puntuación a la tabla de puntuaciones

que es bastante complicado y propenso a errores. Podríamos incrementar algún rango y Tiempo de espera antes de agregar el puntaje. (No transaccional)

segunda idea:

De vez en cuando (? Una vez al día) ordenar todas las puntuaciones por puntos y darles nuevas posiciones (script puede tiempo de espera así que tenemos que hacerlo en tramos)

Para saber en qué lugar nueva puntuación es simplemente lo hacemos

db.GqlQuery ("SELECT * FROM puntuación DONDE puntos>: 1 LIMIT 1", newUsersPoints). .get() precalculated_position + 1

¿Alguna otra idea?

Respuesta

4

thread on the google-appengine group probablemente sea de su interés. También parece que hay una biblioteca, ranklist, específicamente para esto.

Básicamente, parece que hicieron algo similar a los contadores fragmentados.

5

Implementé Ranker en varias aplicaciones de GAE. Son aplicaciones de Facebook que tienen miles y hasta cientos de miles de personas jugando. Funciona bien, pero para mis propósitos que tiene un gran inconveniente: hay que declarar de antemano el rango final sobre la que las puntuaciones de los participantes va a caer en lo que esta es mala por dos razones:.

  1. si tiene un concurso sin fin, donde los puntajes de las personas pueden seguir escalando sin límite superior, estás enganchado.

  2. al principio de un concurso, cuando todos están agrupados cerca de cero, la estructura de árbol utilizada por ranker.py no es eficiente. el árbol es muy profundo y apenas utiliza su amplitud.

En otras palabras, ranker.py es excelente para el caso de que usted tiene los concursantes cuyas puntuaciones se distribuyen al azar en una forma incluso más de una gama de valores conocidos. Para otros usos, es menos que óptimo.

Espero desarrollar pronto un motor de clasificación más útil. ¡Ciertamente actualizará este hilo cuando eso suceda!