none
как от метода получить разные данные RRS feed

  • Вопрос



  • вот есть игра.

    написал метод :

    public string ClaimCard()
                {
                    a.InitializeDeck();
                    int k = 0;
                    int k2 = 0;
                    Random rnd = new Random();
                    Random rnd2 = new Random();
                    k = rnd.Next(13);
                    k2 = rnd2.Next(4);
                        if (a.BigDeck[k, k2] != "0")
                            {
                                return a.BigDeck[k, k2];
                                a.BigDeck.SetValue("0", k, k2);
                            }
                            else
                            {
                                ClaimCard();
                            }
                 return "processing";
                }

    и сама BigDeck описан так :

    public struct Suitess 
            {
                public string[,] BigDeck;
    
                public void InitializeDeck()
                {
                    
                    string[] Seniors = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
                    string[] Suites = { "\u2660", "\u2663", "\u2665", "\u2666" };
                    BigDeck = new string[13,4];
                    for (int i = 0; i < 13; i++)
                    {
                        for (int j = 0; j < 4; j++)
                        {
                            
                            BigDeck[i,j] = Seniors[i]+Suites[j];
                        }
                    }
                }
                
            }

    но результат

    for (int i = 0; i < 3; i++)
                    textBox1.Text = textBox1.Text + ClaimCard();

    который должен отобрать 3 карты на флоп подает 3 одинаковых карт как в начальном рисунке.

    в чем же проблема.

    ведь new Random() сбрасывает rnd при обращений к методу. или я не прав?



Ответы

  • Сделайте приватное поле private Random _rnd = new Random(); и используйте.

    P.S. слова на русском и английском вперемежку - это новая мода? :)

    • Помечено в качестве ответа Medet Tleukabiluly 23 мая 2013 г. 16:32
    Отвечающий

Все ответы

  • даже переделав код  не получается

    public string ClaimCard()
                {
                    a.InitializeDeck();
                    int k;
                    int k2;
                    Randomer rnd = new Randomer();
                         k = rnd.GetRandom(13);
                    Randomer rnd2 = new Randomer();
                         k2 = rnd2.GetRandom(4);
                    
                        if (a.BigDeck[k, k2] != "0")
                            {
                                return a.BigDeck[k, k2];
                                a.BigDeck.SetValue("0", k, k2);
                            }
                            else
                            {
                                ClaimCard();
                            }
                        rnd.Dispose();
                        rnd2.Dispose();
                    
                 return "processing";
                }

    класс Randomer полностью поддерживает IDisposable

    public class Randomer:IDisposable
        {
            private IntPtr handle;
            private Component component = new Component();
            private bool disposed = false;
    
            public Randomer(IntPtr handle)
            {
                this.handle = handle;
            }
            public Randomer()
            { }
            public void Dispose()
            {
                Dispose(true);
                GC.SuppressFinalize(this);
            } 
            protected virtual void Dispose(bool disposing)
            { 
                if(!this.disposed)
                { 
                    if(disposing)
                    {
                        component.Dispose();
                    }
                    CloseHandle(handle);
                    handle = IntPtr.Zero;
                    disposed = true;
    
                }
            }
            [System.Runtime.InteropServices.DllImport("Kernel32")]
            private extern static Boolean CloseHandle(IntPtr handle);
            ~Randomer()
            {
                Dispose(false);
            }
            public int GetRandom(int k)
            {
                Random rand1 = new Random();
                
                return rand1.Next(k);
            }
    
        }

  • Добрый день,

    недавно обсуждалась подобная тема, вам необходимо использовать в методах одни и те же объекты типа Random. Можете сделать rnd, rnd2 полями класса, в котором определен метод ClaimCard

  • Сделайте приватное поле private Random _rnd = new Random(); и используйте.

    P.S. слова на русском и английском вперемежку - это новая мода? :)

    • Помечено в качестве ответа Medet Tleukabiluly 23 мая 2013 г. 16:32
    Отвечающий