Virker fint, men så bliver jeg jo ved med at have en masse kort så jeg skal have noget med at efter den har vist mit kort så bliver det fjernet noget i stil med kort_arry remove (i) eller sådan noget
Er forholdsvis begynder til det her endnu så en vild avanceret kode kan jeg ikke bruge til noget.
Hvordan ville i løse problemet og hvordan kommer jeg her på rette vej?
Så nielle så har jeg fået kigget lidt på det. Har lige lavet en copy + paste.
Altså jeg får random kort. Sådan ca da, men det gjorde jeg også i mit eget eksempel da jeg brugte arry og ikke queue.
Problemet er bare stadig at jeg bliver ved med at have mine kort. Jeg har som sagt brug for noget som så efterfølgende sletter mine kort fra mit arry. Eks med din kode som bliver kørt igennem er resultatet:
9-3-3-8-6-4-9-2-6-6-7-4-3
Som du kan se får jeg de samme kort mere end en gang. Det er ik rigtig meningen i et spil kort, så som efterlyst tidliger søger jeg noget kode som efterfølgende sletter mine kort fra mit arry så det ikke bliver genbrugt før jeg starter et nyt spil.
Nielles loop er blot en simpel blandingsalgoritme.
Hvis det samme tal optræder mere end en gang, er det fordi det gør det i den oprindelige ArrayList.
Den funktionalitet du efterlyser kan du opnå ved at fjerne allerede brugte elementer i listen f.eks. sådan:
et kort = kort(0) kort.RemoveAt(0)
På denne måde trækker du hele tiden det første element, og derefter fjerner du det, så det næste element bliver det første til næste gang. Denne fremgangsmåde kræver naturligvis at listen er blandet først, hvis trækket skal være tilfældig.
For i øvrigt vil jeg anbefale dig at bruge List i stedet for ArrayList, hvis listen kun skal indeholde en type.
Altså Dim kort As New List(Of String)
-Så slipper du for en masse type konverteringer (I hvert fald hvis du bruger Option Strict On, hvad der kan anbefales).
Dim kort As New List(Of String) Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer = 0 i = CInt((Rnd() * 8)) MsgBox(i) PictureBox1.Image = Image.FromFile(kort(i)) kort.RemoveAt(i) MsgBox("Kort tilbage " & kort.Count) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click kort.Add("Cards\1_1.gif") kort.Add("Cards\1_2.gif") kort.Add("Cards\1_3.gif") kort.Add("Cards\1_4.gif") kort.Add("Cards\1_5.gif") kort.Add("Cards\1_6.gif") kort.Add("Cards\1_7.gif") kort.Add("Cards\1_8.gif") kort.Add("Cards\1_9.gif") MsgBox(kort.Count) End Sub End Class
Jeg skal bare have gjort sådan at i ikke er den samme 2 gange, men det kan jeg forstå på dig at nielle's kode gør?
Eller hvordan ville du lave det?
Og bare skriv det som et svar for jeg er kommet videre med det du har skrevet og det var lige det jeg manglede.
Din kode ser ud til at køre som den skal. Når du fjerner element i, -som er valgt tilfældigt, behøver du ikke blande først.
Det er jo ligegyldigt at du trækker to ens i:
i=5: Du fjerner element 5 i listen næste gang: i=5: Nu er det 5. element jo et andet end før!
Men du har en fejl: i = CInt((Rnd() * 8)) << du trækker et tal mellem 0 og 8
Men anden gang du trækker er der et element mindre. Så du skal bruge: i = CInt((Rnd() * kort.Count - 1)), således at du trækker et tal mellem 0 og listens størrelse.
Det er muligt at der skal noget +/- 1 til. Jeg har ikke lige mulighed for at teste hvor jeg sidder.
PS: Jeg synes at du skal dele pointene, da Nielle kom med ideen om en liste.
Ja men tjacob så vil jeg dele points ud til jer begge. Jeg vil så dele sådan at du får 125 og nielle 75.
Lyder det rimelig så må nielle lige smide et svar også.
Og ja du har ret tjacob med at når i er fjernet så har jeg jo et andet kort. Det havde jeg ikke lige tænkt over... Så det ser ud til jeg har lidt at arbejde med når den lille er kommet i seng så igen tak til jer begge.
iøvrigt tjacob så havde jeg også selv prøvet ideen med i = CInt((Rnd() * kort.Count - 1)) men kan ikke få den til at virke.
Derfor mit loop.
Tjek lige den her:
Dim i As Integer If kort.Count = 0 Then MsgBox("Der er ikke flere kort at vælge imellem") Exit Sub End If i = CInt((Rnd() * kort.Count - 1)) PictureBox1.Image = Image.FromFile(kort(i)) kort.RemoveAt(i) MsgBox("Der er nu " & kort.Count & " tilbage") End Sub
Så er problemet når den siger. Der er nu 3 kort tilbage. Så stopper den hver gang.
Indekset lå uden for området. Det må ikke være negativt og skal være mindre end størrelsen på samlingen. Parameternavn: index
men hvis jeg nu IKKE filføjer noget til mit arry og trykker på min knap siger den fint nok at der ikke er flere kort. Har også prøvet med + 1 virker heller ikke
Springer bare over på denne her, men ellers tak. :)
Min pointe med at blande kortene var egentlig blot at man så havde blandet dem fra starten og at man derfor efterfølgende kunne vælge 1. kort og dernæst 2. kort og 3. osv. uden at skulle tænke på random senere hen. Det svare jo egentligt til at man blander sine kort *inden* at man begynder at spille - i stedet for at trække et tilfældigt kort midt fra bunken hver gang man skal have et.
Husk i øvrigt Randomize() - ellers får du det samme spil hver eneste gang!
Ja for jeg har tit tænkt over hvorfor man først skriver randomize og så Rnd og tænkte det kunne være folk af gammel vane fra de gamle vb programmer men nu ved jeg det så.
Ja men nielle din ide er også fin så er du sikker på du ikke vil være med til at have points?
Ja men alt hvad folk siger angående net tager jeg til mig da jeg er helt ny til dette
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.