using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace SimplePuzzle { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { private Button[,] _puzzleButtons; private Random _random = new Random(); public MainWindow() { InitializeComponent(); InitPuzzle(); } private void InitPuzzle() { _puzzleButtons = new Button[3, 3]; int counter = 1; for (int row = 0; row < 3; row++) { for (int col = 0; col < 3; col++) { Button button = new Button { Content = counter == 9 ? "" : counter.ToString(), Width = 50, Height = 50 }; button.Click += PuzzleButton_Click; _puzzleButtons[row, col] = button; Grid.SetRow(button, row); Grid.SetColumn(button, col); PuzzleGrid.Children.Add(button); counter++; } } ShufflePuzzle(); } private void ShufflePuzzle() { int n = 3 * 3; while (n > 1) { n--; int k = _random.Next(n + 1); int row1 = n / 3; int col1 = n % 3; int row2 = k / 3; int col2 = k % 3; Button temp = _puzzleButtons[row1, col1]; _puzzleButtons[row1, col1] = _puzzleButtons[row2, col2]; _puzzleButtons[row2, col2] = temp; Grid.SetRow(_puzzleButtons[row1, col1], row1); Grid.SetColumn(_puzzleButtons[row1, col1], col1); Grid.SetRow(_puzzleButtons[row2, col2], row2); Grid.SetColumn(_puzzleButtons[row2, col2], col2); } } private void PuzzleButton_Click(object sender, RoutedEventArgs e) { Button clickedButton = sender as Button; if (clickedButton == null) return; int row = Grid.GetRow(clickedButton); int col = Grid.GetColumn(clickedButton); if (!CheckMoveValidation(row, col)) return; Button emptyButton = FindEmptyButton(); SwapButton(clickedButton, emptyButton); if (IsPuzzleSolved()) MessageBox.Show("🎊 Congratulations!! 🎊"); } private bool CheckMoveValidation(int row, int col) { return (Math.Abs(row - FindEmptyButtonRow()) + Math.Abs(col - FindEmptyButtonCol()) == 1); } private Button FindEmptyButton() { for (int row = 0; row < 3; row++) { for (int col = 0; col < 3; col++) { if (string.IsNullOrEmpty(_puzzleButtons[row, col].Content.ToString())) return _puzzleButtons[row, col]; } } return null; } private int FindEmptyButtonRow() { return Grid.GetRow(FindEmptyButton()); } private int FindEmptyButtonCol() { return Grid.GetColumn(FindEmptyButton()); } private void SwapButton(Button button1, Button button2) { int row1 = Grid.GetRow(button1); int col1 = Grid.GetColumn(button1); int row2 = Grid.GetRow(button2); int col2 = Grid.GetColumn(button2); _puzzleButtons[row1, col1] = button2; _puzzleButtons[row2, col2] = button1; Grid.SetRow(button1, row2); Grid.SetColumn(button1, col2); Grid.SetRow(button2, row1); Grid.SetColumn(button2, col1); } private bool IsPuzzleSolved() { int counter = 1; for (int row = 0; row < 3; row++) { for (int col = 0; col < 3; col++) { if (row == 2 && col == 2) return string.IsNullOrEmpty(_puzzleButtons[row, col].Content.ToString()); if (_puzzleButtons[row, col].Content.ToString() != counter.ToString()) return false; counter++; } } return true; } } }