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