天天看點

基于WPF實作雙色球

原文: 基于WPF實作雙色球 版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/m0_37591671/article/details/82959625

文章目錄

分析:雙色球由六個紅色号碼和一個藍色号碼組成;紅色球号碼從01–33中選擇,而且不能重複;藍色球号碼從01–16中選擇(可以跟紅球重複)。

(1)點選開始按鈕,開啟七個線程,擷取資料

(2)由于前六個的資料不一樣,是以應當将獲得的資料與除了目前Lable外的其他Lable内容進行比較,如果重複,則需要重新擷取;否則,顯示

(3)當點選停止按鈕,等待所有線程執行完,顯示結果

(1)點選後,開啟線程執行:

private bool IsGoon = true;
        private static object _Lock = new object();
        private void Image_MouseDown(object sender, MouseButtonEventArgs e)
        {

            try
            {
                Image image = (Image)sender;
                if (image.Source.ToString().Equals("pack://application:,,,/DoubleChromosphere;component/Images/click.png"))
                {
                    this.IsGoon = true;
                    image.Source = new BitmapImage(new Uri("Images/stop.jpg", UriKind.RelativeOrAbsolute));
                    //foreach (UIElement element in LayoutRoot.Children)
                    //{
                    //    if (element is Label)
                    //    {
                    //        ((Label)element).Content = "00";
                    //    }
                    //}
                    Thread.Sleep(500);
                    TaskFactory taskFactory = new TaskFactory();
                    List<Task> taskList = new List<Task>();
                    foreach (UIElement element in LayoutRoot.Children)
                    {
                        if (element is Label)
                        {
                            Label lbl = element as Label;
                            taskList.Add(taskFactory.StartNew(() =>
                            {
                                while (this.IsGoon)
                                {
                                    string text = "";
                                    if (this.Dispatcher.Invoke(() => { return lbl.Name.Contains("red"); }))

                                    {
                                        //1 解決沖突的最好辦法,是沒有沖突,上來就随機分6組,每個線程隻取一個組的
                                        //2 線程安全的集合,出一個進一個
                                        //3 每次先找出6個不同的球,然後配置設定給線程
                                        //4 每次線程随意擷取球,更新前檢測下有沒有沖突,有則重新随機,沒有則更新
                                        text = this.GetRandomText();
                                        lock (_Lock)
                                        {
                                            List<string> redList = this.Dispatcher.Invoke(() => GetUsedRed(lbl));
                                            if (redList.Contains(text))
                                                continue;
                                            else
                                            {
                                                Thread.Sleep(50);//讓停止的時候,線程可能在這裡
                                                this.UpdateLable(lbl, text);
                                            }
                                        }
                                    }
                                    else
                                    {
                                        int index = RandomHelper.GetRandomNumber(0, 16);
                                        //Random random = new Random();//僞随機
                                        //string text = this.BlueNums[random.Next(0, 15)];
                                        //int index = RandomHelper.GetRandomNumber(0, 16);
                                        text = this.BlueNums[index];
                                        //lbl.Text = text;//不行
                                        this.UpdateLable(lbl, text);
                                    }

                                    //this.UpdateLable(lbl, text);
                                    Thread.Sleep(50);
                                }
                            }));
                        }
                    }
                    //所有線程執行完,展示結果
                    taskFactory.ContinueWhenAll(taskList.ToArray(), tList => this.ShowResult());

                    {

                    }
                }
                else
                {
                    image.Source = new BitmapImage(new Uri("Images/click.png", UriKind.Relative));
                    this.IsGoon = false;
                }



            }
            catch (Exception ex)
            {

                Console.WriteLine("雙色球啟動出現異常:{0}", ex.Message);
            }

        }
           

(2)擷取随機号碼代碼:

private string GetRandomText()
        {
            int index = RandomHelper.GetRandomNumber(0, 33);
            return this.RedNums[index];
        }
    public class RandomHelper
    {
        /// <summary>
        /// 擷取随機數
        /// </summary>
        /// <param name="min">能出現的最小值</param>
        /// <param name="max">不會出現</param>
        /// <returns></returns>
        public static int GetRandomNumber(int min, int max)
        {
            Guid guid = Guid.NewGuid();
            string sGuid = guid.ToString();
            int seed = DateTime.Now.Millisecond;
            for (int i = 0; i < sGuid.Length; i++)
            {
                switch (sGuid[i])
                {
                    case 'a':
                    case 'b':
                    case 'c':
                    case 'd':
                    case 'e':
                    case 'f':
                    case 'g':
                        seed = seed + 1;
                        break;
                    case 'h':
                    case 'i':
                    case 'j':
                    case 'k':
                    case 'l':
                    case 'm':
                    case 'n':
                        seed = seed + 2;
                        break;
                    case 'o':
                    case 'p':
                    case 'q':
                    case 'r':
                    case 's':
                    case 't':
                        seed = seed + 3;
                        break;
                    case 'u':
                    case 'v':
                    case 'w':
                    case 'x':
                    case 'y':
                    case 'z':
                        seed = seed + 3;
                        break;
                    default:
                        seed = seed + 4;
                        break;
                }
            }
            Random random = new Random(seed);
            return random.Next(min, max);
        }
    }
           

(3)擷取已經存在的資料代碼

private List<string> GetUsedRed(Label lbl)
        {
            List<string> usedList = new List<string>();
            foreach (var labItem in LayoutRoot.Children)
            {
                if (labItem is Label && labItem != lbl)//目前的數字可以用
                {
                    usedList.Add(((Label)labItem).Content.ToString());
                }
            }
            return usedList;
        }
           

(4)更新Lable内容代碼

private void UpdateLable(Label lbl, string text)
        {
            this.Dispatcher.Invoke(new Action(() =>
            {
                lbl.Content = text;
            }));
        }
           

(5)展示結果代碼:

private void ShowResult()
        {
            this.Dispatcher.Invoke(() =>
            {
                MessageBox.Show(string.Format("本期雙色球結果為:{0} {1} {2} {3} {4} {5}  藍球{6}"
, this.labred1.Content
, this.labred2.Content
, this.labred3.Content
, this.labred4.Content
, this.labred5.Content
, this.labred6.Content
, this.lab7.Content));
                foreach (UIElement element in LayoutRoot.Children)
                {
                    if (element is Label)
                    {
                        ((Label)element).Content = "00";
                    }
                }
            }
            );
        }
           

(6)資料:

#region Data
        /// <summary>
        /// 紅球集合
        /// </summary>
        private string[] RedNums =
        {
            "01","02","03","04","05","06","07","08","09","10",
            "11","12","13","14","15","16","17","18","19","20",
            "21","22","23","24","25","26","27","28","29","30",
            "31","32","33"
        };

        /// <summary>
        /// 藍球集合
        /// </summary>
        private string[] BlueNums =
        {
            "01","02","03","04","05","06","07","08","09","10",
            "11","12","13","14","15","16"
        };
#endregion