/// <summary> /// Fuegt der Mauer eine neue Reihe hinzu, wenn noch Platz ist /// </summary> /// <param name="newReihe">Die Reihe, die hinzugefuegt werden soll</param> public Mauer AddReihe(Reihe newReihe) { if (newReihe == null) { return(this); } for (var i = 0; i < Reihen.Length; i++) { if (Reihen[i] == null) { Reihen[i] = newReihe; BesetzteFugen.UnionWith(newReihe.BesetzteFugen); if (i == Reihen.Length - 1) // Letzte Reihe wurde gesetzt. Mauer ist voll { Fertig = true; } return(this); } } return(this); }
/// <summary> /// Erzeugt eine neues <see cref="Mauer"/> Objekt /// </summary> /// <param name="mauer">Die Mauer, die "geklont" wird</param> public Mauer(Mauer mauer) { BesetzteFugen = new HashSet <byte>(); Reihen = new Reihe[mauer.Reihen.Length]; Fertig = false; for (var i = 0; i < mauer.Reihen.Length; i++) { if (mauer.Reihen[i] != null) { AddReihe(mauer.Reihen[i]); } } }
/// <summary> /// Ueberprueft ob zwei Reihen kompatibel sind /// </summary> /// <param name="a">Die erste Reihe</param> /// <param name="b">Die zweite Reihe</param> /// <param name="matrix">Die bisher gebildete Reihen Matrix</param> /// <returns>True wenn die Reihen kompatibel sind</returns> public static bool ReihenSindKompatibel(Reihe a, Reihe b, ref byte[][] matrix) { if (a == null) { return(true); // Weil die Mauer ja direkt die maximal Hoehe hat } var indexA = a.Id; var indexB = b.Id; if (matrix[indexA] != null && matrix[indexA][indexB] != 0) // Bereits eingetragen { return(matrix[indexA][indexB] == 2); } if (matrix[indexB] != null && matrix[indexB][indexA] != 0) // Bereits eingetragen (gespiegelt) { return(matrix[indexB][indexA] == 2); } // Noch nicht eingetragen if (matrix[indexA] == null) { matrix[indexA] = new byte[matrix.Length]; } // Reihen checken var fugenUeberlappungen = a.BesetzteFugen.Intersect(b.BesetzteFugen); var kompatibel = !fugenUeberlappungen.Any(); // Reihen eintragen if (kompatibel) { matrix[indexA][indexB] = 2; } else { matrix[indexA][indexB] = 1; } return(kompatibel); }
/// <summary> /// Erzeugt ein neues <see cref="Mauer"/> Objekt /// </summary> /// <param name="maxHoehe">Die maximale Hoehe der Mauer</param> public Mauer(int maxHoehe) { BesetzteFugen = new HashSet <byte>(); Reihen = new Reihe[maxHoehe]; Fertig = false; }