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); }
/// <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; } }
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); }