Пример #1
0
        public bool[] vratPouzitiSousednichBunek(Bunka[,] bludiste)
        {
            bool[] pouzite = new bool[pruchod.Length];
            for (int t = 0; t < pouzite.Length; t++)
            {
                pouzite[t] = false;
            }

            for (int smer = 0; smer < pruchod.Length; smer++)
            {
                Point p = Bunka.getNewPosition(i, j, smer);
                if (Bunka.jsemVBludisti(p, bludiste))
                {
                    if (bludiste[p.Y, p.X].jePouzita())
                    {
                        pouzite[smer] = true;
                    }
                }
            }

            return(pouzite);
        }
Пример #2
0
        private void hybejse(object sender, KeyEventArgs e)
        {
            if (end)
            {
                return;
            }

            switch (e.KeyCode)
            {
            case Keys.Right:
                if (hrac.muzuJitVeSmeru(Bunka.Right))
                {
                    if (hrac.j + 1 < bludiste.GetLength(1))
                    {
                        hrac = bludiste[hrac.i, hrac.j + 1];
                    }
                }
                break;

            case Keys.Left:
                if (hrac.muzuJitVeSmeru(Bunka.Left))
                {
                    if (hrac.j - 1 >= 0)
                    {
                        hrac = bludiste[hrac.i, hrac.j - 1];
                    }
                }
                break;

            case Keys.Up:
                if (hrac.muzuJitVeSmeru(Bunka.Up))
                {
                    if (hrac.i - 1 >= 0)
                    {
                        hrac = bludiste[hrac.i - 1, hrac.j];
                    }
                }
                break;

            case Keys.Down:
                if (hrac.muzuJitVeSmeru(Bunka.Down))
                {
                    if (hrac.i + 1 < bludiste.GetLength(0))
                    {
                        hrac = bludiste[hrac.i + 1, hrac.j];
                    }
                }
                break;

            default: return;
            }

            if (start == false)
            {
                start     = true;
                startTime = DateTime.Now;
            }

            Invalidate();

            if (hrac.konec)
            {
                end     = true;
                endTime = DateTime.Now;
                MessageBox.Show("Blahopřeji, vyhrál jste :]", "Hra trvala: " + hraloseMinut + ":" + hraloseSekund);

                Cas.Text  = Cas.Text.Remove(Cas.Text.IndexOf(":") + 2);
                Cas.Text += "00:00";
            }
        }
Пример #3
0
        /// <summary>
        /// Funkce vyboura tunel na konec
        /// </summary>
        /// <param name="i">vyskova pozice vstupu</param>
        /// <param name="j">horizontalni pozice vstupu</param>
        /// <param name="pruchod">urcuje smer, odkud se prislo</param>
        /// <param name="konec">urcuje, ve kterym smeru je idealni skoncit (nerika, at tak vzdy skonci, pouze idealni stav)</param>
        /// <param name="rnd">generator nahodnych cisel</param>
        public void VybourejCestu(int i, int j, int pruchod, int konec, Random rnd)
        {
            int smer = rnd.Next(0, 3);

            while (smer == pruchod)
            {
                smer = rnd.Next(0, 3);
            }

            while (smer == Bunka.Left && j == 0)
            {
                smer = rnd.Next(0, 3);
            }

            while (smer == Bunka.Up && i == 0)
            {
                smer = rnd.Next(0, 3);
            }

            if (smer == konec)
            {
                if ((smer == Bunka.Right && j == bludiste.GetLength(1) - 1) || (smer == Bunka.Down && i == bludiste.GetLength(0) - 1))
                {
                    bludiste[i, j].konec            = true;
                    bludiste[i, j].Pruchod[pruchod] = true;
                    bludiste[i, j].Pruchod[smer]    = true;
                    bludiste[i, j].locked           = true;
                    cesta.Push(bludiste[i, j]);
                    return;
                }
            }


            bludiste[i, j].Pruchod[pruchod] = true;
            bludiste[i, j].cesta            = true;
            bludiste[i, j].Pruchod[smer]    = true;
            bludiste[i, j].locked           = true;

            cesta.Push(bludiste[i, j]);


            Point p = Bunka.getNewPosition(i, j, smer);

            i = p.Y;
            j = p.X;


            if (i < bludiste.GetLength(0) && j < bludiste.GetLength(1))
            {
                VybourejCestu(i, j, Bunka.InverzniSmer(smer), konec, rnd);
            }
            else
            {
                if (i >= bludiste.GetLength(0))
                {
                    i--;
                }

                if (j >= bludiste.GetLength(1))
                {
                    j--;
                }


                bludiste[i, j].locked = false;
                bludiste[i, j].konec  = true;
                bludiste[i, j].Pruchod[Bunka.Down] = true;
                bludiste[i, j].locked = true;
                return;
            }
        }
