Text1 = "" For i = 0 To UBound(kortstak) Text1 = Text1.Text & farver(kortstak(i) \ 13) & " " & valører(kortstak(i) Mod 13) & vbCrLf Next End Sub
!!!i bland_kort forstår jeg ikke hvordan man kan undgå at trække det samme kort flere gange? hvis der er en der vil være mega venlig og vedhæfte nogle kommentarer til variablerne jeg er nemlig gået helt kold !!!
Private Sub bland_kort()
Const antalkort = 52
Dim i As Integer, j As Integer Dim udtrukket(antalkort - 1) As Boolean Dim kort(antalkort - 1) As Byte Dim nummer As Byte Dim taeller As Integer
Randomize
For i = antalkort - 1 To 0 Step -1 nummer = Int(Rnd * (i + 1)) + 1
taeller = 0 For j = 0 To antalkort - 1 If Not udtrukket(j) Then taeller = taeller + 1 If taeller = nummer Then udtrukket(j) = True
kort(i) = j Exit For End If Next Next
vis_kort kort End Sub Private Sub Command1_Click() bland_kort End Sub
Dim i As Integer, j As Integer a couple of integers for woking Dim udtrukket(antalkort - 1) As Boolean an array of 52 (0-51) Booleans Dim kort(antalkort - 1) As Byte an array of 52 (0-51) Bytes Dim nummer As Byte Dim taeller As Integer
Randomize Initialize the randomize generator
For i = antalkort - 1 To 0 Step -1 Loop starting at 51 in increments of -1 nummer = Int(Rnd * (i + 1)) + 1 pick a random number
taeller = 0 For j = 0 To antalkort – 1 Loop from 0 to 51 If Not udtrukket(j) Then taeller = taeller + 1 test if TRUE or FALSE if FALSE increment tæller If taeller = nummer Then udtrukket(j) = True
kort(i) = j Exit For End If Next Next
vis_kort kort End Sub Private Sub Command1_Click() bland_kort End Sub
so what is happening (I think) is that the random (rnd) function picks a number then If Not udtrukket(j) is used to check to make sure that the card has not already been picked if NOT then it sets it to picked (udtrukket(j) = True) and then sets the Kort (i) to the value j. This continues until ALL cards have been picked and then the cards are shown
You can also use the debugger to step you way through the program at your own pace. Or set some debug.print statements in the code so you can see th values in the debug window.
For i = antalkort - 1 To 0 Step -1 Debug.print "i = " & i nummer = Int(Rnd * (i + 1)) + 1 Debug.print "nummer = " & nummer . . . .
Jeg ved godt det ikke er det du spørger om, men det kan gøres betydeligt simplere (og hurtigere):
Sub BlandKort() Dim Bunke(51) As Integer, TempBunke(51) As Integer '2 arrays med 52 pladser Dim i As Integer 'tæller til For-Next løkke Dim AktueltKort As Integer 'kortet vi skriver til Bunke Dim Tilbage As Integer 'tæller -hvor mange kort mangler vi?
For i = 0 To 51 TempBunke(i) = i 'giv hvert kort en unik værdi mellem 0 og 51 Bunke(i) = -1 'nulstil alle kort(-1 =tom) Next i
Randomize 'start tilfældigheds-generator Tilbage = 52 For i = 0 To 51 'gentag denne løkke 52 gange AktueltKort = Int(Tilbage * Rnd) 'vælg tilfældigt tal mellem 1 og Tilbage Bunke(i) = TempBunke(AktueltKort) 'dette kort sættes på i i bunken Tilbage = Tilbage - 1 'nu er der et kort færre TempBunke(AktueltKort) = TempBunke(Tilbage) 'dette kort fjernes fra TempBunke Next i
End Sub
Bunke() indeholder nu de 52 kort i tilfældig rækkefølge.
Martin Tæt På :o) Tjacob Det ser straks mere overskueligt ud, jeg har aldrig forstået if not, jeg syntes den er død forvirrende :o)lav lige din kommentar om til et svar så kan du og terry dele points.
men Tjacob Det jeg ikke lige fatter :o) er hvis nu aktueltkort bliver 11, hvordan kan jeg så se at det er lige netop tallet 11 der bliver fjernet, jeg ville jo mene at tilbage blev til 50 i den linie her under Tilbage = Tilbage - 1 'nu er der et kort færre og så kan aktuelt kort jo kun blive noget mellem 0 og 50 i næste gennemløb AktueltKort = Int(Tilbage * Rnd)
Undskyld men jeg er kommet tættere men jeg er stadig ikke helt med (det siger vist en hel del om mig lol)
Det bliver fjernet derved at TempBunke(11) (som den rigtige bunke har fået værdien fra) får værdien Tempbunke(50) (=50).
dvs at hvis AktueltKort næste gang er 11 igen (det kan jo godt ske), så får Bunke (næste plads i Bunke) værdien Tempbunke(11) igen, men nu har Tempbunke(11) en anden værdi end den havde før, nemlig 50, som er den størst mulige værdi. TempBunke(AktueltKort) får hver gang den størst mulige værdi (som bliver mindre og mindre). DVS at selvom vi får 52 11'ere i træk så optræder hver værdi kun en gang.
TempBunke(11) får så ny værdi igen osv.
Systemet bygger på at den tilskrevne værdi (til Bunke -fra TempBunke) ændres hver gang.
Du kan se at et tal er fjernet ved at Tempbunke(x) ikke længere har værdien x.
Systemet er meget lig det dit eksempel, ved at Bunke tilskrives værdier opadgående (fra 0 til 51), men værdierne der tages (fra TempBunke) ændres til nye værdier nedadgående (51 til 0). ligesom i=51 To 0 mens j=0 To 51 i dit eksempel.
Håber det bringer lidt klarhed. Det er svært at forklare med ord ;-)
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.