private void btnMouseDown(object sender, MouseEventArgs e) { PuzzleButton btn = (PuzzleButton)sender; if (vrsta) { if (btn.Text != "") { moveBtn = btn; Bitmap bit = new Bitmap(50, 50); moveBtn.DrawToBitmap(bit, new Rectangle(Point.Empty, bit.Size)); moveCursor = new Cursor(bit.GetHicon()); Cursor.Current = moveCursor; DoDragDrop(this, DragDropEffects.Move); } } else if (btn.Image != null) { moveBtn = btn; Bitmap bit = new Bitmap(50, 50); moveBtn.DrawToBitmap(bit, new Rectangle(Point.Empty, bit.Size)); moveCursor = new Cursor(bit.GetHicon()); Cursor.Current = moveCursor; DoDragDrop(this, DragDropEffects.Move); } }
private void flpPuzzle_DragDrop(object sender, DragEventArgs e) { Point p = this.flpPuzzle.PointToClient(new Point(e.X, e.Y)); PuzzleButton btn = (PuzzleButton)flpPuzzle.GetChildAtPoint(p); if (btn != null) { if (vrsta) { if (btn.Text == "") { btn.BackColor = Color.LightSkyBlue; moveBtn.BackColor = Color.GhostWhite; btn.Text = moveBtn.Text; btn.value = int.Parse(moveBtn.Text); moveBtn.value = 0; moveBtn.Text = ""; rjesenje(); flpPuzzle.Focus(); } } else if (btn.Image == null) { btn.Image = moveBtn.Image; moveBtn.Image = null; btn.value = moveBtn.value; moveBtn.value = 0; rjesenje(); flpPuzzle.Focus(); } } }
//pritiskom na button nova puzzla poziva se ova metoda koja slaže novu igru tako da nasumično rasporedi //brojeve buttona private void btnNovaPuzzla_Click(object sender, EventArgs e) { grbSve.Enabled = false; n = (int)numN.Value; m = (int)numM.Value; prazno = (int)numPrazno.Value; int brPolja = n * m - prazno; flpPuzzle.Width = n * 50 + n + 1; flpPuzzle.Height = m * 50 + m + 1; btnOdustajem.Visible = true; btnOdustajem.Location = new Point(flpPuzzle.Width / 2 - 40, flpPuzzle.Location.Y + flpPuzzle.Height); Random rand = new Random(); for (int i = 0; i < n * m; i++) { PuzzleButton pbtn = new PuzzleButton(); pbtn.pos = i + 1; if (nacin) { pbtn.Click += new EventHandler(swapLabel); } else { pbtn.MouseDown += new MouseEventHandler(btnMouseDown); } flpPuzzle.Controls.Add(pbtn); } List <int> listaBrojeva = new List <int>(), listaBrojeva2 = new List <int>(); int r, inverzije = 0; for (int i = 1; i <= brPolja; i++) { listaBrojeva.Add(i); } while (listaBrojeva.Count != 0) { r = rand.Next(listaBrojeva.Count); listaBrojeva2.Add(listaBrojeva[r]); listaBrojeva.RemoveAt(r); } // za jedno prazno polje činimo igru rješivom if (prazno == 1) { bool promjena = false; for (int i = 0; i < listaBrojeva2.Count; ++i) { for (int j = i + 1; j < listaBrojeva2.Count; ++j) { if (listaBrojeva2[i] > listaBrojeva2[j]) { ++inverzije; } } } if (n % 2 == 1) { if (inverzije % 2 == 1) { promjena = true; } } else { if (m % 2 == 0) { if ((inverzije + m) % 2 == 1) { promjena = true; } } else { if ((inverzije + m) % 2 == 0) { promjena = true; } } } if (promjena) { for (int i = 0; i < listaBrojeva2.Count; ++i) { if (listaBrojeva2[i] > listaBrojeva2[i + 1]) { int tmp = listaBrojeva2[i]; listaBrojeva2[i] = listaBrojeva2[i + 1]; listaBrojeva2[i + 1] = tmp; break; } } } } //provjeravamo je li vrsta puzzle brojevi ili slika, ako su brojevi dodijeli nasumicno brojeve //ako se želi implementirati slika, treba sliku razrezati na n*m dijelova te nasumicno te dijelove podijeliti //pazeći da postavljamo za odgovarajući dio odgovarajući value svakom buttonu if (vrsta) { foreach (PuzzleButton btn in flpPuzzle.Controls) { if (listaBrojeva2.Count != 0) { btn.Text = listaBrojeva2[0] + ""; btn.value = listaBrojeva2[0]; btn.BackColor = Color.LightSkyBlue; listaBrojeva2.RemoveAt(0); } else { btn.Text = ""; btn.value = 0; btn.BackColor = Color.GhostWhite; } } } else { Bitmap img = Properties.Resources.slagalica; Bitmap newimg = resizeImage(img, new Size(n * 50, m * 50)); var Pixel_format = newimg.PixelFormat; var imgarray = new Image[n * m]; //int k = 0; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { var index = i * n + j; RectangleF Tile = new RectangleF(); Tile.Width = 50; Tile.Height = 50; Tile.X = j * 50; Tile.Y = i * 50; imgarray[index] = newimg.Clone(Tile, Pixel_format); } } foreach (PuzzleButton btn in flpPuzzle.Controls) { if (listaBrojeva2.Count != 0) { btn.Image = imgarray[listaBrojeva2[0] - 1]; btn.value = listaBrojeva2[0]; listaBrojeva2.RemoveAt(0); } else { btn.Image = null; btn.value = 0; } } } }
//metoda kojom mijenjamo buttone prilikom pritiska na neki button - provjerava se je li pritisnut button prazan //ako nije tada se prazan button sprema u varijablu i provjeravaju se pozicije buttona kao uvjet za promjenu private void swapLabel(Object sender, EventArgs e) { PuzzleButton btn = (PuzzleButton)sender; if (vrsta) { if (btn.Text == "") { return; } } else { if (btn.Image == null) { return; } } PuzzleButton prazniBtn = null; if (vrsta) { foreach (PuzzleButton bt in flpPuzzle.Controls) { if (bt.Text == "") { prazniBtn = bt; break; } } if ((btn.pos == (prazniBtn.pos - 1) && prazniBtn.pos % n != 1) || btn.pos == (prazniBtn.pos + n) || btn.pos == (prazniBtn.pos - n) || (btn.pos == (prazniBtn.pos + 1) && prazniBtn.pos % n != 0)) { prazniBtn.BackColor = Color.LightSkyBlue; btn.BackColor = Color.GhostWhite; prazniBtn.value = btn.value; prazniBtn.Text = btn.Text; btn.Text = ""; btn.value = 0; flpPuzzle.Focus(); } rjesenje(); } else { foreach (PuzzleButton bt in flpPuzzle.Controls) { if (bt.Image == null) { prazniBtn = bt; break; } } if ((btn.pos == (prazniBtn.pos - 1) && prazniBtn.pos % n != 1) || btn.pos == (prazniBtn.pos + n) || btn.pos == (prazniBtn.pos - n) || (btn.pos == (prazniBtn.pos + 1) && prazniBtn.pos % n != 0)) { prazniBtn.Image = btn.Image; prazniBtn.value = btn.value; btn.value = 0; btn.Image = null; flpPuzzle.Focus(); } rjesenje(); } }