Poels zamen stellen in mijn App

Status
Niet open voor verdere reacties.

old Hippy

Gebruiker
Lid geworden
24 mei 2008
Berichten
911
Hallo Allemaal

Ik wil graag automatisch partijen samenstellen.

Er zijn twee teams van 10 personen.
Er wordt per persoon 5 partijen gespeeld.
Er mag dus geen tweemaal een zelfde tegenstander worden gekozen.

Ik heb me suf geprakkiseerd maar kom er niet goed uit.
Hoe dit aan te pakken.
Met textboxen of listboxen of wat voor manier dan ook.

ik wil dus per persoon een lijst met 5 tegenstanders per team

Hopelijk ben ik duidelijk genoeg.

Iemand die mij hier bij kan helpen???

Groeten Old Hippy
 
Neem de linker lijst.

Deze persoon speelt tegen zijn evenknie in de andere lijst + de twee ervoor en de twee erna.

dus:

1 -> 9,10,1,2,3
2 -> 10,1,2,3,4
3 -> 1,2,3,4,5
4 -> 2,3,4,5,6
5 -> 3,4,5,6,7
6 -> 4,5,6,7,8
7 -> 5,6,7,8,9
8 -> 6,7,8,9,10
9 -> 7,8,9,10,1
10 -> 8,9,10,1,2
 
Hi Wampier dank voor de reactie

Dit is een oplossing.
Maar nu moet ik nu wi ik niet dat de indeling iederekeer het zelfde is.
in je voorbeeld speeld speler1 altijd tegen 9,10,1,2,3
Ik wil dit dus als toeval en niet als regel.
 
De regel moet je consequent toepassen, je kunt echter toch de volgorde van de namen veranderen? Nergens staat dat speler 1 altijd dezelfde persoon moet zijn, zolang je de logica maar volgt tijdens het matchen.

Je husselt beide lijsten door elkaar en past bovenstaande toe. Bij een volgende keer hussel je de lijsten opnieuw en past weer bovenstaande toe. Die aanpak is veel eenvoudiger dan proberen 5 random mensen bij iedereen te zoeken.

Overigens kan dat ook wel, maar dan moet je dus een poule gaan maken. Vervolgens de poule leegmaken door mensen te trekken. In mijn ervaring levert dat nauwelijks een betere verdeling, maar het is wel moeilijker te implementeren.
 
Hu ik ga hier mee aan de gang.
zal wel even zoet mee zijn laat je weten als het werkt.

Groet Old Hippy
 
Je kunt een "list" gebruiken:

vul de list via de "addrange" methode met de waarden van je listbox.
trek een random getal tussen 1 en list.count.
haal deze waarde op uit de lijst en plaats hem terug in de listbox.
Haal de waarde uit de lijst met de "removeat" methode.

ga door met stap 2 totdat je list leeg is.
 
Brrrrr Man mijn ouwe hersenen kraken.

Heb je een Code voorbeeldje voor mij met een listbox.
 
Hier wat code om wampiers idee te illustreren:

[cpp]Dim Spelers As New List(Of String)
For Each speler As String In ListBox1.Items : Spelers.Add(speler) : Next

For i = 1 To Spelers.Count
Dim randomObj As New Random, RandomIndex As Integer
RandomIndex = randomObj.Next(0, Spelers.Count)
ListBox1.Items(i - 1) = Spelers(RandomIndex)
Spelers.RemoveAt(RandomIndex)
Next[/cpp]

:)

PS. De AddRange-method werkt niet bij ListBox.Items ;)

Deze code haalt trouwens alle items uit de ListBox en stopt ze random weer terug. Dat was de bedoeling, toch? :)
 
Laatst bewerkt:
Code:
Randomize()
        Dim lijstje As New List(Of String)
        Dim getal As Long

        For Each onderdeel In ListBox1.Items
            lijstje.Add(onderdeel.ToString)
        Next
        ListBox1.Items.Clear()

        While lijstje.Count
            getal = CInt(Int(Rnd() * lijstje.Count))
            ListBox1.Items.Add(lijstje(getal))
            lijstje.RemoveAt(getal)
        End While

Dit werkt op een simpel voorbeeld met een listbox en een button. Vul de listbox met wat info en run deze code van de button.
 
Hu Hu eerst even een zipie van mijn app maken.
voor ik alles in de vernieling help.

Even voor de duidelijkheid de in de listbox met namen komt uit een database.
die ik filter op de straatnaam.
Ons dorp heeft maar tweestraten.
Even een afbeelding als voorbeeld.
wat is dan de meest voordehand liggende ????


Knipsel22.jpg

PS op de afbeelding staan allenamen vande twee straten dus ongefilterd.
 
Laatst bewerkt:
Beide codes werken (hoewel die van joz wel iets netter is).

