c# Desktop

c# Dilini Kullanarak Form Sayfasında Puzzle Oyunu Yapımı5

Bundan önceki makalemizde resimlerin panel üzerinde rastgele dağıtıldığına ait kodları düzenlemiştik. Burada ise resimlerin gerçek resme uygun hale gelmesini sağlayacağız. Puzzle oyununda resimlerin bir araya gelmesine ait değişik algoritmalar kullanılmaktadır. Biz yeni bir algoritma deneyeceğiz. Fareyle ilgili resim seçildiğinde resmin yatayda ve dikeyde bir kare hareket etmesini sağlayacağız. Vakit kaybetmeden kodlamaya geçelim.

Adım 1: Sahnede bulunan PictureBox nesnelerini tutacak değişkeni tanımlayalım. Bir önceki uygulamada bu değişkeni tanımlamıştık.

        PictureBox[] img;

Adım 2: Resimlerin yerlerini değiştirdiğimizde resmin geçici olarak tutulmasını sağlayacak değişkeni tanımlayalım.

        Image imgYedek;

Adım 3: Seçilen resmin hangi yoldan devam edeceğini belirlemek amacıyla gerekli olan dizi değişkenini tanımlayalım.

        int[][] yollar = new int[4][];

Adım 4: Sürükleyip bırakma işleminin başlayıp başlamadığını kontrol etmek için gerekli olan değişkeni tanımlayalım. Ayrıca gerekli olan indis işlemleri için değişkeni de tanımlayalım.

        int i = -1;
        int[][] yollar = new int[4][];
        bool dragging;

Adım 5: Şimdi PictureBox nesnelerini diziye aktaralım. Bu işlemi ayarlar() metodunda yapacağız.

            img = new PictureBox[] { img1, img2, img3, imgOriginal };

Adım 6: Resmin sahnede gideceği yolu belirleyen dizi elemanlarına girişleri yapalım. Resmin L tipinde hareket etmesini istiyoruz. 

            yollar[0] = new int[] { 1, 2 };
            yollar[1] = new int[] { 0, 3 };
            yollar[2] = new int[] { 0, 3 };
            yollar[3] = new int[] { 1, 2 };

Adım 7: Başlangıçta sürükle bırak işleminin olmadığını belirlemek için dragging değişkeninin değerini belirleyelim. 

            dragging = false;

Adım 8: Öncelikle ilk resmi ikinci resme sürükleyip bırakma işlemini gerçekleştirelim. İlk resmi seçelim ve bu resmin MouseDown olayını oluşturalım.

        private void img1_MouseDown(object sender, MouseEventArgs e)
        {
 
        }

Adım 9. Bu resme basıldığında resmin sıra numarasını saklamak için i değişkenine değeri aktaralım.

        private void img1_MouseDown(object sender, MouseEventArgs e)
        {
            i = 0;
        }

Adım 10: Bu resim seçildiğinde iki nolu resmin sürükle bırak işleminde aktif olabilmesi için AllowDrop özelliğini true yapalım.

            img2.AllowDrop = true;

Adım 11: Resmin kullanılabilir olabileceğini belirlemek için BorderStyle özelliğini Fixed3D yapalım. Projeyi kaydedip çalıştıralım.

            img2.BorderStyle = BorderStyle.Fixed3D;

Adım 12: Dikkat ettiyseniz img2 sürekli gidilecek yol olarak seçili kalacaktır. Bunu iptal etmek için MouseUp olayını düzenleyelim.

        private void img1_MouseUp(object sender, MouseEventArgs e)
        {
 
        }

Adım 13: Burada i değeri -1'den büyükse kontrolünü yaparak img2 için yapılan değişiklikleri eski haline geri getirmemiz gerekir. Projeyi kaydedip çalıştıralım.

        private void img1_MouseUp(object sender, MouseEventArgs e)
        {
            if (i > -1)
            {
                dragging = false;
                img2.AllowDrop = true;
                img2.BorderStyle = BorderStyle.None;
                i = -1;
            }
        }

Adım 14: Şimdi birinci resmin taşınması işlemini gerçekleştirelim. Bunun için MouseMove olayını kullanacağız. Bu olay resmin taşınması işleminin başlanacağını gösterecektir.

        private void img1_MouseMove(object sender, MouseEventArgs e)
        {
 
        }

Adım 15: Burada taşıma işleminin farenin sol tuşuyla olup olmadığını kontrol edeceğiz. Ayrıca taşınacak resmin kopyasını panoya aktaracağız.

        private void img1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                ((PictureBox)sender).DoDragDrop(((PictureBox)sender).Image, DragDropEffects.Copy);
            }
        }

Adım 16: Ayrıca taşıma işlemi sonlandırıldığında ikinci resim konumuna ait özellikleri eski haline getirmemiz gerekir.

        private void img1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left && i>-1)
            {
                ((PictureBox)sender).DoDragDrop(((PictureBox)sender).Image, DragDropEffects.Copy);
                img2.BorderStyle = BorderStyle.None;
                img2.AllowDrop = false;
            }
        }

Adım 17: Birinci resme ait taşıma işlemlerini gerçekleştirdik. Şimdi ikinci resimde oluşacak olayları yazalım. Öncelikle sürükleyip bırakma işleminin başladığını belirlemek için Enter olayını tanımlayalım.

        private void img2_DragEnter(object sender, DragEventArgs e)
        {
 
        }

Adım 18: Bu adımda i değeri -1^den büyük ve panoda yer alan dosya resşm dosyasıysa kopyalama işlemini başlatalım. Aksi durumdaysa kopyalama işlemini durduralim.

        private void img2_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.Bitmap) && i > -1)
            {
                e.Effect = DragDropEffects.Copy;
                dragging = true;
            }
            else
            {
                e.Effect = DragDropEffects.None;
                dragging = false;
            }
        }

