Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno C# Tvorba pole s proměnnou délkou

Dobrý den pánové,

měl bych na Vás dotaz. Dělám do školy projekt, který se zabývá samozřejmě programováním a přesněji mám vytvořit Kimovu hru. Pro oživení: Hra, při které přijdete do místnosti, kde leží několik věcí, věci si zapamatujete, opustíte místnost a zapíšete předměty, které si pamatujete. Ale k mému problému..

Při spuštění se zobrazí okno, ve kterém uživatel zvolí obtížnost a téma.

V programu jsem vytvořil několik kategorií obrázků podle orientace: Sporty, Věci běžného užití, Povolání, ....

Po jeho volbě se otevře nový form se samotnou hrou.

Zobrazuji vždy obrázky, které náhodně generuji z pole, ve kterém jsou uložené. Abych předešel tomu, že bude obrázek vždy pouze jednou, využívám tohoto kódu:

int[] losovanaCisla = new int[16]; 

      while (!uspesne)
            {
                cisloObrazku = nahoda.Next(1, 16);

                if (losovanaCisla[cisloObrazku] == 0)
                {
                    uspesne = true;
                }

            }

To bylo pouze na upřesněnou. Já ale potřebuji, abych při každém otevření toho 2. formu vytvořil pole různě dlouhé (v závislosti na zvoleném tématu). Teď jsem ale u jádra problému.

V 1. formu si vytvořím veřejnou proměnnou:

public static int rozsah;

, kterou v 2. formu vyvolávám:

int rozsah = WFA_Kimova_hra.frmVyberTematu.rozsah;

. To funguje, ale jelikož vyvolávám tu proměnnou hned na začátku třídy, tak nemohu napsat

int[] losovanaCisla = new int[rozsah];

, protože nelze pracovat s proměnnými mimo funkci.

Napadlo mě, že bych to pole vytvořil na začátku té funkce, kde ho budu plnit, ale potřebuji jeho hodnoty potom v jiné funkci a ještě k tomu jsou to funkce, které se spustí po nějaké akci (kliknutí na tlačítko), takže je nemohu nastavit jako public. To bych vyřešil ale tím, že ho uložím do dalšího pole, které bude v Settings, a pak ho v dalších funkcích budu znovu volat. Tohle řešení mi ale připadá nepříliš elegantní, a proto se obracím na Vás.

Doufám, že jste mě pochopili.

Předem děkuji za odpovědi a rady.

Předmět Autor Datum
V první řadě bys měl oddělit logiku aplikace od uživatelského rozhraní. Ne že by to bylo vyloženě nu…
Wikan 17.05.2013 16:33
Wikan
Takže mám do funkce Load toho 2. formuláře vložit tohle? Bude to viditelné ve všech ostatních funkcí…
Fisherman 17.05.2013 16:36
Fisherman
Napsal jsem to blbě. Do třídy toho formuláře vložíš: int[] losovanaCisla; A do nějaké metody: los…
Wikan 17.05.2013 17:06
Wikan
Děkuji, tohle mě napadlo, ale ani jsem to nezkusil, protože jsem si myslel, že musím ten rozsah urči…
Fisherman 17.05.2013 17:10
Fisherman
No ved rozsah urcis pri vytvoreni. Vytvara ho ten new. A maze ho potom delete ked to uz nepotrebujes…
MM.. 17.05.2013 17:17
MM..
Nebos mohl použít kolekce. Ty mají integrovanou automatickou správu velikosti. poslední
Flash_Gordon 17.05.2013 21:30
Flash_Gordon

V první řadě bys měl oddělit logiku aplikace od uživatelského rozhraní. Ne že by to bylo vyloženě nutné, ale výsledek je pak o dost čistší, přehlednější a mnohem snáze se upravuje.
A k dotazu. Proč prostě tohle:

int[] losovanaCisla = new int[rozsah];

nevložíš do nějaké metody, která se provádí při vytváření formu? Třeba do obsluhy události Load.

Takže mám do funkce Load toho 2. formuláře vložit tohle? Bude to viditelné ve všech ostatních funkcích?

Děkuji, tohle mě napadlo, ale ani jsem to nezkusil, protože jsem si myslel, že musím ten rozsah určit hned při vytvoření.

Zpět do poradny Odpovědět na původní otázku Nahoru