Пример #4
0
        private void ProbourejSteny(Random rnd)
        {
            Bunka pokracovaciBunka = cesta.Pop();

            do
            {
                if (pokracovaciBunka != null)
                {
                    bool[] pouzite = pokracovaciBunka.vratPouzitiSousednichBunek(bludiste);

                    int count = 0;
                    for (int m = 0; m < pouzite.Length; m++)
                    {
                        if (pouzite[m])
                        {
                            count++;
                        }
                    }

                    if (count == 4)
                    {
                        pokracovaciBunka = null;
                        continue;
                    }


                    bool[] otestovano  = new bool[4];
                    int    nahodnysmer = rnd.Next(0, 3);
                    Point  p3          = Bunka.getNewPosition(pokracovaciBunka.i, pokracovaciBunka.j, nahodnysmer);
                    do
                    {
                        int g = 0;
                        for (int k = 0; k < otestovano.Length; k++)
                        {
                            if (otestovano[k])
                            {
                                g++;
                            }
                        }

                        if (g == 4)
                        {
                            break;
                        }

                        int irandom = rnd.Next(0, 1000);
                        if (irandom <= 250)
                        {
                            nahodnysmer = 0;
                        }
                        else if (irandom <= 500)
                        {
                            nahodnysmer = 1;
                        }
                        else if (irandom <= 750)
                        {
                            nahodnysmer = 2;
                        }
                        else if (irandom <= 1000)
                        {
                            nahodnysmer = 3;
                        }


                        p3 = Bunka.getNewPosition(pokracovaciBunka.i, pokracovaciBunka.j, nahodnysmer);

                        int counter     = 0;
                        int correctSmer = -1;
                        for (int c = 0; c < pouzite.Length; c++)
                        {
                            if (pouzite[c])
                            {
                                counter++;
                            }
                            else
                            {
                                correctSmer = c;
                            }
                        }

                        otestovano[nahodnysmer] = true;

                        if (counter == 3)
                        {
                            nahodnysmer = correctSmer;
                        }
                    } while (pouzite[nahodnysmer] || !Bunka.jsemVBludisti(p3, bludiste));


                    Point p4 = Bunka.getNewPosition(pokracovaciBunka.i, pokracovaciBunka.j, nahodnysmer);

                    if (!Bunka.jsemVBludisti(p4, bludiste))
                    {
                        pokracovaciBunka = null;
                        continue;
                    }


                    for (int a = 0; a < pouzite.Length; a++)
                    {
                        if (a != nahodnysmer)
                        {
                            if (!pouzite[a])
                            {
                                Point p = Bunka.getNewPosition(pokracovaciBunka.i, pokracovaciBunka.j, a);
                                if (Bunka.jsemVBludisti(p, bludiste))
                                {
                                    cesta.Push(bludiste[p.Y, p.X]);
                                }
                            }
                        }
                    }

                    pokracovaciBunka.Pruchod[nahodnysmer] = true;
                    Point p2 = Bunka.getNewPosition(pokracovaciBunka.i, pokracovaciBunka.j, nahodnysmer);
                    pokracovaciBunka = bludiste[p2.Y, p2.X];
                    pokracovaciBunka.Pruchod[Bunka.InverzniSmer(nahodnysmer)] = true;

                    if (animovatbludiste)
                    {
                        Invalidate();
                        System.Threading.Thread.Sleep(zdrzeni);
                        Application.DoEvents();
                    }
                }
                else
                {
                    pokracovaciBunka = cesta.Pop();
                }
            } while (cesta.Count != 0);
        }
