using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace Bludiště { public partial class Form1 : Form { char[,] bludiste; int sirka, vyska; Point start, cil; Point pozice; bool posunuto = false; int uhel; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) //dialog pro otevreni { textBox1.Text = openFileDialog1.FileName; button2_Click(null, null); } } private void button2_Click(object sender, EventArgs e) { #region Čtení if (!File.Exists(textBox1.Text)) { MessageBox.Show("Soubor neexistuje."); return; } StreamReader soubor = new StreamReader(textBox1.Text); //stream reader string radek = null; radek = soubor.ReadLine(); string[] hodnoty = radek.Split(' '); //velikost pole sirka = Convert.ToInt32(hodnoty[0]); vyska = Convert.ToInt32(hodnoty[1]); bludiste = new char[sirka, vyska]; for (int i = 0; i < vyska; i++) { radek = soubor.ReadLine(); int j = 0; for (int c = 0; c < radek.Length; c++) { if ((radek[c] == '.') || (radek[c] == 'X') || (radek[c] == '&') || (radek[c] == '#')) { bludiste[j, i] = radek[c]; if (radek[c] == '&') { start = new Point(j, i); } else if (radek[c] == '#') { cil = new Point(j, i); } j++; } } } soubor.Close(); #endregion this.Refresh(); NajdiCestu(); } private void NajdiCestu() { pozice = start; uhel = 0; while (pozice != cil) { posunuto = false; #region Základní hledání switch (uhel) { case 0: Nahoru(); Vpravo(); Dolu(); Vlevo(); break; case 1: Vpravo(); Dolu(); Vlevo(); Nahoru(); break; case 2: Dolu(); Vlevo(); Nahoru(); Vpravo(); break; case 3: Vlevo(); Nahoru(); Vpravo(); Dolu(); break; } #endregion #region Slepé uličky if (!posunuto) { switch (uhel) { case 0: Nahoru2(); Vpravo2(); Dolu2(); Vlevo2(); break; case 1: Vpravo2(); Dolu2(); Vlevo2(); Nahoru2(); break; case 2: Dolu2(); Vlevo2(); Nahoru2(); Vpravo2(); break; case 3: Vlevo2(); Nahoru2(); Vpravo2(); Dolu2(); break; } } if (!posunuto) { this.Refresh(); MessageBox.Show("Cestu se nepodařilo nalézt."); return; } #endregion if (zpomalene.Checked) { this.Refresh(); System.Threading.Thread.Sleep(100); } Application.DoEvents(); } this.Refresh(); MessageBox.Show("Cesta úspěšně nalezena!"); } private void Vlevo2() { if (posunuto) return; try { if ((pozice.X > 0) && (bludiste[pozice.X - 1, pozice.Y] != 'X') && (bludiste[pozice.X - 1, pozice.Y] != 'x')) { bludiste[pozice.X, pozice.Y] = 'x'; pozice.X--; posunuto = true; uhel = 3; } } catch { } } private void Vpravo2() { if (posunuto) return; try { if ((pozice.X < sirka - 1) && (bludiste[pozice.X + 1, pozice.Y] != 'X') && (bludiste[pozice.X + 1, pozice.Y] != 'x')) { bludiste[pozice.X, pozice.Y] = 'x'; pozice.X++; posunuto = true; uhel = 1; } } catch { } } private void Dolu2() { if (posunuto) return; try { if ((pozice.Y < vyska - 1) && (bludiste[pozice.X, pozice.Y + 1] != 'X') && (bludiste[pozice.X, pozice.Y + 1] != 'x')) { bludiste[pozice.X, pozice.Y] = 'x'; pozice.Y++; posunuto = true; uhel = 2; } } catch { } } private void Nahoru2() { if (posunuto) return; try { if ((pozice.Y > 0) && (bludiste[pozice.X, pozice.Y - 1] != 'X') && (bludiste[pozice.X, pozice.Y - 1] != 'x')) { bludiste[pozice.X, pozice.Y] = 'x'; pozice.Y--; posunuto = true; uhel = 0; } } catch { } } private void Vlevo() { if (posunuto) return; try { if ((pozice.X > 0) && (bludiste[pozice.X - 1, pozice.Y] != 'X') && (bludiste[pozice.X - 1, pozice.Y] != 'x') && (bludiste[pozice.X - 1, pozice.Y] != '+')) { bludiste[pozice.X, pozice.Y] = '+'; pozice.X--; posunuto = true; uhel = 3; } } catch { } } private void Vpravo() { if (posunuto) return; try { if ((pozice.X < sirka - 1) && (bludiste[pozice.X + 1, pozice.Y] != 'X') && (bludiste[pozice.X + 1, pozice.Y] != 'x') && (bludiste[pozice.X + 1, pozice.Y] != '+')) { bludiste[pozice.X, pozice.Y] = '+'; pozice.X++; posunuto = true; uhel = 1; } } catch { } } private void Dolu() { if (posunuto) return; try { if ((pozice.Y < vyska - 1) && (bludiste[pozice.X, pozice.Y + 1] != 'X') && (bludiste[pozice.X, pozice.Y + 1] != 'x') && (bludiste[pozice.X, pozice.Y + 1] != '+')) { bludiste[pozice.X, pozice.Y] = '+'; pozice.Y++; posunuto = true; uhel = 2; } } catch { } } private void Nahoru() { if (posunuto) return; try { if ((pozice.Y > 0) && (bludiste[pozice.X, pozice.Y - 1] != 'X') && (bludiste[pozice.X, pozice.Y - 1] != 'x') && (bludiste[pozice.X, pozice.Y - 1] != '+')) { bludiste[pozice.X, pozice.Y] = '+'; pozice.Y--; posunuto = true; uhel = 0; } } catch { } } private void button3_Click(object sender, EventArgs e) { Editor editor = new Editor(); editor.Show(); } private void Form1_Paint(object sender, PaintEventArgs e) { if (bludiste == null) return; Graphics kp = e.Graphics; int rozliseni; for (int i = 0; i < sirka; i++) { for (int j = 0; j < vyska; j++) { if (sirka > vyska) rozliseni = 500 / (int)sirka; else rozliseni = 500 / (int)vyska; Rectangle ctverec = new Rectangle(rozliseni * i + 16, rozliseni * j + 86, rozliseni, rozliseni); #region Položky switch (bludiste[i, j]) { case '.': kp.FillRectangle(Brushes.White, ctverec); break; case '+': kp.FillRectangle(Brushes.LightGray, ctverec); break; case 'x': kp.FillRectangle(Brushes.Blue, ctverec); break; case 'X': kp.FillRectangle(Brushes.DarkBlue, ctverec); break; case '&': kp.FillRectangle(Brushes.White, ctverec); kp.FillEllipse(Brushes.Yellow, ctverec); break; case '#': kp.FillRectangle(Brushes.White, ctverec); kp.FillEllipse(Brushes.Green, ctverec); break; } #endregion kp.FillEllipse(Brushes.Yellow, new Rectangle(rozliseni * start.X + 16, rozliseni * start.Y + 86, rozliseni, rozliseni)); } } } } }