Anasayfa / Yazılım / C# / Rastgele Kart Dağıtımı

Rastgele Kart Dağıtımı

Dana önceden Bilge Adam intro projelerinden olan Kart Dağıtımı uygulamasını yaptığımızı bir çok kişi hatırlar herhalde. O uygulama görsel ve her oyuncuya 5’er kart dağıtımına dayanan, toplam 4 oyuncu olan bir uygulama idi. Şimdi yine bir uygulama yapalım ama console uygulaması olarak yapacağım. Amacım benim dizi mantığını iyice kavratmak. Buradaki amacım ise yine 4 tane oyuncuya iskambil kağıtlarını dağıtmak. Yani her bir oyuncuya 13 kart gelecek. Kartları program kodlarımda oluşturacağım ve dağıtımı rasgele yapıp aynı kartın bir diğer oyuncuya gelmemesini sağlayacağım. Şimdi bu genel açıklamamın ardından detaya geçiyorum.

Şimdi uygulamamda dizimde referans type kullanacağım yani object oriented baz alarak kartları oluşturmak için class yolu ile kodlarımı yazacağım. Yani iskambil kağıtlarını oluşturmak ve bunları rasgele dağıtabilmek için bir sınıf yazacağım. Şimdi iskambil kağıtlarını hayal edelim, 4 grup kart mevcut. Nedir bunlar? Maça, Sinek, Karo, Kupa. Her bir grup içinde ise 13 kart var, bunlar ise : AS, ikili, üçlü, dörtlü, beşli, altılı, yedili, sekizli, dokuzlu, onlu, bacak, kız, papaz gibi.

Şimdi ben bu kartları oluşturabilmek için projemde Kart isminde bir class oluşturacağım. Visual Studio üzerinde console uygulaması açtım bu arada. Projeme Kart adında bir class ekliyorum.

Şimdi önce yazalım kodlarımızı sonra açıklayalım. Zaten kod yanlarında da mümkün olduğunca açıklama satırlarımı ekliyorum.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace KartDagitim
{
    public class Kart
    {
        private string Deger;  //kart değerini burada tutacağım
        private string Grup;   //kart grubunu da burada tutacağım
        
        //iki paremetreli constructor oluşturuyorum, 
        //buradaki değerler ile kartlarımı oluşturuyorum
        public Kart(string KartDeger, string KartGrup)
        {
            Deger = KartDeger;  //KartDegeri çalıştırılıyor
            Grup = KartGrup;    //KartGrubu çalıştırılıyor
        } //Burada kart constructor sonlanıyor

        //Aşağıdaki metodum ile kartın değerini yazdırıyorum
        public override string ToString()
        {
            return Grup + " " + Deger;
        } //ToString metodunu burada sonlandırıyorum
    } //Kart classı burada sonlanıyor
}

Böyelikle Kart oluşturmak için sınıfımı oluşturdum. Görüleceği üzere sınıf içinde hem constructor mevcut, hem de metot mevcut. Açıklama satırlarını da yanlarına ekledim. Şimdi de bu sınıfı kullanarak her bir kartın nasıl oluşturulacağını yazmam gerekiyor. Bunun içinde yeni bir sınıf (class) oluşturacağım.

Bu class adı da KartGrubu olsun. Projeme bir adet daha class dosyası ekliyorum.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace KartDagitim
{
    public class KartGrup
    {
        private Kart[] KartGrubu; //Kart nesnesinden bir dizi oluşturuyorum
        private int GuncelKart; //KartGrubu dizisindeki elemanların indeksi için kullanacağım
        private const int Kart_Sayisi = 52; //Kartların toplam sayısını sabit bir değişkene aldım
        private Random RastgeleSayi; //Rastgele sayı oluşturmak için değişken oluşturdum

        //Kartların gruplarını oluşturmak için bir constructor yazıyorum
        public KartGrup()
        {
            //değerler dizisini ve gruplar dizisini oluşturuyorum
            string[] degerler = {"AS","İkili","Üçlü","Dörtlü","Beşli","Altılı","Yedili","Sekizli",
                                    "Dokuzlu","Onlu","Vale","Kız","Papaz"};
            string[] gruplar = { "Kupa", "Karo", "Sinek", "Maça" };

            //Kart sınıfımdan nesnemi alıyorum.
            KartGrubu = new Kart[Kart_Sayisi];
            GuncelKart = 0;
            RastgeleSayi = new Random();

            //Kartlarımı oluşturuyorum
            for (int sayac = 0; sayac < KartGrubu.Length; sayac++)
            {
                KartGrubu[sayac] = new Kart(degerler[sayac % 13], gruplar[sayac / 13]);
            }
        } //constructor sonu

        public void KartKaristir()
        {
            //Her karıştırma sonrası GuncelKart değerini sıfırdan başlatıyorum
            GuncelKart = 0;

            //her bir kart için rastgele karıştırma işlemi
            for (int birinci = 0; birinci < KartGrubu.Length; birinci++)
            {
                //0 ile 51 arasında rastgele sayı oluşturuyorum
                int ikinci = RastgeleSayi.Next(Kart_Sayisi);

                //GuncelKart değerini rastgele seçilen kart değeri ile değiştiriyorum
                Kart gecici = KartGrubu[birinci];
                KartGrubu[birinci] = KartGrubu[ikinci];
                KartGrubu[ikinci] = gecici;
            }
             // for döngüsü sonu
        } //KartKaristir metodu sonu

        //Kart paylaştırma metodum
        public Kart KartPaylas()
        {
            if (GuncelKart < KartGrubu.Length)
                return KartGrubu[GuncelKart++]; //dizideki güncelkart değerini geri döner
            else
                return null;
        } //KartPaylas metodu sonu
    }
}

Görüleceği üzere bu sınıfımda da kartlarımı Kart sınıfından alarak oluşturuyorum. Ayrıca KartKaristir metodu ve KartPaylas metodu ile de kartlarımı karıştırıyorum ve 4 oyuncuya paylaştırıyorum. Gerekli açıklamaları kodlarımın yanında yazdım.

Şimdi de programın ana metninde bu sınıfları ve metotları kullanarak kartlarımı dağıtayım.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace KartDagitim
{
    class Program
    {
        public static void Main(string[] args)
        {
            KartGrup kartlarimiz = new KartGrup();
            kartlarimiz.KartKaristir();

            for (int i = 0; i < 52; i++)
            {
                Console.Write("{0,-19}", kartlarimiz.KartPaylas());
                if ((i + 1) % 4 == 0)
                    Console.WriteLine();
            }

            Console.ReadLine();
        }
    }
}

Sonucu görelim :

20131213001

Uygulamayı indirmek için aşağıdaki linki kullanabilirsiniz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir