» »

[C#] Naključno razporejanje elementov v tabeli

[C#] Naključno razporejanje elementov v tabeli

TheAmunraaa ::

Zdravo!

Rabim pomoč pri mojem projektu - igra spomin.
Na formi imam 16 pictureboxov in 16 panelov, ki jih pokrivajo.
Glede panelov je že skoraj vse narejeno, sedaj pa rabim razporediti slike tako, da bo na formi 8 slik, ki se bojo enkrat ponovile (skupaj 16 slik).
Slike imam v tabeli tako:
Image[] images = new Image[16] //tabela z 16 elementi
     { 
     Properties.Resources.img1,
     Properties.Resources.img2,
     Properties.Resources.img3,
     Properties.Resources.img4,
     Properties.Resources.img5,
     Properties.Resources.img6,
     Properties.Resources.img7,
     Properties.Resources.img8,
     Properties.Resources.img1,
     Properties.Resources.img2,
     Properties.Resources.img3,
     Properties.Resources.img4,
     Properties.Resources.img5,
     Properties.Resources.img6,
     Properties.Resources.img7,
     Properties.Resources.img8
     }; //slike so podvojene, da lahko izbiram med 16 slikami in ne rabim kakšne for zanke

Sedaj pa v pictureboxe dodam slike:

pictureBox1.BackgroundImage = images[0]; //tole se ponovi še 15-krat vendar ima vsak svojo številko elemeenta iz tabele


Kar pa ne znam narediti je pa, da bi elemente v tabeli razporedil naključno (da bi se zamenjali sliki 1 in 5 ali pa 3 in 7, ipd.)

jizzer ::

Sedaj imaš narejeno da je slika picture boxa pravzaprav slika z indeksom 0 v tvojem array-u slik. Index 0 pa pokriva vedno isto vrednost (v tem primeru isto sliko). Uporabi random, in namesto
pictureBox1.BackgroundImage = images[0];
//napišeš nekaj takega
Random nakljucnoSt = new Random();
pictureBox1.BackgroundImage = images[nakljucnoSt.Next(16)] 

Preberi pa še si tu, piše malo več o tem.

Zgodovina sprememb…

  • spremenil: jizzer ()

TheAmunraaa ::

Ok! To sedaj dela in mi lepo in naključno razporedi slike je pa problem, da mi isto sliko pokaže več kot dvakrat, kočem pa da mi jo poakže točno dvakrat (nič več, nič manj)

edit: poskušal sem že z non-repeating random, ampak ne razumem kako se to naredi.

Zgodovina sprememb…

stb ::

Lahko pa jih premešaš za v drug array in poleg parov lahko iščeš tudi trojčke ipd :D
var rnd = new Random();
Image[] imagesAll = new Image[8] { /* ...  snip ... */ }; //tabela z 8 elementi
int factor = 2;
Image[] imagesShuffled = new Image[imagesAll.Length * factor];
foreach (var image in imagesAll)
{
    // duplicate (triplicate...) images in target array:
    for (int i = 0; i < factor; i++)
    {
        // find a random empty slot
        int pos;
        do
        {
            pos = rnd.Next(imagesAll.Length * factor);
        }
        while (imagesShuffled[pos] != null);
        // copy the image
        imagesShuffled[pos] = image;
    }
}

Preveri robne pogoje, ker se ti zna tale nepreizkušena koda zaciklati pri iskanju prostega slota.
Bolj varčno s spominom pa je seveda, da imaš le eno kopijo slik, v drugem arrayu pa hraniš le indekse slik.

Zgodovina sprememb…

  • spremenil: stb ()

darkolord ::

images = images.OrderBy(i => Guid.NewGuid()).ToArray();


Na vrh moraš dodati še "using System.Linq", če tega še nimaš.

Zgodovina sprememb…

  • spremenilo: darkolord ()

stb ::

darkolord je izjavil:

images = images.OrderBy(i => Guid.NewGuid()).ToArray();

Elegantno. 8-) Temu bi dodal le še podvajanje slik, da tega nimaš v kodi:
images = images.Union(images).OrderBy(i => Guid.NewGuid()).ToArray();

TheAmunraaa ::

Hvala!!!!
Legende ste!
Dela tk k mora s tem stavkom zdej:
images = images.Union(images).OrderBy(i => Guid.NewGuid()).ToArray();

A mi lahko prosim kdo razloži kaj to sedaj sploh naredi, da bom vedel pri zagovarjanju naloge?
Sam si predstavljam, da slike, ki jih imam v tabeli "images" uredi v novi tabeli, ampak pojma nimam na kak način.

Zgodovina sprememb…

darkolord ::

Slike v tabeli "images" uredi po vrstnem redu, s tem da kot ključ za urejanje uporabi naključno generiran Guid (globally unique identifier - npr. 393c74cf-597a-48d0-b67c-f9cebc57ac4f).

Ekvivalentno bi bilo takole:

var rnd = new Random();
images = images.Union(images).OrderBy(i => rnd.Next()).ToArray();


Samo je pač ena vrstica več :)

