تەتىلگە چىققىلىمۇ ئىككى ھەپتە بولاي دەپ قاپتۇ. ئالدىنقى بىر مەزگىل تورسىز مۇھتتا تازا ئىچىم پۇشتى. قېرىشقاندەك بوشلۇقتا مەسىلە كۆرۈلۈپ، بىلوگمۇ تاقىلىپ قالدى. شۇنداق قىلىپ جىيەن سېڭىللىرىم بىلەن ئوينىغاچ ئولتۇرۇپ، مەشىق ئورنىدا بىرنەچچە ئاددىي دېتال ياساپمۇ ئۈلگۈردۈم. مانا ھازىر بىلوگ ئەسلىگە كەلدى، تۆۋەندە، تورسىز ئىپتىدائىي دەۋردىكى نەچچە كۈنلۈك تۇرمۇشۇمنىڭ مەھسۇلى سۈپىتىدە "رەسىم قوراشتۇرۇش ئويۇنى" نى ھوزۇرۇڭلارغا سۇندۇم.
ئاۋۋال دېتالنىڭ كۆرۈنمە يۈزىنى كۆرۈپ باقايلى:
دېتال ھەققىدە ئىخچام چۈشەنچە
ئويۇننىڭ ماھيىتى تولىمۇ ئاددىي: خالىغان رەسىمنى تاللاپ ئاچقاندىن كېيىن، بەلگىلىگەن قېيىنلىق دەرىجىسى بويىچە رەسىمنى پارچىلاپ، پارچىلارنىڭ ئورۇنلىرىنى ئىختىيارىي تەرتىپتە ئورۇنلاشتۇرۇپ بېرىدۇ. ئاندىن دېتال تەگلىكىدە شەكىللەنگەن ماس چوڭلۇقتىكى كاتەكلەرگە مۇناسىپ رەسىم پارچىلىرىنى تارتىپ قويىمىز، ئورنى توغرا بولغاندا رەسىم پارچىسى شۇ كاتەكچىگە قۇلۇبلىنىدۇ ۋە گىرۋىكى ئاق رەڭگە ئۆزگىرىدۇ. پارچىلارنىڭ ئورنىنى بىر - بىرلەپ يۆتكەپ، تاكى ئەسلى رەسىم قوراشتۇرۇلغاندا ئويۇن ئاياغلىشىدۇ.
دېتال ئۇچۇرلىرى
نامى: PicturePiece1.0 - رەسىم قوراشتۇرۇش 1.0
يېزىلغان تىل: C# تىلى
پۈتكەن ۋاقتى: 2015 - يىلى 02 - ئاينىڭ 01 - كۈنى
دېتال كودلىرى
ئاۋۋال ئاددىي قىلىپ Peice.cs
نامىدا بىر تۈر قۇرۇۋالدىم. بۇ تۈر ئىچىدە پارچىلارنىڭ ئورنىنى بەلگىلەش ۋە ھۆكۈم قىلىشقا دائىر ئۇسسۇللارنى يېزىۋالدىم. كودلىرى تۆۋەندىكىدەك:
class Peice { public Bitmap Picture; public Rectangle HomeLocation, CurrentLocation; public Peice(Bitmap new_picture, Rectangle home_location) { Picture = new_picture; HomeLocation = home_location; } public bool IsHome() { return HomeLocation.Equals(CurrentLocation); } public bool Contains(Point pt) { return CurrentLocation.Contains(pt); } public bool SnapToHome() { if((Math.Abs(CurrentLocation.X-HomeLocation.X)<20)&& (Math.Abs(CurrentLocation.Y-HomeLocation.Y)<20)) { CurrentLocation = HomeLocation; return true; } return false; } }
ئاندىن Form قىسمىدا يۇقىرىقى تۈرنى ئىشلىتىش ۋە بىر قىسىم ئۇسسۇللارنى ئەمەلگە ئاشۇرۇش ئارقىلىق دېتالنىڭ ئاساسىي ئىقتىدارلىرى ھازىرلاندى. كودلىرى تۆۋەندىكىدەك:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace PicturePeice { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //nowettiki toluq resim private Bitmap FullPicture = null; //doska tegliki private Bitmap Background = null; //Doska private Bitmap Board = null; // parchilar private ListPeices = null; // Parhilarning chongluqi (sukutte asan halet) private int TargetSize = 100; // Parchilarni qoyudighan katekchilerning sani we chongluqi private int NumRows, NumCols, RowHgt, ColWid; // ishletkuchi tartip yotkewatqan parche private Peice MovingPeice = null; private Point MovingPoint; // oyun ayaghlashqanda private bool GameOver = true; // Chekinish private void Exit_ToolStripMenuItem1_Click(object sender, EventArgs e) { this.Close(); } private void Open_ToolStripMenuItem_Click(object sender, EventArgs e) { if (ofdPicture.ShowDialog() == DialogResult.OK) { LoadPicture(ofdPicture.FileName); } } // Resimni yuklesh private void LoadPicture(string filename) { try { // Tallighan resimni yukleymiz using (Bitmap bm = new Bitmap(ofdPicture.FileName)) { FullPicture = new Bitmap(bm.Width, bm.Height); using (Graphics gr = Graphics.FromImage(FullPicture)) { gr.DrawImage(bm, 0, 0, bm.Width, bm.Height); } } // Doska we tegliki Background = new Bitmap(FullPicture.Width, FullPicture.Height); Board = new Bitmap(FullPicture.Width, FullPicture.Height); picPuzzle.Size = FullPicture.Size; picPuzzle.Image = Board; this.ClientSize = new Size(picPuzzle.Right + picPuzzle.Left, picPuzzle.Bottom + picPuzzle.Left); //Yengi oyunni bashlash StartGame(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } // Yengi oyunni bashlash private void StartGame() { if (FullPicture == null) return; GameOver = false; // Herbir parchining chongluqini hisablash NumRows = FullPicture.Height / TargetSize; RowHgt = FullPicture.Height / NumRows; NumCols = FullPicture.Width / TargetSize; ColWid = FullPicture.Width / NumCols; // Yukligen resimni parchilargha aylandurush Random rand = new Random(); Peices = new List (); for (int row = 0; row < NumRows; row++) { int hgt = RowHgt; if (row == NumRows - 1) hgt = FullPicture.Height - row * RowHgt; for (int col = 0; col < NumCols; col++) { int wid = ColWid; if (col == NumCols - 1) wid = FullPicture.Width - col * ColWid; Rectangle rect = new Rectangle(col * ColWid, row * RowHgt, wid, hgt); Peice new_peice = new Peice(FullPicture, rect); // parchilarning deslepki ornini ixtiyariy belgilesh new_peice.CurrentLocation = new Rectangle( rand.Next(0,FullPicture.Width-wid),rand.Next(0,FullPicture.Height-hgt),wid,hgt ); Peices.Add(new_peice); } } //Teglik sizish MakeBackground(); // Doskini hasillash DrawBoard(); } private void DrawBoard() { using (Graphics gr = Graphics.FromImage(Board)) { // Teglikni qayta tertiplesh gr.DrawImage(Background, 0, 0, Background.Width, Background.Height); // Yotkewatqan parchilarni sizish if (MovingPeice != null) { gr.DrawImage(FullPicture, MovingPeice.CurrentLocation, MovingPeice.HomeLocation, GraphicsUnit.Pixel); using (Pen blue_pen = new Pen(Color.Blue, 4)) { gr.DrawRectangle(blue_pen, MovingPeice.CurrentLocation); } } } picPuzzle.Visible = true; picPuzzle.Refresh(); } // Yotkeshke bolidighan parchilar yoq waqittiki teglik private void MakeBackground() { using (Graphics gr = Graphics.FromImage(Background)) { MakeBackgroundOnGraphics(gr); } } // Dayirige mashlashturush private void MakeBackground(Rectangle rect) { using (Graphics gr = Graphics.FromImage(Background)) { gr.SetClip(rect); MakeBackgroundOnGraphics(gr); } } private void MakeBackgroundOnGraphics(Graphics gr) { // Tazlash gr.Clear(picPuzzle.BackColor); // Teglik ustige katekche sizish DrawGrid(gr); //Parchilarn sizish DrawPeices(gr); picPuzzle.Visible = true; picPuzzle.Refresh(); } private void DrawPeices(Graphics gr) { using (Pen white_pen = new Pen(Color.White, 3)) { using (Pen black_pen = new Pen(Color.Black, 3)) { foreach (Peice peice in Peices) { // Yotkewatqan parchini sizmaymiz if (peice != MovingPeice) { gr.DrawImage(FullPicture, peice.CurrentLocation, peice.HomeLocation, GraphicsUnit.Pixel); if (!GameOver) { if (peice.IsHome()) { // qoyulghan parchining girwikini aq rengge almashturimiz gr.DrawRectangle(white_pen, peice.CurrentLocation); } else { // qoyulghan parchining girwikini qara rengge almashturimiz gr.DrawRectangle(black_pen, peice.CurrentLocation); } } } } } } } // Teglik ustige katekche sizish private void DrawGrid(Graphics gr) { using (Pen thick_pen = new Pen(Color.DarkGray, 4)) { for (int y = 0; y <= FullPicture.Height; y += RowHgt) { gr.DrawLine(thick_pen, 0, y, FullPicture.Width, y); } gr.DrawLine(thick_pen, 0, FullPicture.Height, FullPicture.Width, FullPicture.Height); for (int x = 0; x <= FullPicture.Width; x += ColWid) { gr.DrawLine(thick_pen, x, 0, x, FullPicture.Height); } gr.DrawLine(thick_pen, FullPicture.Width, 0, FullPicture.Width, FullPicture.Height); } } //Parchilar bolmighan chaghdiki teglikni muqumlashturush private void RemoveMovingPeiceFromBackground() { if (MovingPeice == null) return; using (Graphics gr = Graphics.FromImage(Background)) { gr.SetClip(MovingPeice.CurrentLocation); // Bu dayirige ramka sizish DrawGrid(gr); // Parchilarni sizish DrawPeices(gr); } picPuzzle.Visible = true; picPuzzle.Refresh(); } private void picPuzzle_MouseDown(object sender, MouseEventArgs e) { MovingPeice = null; foreach (Peice peice in Peices) { if (!peice.IsHome() && peice.Contains(e.Location)) MovingPeice = peice; } if (MovingPeice == null) return; // Bu orunni saqlash MovingPoint = e.Location; // Move it to the top of the stack. Peices.Remove(MovingPeice); Peices.Add(MovingPeice); // yotkiliwatqan parchilarning teglikini qayta sizish Rectangle rect = MovingPeice.CurrentLocation; rect.Inflate(4, 4); MakeBackground(rect); DrawBoard(); } private void picPuzzle_MouseMove(object sender, MouseEventArgs e) { if (MovingPeice == null) return; // parchilarni yotkesh int dx = e.X - MovingPoint.X; int dy = e.Y - MovingPoint.Y; MovingPeice.CurrentLocation.X += dx; MovingPeice.CurrentLocation.Y += dy; // yengi mawus ornini saqlash MovingPoint = e.Location; // qayta sizish DrawBoard(); } private void picPuzzle_MouseUp(object sender, MouseEventArgs e) { if (MovingPeice == null) return; // parchilar toghra ornidimu yoq? if (MovingPeice.SnapToHome()) { Peices.Remove(MovingPeice); Peices.Reverse(); Peices.Add(MovingPeice); Peices.Reverse(); // oyun ayaghlashtim yoq? GameOver = true; foreach (Peice peice in Peices) { if (!peice.IsHome()) { GameOver = false; break; } } } // yotkleme parchilarning ornini elish Rectangle rect = MovingPeice.CurrentLocation; rect.Inflate(4, 4); //parchini yotkeshni toxtitish MovingPeice = null; // yotkelgen parche teglikini qayta sisizish if (GameOver) { MakeBackground(); } else { MakeBackground(rect); } DrawBoard(); } private void mnuOptionsLevel_Click(object sender, EventArgs e) { // Tallanghan yaki tallanmighan tizimlik ToolStripMenuItem mnu = sender as ToolStripMenuItem; Easy_F5ToolStripMenuItem.Checked = (mnu == Easy_F5ToolStripMenuItem); Medimum_F6ToolStripMenuItem.Checked = (mnu == Medimum_F6ToolStripMenuItem); Hard_F7ToolStripMenuItem.Checked = (mnu == Hard_F7ToolStripMenuItem); // Tallanghan qeyinliq derijisini elish TargetSize = int.Parse((string)mnu.Tag); // Yengi oyunni bashlash StartGame(); } } }
شۇنىڭلىق بىلەن مەزكۇر دېتال پۈتتى. كود قىسمىغا زۆرۈر بولغان ئىزاھاتلار قوشۇلدى.
كېيىنكى نەشرىگە قوشۇلىدىغان ئىقتىدارلار
1. نومۇر ھېسابلاش ئىقتىدارى قوشۇلۇپ، رەسىمنىڭ قوراشتۇرۇلۇش ئەھۋالى، كەتكەن ۋاقىت، پارچىلارنى يۆتكىگەن قەدەم باسقۇچ بويىچە ئوينىغۇچىغا نومۇر ھېسابلاپ بېرىدىغان قىلىش.
2. ئويۇننىڭ قېيىنلىق دەرىجىسىگە ئاساسەن مۇۋاپىق ساندا ئەسكەرتىش ئىقتىدارى سەپلەش.
3. دېتالنىڭ كۆرۈنمە يۈزىگە قايتىدىن ئىشلەش.
دېتالنى چۈشۈرۈش ۋە سىناش
دېتالنى چۈشۈرۈپ PicturePeice.exe
نى ئىجرا قىلىپ سىناپ باقسىڭىز بولىدۇ.
چۈشۈرۈش: ResimQorashturush
كود دېگەننى ژېتىۋېتىدىغان بولۇپ كەتتىڭىزمۇ نېمە
ۋاي نەدىكىنى، شۇ ئۆگىنىش باسقۇچىدا تېخى
قاچانغىچە ئۆگۈنۈش باسقۇچىدا سىز؟ مەندىن ئۇستا بوپ كەتكەنسىز، سىستىمىنى يېزىشىپ بىرەمدىكىن دىسەم تېخى!~
ئۆگۈنۈش == مەڭگۈ ئاياغلاشمايدىغان جەڭ!
نەدە سىزدىن ئۇستا بولۇپ كېتەي، مەنمۇ بەكلا ئالدىراش بوپ كەتتىم بىر مەزگىل…
يورتقا كەلگەن بولساڭلار، ما شەھەر تەرەپكە بىر ئۆتەڭلار، بىر پاراڭلىشىلى.
بەكمۇ چۈشىنىشلىك كود يازىدىكەنسىز، ئىزاھات بېرىپ ئوبدان قىلىپسىز.