|
MonchauxantZ
|
Posté le 20 Août 2011 à 21:24
|
|

Messages : 117
GCPoints : 26910
|
Yop les gens :)
J'explique donc d'abord la situation...
On me demande un logiciel de pétanque qui fait entrer le nom des équipes, des manches, du concours...
Jusque là pas de problème :D
Ensuite il faut confronter les équipes aléatoirement.
Le problème est là...
Je travaille avec des listes chaînées (IRL ça fait un peu des fiches avec les renseignements :D)
J'avais d'abord pensé à ça :
1
2
3
4
5
6
On sélectionne un des chiffres avec un Random, puis un autre.
Seul problème, on peut obtenir 1-6 puis ensuite 1-4 par exemple... pour un seul tour :/
En plus on peut obtenir 1-1 et alors là :D
J'ai ensuite pensé à faire :
1 4
2 5
3 6
Idem, du Random.
Ça élimine le 1-1, mais pas le 1-6 et 1-4...
J'ai donc pensé à faire (Oui je pense assez souvent dans ce topic... assez rare, je m'impressionne moi même sur ce coup :D) :
1 23456
2 13456
Ainsi de suite...
Maaais... Si on obtient 1-2 au premier tour, on obtiendra 2-x à l'autre... On a toujours le problème de double-confrontation :/
Je demandais donc de l'aide sur cet aléatoire.
J'utilise PureBasic mais j'imagine que les listes existent aussi dans les autres langages :D
Merci :D
|
|
Mod
|
Posté le 20 Août 2011 à 23:56
|
|

Messages : 4954
GCPoints : 2100823
|
Je ne suis pas vraiment spécialiste es concours, donc je vais peut-être répondre à côté de la plaque, mais le moyen le plus simple que je vois est de retirer un élément de la liste une fois qu'il a été traité.
Un peu dans ce genre là (je n'ai pas codé en PureBasic depuis des années, donc possible que je me trompe) :
Code : PureBasic
Structure Match
Team1.l
Team2.l
EndStructure
teamCount.l = 6
NewList list.l()
NewList matches.Match()
For t = 1 To teamCount
AddElement(list())
list = t
Next
i.l = 0
Repeat
match = match + 1
AddElement(matches())
matches()\Team1 = Random(teamCount - i * 2)
SelectElement(list(), matches()\Team1)
DeleteElement(list())
matches()\Team2 = Random(teamCount - (i * 2 + 1))
SelectElement(list(), matches()\Team2)
DeleteElement(list())
Until ListSize(list()) = 0
|
|
MonchauxantZ
|
Posté le 21 Août 2011 à 18:18
|
|

Messages : 117
GCPoints : 26910
|
En fait il s'agit donc d'un random mais supprimant l'élément ajouté de la liste ?
Seulement, j'y ai pensé, mais que faire quand on a plusieurs manches ? On copie la liste en autant de manches ?
|
|
Darktib
|
Posté le 21 Août 2011 à 18:21
|
|

Messages : 4017
GCPoints : 347288
|
C'est en effet la solution la plus logique.
Mais il y a aussi une autre manière : avec X équipes, tu stockes un tableau à deux dimensions de taille X * X. La case d'indice (i,j) contient le score pour le match entre l'équipe i et l'équipe j.
Pour le type des cases: structure contenant deux entiers, score1 et score2 (équipe1 / équipe 2). Initialement, les scores des cases sur la diagonale sont -1,-1 - pour indiquer que la rencontre est impossible - et 0,0 pour toutes les autres cases, ce qui veut dire que la rencontre est possible.
Tu choisis une case (i,j) au hasard dont les scores sont 0,0 : la rencontre est possible. A la fin du match, les cases (i,j) et (j,i) sont mises à jour avec les scores. Suffit de recommencer...
Le plus: c'est très facilement représentable à l'écran, et ça consomme peu de mémoire (moins que pour la méthode avec les listes) vu que tu garde aussi les scores dans le tableau.
Par contre, je n'ai jamais programmé en PureBASIC... donc pas de code ;)
edit: si tu as plusieurs manches, suffit de stocker plusieurs couples de scores dans chaque case.
Dernière édition le 21 Août 2011 à 18:21
|