Пример #5
0
        private void GenerujBludiste()
        {
            start = false;
            end   = false;

            int sirka             = this.ClientSize.Width - (odsazeniX + 30);
            int vyska             = this.ClientSize.Height - (odsazeniY + 30);
            nastavenivelikosti nv = new nastavenivelikosti();

            nv.originalniSirka = sirka;
            nv.originalniVyska = vyska;

            velikost = new Point(sirka, vyska);

            sirka = sirka / (int)Bunka.krokX;
            vyska = vyska / (int)Bunka.krokY;

            nv.krok.Value = Convert.ToDecimal((int)(((float)(Bunka.krokX + Bunka.krokY)) / 2f));

            nv.radky.Maximum   = Convert.ToDecimal(vyska);
            nv.sloupce.Maximum = Convert.ToDecimal(sirka);
            nv.radky.Value     = Convert.ToDecimal(vyska);
            nv.sloupce.Value   = Convert.ToDecimal(sirka);

            DialogResult ukonceni = nv.ShowDialog();

            if (ukonceni == DialogResult.OK)
            {
                sirka       = Convert.ToInt32(nv.sloupce.Value);
                vyska       = Convert.ToInt32(nv.radky.Value);
                Bunka.krokY = Convert.ToInt32(nv.krok.Value);
                Bunka.krokX = Convert.ToInt32(nv.krok.Value);
            }
            else
            {
                return;
            }



            bludiste = new Bunka[vyska, sirka];

            for (int i = 0; i < vyska; i++)
            {
                for (int j = 0; j < sirka; j++)
                {
                    bludiste[i, j]   = new Bunka();
                    bludiste[i, j].i = i;
                    bludiste[i, j].j = j;
                }
            }

            int    mistovchodu = 0;
            Random rnd         = new Random();

            //urcuje, zda bude vchod ze boku
            int smer = rnd.Next(0, 50);

            int vchodY = 0;
            int vchodX = 0;

            int smerVchodu = 0;

            if (smer > 25)
            {
                mistovchodu = rnd.Next(1, vyska - 1);
                smerVchodu  = Bunka.Left;

                vchodX = 0;
                vchodY = mistovchodu;
            }
            else
            {
                mistovchodu = rnd.Next(1, sirka - 1);
                smerVchodu  = Bunka.Up;

                vchodX = mistovchodu;
                vchodY = 0;
            }

            hrac = bludiste[vchodY, vchodX];

            cesta.Push(bludiste[vchodY, vchodX]);
            VybourejCestu(vchodY, vchodX, smerVchodu, Bunka.InverzniSmer(smerVchodu), rnd);

            ProbourejSteny(rnd);
        }
        /// <summary>
        /// Metoda vygeneruje perfektni bludiste.
        /// </summary>
        /// <param name="w">Sirka bludiste v bunkach.</param>
        /// <param name="h">Vyska bludiste v bunkach.</param>
        /// <returns>Pole bunek reprezentujici bludiste.</returns>
        public Bunka[,] generujPerfektniBludiste(int w, int h)
        {
            int probouraneZdi = 0;

            Bunka[,] bludiste = new Bunka[w, h];
            for (int i = 0; i < w; i++)
            {
                for (int j = 0; j < h; j++)
                {
                    bludiste[i, j] = new Bunka();
                }
            }

            Stack <Point> zasobnik = new Stack <Point>();

            //vybrani pocatecni bunky
            Random r     = new Random();
            Point  start = new Point(r.Next(w), r.Next(h));

            zasobnik.Push(start);

            while (zasobnik.Count > 0)
            {
                //pozice bunky v poli bludiste, nevybere ze zasobniku
                Point p = zasobnik.Peek();


                List <Point> nenavstiveno = new List <Point>();
                //kontrola navstivenosti sousednich bunek
                //nad bunkou
                if (p.Y > 0)
                {
                    if (bludiste[p.X, p.Y - 1].jeNedotcena())
                    {
                        nenavstiveno.Add(new Point(p.X, p.Y - 1));
                    }
                }
                //vpravo od bunky
                if (p.X < w - 1)
                {
                    if (bludiste[p.X + 1, p.Y].jeNedotcena())
                    {
                        nenavstiveno.Add(new Point(p.X + 1, p.Y));
                    }
                }
                //pod bunkou
                if (p.Y < h - 1)
                {
                    if (bludiste[p.X, p.Y + 1].jeNedotcena())
                    {
                        nenavstiveno.Add(new Point(p.X, p.Y + 1));
                    }
                }
                //vlevo od bunky
                if (p.X > 0)
                {
                    if (bludiste[p.X - 1, p.Y].jeNedotcena())
                    {
                        nenavstiveno.Add(new Point(p.X - 1, p.Y));
                    }
                }

                //uz neni zadna nenavstivena bunka
                if (nenavstiveno.Count > 0)
                {
                    //vyber jedne nenavstivene bunky kudy povede cesta
                    int   d     = r.Next(nenavstiveno.Count);
                    Point dalsi = nenavstiveno.ElementAt(d);
                    nenavstiveno.RemoveAt(d);
                    probourejZed(bludiste, p, dalsi);
                    probouraneZdi++;

                    //pridani souseda na zasobnik
                    zasobnik.Push(dalsi);
                }
                //uz neni zadna jina cesty, vybere soucasnou bunku ze zasobniku
                else
                {
                    zasobnik.Pop();
                }
            }

            return(bludiste);
        }