Besoin d'aide pour un algo

Signaler
Messages postés
65
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
4 août 2010
-
ben01n
Messages postés
65
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
4 août 2010
-
Salut à tous,
je suis en train de développer un logiciel permettant d'automatiser l'appariement des joueurs dans un tournoi. Pour cela, il faut que j'utilise le système de la ronde suisse. C'est à dire qu'au 1er tours, on distribut les joueurs au hasard en 1 contre 1 sur une table de jeu. De plus il faut pouvoir gerer le fait qu'il n'est pas toujours possible d'éviter que 2 joueurs se rencontrent 2 fois ou qu'un joueur joue 2 fois sur la même table.
Ensuite dans les tours suivant, on fait de même sauf que les joueurs ne doivent avoir déjà joué l'un contre l'autre et ne doivent pas avoir joué sur la table de jeu attribué.

Pour cela j'utilise une base de donnée dans laquelle j'ai fais une table "Match" comportant les champs suivant :
numMatch, numTours, numJoueur1, numJoueur2, numTable

Quelqu'un peut il m'aider car j'arrive pas à faire un algo potable ?

4 réponses

Messages postés
48
Date d'inscription
mercredi 26 mai 2004
Statut
Membre
Dernière intervention
20 septembre 2006

Salut

je penssse, si je comprend bien, qu'une table ds ta base n'est pas sufisante pour gérer tt ca !

il en faudrait au moins quatres:



- JOUEUR(NumJ,Nom)

- MATCH(NumMatch, NumJ1#,NumJ2#,NumT#,numTour#)

- TABLE(NumT)

- TOUR(NumTour)



J'avou ne pas trés bien comprendre cette phrase : "De plus il faut pouvoir gerer le fait qu'il n'est pas toujours possible
d'éviter que 2 joueurs se rencontrent 2 fois ou qu'un joueur joue 2
fois sur la même table." (un peut chian pour l'algo ! ) pour moi : un joueur peut jour 2 fois sur la mm table ms évidament pas contre un mm joueur.



pour l'algo(enfin je vais peu etre pas tt faire nn plus....) du premier tour pas tres compliqué:



-créer un tableau type joueur:

public type Joueur

dim NumJ as Integer

dim nom as string

dim Jou as boolean

end type



- remplir le tableau "joueur" grace a une
requete "select * from joueuer"et n mettant "Jou" a faux pour t
les joueurs,



- ensuite tu parcour ton tableau du debut à la fin
pour remplir la table match pour le premier tou uniquement, ca vait un
truc du style :

Randomize

For i=1 to nombre_de_joueur_ds_le_tableau

if joueur(i).jou=false

index=joueur(int(rnd*nombre_de_joueur_ds_le_tableau))

while joueur(index).jou=true or index=i



index=joueur(int(rnd*nombre_de_joueur_ds_le_tableau))

wend




'la tu fait une pti commande sql pour remplir la table
match avec numj1#-->joueur(i).NumJ et
numj2#-->joueur(index).NumJ (pour la table je sait pas ca fait parti
des chose que g pas bin captés) et NumT#=1 ( faut pas oublier de
remplir ava,t la table "Table" sinon ca risque de chier)

end if

next i



Bon voila pour l premier tour c pas dit que ca va marcher mais ca peut t'aider quand mm !!
























http://ggggunit.free.fr
Messages postés
33
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
20 mai 2007

Voici mon algo, j'utilise ici des structures en mémoire car je n'utilise pas de base de donnée mais des fichiers cepedant la structure de mes données ressembles à celles de ta base de donnée. L'algo fonctionne, il n'est surement pas optimisé à fond vu le nombre de boucle imbriquée mais le temps d'éxécution pour un nombre d'équipe inférieure à 200 est très raisonnable. Si tu as des questions n'hésites pas voilà bon courage :-) :

'Declaration des structures et variables globales
'Contient les informations des equipes
Type StructTeam
numTeam As Integer
NumPlace As Integer
NomPlayer1 As String * 30
PrenomPlayer1 As String * 30
NomPlayer2 As String * 30
PrenomPlayer2 As String * 30
Score As Integer
End Type



'Contient les scores de chaque équipes pour chaque partie
Type StructPartie
numTeam As Integer
NumPartie As Integer
NumScore As Integer
End Type


'Contient tous les parties alétoires déjà tirées
Type StructAleatoireTirer
NumTable As Integer
NumTeam1 As Integer
NumTeam2 As Integer
End Type