Adım 19: Resimlerin yerlerini değiştirmek ve sürükleyip bırakma işlemini gerçekleştirmek için DragDrop olayını tanımlayalım.

        private void img2_DragDrop(object sender, DragEventArgs e)
        {
 
        }

Adım 20: Burada sürükleyip bırakma işlemini hatasız gerçekleştirmek için i ve dragging değişkenlerinin değerlerini kontrol edelim.

        private void img2_DragDrop(object sender, DragEventArgs e)
        {
            if (i > -1 && dragging == true)
            { 
            
            }
        }

Adım 21: Üzerinde değişiklik yaılacak resmin bir kopyasını oluşturalım. Panodaki resmi buraya yapıştıralım. Sürükleyip bırakma işlemini gerçekleştiren resmi bu resimle değiştirelim. Değişkelerin değerlerini eski haline geri getirelim.

        private void img2_DragDrop(object sender, DragEventArgs e)
        {
            if (i > -1 && dragging == true)
            {
                imgYedek = ((PictureBox)sender).Image;
                Image getPicture = (Bitmap)e.Data.GetData(DataFormats.Bitmap);
                ((PictureBox)sender).Image = getPicture;
                img1.Image = imgYedek;
 
                img2.AllowDrop = false;
                img2.BorderStyle = BorderStyle.None;
                i = -1;
                imgYedek = null;
                dragging = false;
            }
        }

Adım 22: Birinci resmi sürükleyip bırakarak ikinci resme aktarmış olduk. Şimdi bunun tam tersini yapalım. Öncelikle img2 nesnesine ait MouseDown olayını yazalım.

        private void img2_MouseDown(object sender, MouseEventArgs e)
        {
            i = 1;
            img1.AllowDrop = true;
            img1.BorderStyle = BorderStyle.Fixed3D;
        }

Adım 23: Şimdi img2 nesnesine ait MouseUp olayını yazalım.

        private void img2_MouseUp(object sender, MouseEventArgs e)
        {
            if (i > -1)
            {
                dragging = false;
                img1.AllowDrop = false;
                img1.BorderStyle = BorderStyle.None;
                i = -1;
            }
        }

Adım 23: Şimdi de img2 nesnesine ait MouseMove olayını yazalım.

        private void img2_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left && i > -1)
            {
                ((PictureBox)sender).DoDragDrop(((PictureBox)sender).Image, DragDropEffects.Copy);
                img1.BorderStyle = BorderStyle.None;
                img1.AllowDrop = false;
            }
 
        }

Adım 24: img2 nesnesine ait tüm olayları gerçekleştirdik. Projeyi kaydedip çalıştıralım. Sıra geldi img1 nesnesine ait DragEnter olayını yazmaya.

        private void img1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.Bitmap) && i > -1)
            {
                e.Effect = DragDropEffects.Copy;
                dragging = true;
            }
            else
            {
                e.Effect = DragDropEffects.None;
                dragging = false;
            }
 
        }

Adım 25: img1 nesnesine ait DragDrop olayını da yazalım.

        private void img1_DragDrop(object sender, DragEventArgs e)
        {
            if (i > -1 && dragging == true)
            {
                imgYedek = ((PictureBox)sender).Image;
                Image getPicture = (Bitmap)e.Data.GetData(DataFormats.Bitmap);
                ((PictureBox)sender).Image = getPicture;
                img2.Image = imgYedek;
 
                img1.AllowDrop = false;
                img1.BorderStyle = BorderStyle.None;
                i = -1;
                imgYedek = null;
                dragging = false;
            }
 
        }

Uygulamayı kaydedip çalıştıralım. img1 ve img2 isimli resimlerin yer değiştirdiğini görürsünüz. Bir sonraki makalede görüşmek üzere.

Uygulamanın bu aşamasına ait kodları buradan indirebilirsiniz.

İlgili Makaleler
Veri Girişi Doğrulama (Input Validation)
Basit Veri Bağlama (Simple Data Binding)
Veri Girişi Maskeleme (MaskedTextBox)
c# Programında Bigpara Sayfasından Borsa Verilerini Selenium Kütüphanesini Kullanarak Çekme
Kompleks Veri Bağlama (Complex Data Binding)
TabControl Panelini Kullanarak Lokantalar İçin Müşteri Siparişi Alan c# Form Uygulaması
Yıkıcı Metotlar (Destructors)
Konsol Ekranında Kod Yazma ve Çalıştırma
Form Sınıfı
Kaçan Buton Oyununu Yapan c# Uygulaması
Form Sınıfına Ait Bazı Olayların ve Özelliklerin Kullanılmasına Ait Örnek Uygulama
2020 TYT Matematik Ortakatlı Kuralıyla İlgili Sorunun Çözümünü c# Diliyle Kodlama
Verilen İki Matrisi Çarpan Programı c# Dilinde Form Ortamında Yapınız
c# Console Uygulamalarında Ping Nasıl Kullanılır, Ping Atma
Yapıcı Metotlar (Constructors)
Faktöriyel Hesabı Yapan c# Windows Form Uygulaması
Kredi Kartı Taksitlendirme İşlemini Yapan c# Uygulaması
Rastgele Seçilen Bir Sayıyı Basamaklarına Ayıran, Basamak Değerini ve Sayı Değerini Bulan c# Console Uygulaması
c# Console Uygulamalarında params Dizisi Tanımlama
Yazı Tura Oyunu Yapan c# Uygulaması

Yorum Ekle
   
Kötü
İyi