Home >  > C# تىلىدا رەسىم قوراشتۇرۇش ئويۇنى

C# تىلىدا رەسىم قوراشتۇرۇش ئويۇنى

6

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

ئاۋۋال دېتالنىڭ كۆرۈنمە يۈزىنى كۆرۈپ باقايلى:

PicturePiece1

PicturePiece2

دېتال ھەققىدە ئىخچام چۈشەنچە

ئويۇننىڭ ماھيىتى تولىمۇ ئاددىي: خالىغان رەسىمنى تاللاپ ئاچقاندىن كېيىن، بەلگىلىگەن قېيىنلىق دەرىجىسى بويىچە رەسىمنى پارچىلاپ، پارچىلارنىڭ ئورۇنلىرىنى ئىختىيارىي تەرتىپتە ئورۇنلاشتۇرۇپ بېرىدۇ. ئاندىن دېتال تەگلىكىدە شەكىللەنگەن ماس چوڭلۇقتىكى كاتەكلەرگە مۇناسىپ رەسىم پارچىلىرىنى تارتىپ قويىمىز، ئورنى توغرا بولغاندا رەسىم پارچىسى شۇ كاتەكچىگە قۇلۇبلىنىدۇ ۋە گىرۋىكى ئاق رەڭگە ئۆزگىرىدۇ. پارچىلارنىڭ ئورنىنى بىر - بىرلەپ يۆتكەپ، تاكى ئەسلى رەسىم قوراشتۇرۇلغاندا ئويۇن ئاياغلىشىدۇ.

دېتال ئۇچۇرلىرى

نامى: 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

 

بۇلارنىمۇ ياقتۇرۇپ قالىسىز

ئۆز - ئۆزۈمنى ئىزدەش بوسۇغىسىدا...


ئۈنچىلەر (6)
نەقىللەر (0)
  1. چاشقان [ قىرىق تۆتىنچى دەرىجە ] IE  نىڭ ئىپدىايىسىغۇ بۇWindows 8 دىۋان 2015/02/05 09:26

    كود دېگەننى ژېتىۋېتىدىغان بولۇپ كەتتىڭىزمۇ نېمە :lol:

  2. ئالتۇن بۇلاق [ قىرىق تۆتىنچى دەرىجە ] Google Chrome 40.0.2214.94Windows 8 گىلەم 2015/02/10 10:17

    قاچانغىچە ئۆگۈنۈش باسقۇچىدا سىز؟ مەندىن ئۇستا بوپ كەتكەنسىز، سىستىمىنى يېزىشىپ بىرەمدىكىن دىسەم تېخى!~

  3. پەرىزكار [ قىرىق تۆتىنچى دەرىجە ] Safari 538.39.41Mac OSX 10_10 كىگىز 2 كۈن بۇرۇن

    بەكمۇ چۈشىنىشلىك كود يازىدىكەنسىز، ئىزاھات بېرىپ ئوبدان قىلىپسىز.

  • كۆچۈرۈلمە يوق

ئۈنچە قالدۇرۇش