تەتىلگە چىققىلىمۇ ئىككى ھەپتە بولاي دەپ قاپتۇ. ئالدىنقى بىر مەزگىل تورسىز مۇھتتا تازا ئىچىم پۇشتى. قېرىشقاندەك بوشلۇقتا مەسىلە كۆرۈلۈپ، بىلوگمۇ تاقىلىپ قالدى. شۇنداق قىلىپ جىيەن سېڭىللىرىم بىلەن ئوينىغاچ ئولتۇرۇپ، مەشىق ئورنىدا بىرنەچچە ئاددىي دېتال ياساپمۇ ئۈلگۈردۈم. مانا ھازىر بىلوگ ئەسلىگە كەلدى، تۆۋەندە، تورسىز ئىپتىدائىي دەۋردىكى نەچچە كۈنلۈك تۇرمۇشۇمنىڭ مەھسۇلى سۈپىتىدە "رەسىم قوراشتۇرۇش ئويۇنى" نى ھوزۇرۇڭلارغا سۇندۇم.
ئاۋۋال دېتالنىڭ كۆرۈنمە يۈزىنى كۆرۈپ باقايلى:
دېتال ھەققىدە ئىخچام چۈشەنچە
ئويۇننىڭ ماھيىتى تولىمۇ ئاددىي: خالىغان رەسىمنى تاللاپ ئاچقاندىن كېيىن، بەلگىلىگەن قېيىنلىق دەرىجىسى بويىچە رەسىمنى پارچىلاپ، پارچىلارنىڭ ئورۇنلىرىنى ئىختىيارىي تەرتىپتە ئورۇنلاشتۇرۇپ بېرىدۇ. ئاندىن دېتال تەگلىكىدە شەكىللەنگەن ماس چوڭلۇقتىكى كاتەكلەرگە مۇناسىپ رەسىم پارچىلىرىنى تارتىپ قويىمىز، ئورنى توغرا بولغاندا رەسىم پارچىسى شۇ كاتەكچىگە قۇلۇبلىنىدۇ ۋە گىرۋىكى ئاق رەڭگە ئۆزگىرىدۇ. پارچىلارنىڭ ئورنىنى بىر - بىرلەپ يۆتكەپ، تاكى ئەسلى رەسىم قوراشتۇرۇلغاندا ئويۇن ئاياغلىشىدۇ.
دېتال ئۇچۇرلىرى
نامى: 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 List Peices = 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

كود دېگەننى ژېتىۋېتىدىغان بولۇپ كەتتىڭىزمۇ نېمە
ۋاي نەدىكىنى، شۇ ئۆگىنىش باسقۇچىدا تېخى
قاچانغىچە ئۆگۈنۈش باسقۇچىدا سىز؟ مەندىن ئۇستا بوپ كەتكەنسىز، سىستىمىنى يېزىشىپ بىرەمدىكىن دىسەم تېخى!~
ئۆگۈنۈش == مەڭگۈ ئاياغلاشمايدىغان جەڭ!
نەدە سىزدىن ئۇستا بولۇپ كېتەي، مەنمۇ بەكلا ئالدىراش بوپ كەتتىم بىر مەزگىل…
يورتقا كەلگەن بولساڭلار، ما شەھەر تەرەپكە بىر ئۆتەڭلار، بىر پاراڭلىشىلى.
بەكمۇ چۈشىنىشلىك كود يازىدىكەنسىز، ئىزاھات بېرىپ ئوبدان قىلىپسىز.