基于WPF实现双色球
原文:基于WPF实现双色球
基于WPF实现双色球
文章目录
1.实现思路:
分析:双色球由六个红色号码和一个蓝色号码组成;红色球号码从01–33中选择,而且不能重复;蓝色球号码从01–16中选择(可以跟红球重复)。
(1)点击开始按钮,开启七个线程,获取数据
(2)由于前六个的数据不一样,所以应当将获得的数据与除了当前Lable外的其他Lable内容进行比较,如果重复,则需要重新获取;否则,显示
(3)当点击停止按钮,等待所有线程执行完,显示结果
2.实现代码:
(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
3.源代码
基于WPF实现双色球的更多相关文章
- VSTO学习笔记(七)基于WPF的Excel分析、转换小程序
原文:VSTO学习笔记(七)基于WPF的Excel分析.转换小程序 近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率. 小程序的功能是对Excel进行一些分析.验证,然 ...
- (转)基于 WPF + Modern UI 的 公司OA小助手 开发总结
原文地址:http://www.cnblogs.com/rainlam163/p/3365181.html 前言: 距离上一篇博客,整整一个月的时间了.人不能懒下来,必须有个阶段性的总结,算是对我这个 ...
- 基于WPF系统框架设计(5)-Ribbon整合Avalondock 2.0实现多文档界面设计(二)
AvalonDock 是一个.NET库,用于在停靠模式布局(docking)中排列一系列WPF/WinForm控件.最新发布的版本原生支持MVVM框架.Aero Snap特效并具有更好的性能. Ava ...
- 基于 WPF + Modern UI 的 公司OA小助手 开发总结
前言: 距离上一篇博客,整整一个月的时间了.人不能懒下来,必须有个阶段性的总结,算是对我这个阶段的一个反思.人只有在总结的过程中才会发现自己的不足. 公司每天都要在OA系统上上班点击签到,下班点击签退 ...
- 封装:简要介绍自定义开发基于WPF的MVC框架
原文:封装:简要介绍自定义开发基于WPF的MVC框架 一.目的:在使用Asp.net Core时,深感MVC框架作为页面跳转数据处理的方便,但WPF中似乎没有现成的MVC框架,由此自定义开发一套MVC ...
- 基于WPF的酷炫GUI窗口的实现全过程
title: 基于WPF的酷炫GUI窗口的实现全过程 date: 2020-08-14 permalink: /build/wpfgui sidebarDepth: 2 tags: wpf gui 软 ...
- .NET6: 开发基于WPF的摩登三维工业软件 (2)
在<.NET6: 开发基于WPF的摩登三维工业软件 (1)>我们创建了一个"毛坯"界面,距离摩登还差一段距离.本文将对上一阶段的成果进行深化,实现当下流行的暗黑风格UI ...
- .NET6: 开发基于WPF的摩登三维工业软件 (7)
做为一个摩登的工业软件,提供可编程的脚本能力是必不可少的能力.脚本既可以方便用户进行二次开发,也对方便对程序进行自动化测试.本文将结合AnyCAD对Python脚本支持的能力和WPF快速开发带脚本编辑 ...
- .NET6: 开发基于WPF的摩登三维工业软件 (8) - MVVM
基于WPF开发界面的一个很大优势是可以方便地基于MVVM设计模式开发应用.本文从应用的角度基于MVVM实现参数化管材的创建界面. 1 MVVM MVVM是Model-View-ViewModel的简写 ...
随机推荐
- 6 、字符编码笔记:ASCII,Unicode和UTF-8
1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出 256种状态,这被称为一个字节(byte) ...
- 美国汪利宏的蒙特卡洛及卷积模拟程序,可以模拟top-hat光束和高斯光束在生物组织中的传输
链接:https://pan.baidu.com/s/1yaCsQ8TCVPSIZ4TVBZgfnw 密码:otzr
- github-vimium-compile-crx
chrome-62.x版本上安装vimium 1.61.1 https://blog.csdn.net/ZHUJIANWEILI4/article/details/78385346
- 在Eclipse中运行hadoop程序 分类: A1_HADOOP 2014-12-14 11:11 624人阅读 评论(0) 收藏
1.下载hadoop-eclipse-plugin-1.2.1.jar,并将之复制到eclipse/plugins下. 2.打开map-reduce视图 在eclipse中,打开window--> ...
- J2EE&JavaEE概述
来源 Sun公司在1998年发表JDK1.2版本的时候, 使用了新名称Java 2 Platform,即"Java2平台",修改后的JDK称为Java 2 Platform Sof ...
- Linux环境下Apache ActiveMQ 基本安装
原文链接:https://www.jianshu.com/p/1c017088aa95 在linux上安装mq,并映射到外网.1.Apache ActiveMQ安装基本条件请参考链接:2.下载Apac ...
- Xcode6 模拟器路径
Xcode6公布后,出现了非常多的变动,功能性的变动,在这里不进行过多的赘述,在WWDC上苹果已经进行了讲述,网上也有非常多文章,这里要介绍的是一些不太easy发现的,但非常重要的小地方. ...
- Git恢复删除或修改的文件 ls-files
一.git ls-files -d 查看删除了的文件 1.查看当前状态可以看到删除了一个index.js: git status image.png 2.查看当前项目中删除了的文件 git ls-fi ...
- asp.net core2.1 部署centos7/linux系统 -- 安装部署(一)
原文:asp.net core2.1 部署centos7/linux系统 -- 安装部署(一) 1.安装dotnet sdk(添加产品秘钥与yum源) 添加yum源:sudo rpm -Uvh htt ...
- require.js的用法详解
require.js的诞生是为了解决两大问题,第一实现js文件的异步加载,避免网页失去响应,第二管理模块之间的依赖性,便于代码的编写和维护. 一.为什么要用require.js? 最早的时候,所有Ja ...