Clear        


                
                    using _26_RecursiveMethods.Demos.TasKagitMakas.Models.Bases;
using _26_RecursiveMethods.Demos.TasKagitMakas.Services.Bases;

namespace _26_RecursiveMethods.Demos.TasKagitMakas.Services
{
    /// <summary>
    /// Taş Kağıt Makas Oyunu işlemlerini gerçekleştiren, ITasKagitMakasService interface'ini implemente eden
    /// ve oyuncunun enjekte edildiği servis class'ı.
    /// </summary>
    public class TasKagitMakasService : ITasKagitMakasService
    {
        #region Fields
        private readonly OyuncuBase _oyuncu; // has-a relationship: TasKagitMakasService tipindeki obje OyuncuBase tipindeki objeye sahiptir

        /// <summary>
        /// 1 (dahil) ile 3 (dahil) aralığında rastgele sayı üretecek referans.
        /// </summary>
        Random _rastgele;

        /// <summary>
        /// k: kağıt, m: makas, t: taş anahtar değer çiftlerine sahip sözlük.
        /// </summary>
        Dictionary<char, string> _hareketler;
        #endregion



        #region Constructor
        public TasKagitMakasService(OyuncuBase oyuncu) // dependency injection (constructor injection),
                                                       // TasKagitMakasService objesini new'lerken içerisine dışarıdan
                                                       // new'lenmiş OyuncuBase tipindeki objeyi enjekte ediyoruz
        {
            _oyuncu = oyuncu;
            _rastgele = new Random();
            _hareketler = new Dictionary<char, string>()
            {
                { 'k', "Kağıt" },
                { 'm', "Makas" },
                { 't', "Taş" }
            };
        }
        #endregion



        #region Method Implementations
        /// <summary>
        /// Oyuncu kazanma sayısını sıfırlar.
        /// </summary>
        public void YeniOyunaBasla()
        {
            _oyuncu.KazanmaSayisi = 0;
        }

        /// <summary>
        /// Bilgisayar için rastgele olarak taş (t), kağıt (k) veya makas (m) hareketi, oyuncu için de gönderilen hareket parametresi 
        /// üzerinden oyunu oynatır ve kazananı geri döner.
        /// </summary>
        /// <returns>string</returns>
        public string Oyna(char oyuncuHareketi, string sonuc = null)
        {
            int rastgeleSayi = _rastgele.Next(1, 4);
            char bilgisayarHareketi = rastgeleSayi == 1 ? 'k' : rastgeleSayi == 2 ? 'm' : 't';
            if (bilgisayarHareketi == oyuncuHareketi) // eğer bilgisayar ile oyuncu hareketleri aynıysa tekrar recursive olarak
                                                      // Oyna methodu çağrılır ve berabere sonucunun gelmemesi sağlanır
            {
                sonuc = Oyna(oyuncuHareketi, sonuc);
            }
            else
            {
                sonuc = "\nBilgisayar: " + _hareketler[bilgisayarHareketi] + "\nOyuncu: " + _hareketler[oyuncuHareketi];
                if (bilgisayarHareketi == 'k')
                {
                    if (oyuncuHareketi == 'm')
                    {
                        sonuc += "\n\"" + _oyuncu.Rumuzu + "\" kazandı.\nKazanma sayısı: " + ++_oyuncu.KazanmaSayisi;
                    }
                    else
                    {
                        sonuc += "\nBilgisayar kazandı.";
                    }
                }
                else if (bilgisayarHareketi == 'm')
                {
                    if (oyuncuHareketi == 't')
                    {
                        sonuc += "\n\"" + _oyuncu.Rumuzu + "\" kazandı.\nKazanma sayısı: " + ++_oyuncu.KazanmaSayisi;
                    }
                    else
                    {
                        sonuc += "\nBilgisayar kazandı.";
                    }
                }
                else
                {
                    if (oyuncuHareketi == 'k')
                    {
                        sonuc += "\n\"" + _oyuncu.Rumuzu + "\" kazandı.\nKazanma sayısı: " + ++_oyuncu.KazanmaSayisi;
                    }
                    else
                    {
                        sonuc += "\nBilgisayar kazandı.";
                    }
                }
            }
            return sonuc;
        }
        #endregion
    }        
}