自己编一个大乐透选号器

新手,最近自己尝试着做了一个体彩大乐透的选号器,感觉挺有意思的,下面分享给大家!

具体步骤:

1、新建一个基于对话框的MFC工程。

2、按下图所示添加显示前区号码的5个编辑框,显示后区号码的2个编辑框,一个开始按钮。

截图标题

3、在OnInitDialog()函数中设置时间种子

BOOL C体彩大乐透Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO:  在此添加额外的初始化代码
	
	srand((time(0)));    // 以时间为种子,产生随机数

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

为什么要设置这个呢,不然的话每次产生的随机数都是固定的。所以能不能输出中奖号码,就得看当前是否占据天时地利人和了

4、开始按钮的响应函数中设置定时器

 SetTimer(1,40,NULL);

5、在WM_TIMER消息的响应函数中实现前区5位号码、后区2位号码的依次输出。

这里模拟真实开奖环境,7个球依次开出号码,因为每开出一个球大概都要摇动几十秒。

扫描二维码关注公众号,回复: 2278038 查看本文章

所以每产生1个号码都定时摇号几十秒,到时间后再确定该号码,并保证与前面已开出的号码保持互斥,再开始下一个球。

这样开出了7个号码,因为是随机产生的,所以再排个序,最终显示在下面静态文本框中,就跟电视中真是开奖环节差不多了。

void C体彩大乐透Dlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	// 开前区第1位号码
	if (bTimerSwitch[0])
	{
		nFront[0] = rand() % 35 + 1;
		SetDlgItemInt(IDC_EDIT_FRONT_1, nFront[0]);   // 实时更新
		// 时间到,确定号码
		if (++nCount[0] >= 40)
		{
			bTimerSwitch[0] = false;
			bTimerSwitch[1] = true;
		}
	}

	
	// 开前区第2位号码
	if (bTimerSwitch[1])
	{
		nFront[1] = rand() % 35 + 1;
		SetDlgItemInt(IDC_EDIT_FRONT_2, nFront[1]);   // 实时更新
		// 时间到,确定号码
		if (++nCount[1] >= 40 && nFront[1] != nFront[0])
		{
			bTimerSwitch[1] = false;
			bTimerSwitch[2] = true;
		}
	}

	// 开前区第3位号码
	if (bTimerSwitch[2])
	{
		nFront[2] = rand() % 35 + 1;
		SetDlgItemInt(IDC_EDIT_FRONT_3, nFront[2]);   // 实时更新
		// 时间到,确定号码
		if (++nCount[2] >= 40 && nFront[2] != nFront[0] && nFront[2] != nFront[1])
		{
			bTimerSwitch[2] = false;
			bTimerSwitch[3] = true;
		}
	}

	// 开前区第4位号码
	if (bTimerSwitch[3])
	{
		nFront[3] = rand() % 35 + 1;
		SetDlgItemInt(IDC_EDIT_FRONT_4, nFront[3]);   // 实时更新
		// 时间到,确定号码
		if (++nCount[3] >= 40 && nFront[3] != nFront[0] && nFront[3] != nFront[1] && nFront[3] != nFront[2])
		{
			bTimerSwitch[3] = false;
			bTimerSwitch[4] = true;
		}
	}
		
	// 开前区第5位号码
	if (bTimerSwitch[4])
	{
		nFront[4] = rand() % 35 + 1;
		SetDlgItemInt(IDC_EDIT_FRONT_5, nFront[4]);   // 实时更新
		// 时间到,确定号码
		if (++nCount[4] >= 40 && nFront[4] != nFront[0] && nFront[4] != nFront[1] && nFront[4] != nFront[2] && nFront[4] != nFront[3])
		{
			bTimerSwitch[4] = false;
			bTimerSwitch[5] = true;
		}
	}
	
	// 开后区第1位号码
	if (bTimerSwitch[5])
	{
		nBack[0] = rand() % 12 + 1;
		SetDlgItemInt(IDC_EDIT_BACK_1, nBack[0]);   // 实时更新
		// 时间到,确定号码
		if (++nCount[5] >= 40 )
		{
			bTimerSwitch[5] = false;
			bTimerSwitch[6] = true;
		}
	}
	
	// 开后区第2位号码
	if (bTimerSwitch[6])
	{		
		nBack[1] = rand() % 12 + 1;
		SetDlgItemInt(IDC_EDIT_BACK_2, nBack[1]);   // 实时更新
		// 时间到,确定号码
		if (++nCount[6] >= 40 && nBack[1] != nBack[0])
		{
			bTimerSwitch[6] = false;
			KillTimer(1);
		}
	}

        // 7个号码全部开出,排序,并显示
	if (!bTimerSwitch[0] && !bTimerSwitch[1] && !bTimerSwitch[2] && !bTimerSwitch[3] && !bTimerSwitch[4] && !bTimerSwitch[5] && !bTimerSwitch[6])
	{
		// 6个数排序
		qsort(nFront, 5, sizeof(nFront[0]), cmp);
		qsort(nBack, 2, sizeof(nBack[0]), cmp);
		CString str;
		//str.Format(L"%d %d %d %d %d %d %d", nCount[0], nCount[1], nCount[2], nCount[3], nCount[4], nCount[5], nCount[6]);
		str.Format(L"前区:%d  %d  %d  %d  %d  后区:%d  %d", nFront[0], nFront[1], nFront[2], nFront[3], nFront[4], nBack[0], nBack[1]);
		SetDlgItemText(IDC_STATIC2, str);     // 最终结果显示
	}
	

		
	CDialogEx::OnTimer(nIDEvent);
}

6、OK了,当然大家可以把界面做得漂亮一点,在对话框界面添加几个PICTURE control控件,网上下载个选号器的图片,利用windows自带画图软件改成位图,再添加即可。下面这个是我以前做得双色球选号器。


            

猜你喜欢

转载自blog.csdn.net/weixin_36514487/article/details/81118082