Zolang je twee lijstjes kunt vullen van de twee teams kun je die bewerken met onze code. Het HOEFT natuurlijk geen listbox te zijn. je kunt ook twee "LIST"s gebruiken die je vult met de twee teams.
 
Ok Ik Was al een beetje op weg
zou het ook met een treeview kunnen????
 
In een TreeView kan het ook. Bedoel je zoiets:

Poel 1
L wampier
L JoZ1

Poel 2
L old Hippy
L Jan

?
 
[CPP] Dim Team1 As String() = {"Speler 1", "Speler 2", "Speler 3", "Speler 4", "Speler 5"}
Dim Team2 As String() = {"Speler 6", "Speler 7", "Speler 8", "Speler 9", "Speler 10"}

For i = 1 To 5 ''//aantal poels
TreeView1.Nodes.Add("Poel " & i.ToString)

''//Nieuwe rijen om het verwijderen van personen mogelijk te maken
Dim Temp1 As New List(Of String), Temp2 As New List(Of String)
Temp1.AddRange(Team1) : Temp2.AddRange(Team2)

For c = 1 To Team1.Length ''//aantal spelers
Dim tegenstanders As String = ""
Dim randomObj As New Random, randomInt As Integer

''//willekeurig persoon uit team 1
randomInt = randomObj.Next(0, Temp1.Count)
tegenstanders = Temp1(randomInt)
Temp1.RemoveAt(randomInt)

Threading.Thread.Sleep(10) ''//Dit is noodzakelijk omdat anders de getallen niet random zijn

''//willekeurig persoon uit team 2
randomInt = randomObj.Next(0, Temp2.Count)
tegenstanders &= " versus " & Temp2(randomInt)
Temp2.RemoveAt(randomInt)

TreeView1.Nodes(i - 1).Nodes.Add(tegenstanders)
Next
Next[/CPP]

Heb 'm gelijk even goed gecomment ;)

Output:

74338480.png
 
Laatst bewerkt:
HI Joz1

Dit is echt mooi maar!

krijg deze fout melding
Warning 1 Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated.

Maar het werkt en ik ga dit verder uitwerken Heel hartelijk dank Joz1 en Wampier

Old Hippy
 
Dat klopt, dat is een warning en geen foutmelding ;)

Komt door deze regel:

[CPP]Threading.Thread.CurrentThread.Sleep(10)[/CPP]

[edit] Die kun je trouwens beter veranderen in:

[cpp]Threading.Thread.Sleep(10)[/cpp][/edit]
 
Laatst bewerkt:
HI Joz1

Toch nog een misser zie afbeelding.

Poel.jpg

Dit is de code bij mij geworden.

Code:
  Private Sub ButtonItem38_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonItem38.Click

        Dim Team1 As String() = {ListBox1.Items.Item(0), ListBox1.Items.Item(1), ListBox1.Items.Item(2), ListBox1.Items.Item(3) _
                                 , ListBox1.Items.Item(4), ListBox1.Items.Item(5), ListBox1.Items.Item(6), ListBox1.Items.Item(7), ListBox1.Items.Item(8), ListBox1.Items.Item(9)}
        Dim Team2 As String() = {ListBox2.Items.Item(0), ListBox2.Items.Item(1), ListBox2.Items.Item(2), ListBox2.Items.Item(3) _
                                 , ListBox2.Items.Item(4), ListBox2.Items.Item(5), ListBox2.Items.Item(6), ListBox2.Items.Item(7), ListBox2.Items.Item(8), ListBox2.Items.Item(9)}

        For i = 1 To 5 ''//aantal poels
            TreeView1.Nodes.Add("Poel " & i.ToString)

            ''//Nieuwe rijen om het verwijderen van personen mogelijk te maken
            Dim Temp1 As New List(Of String), Temp2 As New List(Of String)
            Temp1.AddRange(Team1) : Temp2.AddRange(Team2)

            For c = 1 To Team1.Length ''//aantal spelers
                Dim tegenstanders As String = ""
                Dim randomObj As New Random, randomInt As Integer

                ''//willekeurig persoon uit team 1
                randomInt = randomObj.Next(0, Temp1.Count)
                tegenstanders = Temp1(randomInt)
                Temp1.RemoveAt(randomInt)

                Threading.Thread.CurrentThread.Sleep(10) ''//Dit is noodzakelijk omdat anders de getallen niet random zijn

                ''//willekeurig persoon uit team 2
                randomInt = randomObj.Next(0, Temp2.Count)
                tegenstanders &= "  versus  " & Temp2(randomInt)
                Temp2.RemoveAt(randomInt)

                TreeView1.Nodes(i - 1).Nodes.Add(tegenstanders)
            Next
        Next
    End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan