Ezt a programot, hogy valósítanátok meg?
Először is leszögezném, nem kódot kérnék, hanem elméletet a programhoz. A program ALAPJA, amit már 4 féle módon próbáltam megírni, de nem sikerült, az az hogy:
20 pictureboxot, kéne lerakni véletlenszerűen kiválasztott koordinátákra. A koordináták, adottak amiket ki kell "sorsolni" a pictureboxoknak. A pictureboxokat fejenként 2 képpel kellene feltölteni. Mert alapjáraton egy bizonyos kép lenne mindegyikben, de kattintásra, "felfordulnak" és egyedi kép van mindegyikben. Szóval pl: két tömbben eltároltuk a lehetséges X és a lehetséges Y koordinátákat. Ebből sorsoljuk ki nekik a pozíciójukat. Nos kb ennyi lenen a program alapja. Én személy szerint 2 módszerrel próbálkoztam már, és a tanárom szintén kettővel. És egyik se volt helyes. :S Remélem tudtok ötletet adni hogy is lehetne megírni ezt a programot. Amúgy C# ban írnám. Előre is köszönöm.
"2 dimenziós tömbbe vettem fel a koordinátákat, kisorsoltam és a kisorsolt koordinátákat beleraktam egy másik tömbbe h azok ne lehessenek "
Gondolom hogy boolean-okat tárolt az a 2d-s tömb.
"4 tömböt hoztunk létre x,y és a már használt x,y oknak ..."
Már rosszul kezdődik, ezért vannak a struktúrák, mert különben olyan kesze-kusza lesz a kód hogy szétdurran az ember agya.
":S őő struktúrákkal próbálkozott, és futásidőben létrehozni a picturebox-okat, de ott meg az imagelist el szenvedett valamit a kód és nem tetszett neki. "
Ez már jobban hangzik.
Csinálnék egy kártyalap osztályt ami 2 képet tárol a kártyalap 2 oldalát, lenne olyan metódusa ami megmondaná hogy hátlapra van meg előlapra van fordítva a kártya (még kellhet).
Kártyalap osztálybeli objektumokat példányosítanék dinamikusan futási időben, persze események lennének hozzárendelve ezekhez az objektumokhoz, ilyen az egérkattintás, kirajzolás stb.
Koordinálták kisorsolásánál valamilyen adatszerkezetet használnék, pl egy fát, ami koordinátákat tartalmaz. Minden kártyalapnak van mérete nem csak pontszerű grafikus objektumok, van szélességük magasságuk, ezért gondolom úgy kéne kisorsolni a koordinátákat, hogy ne legyen takarásba 1 kártya sem,például az nem jó ha 1 kártya a másikhoz képest 1 pixel-lel van arrébb.Nyilván kell egy kis geometria is hozzá. Ha csak simán "dobálom fel" a koordinátákat úgy hogy a következő koordinálta olyan legyen hogy ne legyen takarásba a leendő kártya egy másik leendő kártyával akkor lehet olyan szerencsétlen helyzet hogy nem lehet felvenni újabb koordinátát. Ezen kéne elgondolkodni, hogy hogy lehet megfelelően koordinátákat sorsolni.
Előbb át kell gondolni aztán kódolni!!!
Nos, adott 20 darab koordinátád, amiket előre, konstansként meghatározol, mert mondjuk lusta vagy hozzá, hogy dinamikusan a megjelenitő felület méretéből számold.
Ez mondjuk legyen egy Point nevü struktúra(C#-ban a System.Drawing namespace-ben alapból van ilyen).
Az alapprobléma gyakorlatilag egy véletlenszerü permutáció generálása a 20(vagy 30 vagy akármennyi) koordinátából.
Tehát:
Van 20 db picturebox-od.
Ezeket felrakod még a designer-ben a Form-odra.(Tökmindegy, hogy hova)
Csinálsz a form-ba private member-ként egy PictureBox[] arrayt.
Ebbe a konstruktorodban(az InitializeComponent() után) belerakosgatod szépen a picturebox-okra mutató referenciákat.
Van 20 db koordinátád, azt is belerakod egy array-be(mondjuk Point[] coords = new Point[20]) a Form egy private mezőjeként, még ezt is a konstruktorban.
A "sorsolás", azaz a koordináták egy véletlenszerü permutációjának előállitása a következőképpen zajlik:
(Ezt már lustaságom okán CéKetrec-ben irom)
for (int index = 19; index >0;--index)
{
int randomIndex = Random.Next(0,index)
Point temp = coords[index];
coords[index] = coords[randomIndex];
coords[randomIndex] = temp;
}
A ciklus nyilván mehetne fölfelé is 0-tól 18-ig,
és akkor a random-ot index+1,20 paraméterekkel kell meghivni, mivel az alsó korlát inclusive, a felső viszont exclusive.
Ezután már egy sima ciklussal párhuzamosan iterálsz a coords és a picturebox-okat tartalmazó array-eken, és szépen beállitod az i-edik picturebox-nak az i-edik Point X és Y koordinátáit.
Kb. ennyi.
És ez még mindig egy igénytelen megoldás, mert nem veszi figyelembe, hogy ha pl. a user átméretezi az ablakot, akkor k*rva rondán fog már kinézni.
Ezért, ha szépen akarod csinálni, arra a területre, ahol a pictureBox-ok lesznek, szépen kiraksz egy TableLayout panel-t, a panel dock property-je legyen Fill. Beállitasz neki annyi oszlopot/sort, amennyi kell, az oszlopok/sorok méretét százalékosan állitod, és innentől kezdve a koordináták a táblázat egy adott sor-oszlopát azonositják, és nyilván azokhoz adogatod hozzá a picturebox-okat, ugyanúgy Dock= Fill-el.
Persze ez kicsit macerásabb, mert minden újratöltés előtt ki is venni a control-ok közül a picturebox-okat.
Azt meg már leirni is alig merem, hogy ettől még mindig alapvetően f*s a progi, mert hardcode-oltan 20 db képpel müködik. Mert mi van, ha később bele kell tenni egy olyat, hogy pl. 3 nehézségi fok legyen, és easy-n csak 3x4-es tábla van, medium-on már 4x5, hardon meg 5x6.
És könnyen bővithető legyen mondjuk új nehézségi fokozattal. Vagy különböző témákkal(Pl. állatos képek, virágos képek, meztelen bukszás képek).
És persze mindezt úgy megoldani, hogy ne legyen szanaszét if-elve az egész kód, hogy esetleg más is értelmezni tudja, ne csak az, aki irta.
De ez inkább már tervezési kérdés, amihez kéne némi tapasztalat+design pattern ismeret.
Egyelőre tanuljatok meg(a tanároddal együtt :D ) algoritmizálni :D
Egyébként, ha nem vagyok indiszkrét, hol/milyen szinten tanulsz programozást? Mer' öszintén szólva totál dilettáns a tanárod, ha még egy ilyen egyszerü dolgot sem tud megoldani. Persze nyilván nem véletlenül lett tanár, aki nem tudja, az tanitja..
Nem leszólni akartalak, sry ha mégis úgy hangzott :)
Permutáció : n darab különböző elem egy meghatározott sorrendje. Egy permutáció előállitása magukat az elemeket nem változtatja meg. Ebből következik, hogyha van 20 különböző koordinátád, amiket előre kiszámolsz, és nincs két egyforma, akkor ezeknek bármely permutációja sem fog két egyformát tartalmazni.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!