2009-05-11 4 views
2

나는 복수 라운드가있는 swiss tournament을 나타내는 모델을 만들려고합니다. 홀수 플레이어가있는 경우를 제외하고 각 플레이어는 모두 다른 플레이어와 페어링됩니다. 한 플레이어가 작별 인사를하게됩니다.장고에서 스위스 토너먼트 모델링

각 페어링의 결과를 추적해야합니다. 즉, 어느 플레이어가 이겼는가. 또한, 나는 주어진 플레이어를 상대로 플레이 한 모든 플레이어를 효율적으로 검색 할 수 있기를 원합니다.

확실한 물건 : 처음에는

class Tournament(models.Model): 
    name = models.CharField(max_length=80) 

class Player(models.Model): 
    name = models.CharField(max_length=80) 

나는 이런 식으로 뭔가 보이는 "TournamentPairing"클래스가 계획되었다

class TournamentPairing(models.Model): 
    tournament = models.ForeignKey(Tournament) 
    round = models.IntegerKey() 
    player1 = models.ForeignKey(Player) 
    player2 = models.ForeignKey(Player, null = True) # In case of a bye, this is None. 
    outcome = models.CharField(max_length=1) # player1 wins, loses, bye, or tie 

을하지만 그건, 종류, 특히 부분의 해키 느낌 때로는 플레이어 2가 없음에 대해. 또한, 나는 우리가 찾고있는 플레이어가 player1 또는 player2 슬롯에있을 수 있기 때문에 탐색을 용이하게한다고 생각하지 않는다.

더 좋은 방법이 있습니까? 내 장고 놈이 내게 올바른 해결책을 찾지 못하게하는 것 같아.

+0

당신이뿐만 아니라 페어링 알고리즘을 구현 하시겠습니까? – Svante

+0

페어링에 대한 검색/작업을 나열하면 더 좋은 아이디어를 얻을 수 있습니다. – muhuk

답변

5

귀하의 TournamentPairing 클래스를 리팩토링하여보다 "둥근"중심으로 만들 수 있습니다.

선택 = 행 ( ('N', '보통') ('B', '안녕') ) 동점의 경우

class Round(models.Model):   
    number = models.IntegerField() 
    round_type = models.CharField(max_length=1, default="n", choices=CHOICES) 
    tournament = models.ForeignKey(Tournament) 
    players = models.ManyToManyField(Player, related_name="rounds") 
    winner = models.ForeignKey(Player, null=True, related_name="round_winner") 

가있는 위너 필드 지점 플레이어는 "Tie"라고 불렀습니다.

그런 다음, 당신의 검색 기준에 대해 특정 플레이어에 플레이 한 플레이어의 목록을 보려면 :

# grab a player 
p = Player.objects.get(name='Tom') 

# see what rounds this player played in 
rounds_played = p.rounds.all() 

# who did this player play against? 
[r.players for r in rounds_played] 

# to see all rounds this player won 
p.round_winner.all() 
+0

이것은 실제로 그것을하는 올바른 방법처럼 보입니다. 감사! – csbrooks

1

당신은 단 하나의 선수 명단을 가지고 있어야하며 player1과 player2로 나누지 않아야한다고 생각합니다. 라운드가 설정되면 구성 할 수 있습니다.

플레이어 클래스에는 재생 한 플레이어 목록이 포함될 수 있으며 해당 목록의 마지막 플레이어는 현재 재생중인 플레이어가됩니다. 누군가가 반드시 재생해야하는 다음 플레이어를 선택하면 해당 플레이어를 목록에 추가하십시오. 각 라운드 동안

class Player(Models.model): 
    name = models.CharField(max_length=80) 
    playersPlayed = [] 

는 단일 플레이어, 단순히 플레이어의 글로벌 목록을 반복하고 playersPlayed의 각 요소에 특정 선수를 비교합니다. 요소가 존재하지 않으면, 그 사람이 플레이 될 수 있고 그 플레이어는리스트에 추가되어야합니다. 특정 라운드에서 플레이어를 찾을 수없는 경우 해당 플레이어에게 작별을 명합니다.

적어도 출발점이되기를 바랍니다.