6

Using C# to write a memory game. So I have a list of 54 images. I can get another list to grab eight of them images at random. I then want to add them eight images from my second list to another list, twice for each image, simple enough.

Now I want to shuffle the list and I am a little stuck. The reason I want to shuffle the list is because I want the pictures to be random each time the game (memory) is loaded or button(restart) is clicked... Here is what I have for this issue:

private void Form2_Load(object sender, EventArgs e)
{
    //generate random number
    Random r = new Random();

    //play music via media player
    axWindowsMediaPlayer1.uiMode = "none";
    axWindowsMediaPlayer1.URL = ("Theme.mp3");            

    //create limage list
    List<Image> imagesEasy;
    //populate the 'imageEasy' list
    imagesEasy = new List<Image>();
    imagesEasy.Add(Image.FromFile(@"Baraka01.gif"));
    imagesEasy.Add(Image.FromFile(@"Baraka02.gif"));
    imagesEasy.Add(Image.FromFile(@"CyberSubZero01.gif"));
    imagesEasy.Add(Image.FromFile(@"CyberSubZero02.gif"));
    imagesEasy.Add(Image.FromFile(@"Cyrax01.gif"));
    imagesEasy.Add(Image.FromFile(@"Cyrax02.gif"));
    imagesEasy.Add(Image.FromFile(@"Ermac01.gif"));
    imagesEasy.Add(Image.FromFile(@"Ermac02.gif"));
    imagesEasy.Add(Image.FromFile(@"Jade01.gif"));
    imagesEasy.Add(Image.FromFile(@"Jade02.gif"));
    imagesEasy.Add(Image.FromFile(@"Jax01.gif"));
    imagesEasy.Add(Image.FromFile(@"Jax01.gif"));
    imagesEasy.Add(Image.FromFile(@"JohnnyCage01.gif"));
    imagesEasy.Add(Image.FromFile(@"JohnnyCage02.gif"));
    imagesEasy.Add(Image.FromFile(@"Kabal01.gif"));
    imagesEasy.Add(Image.FromFile(@"Kabal02.gif"));
    imagesEasy.Add(Image.FromFile(@"Kano01.gif"));
    imagesEasy.Add(Image.FromFile(@"Kano02.gif"));
    imagesEasy.Add(Image.FromFile(@"Katana01.gif"));
    imagesEasy.Add(Image.FromFile(@"Katana02.gif"));
    imagesEasy.Add(Image.FromFile(@"Kratos01.gif"));
    imagesEasy.Add(Image.FromFile(@"Kratos02.gif"));
    imagesEasy.Add(Image.FromFile(@"KungLau01.gif"));
    imagesEasy.Add(Image.FromFile(@"KungLau02.gif"));
    imagesEasy.Add(Image.FromFile(@"LiuKang01.gif"));
    imagesEasy.Add(Image.FromFile(@"LiuKang02.gif"));
    imagesEasy.Add(Image.FromFile(@"Mileena01.gif"));
    imagesEasy.Add(Image.FromFile(@"Mileena02.gif"));
    imagesEasy.Add(Image.FromFile(@"NightWolf01.gif"));
    imagesEasy.Add(Image.FromFile(@"NightWolf02.gif"));
    imagesEasy.Add(Image.FromFile(@"NoobSaibot01.gif"));
    imagesEasy.Add(Image.FromFile(@"NoobSaibot02.gif"));
    imagesEasy.Add(Image.FromFile(@"QuanChi01.gif"));
    imagesEasy.Add(Image.FromFile(@"QuanChi01.gif"));
    imagesEasy.Add(Image.FromFile(@"Raiden01.gif"));
    imagesEasy.Add(Image.FromFile(@"Raiden02.gif"));
    imagesEasy.Add(Image.FromFile(@"Scorpian01.gif"));
    imagesEasy.Add(Image.FromFile(@"Scorpian02.gif"));
    imagesEasy.Add(Image.FromFile(@"Sektor01.gif"));
    imagesEasy.Add(Image.FromFile(@"Sektor02.gif"));
    imagesEasy.Add(Image.FromFile(@"ShangTsung01.gif"));
    imagesEasy.Add(Image.FromFile(@"ShangTsung02.gif"));
    imagesEasy.Add(Image.FromFile(@"Sheeva01.gif"));
    imagesEasy.Add(Image.FromFile(@"Sheeva02.gif"));
    imagesEasy.Add(Image.FromFile(@"Sindel01.gif"));
    imagesEasy.Add(Image.FromFile(@"Sindel02.gif"));
    imagesEasy.Add(Image.FromFile(@"Smoke01.gif"));
    imagesEasy.Add(Image.FromFile(@"Smoke02.gif"));
    imagesEasy.Add(Image.FromFile(@"Sonya01.gif"));
    imagesEasy.Add(Image.FromFile(@"Sonya02.gif"));
    imagesEasy.Add(Image.FromFile(@"Stryker01.gif"));
    imagesEasy.Add(Image.FromFile(@"Stryker02.gif"));
    imagesEasy.Add(Image.FromFile(@"SubZero01.gif"));
    imagesEasy.Add(Image.FromFile(@"SubZero02.gif"));

    List<Image> imagesReady;
    //populate the 'imageReady' list to fill remaining 8 pictureBoxes
    imagesReady = new List<Image>();
    imagesReady.Add(imagesEasy[r.Next(54)]);
    imagesReady.Add(imagesEasy[r.Next(54)]);
    imagesReady.Add(imagesEasy[r.Next(54)]);
    imagesReady.Add(imagesEasy[r.Next(54)]);
    imagesReady.Add(imagesEasy[r.Next(54)]);
    imagesReady.Add(imagesEasy[r.Next(54)]);
    imagesReady.Add(imagesEasy[r.Next(54)]);
    imagesReady.Add(imagesEasy[r.Next(54)]);

    List<Image> imagesFinal;
    //populate the 'imageFinal' list to fill remaining 8 pictureBoxes
    imagesFinal = new List<Image>();
    imagesFinal.Add(imagesReady[0]);
    imagesFinal.Add(imagesReady[1]);
    imagesFinal.Add(imagesReady[2]);
    imagesFinal.Add(imagesReady[3]);
    imagesFinal.Add(imagesReady[4]);
    imagesFinal.Add(imagesReady[5]);
    imagesFinal.Add(imagesReady[6]);
    imagesFinal.Add(imagesReady[7]);
    imagesFinal.Add(imagesReady[0]);
    imagesFinal.Add(imagesReady[1]);
    imagesFinal.Add(imagesReady[2]);
    imagesFinal.Add(imagesReady[3]);
    imagesFinal.Add(imagesReady[4]);
    imagesFinal.Add(imagesReady[5]);
    imagesFinal.Add(imagesReady[6]);
    imagesFinal.Add(imagesReady[7]);

    //
    //need to add or call shuffle method here before assigning pictures to pictureBoxes
    //

    //assign pictures to pictureBoxes from the imagesFinal list
    pictureBox1.Image = imagesFinal[0];
    pictureBox2.Image = imagesFinal[1];
    pictureBox3.Image = imagesFinal[2];
    pictureBox4.Image = imagesFinal[3];
    pictureBox5.Image = imagesFinal[4];
    pictureBox6.Image = imagesFinal[5];
    pictureBox7.Image = imagesFinal[6];
    pictureBox8.Image = imagesFinal[7];
    pictureBox9.Image = imagesFinal[8];
    pictureBox10.Image = imagesFinal[9];
    pictureBox11.Image = imagesFinal[10];
    pictureBox12.Image = imagesFinal[11];
    pictureBox13.Image = imagesFinal[12];
    pictureBox14.Image = imagesFinal[13];
    pictureBox15.Image = imagesFinal[14];
    pictureBox16.Image = imagesFinal[15];
}
Daniel Lucas
  • 71
  • 1
  • 1
  • 5
  • How are we supposed to know what programming language you are even talking about ? Please tag appropriately. – Paul R Aug 27 '12 at 06:51
  • Sorry I forgot to add I'm using C# – Daniel Lucas Aug 27 '12 at 06:54
  • what have you tried so far. my first idea would a for-loop with a random number. – Tomtom Aug 27 '12 at 07:01
  • yes you're right, I need a for loop that will generate numbers from 0-15, but must not duplicate any of the numbers. so a for loop with a nested while loop maybe? I don't know how to ensure I don't receive any duplicates if I store the randomly generated numbers in an array I know I can check against the aray, but not clear how to do this – Daniel Lucas Aug 27 '12 at 07:28
  • Make a copy of the list and delete the elements from the copy, in this way you don't need to avoid duplicates – Gabber Aug 27 '12 at 07:38
  • Thanks everyone that helped. I've ended up using a for loop that generates a random number with ono repeates............int numb; int[] chosen = new int[16]; for (int i = 0; i < 16; i++) { numb = r.Next(17); for (int b = 0; b < 16; b++) { while (chosen.Contains(numb) == true) { numb = r.Next(17); b = 0; } } chosen[i] = numb; } – Daniel Lucas Aug 27 '12 at 08:06

