Hogy lehetne megcsinálni ezt egyszerűbben azaz hogy ne legyen ennyi iteráció? C# Winform
Feladat: "Aknakereső"
-Van 1024db pici panel tehát 32x32 sor.
-5db aknát kell elhelyezni.
Működik, de a tanár visszadobta hogy ez így túl sok iteráció, egy munkahely biztos nem fogadná el, gondolkozzak más megoldáson, mert ez így max 2-est ér.
private List<Panel> list = new List<Panel>();
for (int i = 0; i < 5; i++)
{
string randomName = "panel" + r.Next(1, 1025);
foreach (Panel panel in this.Controls.OfType<Panel>())
{
if (panel.Name == randomName)
{
if (!list.Contains(panel))
{
list.Add(panel);
}
else
{
i--;
}
break;
}
}
}
Hogy lehetne elhelyezni 5db aknát 1024 panelen máshogy?
A panelek neve panel1 panel2 ... panel1024
Próbáltam olyat hogy: panelList.Add((Panel)randompanelnévstring);
de természetesen úgy nem lehet.
Meg kell mondjam, én nem sokat értek a kódodból, sem a hozzáfűzött magyarázatodból, de én valahogy úgy csinálnám, hogy létrehoznék egy 1024 üres panelből álló listát, meg egy 5 random számból álló tömböt (ebben elég egyszerű ellenőrizni és kiküszöbölni az ismétlődéseket), utána a tömbelemeknek megfelelő indexű paneleket aknákra változtatnám.
Amúgy meg ez 1024 különböző nevű panel kész horror szerintem. Miért nem lehet egyszerűen kétdimenziós tömböt (vagy egye fene, listák listáját) használni, és indexelni? És szükség van pont panelokra? Én valószínűleg az egészet valami nokedli-méretű byte- vagy int-tömbben könyvelném a háttérben, és egy nagy képfelületnek a megfelelő helyeire csak kirajzoltatnám a becélzott tömbelem tartalmának megfelelő kis kockát – már amennyiben tudnék C#-ban programozni. A panelos megoldás mindenesetre veszettül pocsékolónak tűnik.
Rendben, újragondoilom az egészet inkább.
A Panel azért jó erre amúgy mert lehet adni neki színt és border-t, így kis négyzeteket lehet csinálni. Egyet beállítunk utána ctrl c ctrl v egy sort megcsinálva, majd a sort lemásolni 32x. Így 3-4 perc alatt megvolt maga a kinézete a játéknak :D
Tehát a kódodban benne van az 1024 panel rétrehozása egyesével és a nevük beállítva? Ez azért így nem túl szép... Nem ártana aztokat is ciklussal létrehozni.
A túl sok iteráció pedig az, hgoy végigmész az összes vezérlőn és név alapján keresed az aktuális vélelten számút. Elég lenne egy tömmbe berakni minden panelt és abból egy lépésben meg tudnád kapni az objektumot.
"Tehát a kódodban benne van az 1024 panel rétrehozása egyesével és a nevük beállítva?"
Visual Studio Winform designerben (Ami grafikus interface) mint mondtam egyet megcsináltam és csak ctrl c ctrl v tehát pár perc volt. Ahogy kész volt egy sor utána az egész sort másoltam nem csak egyet. A nevüket meg magától csinálta panel1 panel2 ... panel1024 tehát nem kellett vele bajlódnom :D
Amúgy úgy lesz akkor hogy létrehozok egy int listát v tömböt abba eltárolom az aknákat így a foreach panelen csak egyszer kell a proginak végigmenni. Remélem így már okés lesz a tanárnak.
„A Panel azért jó erre amúgy mert lehet adni neki színt és border-t, így kis négyzeteket lehet csinálni.”
De a Panel egy ezenkívül száz egyéb dolgot tudó, bonyolult működésű objektum, nyilván ehhez mért helyfoglalással, ami valószínűleg már önmagában is többszörösen meghaladja azt, amire az egyszerű játék tulajdonképpeni működtető részének szüksége van – ebből hozol létre 1024 darabot. Ez körülbelül olyan, mint okostelefonokkal pasziánszozni. Persze, semmi akadálya, csak drága, indokolatlan, és a telefonok tudásából gyakorlatilag semmit sem használ fel.
Első körben szerintem nem az a gond, hogy Panelt használ, hanem hogy ezt kézzel pakolgatta a formra, mind az 1024 darabot... ez így baromi ronda és nem túl rugalmsa.. elég nehéz módosítani a daraszámot például.
Ezeket dinamikusan kéne létrehozni..
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!