原文: 基于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