新手,最近自己尝试着做了一个体彩大乐透的选号器,感觉挺有意思的,下面分享给大家!
具体步骤:
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自带画图软件改成位图,再添加即可。下面这个是我以前做得双色球选号器。