新手,最近自己尝试着做了一个体彩大乐透的选号器,感觉挺有意思的,下面分享给大家!
具体步骤:
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个球依次开出号码,因为每开出一个球大概都要摇动几十秒。
所以每产生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自带画图软件改成位图,再添加即可。下面这个是我以前做得双色球选号器。