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.