Public NBteam As Integer 'Nombre d'équipe'
Public NbPartie As Integer 'Nombre de partie'
'Tableau des équipes
Public TabTeam() As StructTeam
Public TabPartieGenere() As StructAleatoireTirer



'Début des procédures et fonctions
Function ValAle() As Integer
'Retourne un nombre aléatoire compris entre 0 et le nombre d'équipe
Dim Temp As Integer
Randomize
Temp = 0
While Temp = 0
Temp = Rnd * NBteam
Wend
ValAle = Temp
End Function
Private Sub GenerationAleatoire()
'Génére les parties de façon aléatoire en fonction du nombre d'équipe
Dim Taille, parcour, putil, i, col, num1, num2, j As Integer
Dim TabVal() As Integer
Dim bool, atom As Boolean
atom = False

While atom = False
Taille = 1
bool = True
ReDim TabVal(1)
'Cette première partie de l'algo crée un tableau tabval contenant
'tous les numéros d'équipes de façon aléatoire
For i = 1 To NBteam
While bool = True
'ValAle retourne un nombre aléatoire entre 0 et le nombre équipe
putil = ValAle()
bool = False
'On regarde si le numéro d'équipe putil n'est pas déjà dans le tableau
'TabVal contenant toutes les équipes déjà sélectionnées
For parcour = 1 To Taille - 1
If TabVal(parcour) = putil Then
bool = True
End If
Next parcour
Wend
'Lorsque que l'on obtient une équipe non tirée on l'ajoute dans le tableau
'des équipes sélectionnées et on continu
ReDim Preserve TabVal(i)
Taille = Taille + 1
TabVal(i) = putil
bool = True
Next i

atom = True
col = 0
'Lorsque toutes les équipes sont dans le tableau de façon aléatoire
'il faut s'assurer si ce n'est pas la première partie que les équipes ne
'se sont pas déjà rencontrées.
'Dans le tableau tabval on considère que les équipes qui se recontrent sont
'TabVal(i) et TabVal(i + (NBteam / 2)
'Pour la comparaison on utilise une matrice de partie généré ici variable globale.
'Cette matrice contient en colonne les parties générées et en ligne une structure contenant
'le numéro de la table et les deux numéros des équipes qui se sont déjà rencontrées
While col < NbPartie
For j = 0 To NBteam / 2
num1 = TabPartieGenere(col, j).NumTeam1
num2 = TabPartieGenere(col, j).NumTeam2
For i = 1 To NBteam
If (TabVal(i) = num1) Then
If (i < (NBteam / 2)) Then
If (TabVal(i + (NBteam / 2)) = num2) Then
atom = False
End If
Else
If (TabVal(i - (NBteam / 2)) = num2) Then
atom = False
End If
End If
End If
If (TabVal(i) = num2) Then
If (i < (NBteam / 2)) Then
If (TabVal(i + (NBteam / 2)) = num1) Then
atom = False
End If
Else
If (TabVal(i - (NBteam / 2)) = num1) Then
atom = False
End If
End If
End If
Next i
Next j
col = col + 1
Wend
Wend

'On ajoute ensuite dans le tableau de partie générée le numéro des équipes
'de la prochaine partie

'Pour vérifier toutes les solutions ont été générées il suffit de vérifier :
'que le nombre de partie générée est inférieur aux nombres d'équipes - 1 ex :
'2 équipes ==> 1 partie possible
'4 équipes ==> 3 parties possibles
'6 équipes ==> 5 parties possibles
'...

NbPartie = NbPartie + 1
ReDim Preserve TabPartieGenere(NbPartie, NBteam)
'On ajoute la nouvelle partie générée
For i = 0 To (NBteam / 2)
TabPartieGenere(col, i).NumTable = i
TabPartieGenere(col, i).NumTeam1 = TabVal(i)
TabPartieGenere(col, i).NumTeam2 = TabVal(i * 2)
Next i

End Sub
Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
11
Salut,

Joueur d'échecs non ?

Une description complète du système suisse pour les appariements se trouve A CETTE URL
A moins que tu veuilles parler du système suisse accéléré?

Pour l'algo, de l'un ou de l'autre, j'avais fait quelque chose pour mon ancien club il y a quelques années. Je vais essayer de le retrouver mais ce n'est pas garanti.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
Messages postés
65
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
4 août 2010

Merci à tous pour ces réponses rapides.
Je vais voir ce que ça donne avec ce que vous m'avez donné et je vous dirai ce qu'il en est.