ben01n
Messages postés65Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention 4 août 2010
-
22 août 2005 à 16:55
ben01n
Messages postés65Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention 4 août 2010
-
23 août 2005 à 09:18
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 ?
Stan62970
Messages postés48Date d'inscriptionmercredi 26 mai 2004StatutMembreDernière intervention20 septembre 2006 22 août 2005 à 17:37
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 :
'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 !!
mekhanik
Messages postés33Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention20 mai 2007 22 août 2005 à 17:51
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
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200621 22 août 2005 à 18:00
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 !?