/// <summary> /// Малює 15 елементів паззду /// </summary> private void DrawBoard() { //очистити ігрову панель cnv.Children.Clear(); //оголошення масиву з 15 чисел, що слугуватимуть цільовим значенням комірок var arr = new int[15]; for (int i = 0; i < 15; i++) { arr[i] = i+1; } //кількість елементів в масиві, що залишились незадіяними //var numbersInArrayLeft = 15; //створити Генератор випадкових чисел var rnd = new MerseneTwister(); //Цикл //Виконати чотири рази, де кожна ітерація відповідає за рядок for (int i = 0; i < 4; i++) { //Цикл //Виконати чотири рази, де кожна ітерація відповідає стовпець for (int j = 0; j < 4; j++) { //поточна позиція комірки var pos = i*4 + j + 1; //Вийти з циклу, якщо дістались до останньої комірки if (pos == 16) break; //згенерувати випадкове число, що слугує номером елементу в масиві //var target = rnd.GetRandom(16 - pos); //var target1 = pos; //створити новий елемент пазлу var item = new PuzzleItem(pos) { Width = cnv.Width / 4, Height = cnv.Height / 4, X = i, Y = j, CurrentPosition = pos }; Canvas.SetTop(item, i * cnv.Height / 4); Canvas.SetLeft(item, j * cnv.Width / 4); item.MouseLeftButtonUp += new MouseButtonEventHandler(item_MouseHandler); //if (item.CurrentPosition == item.TargetPosition) //{ // flags[item.TargetPosition - 1] = true; //} cnv.Children.Add(item); ////поміняти місьцями задіяний елемент із останнім незадіяним //numbersInArrayLeft--; //var temp = arr[target]; //arr[target] = arr[numbersInArrayLeft]; //arr[numbersInArrayLeft] = temp; } } _emptyCell.Position = 16; for (int i = 0; i < 164; i++) { Random(); } foreach (var item in cnv.Children.OfType<PuzzleItem>()) { if (item.CurrentPosition == item.TargetPosition) { _flags[item.TargetPosition - 1] = true; } } }
private void Random() { var rnd = new MerseneTwister(); var num = rnd.GetRandom(4); var pos = _emptyCell.GetRandomContactSide(num); var item = cnv.Children.OfType<PuzzleItem>().First(i => i.CurrentPosition == pos); cnv.Children.Remove(item); var x = (_emptyCell.Position - 1) / 4; var y = (_emptyCell.Position - 1) % 4; Canvas.SetTop(item, (int)((_emptyCell.Position - 1) / 4) * cnv.Width / 4); Canvas.SetLeft(item, (int)((_emptyCell.Position - 1) % 4) * cnv.Width / 4); var temp = _emptyCell.Position; _emptyCell.Position = item.CurrentPosition; item.CurrentPosition = temp; cnv.Children.Add(item); }