У меня есть Player
класс с атрибутом score
:Как отслеживать рейтинги игроков?
class Player(game_engine.Player):
def __init__(self, id):
super().__init__(id)
self.score = 0
Этот показатель увеличивается/уменьшается, как игрок успешно/не в состоянии сделать цели. Теперь я должен сказать игроку его ранг от общего количества игроков с чем-то вроде
print('Your rank is {0} out of {1}')
Сначала я думал, что иметь список всех игроков, и каждый раз, когда что-нибудь случится с игроком:
- проверить, если его оценка увеличена или уменьшена
- найти его в списке
- переместить его, пока его счет не находится в правильном месте
Но это было бы крайне медленно. Могут быть сотни тысяч игроков, и игрок может сбросить свой счет до 0
, что означало бы, что мне придется переместить всех за ним в стек. Даже найти игрока будет O (n).
Что я ищу - это высокопроизводительное решение. Использование ОЗУ не так важно, хотя здравый смысл следует использовать. Как я могу улучшить систему намного быстрее?
Информация обновлена: Я храню данные игрока в базе данных MySQL с помощью SQLAlchemy каждый раз, когда он покидает игровой сервер, и я загружаю его каждый раз, когда он присоединяется к серверу. Они обрабатываются через 'player_join'
и 'player_leave'
событий:
@Event('player_join')
def load_player(id):
"""Load player into the global players dict."""
session = Session()
query = session.query(Player).filter_by(id=id)
players[id] = query.one_or_none() or Player(id=id)
@Event('player_leave')
def save_player(id):
"""Save player into the database."""
session = Session()
session.add(players[id])
session.commit()
Кроме того, оценка игрока обновляется на 'player_kill'
событие:
@Event('player_kill')
def update_score(id, target_id):
"""Update players' scores upon a kill."""
players[id].score += 2
players[target_id].score -= 2
, какую базу данных вы используете? –
@ r-m-n Я использую MySQL –
в некоторых базах данных, это можно сделать с помощью функции окна DENSE_RANK, но MySQL не поддерживает эту функцию. Вы можете попробовать что-то вроде этого: http://dukesoftware00.blogspot.ru/2012/11/calculate-denserank-for-mysql.html –