Avatar billede farout Nybegynder
04. juni 2002 - 20:33 Der er 11 kommentarer og
1 løsning

Forståelses problem

Hej alle
jeg er på et VB kursus og har fået følgende kode, den har jeg nogle spørgsmål til, da der er nogle ting jeg ikke fatter.

!!!i den her sub er jeg med :o)!!!

Private Sub vis_kort(ByRef kortstak)
Dim farver, valører
Dim i As Integer

farver = Array("Spar", "Klør", "Ruder", "Hjerter")
valører = Array("2", "3", "4", "5", "6", "7", "8", "9", "10", "Knægt", "Dame", "Konge", "Es")
 
  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
Avatar billede terry Ekspert
04. juni 2002 - 20:57 #1
Here's a start....

Private Sub bland_kort()

Const antalkort = 52        52 cards in a set

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
Avatar billede terry Ekspert
04. juni 2002 - 21:06 #2
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

vis_kort kort
Avatar billede martin_moth Mester
05. juni 2002 - 09:31 #3
Ha ha, det skulle vel ikke være opgave 31 i Visual Basic II på netkursus - lave et spil 31? - jeg synes jeg kan genkende problematikken ;o)
Avatar billede terry Ekspert
05. juni 2002 - 09:42 #4
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
.
.
.
.
Avatar billede tjacob Juniormester
05. juni 2002 - 11:30 #5
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.
Avatar billede tjacob Juniormester
05. juni 2002 - 11:32 #6
Der er en lille fejl i en af kommenterne:
'vælg tilfældigt tal mellem 1 og Tilbage= 'vælg tilfældigt tal mellem 0 og Tilbage
Avatar billede farout Nybegynder
05. juni 2002 - 14:54 #7
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.
Avatar billede farout Nybegynder
05. juni 2002 - 15:16 #8
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)
Avatar billede tjacob Juniormester
05. juni 2002 - 16:16 #9
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 ;-)
Avatar billede farout Nybegynder
05. juni 2002 - 18:00 #10
Tjacob nu er jeg med, Tak for hjælpen :o)
Avatar billede farout Nybegynder
05. juni 2002 - 18:02 #11
Rettere sagt Tusinde Tak for hjælpen :o)
Avatar billede tjacob Juniormester
05. juni 2002 - 18:28 #12
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester