public Form1() { editModus = 0; Daten = new Knoten[15, 30]; InitializeComponent(); Feld.ReadOnly = true; Feld.ColumnCount = 30; Feld.RowCount = 15; Feld.AllowUserToResizeRows = false; Feld.AllowUserToResizeColumns = false; for (int i = 0; i < Feld.ColumnCount; i++) { Feld.Columns[i].Width = 20; } for (int a = 0; a < 15; a++) { for (int b = 0; b < 30; b++) { Daten[a, b] = new Knoten(a, b); } } }
private void timer1_Tick(object sender, EventArgs e) { #region working if (working == true) { //find smallest distance int min = unvisited.ElementAt(0).distance; actuell = unvisited.ElementAt(0); for (int i = 0; i < unvisited.Count; i++) { if (unvisited.ElementAt(i).distance <= min) { min = unvisited.ElementAt(i).distance; actuell = unvisited.ElementAt(i); } } if (actuell.state == 3) { working = false; backtracking = true; } unvisited.Remove(actuell); Daten[actuell.pos[0], actuell.pos[1]].visited = true; //scan neighbours //right if (actuell.pos[0] + 1 < 15 && Daten[actuell.pos[0] + 1, actuell.pos[1]].visited == false && Daten[actuell.pos[0] + 1, actuell.pos[1]].distance > (actuell.distance + 1) && Daten[actuell.pos[0] + 1, actuell.pos[1]].state != 1) { Daten[actuell.pos[0] + 1, actuell.pos[1]].dad[0] = actuell.pos[0]; Daten[actuell.pos[0] + 1, actuell.pos[1]].dad[1] = actuell.pos[1]; Daten[actuell.pos[0] + 1, actuell.pos[1]].distance = actuell.distance + 1; if (Daten[actuell.pos[0] + 1, actuell.pos[1]].state == 0) { Feld[actuell.pos[1], actuell.pos[0] + 1].Style.BackColor = Color.LightSalmon; } } //left if (actuell.pos[0] - 1 > -1 && Daten[actuell.pos[0] - 1, actuell.pos[1]].visited == false && Daten[actuell.pos[0] - 1, actuell.pos[1]].distance > (actuell.distance + 1) && Daten[actuell.pos[0] - 1, actuell.pos[1]].state != 1) { Daten[actuell.pos[0] - 1, actuell.pos[1]].dad[0] = actuell.pos[0]; Daten[actuell.pos[0] - 1, actuell.pos[1]].dad[1] = actuell.pos[1]; Daten[actuell.pos[0] - 1, actuell.pos[1]].distance = actuell.distance + 1; if (Daten[actuell.pos[0] - 1, actuell.pos[1]].state == 0) { Feld[actuell.pos[1], actuell.pos[0] - 1].Style.BackColor = Color.LightSalmon; } } //up if (actuell.pos[1] + 1 < 30 && Daten[actuell.pos[0], actuell.pos[1] + 1].visited == false && Daten[actuell.pos[0], actuell.pos[1] + 1].distance > (actuell.distance + 1) && Daten[actuell.pos[0], actuell.pos[1] + 1].state != 1) { Daten[actuell.pos[0], actuell.pos[1] + 1].dad[0] = actuell.pos[0]; Daten[actuell.pos[0], actuell.pos[1] + 1].dad[1] = actuell.pos[1]; Daten[actuell.pos[0], actuell.pos[1] + 1].distance = actuell.distance + 1; if (Daten[actuell.pos[0], actuell.pos[1] + 1].state == 0) { Feld[actuell.pos[1] + 1, actuell.pos[0]].Style.BackColor = Color.LightSalmon; } } //down if (actuell.pos[1] - 1 > -1 && Daten[actuell.pos[0], actuell.pos[1] - 1].visited == false && Daten[actuell.pos[0], actuell.pos[1] - 1].distance > (actuell.distance + 1) && Daten[actuell.pos[0], actuell.pos[1] - 1].state != 1) { Daten[actuell.pos[0], actuell.pos[1] - 1].dad[0] = actuell.pos[0]; Daten[actuell.pos[0], actuell.pos[1] - 1].dad[1] = actuell.pos[1]; Daten[actuell.pos[0], actuell.pos[1] - 1].distance = actuell.distance + 1; if (Daten[actuell.pos[0], actuell.pos[1] - 1].state == 0) { Feld[actuell.pos[1] - 1, actuell.pos[0]].Style.BackColor = Color.LightSalmon; } } //refresh unvisited unvisited.Clear(); for (int a = 0; a < 15; a++) { for (int b = 0; b < 30; b++) { if (Daten[a, b].state != 1 && Daten[a, b].visited == false) { unvisited.Add(Daten[a, b]); } } } } #endregion #region backtracking if (backtracking) { actuell = Daten[actuell.dad[0], actuell.dad[1]]; if (actuell.state == 2) { backtracking = false; } else { Feld[actuell.pos[1], actuell.pos[0]].Style.BackColor = Color.Yellow; } } #endregion }