Confrontation aléatoire

MonchauxantZ Message lu Posté le 20 Août 2011 à 21:24 Bulle
Avatar de MonchauxantZ
Explorateur

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
Image



MonchauxantZ.
Mod Message lu Posté le 20 Août 2011 à 23:56 Bulle
Avatar de Mod
Webmaster

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 Message lu Posté le 21 Août 2011 à 18:18 Bulle
Avatar de MonchauxantZ
Explorateur

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 ?
Image



MonchauxantZ.
Darktib Message lu Posté le 21 Août 2011 à 18:21 Bulle
Avatar de Darktib
Membre Ultime

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
Répondre
GameCorp - Site d'apprentissage et d'entraide à la création de jeux vidéo.
XHTML Valid 1.1 - Page générée en 0.0816 secondes