Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. Visual Basic
  4. Need Help with Shuffle of a deck

Need Help with Shuffle of a deck

Scheduled Pinned Locked Moved Visual Basic
help
40 Posts 4 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Y ymilan

    Hello, Well it still shows two of a kinds after the shuffle. I've tried various things with While and Do nested loops and same with If Then EndIf, but nothing seems to work...I'm trying though. Any ideas?

    R Offline
    R Offline
    riced
    wrote on last edited by
    #31

    I'm not sure what the program is supposed to do so not sure why it's not working. Can you tell me what the form looks like (e.g. how many image controls it displays)? What should happen when the Start button is clicked (I assume Start is a button)? Should it display one card or more than one?

    Regards David R

    Y 1 Reply Last reply
    0
    • R riced

      I'm not sure what the program is supposed to do so not sure why it's not working. Can you tell me what the form looks like (e.g. how many image controls it displays)? What should happen when the Start button is clicked (I assume Start is a button)? Should it display one card or more than one?

      Regards David R

      Y Offline
      Y Offline
      ymilan
      wrote on last edited by
      #32

      Well, it is displaying all the cards 4 across and 13 down in full suits w/out jokers, of course. Then when the cards are random and shuffled, they should display the same amount of cards in same positions, but random ones. What happens when I compile and run the program, is that more of one of the same cards are displayed, thus showing not totally random cards. Somehow, I'm thinking Card1 should not equal Card2 from the random procedure, then the cards are shuffled, and then distributed out....but there is no code that shows Card1 should not equal to Card2 at all, for to be randomly displayed. Any ideas? Thank you.

      R 1 Reply Last reply
      0
      • Y ymilan

        Well, it is displaying all the cards 4 across and 13 down in full suits w/out jokers, of course. Then when the cards are random and shuffled, they should display the same amount of cards in same positions, but random ones. What happens when I compile and run the program, is that more of one of the same cards are displayed, thus showing not totally random cards. Somehow, I'm thinking Card1 should not equal Card2 from the random procedure, then the cards are shuffled, and then distributed out....but there is no code that shows Card1 should not equal to Card2 at all, for to be randomly displayed. Any ideas? Thank you.

        R Offline
        R Offline
        riced
        wrote on last edited by
        #33

        So you have 52 Image1() controls and want to display the deck in them?. Do the indexes for the controls go from 1 to 52 or from 0 to 51? You should be able to find that from the properties in the designer. Depending on whether it's 0-51 or 1-52 there could be a simple solution. How do the Image1() controls get filled with pictures when the program starts up? Is there any code that fills them (probably in Form_Load event if there is)? Or did you set them in the designer? I managed to dig out an old machine that still had VB6 on and had a little play - frightening how much I'd forgotten about Image controls!

        Regards David R

        Y 2 Replies Last reply
        0
        • R riced

          So you have 52 Image1() controls and want to display the deck in them?. Do the indexes for the controls go from 1 to 52 or from 0 to 51? You should be able to find that from the properties in the designer. Depending on whether it's 0-51 or 1-52 there could be a simple solution. How do the Image1() controls get filled with pictures when the program starts up? Is there any code that fills them (probably in Form_Load event if there is)? Or did you set them in the designer? I managed to dig out an old machine that still had VB6 on and had a little play - frightening how much I'd forgotten about Image controls!

          Regards David R

          Y Offline
          Y Offline
          ymilan
          wrote on last edited by
          #34

          Firstly, I would like to thank you for being so cool for helping me on this project. I truly appreciate it. As far as the image1() controls, they were created in the design page all lined up with different bitmaps representing them. Then the first image card would be image1(0) to image1(52) for the final card. Wait a second....just came back to reading this and realized in the designer the first card of the array is 0, then the final card is labeled 52. Isn't it supposed to be 51? Why is it doing that....it looks like I set up the suits perfectly in order..... No specific code that fills the array of images, just designed in designer form and added that way. Thought that would be easier, but perhaps there is a disadvantage of doing it that way?

          R 1 Reply Last reply
          0
          • R riced

            So you have 52 Image1() controls and want to display the deck in them?. Do the indexes for the controls go from 1 to 52 or from 0 to 51? You should be able to find that from the properties in the designer. Depending on whether it's 0-51 or 1-52 there could be a simple solution. How do the Image1() controls get filled with pictures when the program starts up? Is there any code that fills them (probably in Form_Load event if there is)? Or did you set them in the designer? I managed to dig out an old machine that still had VB6 on and had a little play - frightening how much I'd forgotten about Image controls!

            Regards David R

            Y Offline
            Y Offline
            ymilan
            wrote on last edited by
            #35

            Should there be a -1 somewhere in the code, making the array of images to go back one integer?

            1 Reply Last reply
            0
            • Y ymilan

              Firstly, I would like to thank you for being so cool for helping me on this project. I truly appreciate it. As far as the image1() controls, they were created in the design page all lined up with different bitmaps representing them. Then the first image card would be image1(0) to image1(52) for the final card. Wait a second....just came back to reading this and realized in the designer the first card of the array is 0, then the final card is labeled 52. Isn't it supposed to be 51? Why is it doing that....it looks like I set up the suits perfectly in order..... No specific code that fills the array of images, just designed in designer form and added that way. Thought that would be easier, but perhaps there is a disadvantage of doing it that way?

              R Offline
              R Offline
              riced
              wrote on last edited by
              #36

              It looks like you have missed an index somewhere. The only way to find out is to go through them one by one. The reason I asked was that I thought if the indexes go from 1 to 52 you could have an Image1(0) that can be made invisible (you could do this in the Form_Load event, and it wouldn't matter where it is on the screen). You could then use this in the shuffle instead of tmpCard when doing the swap. That way you know it is the correct type. So you could have something like this for swapping:

              If (card1 <> card2) Then
              Image1(0).Picture = Image1(card1).Picture
              Image1(card1).Picture = Image1(card2).Picture
              Image1(card2).Picture = Image1(0).Picture
              End If

              In your loop I'd avoid using the goto, you need something like:

              For counter = 1 to 100 'Do 100 swaps to shuffle deck
              'do the shuffling here
              Next counter

              A disadvantage of setting the bitmaps in the designer is that it would be tedious to set the images to use a different set of cards (but that probably isn't a worry). Another one is you have to make sure you don't have gaps in the indexes and it looks like you have a gap (else the indexes would be 0 to 51). Because of the way card1 and card2 are calculated they will be between 1 and 52 so your indexes for Image1() need to be in the same range. This avoids having to do -1 somewhere to get the correct range (in fact you could just drop the +1 when calculating card1 and card2 instead of using -1).

              Regards David R

              Y 2 Replies Last reply
              0
              • R riced

                It looks like you have missed an index somewhere. The only way to find out is to go through them one by one. The reason I asked was that I thought if the indexes go from 1 to 52 you could have an Image1(0) that can be made invisible (you could do this in the Form_Load event, and it wouldn't matter where it is on the screen). You could then use this in the shuffle instead of tmpCard when doing the swap. That way you know it is the correct type. So you could have something like this for swapping:

                If (card1 <> card2) Then
                Image1(0).Picture = Image1(card1).Picture
                Image1(card1).Picture = Image1(card2).Picture
                Image1(card2).Picture = Image1(0).Picture
                End If

                In your loop I'd avoid using the goto, you need something like:

                For counter = 1 to 100 'Do 100 swaps to shuffle deck
                'do the shuffling here
                Next counter

                A disadvantage of setting the bitmaps in the designer is that it would be tedious to set the images to use a different set of cards (but that probably isn't a worry). Another one is you have to make sure you don't have gaps in the indexes and it looks like you have a gap (else the indexes would be 0 to 51). Because of the way card1 and card2 are calculated they will be between 1 and 52 so your indexes for Image1() need to be in the same range. This avoids having to do -1 somewhere to get the correct range (in fact you could just drop the +1 when calculating card1 and card2 instead of using -1).

                Regards David R

                Y Offline
                Y Offline
                ymilan
                wrote on last edited by
                #37

                Very astute. Thank you for the explanations. Have a wonderful holiday!

                1 Reply Last reply
                0
                • R riced

                  It looks like you have missed an index somewhere. The only way to find out is to go through them one by one. The reason I asked was that I thought if the indexes go from 1 to 52 you could have an Image1(0) that can be made invisible (you could do this in the Form_Load event, and it wouldn't matter where it is on the screen). You could then use this in the shuffle instead of tmpCard when doing the swap. That way you know it is the correct type. So you could have something like this for swapping:

                  If (card1 <> card2) Then
                  Image1(0).Picture = Image1(card1).Picture
                  Image1(card1).Picture = Image1(card2).Picture
                  Image1(card2).Picture = Image1(0).Picture
                  End If

                  In your loop I'd avoid using the goto, you need something like:

                  For counter = 1 to 100 'Do 100 swaps to shuffle deck
                  'do the shuffling here
                  Next counter

                  A disadvantage of setting the bitmaps in the designer is that it would be tedious to set the images to use a different set of cards (but that probably isn't a worry). Another one is you have to make sure you don't have gaps in the indexes and it looks like you have a gap (else the indexes would be 0 to 51). Because of the way card1 and card2 are calculated they will be between 1 and 52 so your indexes for Image1() need to be in the same range. This avoids having to do -1 somewhere to get the correct range (in fact you could just drop the +1 when calculating card1 and card2 instead of using -1).

                  Regards David R

                  Y Offline
                  Y Offline
                  ymilan
                  wrote on last edited by
                  #38

                  Ok, I still had a little trouble with getting double cards, so I tried this and it seems to work as I test it; must do some more testing, but I think I'm ready to move on to the next task. Thanks so much. Here's the code I have: Option Explicit Public Sub Main() Start_Game.Show End Sub Private Sub Exit_Click() MsgBox ("Thank you for playing! Good bye") End End Sub Private Sub Start_Click() Dim arrDeck(52) Randomize Dim Cardcount As Integer Dim Counter As Integer Dim Card1 As Integer Dim Card2 As Integer ' Fill deck with cards in order 1 to 52 Cardcount = 0 Do While Cardcount <= 51 arrDeck(Cardcount) = Cardcount Cardcount = Cardcount + 1 Loop ' Shuffle the deck - end value (100) Counter = 0 For Counter = 0 To 100 Card1 = Int(52 * Rnd) Card2 = Int(52 * Rnd) If (Card1 <> Card2) Then Image1(0).Picture = Image1(Card1).Picture Image1(Card1).Picture = Image1(Card2).Picture Image1(Card2).Picture = Image1(0).Picture End If Next Counter ' Re-shuffle the deck Counter = 0 For Counter = 0 To 100 Card1 = Int(52 * Rnd) Card2 = Int(52 * Rnd) If (Card1 <> Card2) Then Image1(0).Picture = Image1(Card1).Picture Image1(Card1).Picture = Image1(Card2).Picture Image1(Card2).Picture = Image1(0).Picture End If Next Counter ' Now output images in order Counter = 0 For Counter = 0 To 51 Image1(Counter).Visible = True Next Counter End Sub

                  R 1 Reply Last reply
                  0
                  • Y ymilan

                    Ok, I still had a little trouble with getting double cards, so I tried this and it seems to work as I test it; must do some more testing, but I think I'm ready to move on to the next task. Thanks so much. Here's the code I have: Option Explicit Public Sub Main() Start_Game.Show End Sub Private Sub Exit_Click() MsgBox ("Thank you for playing! Good bye") End End Sub Private Sub Start_Click() Dim arrDeck(52) Randomize Dim Cardcount As Integer Dim Counter As Integer Dim Card1 As Integer Dim Card2 As Integer ' Fill deck with cards in order 1 to 52 Cardcount = 0 Do While Cardcount <= 51 arrDeck(Cardcount) = Cardcount Cardcount = Cardcount + 1 Loop ' Shuffle the deck - end value (100) Counter = 0 For Counter = 0 To 100 Card1 = Int(52 * Rnd) Card2 = Int(52 * Rnd) If (Card1 <> Card2) Then Image1(0).Picture = Image1(Card1).Picture Image1(Card1).Picture = Image1(Card2).Picture Image1(Card2).Picture = Image1(0).Picture End If Next Counter ' Re-shuffle the deck Counter = 0 For Counter = 0 To 100 Card1 = Int(52 * Rnd) Card2 = Int(52 * Rnd) If (Card1 <> Card2) Then Image1(0).Picture = Image1(Card1).Picture Image1(Card1).Picture = Image1(Card2).Picture Image1(Card2).Picture = Image1(0).Picture End If Next Counter ' Now output images in order Counter = 0 For Counter = 0 To 51 Image1(Counter).Visible = True Next Counter End Sub

                    R Offline
                    R Offline
                    riced
                    wrote on last edited by
                    #39

                    Glad to hear you're making progress. Here's a version I knocked up that populates the Image1() array from files on disk. It also does the shuffle and (I think!) it works - just done some quick checking and can't see duplicates. It's got some constants in that I used to get spacing for the images. It also has hard coded file path to where I put the bitmap files. It's been a bit of fun going back to VB6 - I've been using C# for the last few years (with a little bit of VB.NET). If you decide to try VB.NET be warned it's only superficially the same as VB6 - it's really a very different language.

                    Option Explicit

                    Private Const OFFSET_X As Integer = 600
                    Private Const OFFSET_Y As Integer = 600
                    Private Const CARD_WIDTH As Integer = 1305
                    Private Const CARD_HEIGHT As Integer = 1425
                    Private Const COL_SPACE As Integer = 150
                    Private Const ROW_SPACE As Integer = 150

                    '---------------------------------------------------------------------------------------
                    ' Initialise the Image1() control array when the Form is loaded.
                    ' Has to be done somewhere and this seems sensible place.
                    '---------------------------------------------------------------------------------------
                    Private Sub Form_Load()
                    ' Need to fill the Image() control array with bitmap pictures of cards
                    ' Assume that we have 52 bitmaps - Card_1.bmp to Card_52.bmp.
                    ' This makes it possible to fill the control array in a loop
                    Dim left As Long
                    Dim top As Long
                    Dim fileroot As String
                    Dim i As Integer
                    Dim j As Integer
                    Dim index As Integer

                    fileroot = "C:\VB6_Progs\Cards\Card_" 'This is where I store the bitmaps
                    SetImageZero (fileroot) 'Sets Image1(0) with dummy picture and makes it invisible

                    For i = 0 To 12 'NOTE: Using 0-12 and 0-3 makes calculation of index simpler
                    top = i * (CARD_HEIGHT + COL_SPACE) + OFFSET_Y
                    For j = 0 To 3
                    left = j * (CARD_WIDTH + ROW_SPACE) + OFFSET_X
                    index = 4 * i + j + 1
                    Load Image1(index) 'Create the image control for the card
                    Image1(index).left = left
                    Image1(index).top = top
                    Image1(index).Picture = LoadPicture(fileroot & index & ".bmp") 'Set picture for Image1(i)
                    Image1(index).Visible = True
                    Next j
                    Next i

                    End Sub

                    '--------------------------------------------------
                    ' When the button is clicked, shuffle the cards
                    '--------------------------------------------------
                    Private Sub Start_Click()
                    ShuffleCardNumbers
                    End Sub

                    '--------------------

                    Y 1 Reply Last reply
                    0
                    • R riced

                      Glad to hear you're making progress. Here's a version I knocked up that populates the Image1() array from files on disk. It also does the shuffle and (I think!) it works - just done some quick checking and can't see duplicates. It's got some constants in that I used to get spacing for the images. It also has hard coded file path to where I put the bitmap files. It's been a bit of fun going back to VB6 - I've been using C# for the last few years (with a little bit of VB.NET). If you decide to try VB.NET be warned it's only superficially the same as VB6 - it's really a very different language.

                      Option Explicit

                      Private Const OFFSET_X As Integer = 600
                      Private Const OFFSET_Y As Integer = 600
                      Private Const CARD_WIDTH As Integer = 1305
                      Private Const CARD_HEIGHT As Integer = 1425
                      Private Const COL_SPACE As Integer = 150
                      Private Const ROW_SPACE As Integer = 150

                      '---------------------------------------------------------------------------------------
                      ' Initialise the Image1() control array when the Form is loaded.
                      ' Has to be done somewhere and this seems sensible place.
                      '---------------------------------------------------------------------------------------
                      Private Sub Form_Load()
                      ' Need to fill the Image() control array with bitmap pictures of cards
                      ' Assume that we have 52 bitmaps - Card_1.bmp to Card_52.bmp.
                      ' This makes it possible to fill the control array in a loop
                      Dim left As Long
                      Dim top As Long
                      Dim fileroot As String
                      Dim i As Integer
                      Dim j As Integer
                      Dim index As Integer

                      fileroot = "C:\VB6_Progs\Cards\Card_" 'This is where I store the bitmaps
                      SetImageZero (fileroot) 'Sets Image1(0) with dummy picture and makes it invisible

                      For i = 0 To 12 'NOTE: Using 0-12 and 0-3 makes calculation of index simpler
                      top = i * (CARD_HEIGHT + COL_SPACE) + OFFSET_Y
                      For j = 0 To 3
                      left = j * (CARD_WIDTH + ROW_SPACE) + OFFSET_X
                      index = 4 * i + j + 1
                      Load Image1(index) 'Create the image control for the card
                      Image1(index).left = left
                      Image1(index).top = top
                      Image1(index).Picture = LoadPicture(fileroot & index & ".bmp") 'Set picture for Image1(i)
                      Image1(index).Visible = True
                      Next j
                      Next i

                      End Sub

                      '--------------------------------------------------
                      ' When the button is clicked, shuffle the cards
                      '--------------------------------------------------
                      Private Sub Start_Click()
                      ShuffleCardNumbers
                      End Sub

                      '--------------------

                      Y Offline
                      Y Offline
                      ymilan
                      wrote on last edited by
                      #40

                      Thank you very much! I appreciate it! Yvonne

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups