15 puzzle game: Difference between revisions

Add IsSolvable method in C#
(Fix C# for 15-14 case)
(Add IsSolvable method in C#)
Line 3,977:
{{libheader|System.Windows.Forms}}
{{libheader|System.Drawing}}
{{works with|C sharp|63+}}
<syntaxhighlight lang="csharp">using System;
using System.Collections.Generic;
Line 3,994:
private DateTime Start;
 
private classControl PuzzleHighlightNormalSolve;
private Control HighlightAltSolve;
 
public class Puzzle
{
private int mOrderedNumer;
Line 4,003 ⟶ 4,006:
public int X;
public int Y;
 
public int InvX
{
get { return (GridSize - 1) - X; }
}
public int InvY
{
get { return (GridSize - 1) - Y; }
}
 
public Puzzle(int OrderedNumer)
Line 4,015 ⟶ 4,027:
X = OrderedNumer % GridSize;
Y = OrderedNumer / GridSize;
}
public Puzzle(int OrderedNumer, int CurrentNumber)
: this(OrderedNumer)
{
this.CurrentNumber = CurrentNumber;
}
 
Line 4,046 ⟶ 4,063:
}
 
[STAThread]
public static void Main(string[] args)
{
Line 4,078 ⟶ 4,094:
Form.ClientSize = new Size(FormWidth, FormHeigth);
Form.SuspendLayout();
 
// panels for highlight true solution
int HSize = 4;
 
HighlightNormalSolve = new Panel();
HighlightNormalSolve.Size = new Size(HSize, HSize);
HighlightNormalSolve.Location = new Point(FormWidth - FormEdge, FormWidth - FormEdge);
HighlightNormalSolve.Visible = false;
HighlightNormalSolve.BackColor = Color.Navy;
Form.Controls.Add(HighlightNormalSolve);
 
HighlightAltSolve = new Panel();
HighlightAltSolve.Size = new Size(HSize, HSize);
HighlightAltSolve.Location = new Point(FormEdge - HSize, FormEdge - HSize);
HighlightAltSolve.Visible = false;
HighlightAltSolve.BackColor = Color.Navy;
Form.Controls.Add(HighlightAltSolve);
 
for (int i = 0; i < BlockCount; i++)
Line 4,122 ⟶ 4,155:
{
Puzzles[i].Enabled = true;
}
 
bool IsNormalSolve = IsSolvable(Puzzles.ConvertAll<Puzzle>(Bt => (Puzzle)Bt.Tag));
if (IsNormalSolve)
{
HighlightNormalSolve.Visible = true;
HighlightAltSolve.Visible = false;
}
else // alt solve
{
HighlightNormalSolve.Visible = false;
HighlightAltSolve.Visible = true;
}
 
Line 4,133 ⟶ 4,178:
Puzzle Pz1 = (Puzzle)Bt1.Tag;
 
Button Bt2 = Puzzles.Find(Bt => !((Puzzle)Bt.VisibleTag).IsMaxPuzzle);
// Dirty! Try way get a empty spase check Puzzle inside Button.
Button Bt2 = Puzzles.Find(Bt => !Bt.Visible);
Puzzle Pz2 = (Puzzle)Bt2.Tag;
 
Line 4,159 ⟶ 4,203:
Puzzles[i].Enabled = false;
}
 
HighlightNormalSolve.Visible = false;
HighlightAltSolve.Visible = false;
 
TimeSpan Elapsed = DateTime.Now - Start;
Line 4,184 ⟶ 4,231:
Bt2.Text = Pz2.ToString();
if (Pz2.IsMaxPuzzle) Bt2.Visible = false;
}
 
private bool IsSolvable(List<Puzzle> Puzzles)
{
// WARNING: size of puzzle board MUST be even(like 4)!
// For explain see: https://www.geeksforgeeks.org/check-instance-15-puzzle-solvable/
 
// Count inversions in given puzzle
int InvCount = 0;
for (int i = 0; i < Puzzles.Count - 1; i++)
{
for (int j = i + 1; j < Puzzles.Count; j++)
{
if (Puzzles[i].IsMaxPuzzle) continue;
if (Puzzles[j].IsMaxPuzzle) continue;
 
if (Puzzles[i].CurrentNumber > Puzzles[j].CurrentNumber) InvCount++;
}
}
 
Puzzle EmptyPuzzle = Puzzles.Find(Pz => Pz.IsMaxPuzzle);
 
bool Result = false;
if ((EmptyPuzzle.InvY + 1) % 2 == 0) // is even
{
// is odd
if (InvCount % 2 != 0) Result = true;
}
else // is odd
{
// is even
if (InvCount % 2 == 0) Result = true;
}
return Result;
}
}</syntaxhighlight>
7

edits