Union pa nardi unijo.

TheAmunraaa ::

Hvala tebi in vsem drugim, ki ste mi pomagali!
Bom kar pustil Guid bo profesor bolj navdušen :P
Lep pozdrav!

TheAmunraaa ::

Mojim težavam pa ni in ni konca in namesto, da bi že prej vprašal tole sem se sam mučil do 1.00 zjutraj...
Sedaj imam problem, ker ne vem kako bi preveril, če je v npr. picturebox1 enaka slika kot v picturebox2, tako da bom dobil par, ki bo prikazan do konca igre v en label pa mi bo nabilo 5 točk.

darkolord ::

if (pictureBox1.BackgroundImage == pictureBox2.BackgroundImage)
?

TheAmunraaa ::

To sem že poskusil, ampak mi ne dela.
Problem je da imam preko picturebox-ov panele na katere klikam in se ti odpirajo. Ne znam narediti, da bi program vedel, da če kliknem panel1, da bi mogoče dobil vrednost pictureboxa.

stb ::

Operator == primerja če gre za isto instanco objekta.
Probaj z
if (pictureBox1.BackgroundImage.Equals(pictureBox2.BackgroundImage))

ki naj bi primerjal vsebino, ne instanc.

TheAmunraaa ::

Ne dela :(
Ne vem na kakšen način bi še lahko primerjal slike v picturebox-ih.
Ali se da narediti, da bi lahko eno spremenljivko pripel panelu in bi potem kar s paneli preverjal enakost?
Spremenljivke pa bi panelom pripenjal tako, kot dajem vrednosti picturebox-om(če je ima picturebox1 sliko "img4" bi v panelu1 pisalo "img4")

amacar ::

Primerjaš elemente v polju images na teh indexih, če so enaki.

TheAmunraaa ::

amacar je izjavil:

Primerjaš elemente v polju images na teh indexih, če so enaki.

Saj to mi je že kolega reku, ampak ne vem kako naj to primerjam.

darkolord ::

TheAmunraaa je izjavil:

Ne dela :(
To je pa malo čudno. Pokaži kodo.

TheAmunraaa ::

Evo! Projekt je narejen
Je prišel na idejo da bi primerjal slike po širini in sicer sem 3 slike povečal za 1, 2 in 3 pixle, tako, da se razlikujejo.

darkolord ::

O fuj :)

darkkk ::

darkolord je izjavil:

O fuj :)

+1

Prav nasmejal me je :)

Zgodovina sprememb…

  • spremenil: darkkk ()

TheAmunraaa ::

Kolega je dobil idejo...*
SRSLY YOU GUYZ???


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[c#] ukaz radirka

Oddelek: Programiranje
91118 (911) japol
»

[c#] shrani text, tabele, slike

Oddelek: Programiranje
251524 (1130) klemen93
»

[c#] picturebox, slika na sliko

Oddelek: Programiranje
151089 (899) japol
»

[Visual C#] "Format" shranjevanja?

Oddelek: Programiranje
10977 (762) c0dehunter
»

C# metoda

Oddelek: Programiranje
61984 (1855) davaman

Več podobnih tem