Avatar
Josef Kuchař (Pepa489):

Ahoj, mám pole byte[,] o velikosti 32x32 a v něm vygenerovanou mapu jako na obrázku, zelená představuje v poli 1 a prázdná místa 0 a potřebuji každé prázdné místo("jezírko") vyplnit jiným číslem, jen nevím jak na to, možná, že by to šlo algoritmem vlny, ale absolutně nevím jak.
Napíšete mi prosím kód, odkaz(y) nebo jenom jak na to?
Děkuju všem
Pepa489

Odpovědět 19.12.2014 14:02
2x piš, jednou debuguj
Avatar
Josef Kuchař (Pepa489):

A zde ještě obrázek pro lepší pochopení

Nahoru Odpovědět 19.12.2014 14:05
2x piš, jednou debuguj
Avatar
Ondřej Štorc:

Asi pořádně nechápu co chceš, ale nešlo by to udělat tak že bys prošel každej prvek v tom poli a měnil jejich hodnotu na základě nějaký podmínky?
// Tak to asi ne nevšiml jsem si tvého druhého příspěvku

Editováno 19.12.2014 14:07
Nahoru Odpovědět 19.12.2014 14:06
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Odpovídá na Ondřej Štorc
Josef Kuchař (Pepa489):

Ne né, to chce něco propracovanějšího, protože by to jezírko byla akorát směť čísel

Nahoru Odpovědět 19.12.2014 14:17
2x piš, jednou debuguj
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Josef Kuchař (Pepa489)
Jan Vargovský:

Projdeš mapu normálně po řádku a sloupci a od daného prvního prvku v jezírku projdeš rekurzivně prvky okolo něj a očísluješ si je. Pak se logicky z metody vrátíš z5 k procházení po řádku a sloupci dokud nenarazíš na neočíslované jezírko.

Editováno 19.12.2014 14:48
 
Nahoru Odpovědět  +1 19.12.2014 14:48
Avatar
Odpovídá na Josef Kuchař (Pepa489)
Ondřej Štorc:

Hele když to budeš vyhodnocovat tak můžeš porovnat všechny prvky který s nim sousedi například takto:

If(mapa[x-1,y] = 0 || mapa[x, y-1] = 0)
 mapa[x,y] = pocetJezirek;
else
{
pocetJezirek++;
mapa[x,y] = pocetJezirek;
}
Nahoru Odpovědět 19.12.2014 14:50
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Lukáš Křehula
Redaktor
Avatar
Odpovídá na Josef Kuchař (Pepa489)
Lukáš Křehula:

Co projet cyklem to pole a když narazíš na nulu, tak si vybrat nějaký náhodný číslo (nebo popořadě) a pak cyklem while hledat ve 4 směrech další nuly a zapisovat tvoje vybraný číslo?
Zkusil jsem něco napsat (takovým prasáckým způsobem :D)

Random r = new Random();
for(int x = 0; x<32;x++)
            {
                for(int y = 0; y < 32; y++)
                {
                    if(pole[x,y] == 0)
                    {

                        int posX = x;
                        int posY = y;
                        byte num = (byte)r.Next(2,6);
                        pole[posX, posY] = num;
                        while(true)
                        {
                                if (posX < 31 && pole[posX + 1, posY] == 0)
                                {
                                    posX++;
                                    pole[posX, posY] = num;
                                }
                                else if (posX > 0 && pole[posX - 1, posY] == 0)
                                {
                                    posX--;
                                    pole[posX, posY] = num;
                                }
                                else if (posX < 32 && pole[posX, posY + 1] == 0)
                                {
                                    posY++;
                                    pole[posX, posY] = num;
                                }
                                else
                                    break;
                        }
                    }
                }
            }

// Jan Vargovský byl dřív :)

Editováno 19.12.2014 14:52
 
Nahoru Odpovědět 19.12.2014 14:51
Avatar
STP
Člen
Avatar
STP:
private byte cisloJezirka = 2;
       private void NaplnJezera(byte[,] pole)
       {
           for (int x = 0; x < 32; x++)
           {
               for (int y = 0; y < 32; y++)
               {
                   if (pole[x,y] == 0 )  // je prazdne :)
                   {
                       pole[x, y] = cisloJezirka;
                       najdiSousedniVodu(x, y, cisloJezirka);
                       cisloJezirka++;
                   }
               }
           }
       }

       private void najdiSousedniVodu(int x, int y, byte cisloJezirka)
       {
           //+ osetreni jestli nejsem mimo index
           if (pole[x + 1, y] == 0)
           {
               pole[x + 1, y] = cisloJezirka;
               najdiSousedniVodu(x + 1, y, cisloJezirka);
           }
           if (pole[x - 1, y] == 0)
           {
               pole[x - 1, y] = cisloJezirka;
               najdiSousedniVodu(x - 1, y, cisloJezirka);
           }
           if (pole[x, y + 1] == 0)
           {
               pole[x, y + 1] = cisloJezirka;
               najdiSousedniVodu(x, y + 1, cisloJezirka);
           }
           if (pole[x, y - 1] == 0)
           {
               pole[x, y - 1] = cisloJezirka;
               najdiSousedniVodu(x, y - 1, cisloJezirka);
           }

       }

Něco takovéhleho?

Editováno 19.12.2014 14:56
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 19.12.2014 14:56
Když umřít, tak online!!!
Avatar
Josef Kuchař (Pepa489):

Tady je ještě jeden jak by to mělo ve finále vypadat:

Editováno 19.12.2014 15:01
Nahoru Odpovědět 19.12.2014 15:00
2x piš, jednou debuguj
Avatar
Odpovídá na STP
Josef Kuchař (Pepa489):

STP
Díky, funguje
//Edit: Jen jsem u metody naplnjezera musel přidat parametr pole

Editováno 19.12.2014 15:13
Nahoru Odpovědět 19.12.2014 15:12
2x piš, jednou debuguj
Avatar
STP
Člen
Avatar
Odpovídá na Josef Kuchař (Pepa489)
STP:

Jo mělo by to projít tak jak chceš :)

Nahoru Odpovědět 19.12.2014 15:12
Když umřít, tak online!!!
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.