Лучшее решение для игры с растущим числом?
Я переделываю вопрос, который я задал здесь, основываясь на обратной связи, которую мне дали. Если в моем вопросе все еще есть что-то неясное, пожалуйста, дайте мне знать.
Пояснение к игре: Игра с растущим числом, в которой пользователь должен угадать, когда число перестанет расти. Это чисто случайный шанс и осуществляется путем нажатия пользователем на кнопку. Число вычисляется на стороне сервера после каждой игры. Число будет увеличиваться на 0.01, начиная с 1.00, до тех пор, пока число не будет рассчитано на стороне сервера.
Решение, которое я придумал: Запуск фонового процесса с помощью apischeduler. Выполнение функции увеличения числа каждые 0.1 секунды, которая добавляет 0.01 к текущему состоянию числа и отправляет результат состояния на фронтенд с помощью Django Channels. Я извлекаю и обновляю состояние с помощью запросов к базе данных. Когда конечный результат (число) будет достигнут, будет вычислено новое число и будет запущен таймер до начала новой игры
Все это кажется странным, учитывая, что я вызываю функцию в фоновом режиме каждые 0,1 секунды бесконечно. Однако я не могу понять, как выполнить задачу по-другому. Есть ли лучшее решение/более эффективный способ сделать то, что я пытаюсь достичь?
Пример кода для увеличивающейся части и отправки ее на передний край:
jobs.py
# Running this function every 0.1 seconds.
def increaseNumber():
gameObj = Game.objects.latest('round_start_time')
lastGameObj = Game.objects.filter(round_number=gameObj.round_number-1)[0]
group_name = 'numbers'
channel_layer = channels.layers.get_channel_layer()
if lastGameObj.timer > 0:
# run timer
oldTimer = lastGameObj.timer
newTimer = oldTimer - Decimal(0.1)
Game.objects.filter(round_number=gameObj.round_number-1).update(timer=newTimer)
async_to_sync(channel_layer.group_send)(
group_name,
{
'type': 'timer',
'timer': json.dumps(newTimer, cls = DecimalEncoder)
}
)
else:
if gameObj.over == False:
# run game
getcontext().prec = 3
oldState = gameObj.result_state
newState = oldState + Decimal(0.01)
Game.objects.filter(id=gameObj.id).update(result_state=newState)
if newState >= gameObj.result:
Game.objects.filter(id=gameObj.id).update(over=True)
async_to_sync(channel_layer.group_send)(
group_name,
{
'type': 'number_game',
'state': json.dumps(newState, cls = DecimalEncoder)
}
)
return
async_to_sync(channel_layer.group_send)(
group_name,
{
'type': 'number_game',
'state': json.dumps(newState, cls = DecimalEncoder)
}
)
consumer.py
async def number_game(self, event):
state = event['state']
await self.send(text_data=json.dumps({
'state': state
}))
async def timer(self, event):
timer = event['timer']
await self.send(text_data=json.dumps({
'timer': timer
}))