olavgb Skrevet 14. november 2011 Del Skrevet 14. november 2011 (endret) 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 14. november 2011 av olavgulb Lenke til kommentar
etse Skrevet 15. november 2011 Del Skrevet 15. november 2011 (endret) 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 15. november 2011 av etse Lenke til kommentar
GeirGrusom Skrevet 15. november 2011 Del Skrevet 15. november 2011 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå