Diskuze: Generátor bludiště - nahrazení switch

C# .NET .NET (C# a Visual Basic) Generátor bludiště - nahrazení switch American English version English version

Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Ahoj, udělal jsem si jednoduchý generátor bludiště. Jeho rychlost není nijak závratná, taže zkouším různě optimalizovat (což mi nikdy moc nešlo). Každopádně pokusil jsem se o rekurzi. Problém je že je tam stále ošklivý switch, který určuje směr pokládání zdí. Myslíte že půjde nějak nahradit ?
Generátor je vlastně ten co je zde popsán, ještě zkusím algoritmus prohledávání do hloubky, ale to až časem.

Mám tedy pole, kde si připravím základny. Základna je místo odkud se vždy začne generovat zeď. Jakmile narazím na Ntou základnu nebo na ze´d ukončím pokládání a vyberu náhodně další základnu a směr. Připravení základen mám takto.

private void PrepareBase()
       {
           for (int x = 0; x < sizeX; x++)
           {
               for (int y = 0; y < sizeY; y++)
               {
                   if (x == 0 || x == sizeX - 1 || y == 0 || y == sizeY - 1)
                   { pole[x, y] = 1; }// základní zeď
                   else if (x % 2 == 0 && y % 2 == 0 && !(x == 0 || x == sizeX - 2 || y == 0 || y == sizeY - 2))
                   { pole[x, y] = 2; position.Add(new Position(x, y)); Base.Add(new Position(x, y)); }

               }

           }
       }

Základna je v poli představována 2. List position uchováv pozice základen a slouží i jako indikátor zbývajícich základen. List Base uchovává taktéž základny kvůli debugu. Tj není potřeba pro správné vygenerování.

Zde je metoda která generuje. Ten swtich se mi tam nelíbí ale nevím jak ho nahradit.

private bool Put(Position put, int smer, int n)
        {
            int pocet = 0;
                if (n < 2)
                    n = 2;

                switch (smer)
                {
                    case 0: // vlevo
                        for (int x = put.X; x > 0; x--)
                        {
                            if (pole[x, put.Y] == 2)
                            {
                                pole[x, put.Y] = 1;
                                position.Remove(new Position(x, put.Y));
                                pocet++;
                                if (pocet >= n)
                                    break;
                            }
                            else if (pole[x, put.Y] == 0)
                                pole[x, put.Y] = 1;
                            else break;
                        }

                        break;
                    case 1: //vpravo
                        for (int x = put.X; x < sizeX; x++)
                        {
                            if (pole[x, put.Y] == 2)
                            {
                                pole[x, put.Y] = 1;
                                position.Remove(new Position(x, put.Y));
                                pocet++;
                                if (pocet >= n)
                                    break;
                            }
                            else if (pole[x, put.Y] == 0)
                                pole[x, put.Y] = 1;
                            else break;
                        }

                        break;
                    case 2: // nahoru
                        for (int y = put.Y; y > 0; y--)
                        {

                            if (pole[put.X, y] == 2)
                            {
                                pole[put.X, y] = 1;
                                position.Remove(new Position(put.X, y));
                                pocet++;
                                if (pocet >= n)
                                    break;
                            }
                            else if (pole[put.X, y] == 0)
                                pole[put.X, y] = 1;
                            else break;
                        }

                        break;
                    case 3: //dolu
                        for (int y = put.Y; y < sizeY; y++)
                        {
                            if (pole[put.X, y] == 2) // nalezl základnu
                            {
                                pole[put.X, y] = 1; // položí zed
                                position.Remove(new Position(put.X, y)); // vymaže základnu
                                pocet++;
                                if (pocet >= n)
                                    break;
                            }
                            else if (pole[put.X, y] == 0)
                                pole[put.X, y] = 1;
                            else break;
                        }
                        break;
                }
                if (position.Count == 0)
                    return true;
                else
                    return Put(position[rnd.Next(0, position.Count)], rnd.Next(0, 4), rnd.Next(0, position.Count)); ;


        }

Proměnná n indikuje počet základen , které potkám než zastavím generování. Podmínka s n je jenom taková vychytávka, aby se nevygenerovala jenom zeď o jednom políčku.

Nějaká rada jak to urychlit / vylepšit ? Napadlo mě použít zásobník, ale nevím jak ho využít s náhodným generováním.

Editováno 21.4.2013 13:22
Odpovědět 21.4.2013 13:21
Pokrok nezastavíš, neusni a jdi s ním vpřed
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 1 zpráv z 1.