Lo primero que vamos a hacer es que la clase
ChessBoard implemente la interfaz INotifyPropertyChanged del namespace System.ComponentModel. Una vez hecho esto, añadimos el evento public event PropertyChangedEventHandler PropertyChanged y creamos un método que realice la llamada. Ahora que ya podemos notificar cambios en las propiedades, le incluimos una llamada a este método desde la propiedad BestParent, es decir, cada vez que se encuentre una solución parcial en el algoritmo queremos que actualice la pantalla, para ello cambiamos también la propiedad Bestparent por su equivalente de propiedad completa.
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
private List bestparent;
public List BestParent
{
get { return bestparent; }
set
{
bestparent = value;
OnPropertyChanged(nameof(BestParent));
}
}
A la clase ChessPiece le he añadido una propiedad nueva llamada Picture para incluirle la forma de la pieza de ajedrez.
Acto seguido, preparamos nuesto código XAMl, donde yo lo que he hecho, como nuestra clase ChessBoard era una lista de objetos ChessPiece, no he cambiado a coordenadas y simplemente he incluido 64 Textblock, uno por casilla y el DataContext de cada Textblock es el que corresponde a cada objeto de la lista de objetos ChessPiece. Posteriormente cada Textblock tendrá un style asociado donde se le crea el Binding con el texto o la figura de ajedrez. (Las piezas de ajedrez son caracteres Unicode. ♜♞♝♛♚♟♖♘♗♕♔♙).
El estilo aplicado a cada Textblock es el siguiente:
<Style x:Key="piece" TargetType="TextBlock">
<Setter Property="Text" Value="{Binding Picture}"/>
Código XAML
<Window x:Class="ChessBoardProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ChessBoardProject"
mc:Ignorable="d"
Title="MainWindow" Height="600" Width="800">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="20*"/>
<ColumnDefinition Width="20"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="20"/>
<RowDefinition Height="20*"/>
<RowDefinition Height="20"/>
</Grid.RowDefinitions>
<Grid Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="board">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="55"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="55"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="55"/>
<RowDefinition Height="50"/>
<RowDefinition Height="50"/>
<RowDefinition Height="50"/>
<RowDefinition Height="50"/>
<RowDefinition Height="50"/>
<RowDefinition Height="50"/>
<RowDefinition Height="55"/>
</Grid.RowDefinitions>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="0" Grid.Column="0"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="0" Grid.Column="1"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="0" Grid.Column="2"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="0" Grid.Column="3"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="0" Grid.Column="4"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="0" Grid.Column="5"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="0" Grid.Column="6"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="0" Grid.Column="7"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="1" Grid.Column="0"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="1" Grid.Column="1"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="1" Grid.Column="2"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="1" Grid.Column="3"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="1" Grid.Column="4"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="1" Grid.Column="5"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="1" Grid.Column="6"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="1" Grid.Column="7"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="2" Grid.Column="0"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="2" Grid.Column="1"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="2" Grid.Column="2"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="2" Grid.Column="3"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="2" Grid.Column="4"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="2" Grid.Column="5"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="2" Grid.Column="6"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="2" Grid.Column="7"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="3" Grid.Column="0"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="3" Grid.Column="1"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="3" Grid.Column="2"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="3" Grid.Column="3"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="3" Grid.Column="4"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="3" Grid.Column="5"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="3" Grid.Column="6"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="3" Grid.Column="7"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="4" Grid.Column="0"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="4" Grid.Column="1"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="4" Grid.Column="2"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="4" Grid.Column="3"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="4" Grid.Column="4"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="4" Grid.Column="5"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="4" Grid.Column="6"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="4" Grid.Column="7"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="5" Grid.Column="0"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="5" Grid.Column="1"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="5" Grid.Column="2"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="5" Grid.Column="3"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="5" Grid.Column="4"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="5" Grid.Column="5"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="5" Grid.Column="6"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="5" Grid.Column="7"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="6" Grid.Column="0"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="6" Grid.Column="1"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="6" Grid.Column="2"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="6" Grid.Column="3"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="6" Grid.Column="4"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="6" Grid.Column="5"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="6" Grid.Column="6"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="6" Grid.Column="7"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="7" Grid.Column="0"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="7" Grid.Column="1"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="7" Grid.Column="2"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="7" Grid.Column="3"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="7" Grid.Column="4"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="7" Grid.Column="5"/>
<Rectangle Style="{StaticResource blackCell}" Grid.Row="7" Grid.Column="6"/>
<Rectangle Style="{StaticResource whiteCell}" Grid.Row="7" Grid.Column="7"/>
<Rectangle Fill="Transparent" Stroke="Black" StrokeThickness="3" Grid.RowSpan="8" Grid.ColumnSpan="8"/>
<TextBlock DataContext="{Binding BestParent[0]}" Style="{StaticResource piece}" Grid.Row="0" Grid.Column="0"/>
<TextBlock DataContext="{Binding BestParent[1]}" Style="{StaticResource piece}" Grid.Row="0" Grid.Column="1"/>
<TextBlock DataContext="{Binding BestParent[2]}" Style="{StaticResource piece}" Grid.Row="0" Grid.Column="2"/>
<TextBlock DataContext="{Binding BestParent[3]}" Style="{StaticResource piece}" Grid.Row="0" Grid.Column="3"/>
<TextBlock DataContext="{Binding BestParent[4]}" Style="{StaticResource piece}" Grid.Row="0" Grid.Column="4"/>
<TextBlock DataContext="{Binding BestParent[5]}" Style="{StaticResource piece}" Grid.Row="0" Grid.Column="5"/>
<TextBlock DataContext="{Binding BestParent[6]}" Style="{StaticResource piece}" Grid.Row="0" Grid.Column="6"/>
<TextBlock DataContext="{Binding BestParent[7]}" Style="{StaticResource piece}" Grid.Row="0" Grid.Column="7"/>
<TextBlock DataContext="{Binding BestParent[8]}" Style="{StaticResource piece}" Grid.Row="1" Grid.Column="0"/>
<TextBlock DataContext="{Binding BestParent[9]}" Style="{StaticResource piece}" Grid.Row="1" Grid.Column="1"/>
<TextBlock DataContext="{Binding BestParent[10]}" Style="{StaticResource piece}" Grid.Row="1" Grid.Column="2"/>
<TextBlock DataContext="{Binding BestParent[11]}" Style="{StaticResource piece}" Grid.Row="1" Grid.Column="3"/>
<TextBlock DataContext="{Binding BestParent[12]}" Style="{StaticResource piece}" Grid.Row="1" Grid.Column="4"/>
<TextBlock DataContext="{Binding BestParent[13]}" Style="{StaticResource piece}" Grid.Row="1" Grid.Column="5"/>
<TextBlock DataContext="{Binding BestParent[14]}" Style="{StaticResource piece}" Grid.Row="1" Grid.Column="6"/>
<TextBlock DataContext="{Binding BestParent[15]}" Style="{StaticResource piece}" Grid.Row="1" Grid.Column="7"/>
<TextBlock DataContext="{Binding BestParent[16]}" Style="{StaticResource piece}" Grid.Row="2" Grid.Column="0"/>
<TextBlock DataContext="{Binding BestParent[17]}" Style="{StaticResource piece}" Grid.Row="2" Grid.Column="1"/>
<TextBlock DataContext="{Binding BestParent[18]}" Style="{StaticResource piece}" Grid.Row="2" Grid.Column="2"/>
<TextBlock DataContext="{Binding BestParent[19]}" Style="{StaticResource piece}" Grid.Row="2" Grid.Column="3"/>
<TextBlock DataContext="{Binding BestParent[20]}" Style="{StaticResource piece}" Grid.Row="2" Grid.Column="4"/>
<TextBlock DataContext="{Binding BestParent[21]}" Style="{StaticResource piece}" Grid.Row="2" Grid.Column="5"/>
<TextBlock DataContext="{Binding BestParent[22]}" Style="{StaticResource piece}" Grid.Row="2" Grid.Column="6"/>
<TextBlock DataContext="{Binding BestParent[23]}" Style="{StaticResource piece}" Grid.Row="2" Grid.Column="7"/>
<TextBlock DataContext="{Binding BestParent[24]}" Style="{StaticResource piece}" Grid.Row="3" Grid.Column="0"/>
<TextBlock DataContext="{Binding BestParent[25]}" Style="{StaticResource piece}" Grid.Row="3" Grid.Column="1"/>
<TextBlock DataContext="{Binding BestParent[26]}" Style="{StaticResource piece}" Grid.Row="3" Grid.Column="2"/>
<TextBlock DataContext="{Binding BestParent[27]}" Style="{StaticResource piece}" Grid.Row="3" Grid.Column="3"/>
<TextBlock DataContext="{Binding BestParent[28]}" Style="{StaticResource piece}" Grid.Row="3" Grid.Column="4"/>
<TextBlock DataContext="{Binding BestParent[29]}" Style="{StaticResource piece}" Grid.Row="3" Grid.Column="5"/>
<TextBlock DataContext="{Binding BestParent[30]}" Style="{StaticResource piece}" Grid.Row="3" Grid.Column="6"/>
<TextBlock DataContext="{Binding BestParent[31]}" Style="{StaticResource piece}" Grid.Row="3" Grid.Column="7"/>
<TextBlock DataContext="{Binding BestParent[32]}" Style="{StaticResource piece}" Grid.Row="4" Grid.Column="0"/>
<TextBlock DataContext="{Binding BestParent[33]}" Style="{StaticResource piece}" Grid.Row="4" Grid.Column="1"/>
<TextBlock DataContext="{Binding BestParent[34]}" Style="{StaticResource piece}" Grid.Row="4" Grid.Column="2"/>
<TextBlock DataContext="{Binding BestParent[35]}" Style="{StaticResource piece}" Grid.Row="4" Grid.Column="3"/>
<TextBlock DataContext="{Binding BestParent[36]}" Style="{StaticResource piece}" Grid.Row="4" Grid.Column="4"/>
<TextBlock DataContext="{Binding BestParent[37]}" Style="{StaticResource piece}" Grid.Row="4" Grid.Column="5"/>
<TextBlock DataContext="{Binding BestParent[38]}" Style="{StaticResource piece}" Grid.Row="4" Grid.Column="6"/>
<TextBlock DataContext="{Binding BestParent[39]}" Style="{StaticResource piece}" Grid.Row="4" Grid.Column="7"/>
<TextBlock DataContext="{Binding BestParent[40]}" Style="{StaticResource piece}" Grid.Row="5" Grid.Column="0"/>
<TextBlock DataContext="{Binding BestParent[41]}" Style="{StaticResource piece}" Grid.Row="5" Grid.Column="1"/>
<TextBlock DataContext="{Binding BestParent[42]}" Style="{StaticResource piece}" Grid.Row="5" Grid.Column="2"/>
<TextBlock DataContext="{Binding BestParent[43]}" Style="{StaticResource piece}" Grid.Row="5" Grid.Column="3"/>
<TextBlock DataContext="{Binding BestParent[44]}" Style="{StaticResource piece}" Grid.Row="5" Grid.Column="4"/>
<TextBlock DataContext="{Binding BestParent[45]}" Style="{StaticResource piece}" Grid.Row="5" Grid.Column="5"/>
<TextBlock DataContext="{Binding BestParent[46]}" Style="{StaticResource piece}" Grid.Row="5" Grid.Column="6"/>
<TextBlock DataContext="{Binding BestParent[47]}" Style="{StaticResource piece}" Grid.Row="5" Grid.Column="7"/>
<TextBlock DataContext="{Binding BestParent[48]}" Style="{StaticResource piece}" Grid.Row="6" Grid.Column="0"/>
<TextBlock DataContext="{Binding BestParent[49]}" Style="{StaticResource piece}" Grid.Row="6" Grid.Column="1"/>
<TextBlock DataContext="{Binding BestParent[50]}" Style="{StaticResource piece}" Grid.Row="6" Grid.Column="2"/>
<TextBlock DataContext="{Binding BestParent[51]}" Style="{StaticResource piece}" Grid.Row="6" Grid.Column="3"/>
<TextBlock DataContext="{Binding BestParent[52]}" Style="{StaticResource piece}" Grid.Row="6" Grid.Column="4"/>
<TextBlock DataContext="{Binding BestParent[53]}" Style="{StaticResource piece}" Grid.Row="6" Grid.Column="5"/>
<TextBlock DataContext="{Binding BestParent[54]}" Style="{StaticResource piece}" Grid.Row="6" Grid.Column="6"/>
<TextBlock DataContext="{Binding BestParent[55]}" Style="{StaticResource piece}" Grid.Row="6" Grid.Column="7"/>
<TextBlock DataContext="{Binding BestParent[56]}" Style="{StaticResource piece}" Grid.Row="7" Grid.Column="0"/>
<TextBlock DataContext="{Binding BestParent[57]}" Style="{StaticResource piece}" Grid.Row="7" Grid.Column="1"/>
<TextBlock DataContext="{Binding BestParent[58]}" Style="{StaticResource piece}" Grid.Row="7" Grid.Column="2"/>
<TextBlock DataContext="{Binding BestParent[59]}" Style="{StaticResource piece}" Grid.Row="7" Grid.Column="3"/>
<TextBlock DataContext="{Binding BestParent[60]}" Style="{StaticResource piece}" Grid.Row="7" Grid.Column="4"/>
<TextBlock DataContext="{Binding BestParent[61]}" Style="{StaticResource piece}" Grid.Row="7" Grid.Column="5"/>
<TextBlock DataContext="{Binding BestParent[62]}" Style="{StaticResource piece}" Grid.Row="7" Grid.Column="6"/>
<TextBlock DataContext="{Binding BestParent[63]}" Style="{StaticResource piece}" Grid.Row="7" Grid.Column="7"/>
</Grid>
<Button Content="Start" Grid.Column="1" HorizontalAlignment="Right" Grid.Row="1" VerticalAlignment="Bottom" Width="75" Margin="20" Click="Button_Click"/>
</Grid>
</Window>
Para no bloquear la interfaz, creamos una tarea y ejecutamos. Le he puesto un retardo de unos cuantos milisegundos en cada solución parcial para ver como actua el algoritmo y el resultado.


Esta obra está bajo una Licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional.
















Una vez tenemos la matriz inicial, empezaremos a realizar comparaciones por filas de cada caracter con el caracter de cada columna. En cada operación, obtenemos primero el peso y tres valores de los cuales deduciremos el menor de ellos como valor final y con un ejemplo lo veremos mejor.


¿Que utilidades podemos darle? por ejemplo palabras sugerentes en base a un diccionario o aproximaciones, corrección de ortografía, etc. y además, existen variantes del algoritmo como la de Damerau-Levenshtein, otros más complejos, algoritmos fonéticos.