4 Answers4

20

This can easily be accomplished using linq OrderBy with Random.

var rand = new Random();
var randomList = imagesEasy.OrderBy (x => rand.Next()).ToList();
Magnus
  • 45,362
  • 8
  • 80
  • 118
1

Try to implement this method:

http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

Alex
  • 458
  • 5
  • 17
0

Thanks all for the help I ended up using an array filled with random numbers through a for loop with a nested while loop ensuring I get no duplicates.

        int numbA;
        int[] chosenA = new int[8];
        for (int i = 0; i < 8; i++)
        {
            numbA = r.Next(9);

            for (int b = 0; b < 8; b++)
            {
                while (chosenA.Contains(numbA) == true)
                {
                    numbA = r.Next(9);
                    b = 0;
                }
            }
            chosenA[i] = numbA;
        }

Then calling the picture from the list using the array value.

        List<Image> imagesFinal;
        //populate the 'imageFinal' list to fill remaining 8 pictureBoxes
        imagesFinal = new List<Image>();
        imagesFinal.Add(imagesReady[(chosenA[0] - 1 )]);
        imagesFinal.Add(imagesReady[(chosenA[1] - 1 )]);
        imagesFinal.Add(imagesReady[(chosenA[2] - 1 )]);
        imagesFinal.Add(imagesReady[(chosenA[3] - 1 )]);
        imagesFinal.Add(imagesReady[(chosenA[4] - 1 )]);
        imagesFinal.Add(imagesReady[(chosenA[5] - 1 )]);
        imagesFinal.Add(imagesReady[(chosenA[6] - 1 )]);
        imagesFinal.Add(imagesReady[(chosenA[7] - 1 )]);
        imagesFinal.Add(imagesReady[(chosenA[0] - 1 )]);
        imagesFinal.Add(imagesReady[(chosenA[1] - 1 )]);
        imagesFinal.Add(imagesReady[(chosenA[2] - 1 )]);
        imagesFinal.Add(imagesReady[(chosenA[3] - 1 )]);
        imagesFinal.Add(imagesReady[(chosenA[4] - 1 )]);
        imagesFinal.Add(imagesReady[(chosenA[5] - 1 )]);
        imagesFinal.Add(imagesReady[(chosenA[6] - 1 )]);
        imagesFinal.Add(imagesReady[(chosenA[7] - 1 )]);

