创建复杂规则的记分板

0 投票
2 回答
516 浏览
提问于 2025-04-16 08:06

我需要根据以下规则来制作一个记分板:

在锦标赛的第一阶段,球队的排名是根据得分来决定的。赢得一场比赛,球队可以获得3分;如果是平局,得1分;输了则得0分。

如果有两支或更多球队的得分相同,那么它们的排名将按照以下方式来决定:

  1. 根据这些球队之间的比赛结果:

    • 得分更高的球队优先;

    • 进球数和失球数的差值更好的球队优先;

    • 在这些比赛中进球数更多的球队优先;

    • 在对方主场进球数更多的球队优先;

  2. 所有比赛中胜利场次更多的球队优先;

  3. 所有比赛中进球数和失球数的差值更好的球队优先;

  4. 所有比赛中进球数最多的球队优先;

  5. 所有比赛中在对方主场进球数最多的球队优先;

现在我有这样的模型:

from django.db import models

class Team(models.Model):
    name = models.CharField(max_length=30)

    def __unicode__(self):
        return self.name

class Game(models.Model):
    beginning = models.DateTimeField()
    place = models.CharField(max_length=50)
    spectators = models.IntegerField()

    def __unicode__(self):
        return self.beginning.strftime("%A, %d. %B %Y %I:%M%p")

class TeamGame(models.Model):

    RESULT_WIN = 'w'
    RESULT_DRAW = 'd'
    RESULT_LOSE = 'l'

    RESULT_CHOICES = (
        (RESULT_WIN, 'Win'),
        (RESULT_LOSE, 'Lose'),
        (RESULT_DRAW, 'Draw'),
    )

    HOME_FIELD = 'h'
    OUT_FIELD = 'o'

    FIELD_CHOICES = (
        (HOME_FIELD, 'home'),
        (OUT_FIELD, 'out')
    )

    game = models.ForeignKey(Game)
    team_name = models.ForeignKey(Team)
    goals_hit = models.IntegerField()
    goals_get = models.IntegerField()
    result = models.CharField(max_length=1, choices=RESULT_CHOICES, blank=True)
    field = models.CharField(max_length=1, choices=FIELD_CHOICES, blank=True)

我该如何制作这样一个复杂的东西呢?请帮帮我!

2 个回答

0

我觉得你现在想要一次性做三件事情,但其实不应该这样。

  1. 把每个团队的信息放进表格里(模型)
  2. 根据这些信息计算每个团队的分数(模型)
  3. 根据分数把团队按顺序显示出来(视图)
1

看起来你想做的是使用sort()这个函数。在Python中,sort()会按照字典顺序来排序元组,也就是说,如果第一个元素相同,它会继续检查第二个元素(依此类推)。

def rank_teams():
    rank = []
    # iterate through teams and create a tuple with most important to least important 
    # sort params. team bust be the last object
    for team in Team.objects.all():
        points = 0
        best_goal_gap = 0
        best_goals = 0
        best_away_goals = 0
        all_victories = 0
        for game in TeamGame.objects.filter(team_name=team):
            points += {'w':3, 'd':1, 'l':0}[game.result]
            best_goal_gap = max(best_goal_gap, game.goals_hit-game.goals_get)
            best_goals = max(best_goals, game.goals_get)
            if game.field == 'o':
                best_away_goals = max(best_away_goals, game.goals_get)
            if game.result == 'w':
                all_victories +=1
        rank.append((points, best_goal_gap, best_goals, best_away_goals, all_victories, team))
    #sort the teams
    rank.sort()
    team_rank = [team for p,g,b,a,v,team in rank]
    return team_rank

这个函数会返回一个按照你想要的顺序排列的团队对象列表(根据第一个要点)。

撰写回答