Gå til innhold

Legge til en tilfeldig, ikke repeterende liste i combobox?


Anbefalte innlegg

Case'n er gloseprøve i Visual Studio 2010.

 

Brukeren velger fra- og til-språk i to nedtrekksmenyer(combobox(cbxSvar i koden)). F.eks. Fra Engelsk til Norsk. Han får så opp det engelske ordet og en ny combobox med 5 alternativer på norsk.

 

Det vi sliter med er å få 5 forskjellige alternativer i tilfeldig rekkefølge, der svaret selvfølgelig også er blant alternativene. Vi har fått til å vise 5 alternativer der svaret er i tilfeldig plassering(ikke kun øverste eller nederste plassering), men det blir alltid noen alternativer som kommer opp dobbelt, og derfor tar plassen til fasiten også noen ganger.

 

Så er det noen tips til hvordan vi kan legge til 5 tilfeldige alternativer der ingen er gjentatt flere ganger, og fasiten er tilfeldig plassert på lista?

 

Den lille koden vi bruker for å legge de til:

 

 

 

 

  cbxSvar.Items.Clear()

  For j = 0 To 4 'Legger ut 5 alternativer i tilfeldig rekkefølge


           cbxSvar.Items.Add(alternativer(Int(Rnd() * 4)))
       Next j

Vi henter der tilfeldige ord fra en forhåndslagret tabell.

 

 

 

Jeg har prøvd meg på en måte for å få det til, med å legge til først 2 alternativer, så teste om de er like. Om de er det kjøres det en loop der det siste tallet blir byttet ut med nytt tilfeldig tall frem til de er ulike. Legger så til ett og ett alternativ og tester det nye alternativet mot de andre. Koden:

 

 

 

EDIT: Fargeleggingen ble ikke helt riktig her i forumet, men dere skjønner det nok allikevel håper jeg.

 

 

    cbxSvar.Items.Clear()

   cbxSvar.Items.Add(alternativer(Int(Rnd() * 4))) 'Item 0, alternativ 1
   cbxSvar.Items.Add(alternativer(Int(Rnd() * 4))) 'Item 1, alternativ 2
       If cbxSvar.Items(1) = cbxSvar.Items(0) Then 'Alt 1 og 2 er like
                       Do
               cbxSvar.Items.RemoveAt(1) 'Fjerner Item 1, alternativ 2
               cbxSvar.Items.Add(alternativer(Int(Rnd() * 4))) 'Legger til ny Item 1, alternativ 2
           Loop Until cbxSvar.Items(1) <> cbxSvar.Items(0) ' Loop inntil de er ulike 
       End If 'alt er i orden
               cbxSvar.Items.Add(alternativer(Int(Rnd() * 4))) 'Item 2, alternativ 3
       If cbxSvar.Items(2) = cbxSvar.Items(0) Or cbxSvar.Items(1) = cbxSvar.Items(2) Then 'Item 2, alternativ 3 er like med alt 1 eller alt 2
  					Do
               cbxSvar.Items.RemoveAt(2) 'Fjerner Item 2, alternativ 3
               cbxSvar.Items.Add(alternativer(Int(Rnd() * 4))) ' Legger til ny Item 2, alternativ 3
           Loop Until cbxSvar.Items(2) <> cbxSvar.Items(0) And cbxSvar.Items(2) <> cbxSvar.Items(1) 'Looper inner alle er ulike
       End If 'Alt er i orden
  			cbxSvar.Items.Add(alternativer(Int(Rnd() * 4))) 'Item 3, alternativ 4
       If cbxSvar.Items(3) = cbxSvar.Items(0) Or cbxSvar.Items(3) = cbxSvar.Items(1) Or cbxSvar.Items(3) = cbxSvar.Items(2) Then 'Item 3, alternativ 4 er like med alt 1, alt 2 eller alt 3
                     Do
               cbxSvar.Items.RemoveAt(3) 'Fjerner Item 3, alternativ 4
               cbxSvar.Items.Add(alternativer(Int(Rnd() * 4))) 'Legger til ny Item 3, alternativ 4
           Loop Until cbxSvar.Items(3) <> cbxSvar.Items(2) And cbxSvar.Items(3) <> cbxSvar.Items(1) And cbxSvar.Items(3) <> cbxSvar.Items(0) 'Looper inntil alternativ 4 er ulik alle de andre alternativene
       End If  'Alt er i orden

 

Denne er tungvind, både for programmereren og datamaskinen, da programmet krasjer dersom alternativ 4 er like med noen av de andre. Regner da også med at om jeg hadde lagt til alternativ 5 så hadde det også krasjet.

 

 

 

 

 

Noen tips? :)

 

Mvh Olav B, G ;)

Endret av olavgulb
Lenke til kommentar
Videoannonse
Annonse

Du kan jo gjøre noe lignende dette:

Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim tmp As New List(Of String)
       For j = 0 To 20
           tmp.Add(j.ToString())
       Next

       Dim tmp2 = CreateList("Riktig_svar!", tmp, 4)
       ComboBox1.Items.Clear()
       ComboBox1.Items.AddRange(tmp2)
   End Sub

   Private Function CreateList(ByVal answer As String, ByVal wordList As List(Of String), ByVal count As Integer)
       Dim choices(0 To count) As String, x As String, rand As New Random
       Dim answer_pos = rand.Next(0, count + 1)

       choices(answer_pos) = answer

       For j = 0 To count
           If Not (j = answer_pos) Then
               Do 
                   x = rand.Next(0, wordList.Count + 1)
               Loop While choices.Contains(x)
               choices(j) = x
           End If
       Next

       Return (choices)
   End Function

End Class

 

Her har jeg laget en funksjon som heter "createList". Denne tar som input parametere:

- answer (string): Det riktige svaret som skal være med

- wordList (List(Of string)) : En liste med alle de mulige ordene som skal være mulige forslag

- count (integer) : Hvor mange alternativer ønsker du totalt inklusive det riktige alternativet.

 

Funksjonen vil da returnerer et array med alle alternativene. Dette arrayet kan deretter bare puttes inn i en ComboBoc med å bruke "AddRange()"

Endret av etse
Lenke til kommentar

Du kan lage en klasse som representerer hver glose:

 

Public Class Glose
 Public Value1 As String
 Public Value2 As String

 Public Sub New(ByVal v1 As String, ByVal v2 As String)
   Value1 = v1
   Value2 = v2
 End Sub

 Public Overrides Function ToString() As String
   Return Value1
 End Function
End Class

 

Deretter kan du lage en liste

 

Dim MyList As New List(Of Glose)

 MyList.Add(en_glose)
 ...

 

For å sette denne i tilfeldig rekkefølge kan du rett og slett gjøre slik:

 

Dim rnd As New Random()
Dim result = MyList.OrderBy(rnd.Next).ToArray()

 

Skal du bare velge X fra listen kan du gjøre slik:

 

Dim result = MyList.OrderBy(rnd.Next).Take(X).ToArray()

 

Legg disse inn i comboboxen, og du kan caste SelectedItem til Glose. Value1 vil vises som verdien i comboboxen.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...