To ensure the pictures were placed in randomly in pictureboxes I again used another for loop with a nested while loop a higher random number generation.

        pictureBox1.Image = imagesFinal[chosenB[0] -1 ];
        pictureBox2.Image = imagesFinal[chosenB[1] -1 ];
        pictureBox3.Image = imagesFinal[chosenB[2] -1 ];
        pictureBox4.Image = imagesFinal[chosenB[3] -1 ];
        pictureBox5.Image = imagesFinal[chosenB[4] -1 ];
        pictureBox6.Image = imagesFinal[chosenB[5] -1 ];
        pictureBox7.Image = imagesFinal[chosenB[6] -1 ];
        pictureBox8.Image = imagesFinal[chosenB[7] -1 ];
        pictureBox9.Image = imagesFinal[chosenB[8] -1 ];
        pictureBox10.Image = imagesFinal[chosenB[9] -1 ];
        pictureBox11.Image = imagesFinal[chosenB[10] -1 ];
        pictureBox12.Image = imagesFinal[chosenB[11] -1 ];
        pictureBox13.Image = imagesFinal[chosenB[12] -1 ];
        pictureBox14.Image = imagesFinal[chosenB[13] -1 ];
        pictureBox15.Image = imagesFinal[chosenB[14] -1 ];
        pictureBox16.Image = imagesFinal[chosenB[15] -1 ];
Daniel Lucas
  • 71
  • 1
  • 1
  • 5
-1

You can try something like:

List<int> list = new List<int>();
Random rnd = new Random(SEED);
for(int i = 0; i <  15; i++)
{
int nextValue = rnd.Next(MIN,MAX);
while(list.Contains(nextValue))
      nextValue = rnd.Next(MIN,MAX);
}
Tomtom
  • 9,087
  • 7
  • 52
  • 95