changed up a few things regarding scoring, added some usability features

This commit is contained in:
root
2020-06-16 13:31:05 +02:00
parent 00d0df4af7
commit 953f2eeb46
9 changed files with 64 additions and 30 deletions

View File

@@ -1,6 +1,7 @@
import os
import random
import uuid
import math
from django.contrib.postgres.search import SearchVectorField, SearchQuery, SearchVector
from django.conf import settings
@@ -51,20 +52,14 @@ class User(AbstractUser):
class Challenge(models.Model):
name = models.CharField(_('Challenge Name'), max_length=255, blank=False, db_index=True)
average = models.PositiveIntegerField(default=0)
name = models.CharField(_('Challenge Name'), max_length=255, blank=True, db_index=True)
user = models.ForeignKey(User, models.PROTECT,
related_name='challenge_user',
null=False, blank=False)
def update_average_score(self):
average = GameRound.objects.filter(game__challenge=self).aggregate(Avg('result')).get('result__avg', 0)
self.average = average
self.save()
return average
def setup_challenge(self, user):
rounds = Coord.objects.filter(challenge=self)
#setup games with max score
game = Game.objects.create(
challenge=self,
start=timezone.now(),
@@ -82,6 +77,18 @@ class Challenge(models.Model):
round_id = round.id
return game.id, round_id
@property
def average(self):
#this should be cached, but with low volumes its fine as is
return int(round(Game.objects.filter(challenge=self).aggregate(Avg('score')).get('score__avg', 0)))
@property
def num_rounds(self):
return Coord.objects.filter(challenge=self).count()
def num_plays(self):
return Game.objects.filter(challenge=self).count()
class Coord(models.Model):
lng = models.CharField(_('longitude'), max_length=50, null=False, blank=False)
@@ -132,5 +139,13 @@ class GameRound(models.Model):
else:
actual_coord = (self.coord.lat, self.coord.lng,)
guess_coord = (self.guess_lat, self.guess_lng,)
self.result = distance.distance(actual_coord, guess_coord).km * 1000
super().save(*args, **kwargs)
#get distance in meters between actual coord and the guess
dst = distance.distance(actual_coord, guess_coord).km * 1000
#calculate a score of 0 to 100
if dst < 100:
self.result = 100
elif dst > 100000:
self.result = 0
else:
self.result = int(round(14.46 * (11.52 - math.log(dst))))
super().save(*args, **kwargs)