MFC模拟双色球抽奖

原创 2012年03月26日 09:58:17

用MFC+ATL写了一个很简单的模拟双色球抽奖小程序

主要是用到了ATL中的deque容器:

初始化对话框,以及文件:

BOOL CRewardDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	using namespace std;
	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标
	redNum=0;
	for(int i=0;i<6;i++)
		blueNum[i]=0;
	srand((UINT)time(NULL));//播种
	CString str=GetAppPath()+_T("\\Count.dat");
	if(!IsFileExist(str))
	{
		m_nCount=0;
		ofstream i(str);
		i.close();
	}
	else
	{
		string s="";
		ifstream is(str);
		while(true)
		{
			if(is.get()==':')
				break;
		}
		while(!is.eof())
		{
			char ch=is.get();
			s+=ch;
		}
		const char* c=s.c_str();
		m_nCount=atoi(c);
		is.close();
	}
	// TODO: 在此添加额外的初始化代码
	CString str1(_T("点击按钮开始抽奖"));
	m_btn1.Init(str1);
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

以下函数用来绘制圆形:

void CRewardDlg::DrawCicle(CDC* pDC,CRect& rc/*确定圆的矩形区域*/,int number/*圆上面显示的数字 */, COLORREF rgb/*圆的颜色*/)
{
	//pDC->FillSolidRect(rc,rgb);
	CString str;
	if(m_IsInit)
		str.Format(_T("%02d"),number);
	else
		str=_T("**");
	CFont ft,*pOldFt=NULL;
	ft.CreatePointFont(240,_T("黑体"));
	
	pOldFt=pDC->SelectObject(&ft);
	CBrush br,*pOldBr=NULL;
	br.CreateSolidBrush(rgb);
	pOldBr=pDC->SelectObject(&br);
	pDC->Ellipse(&rc);
	pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor(RGB(0,255,0));
	pDC->DrawText(str,rc,DT_VCENTER|DT_CENTER|DT_SINGLELINE);
	//释放资源
	pDC->SelectObject(pOldFt);
	pDC->SelectObject(pOldBr);
	br.DeleteObject();
	pOldBr->DeleteObject();
	pOldBr=NULL;
}

点击开始抽奖按钮:

void CRewardDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	m_IsInit=TRUE;
	CString str;
	if(m_IsStart)//已经开始,进入后结束抽奖
	{
		m_IsStart=FALSE;
		m_btn1.SetWindowTextW(_T("开始抽奖"));
		str=_T("点击按钮开始抽奖");
		m_btn1.Init(str);
		EndReward();
		this->SaveRewordData();
	}
	else//已经结束,进入后开始抽奖
	{
		int num=rand()%4+4;
		SetTimer(2,num*1000,NULL);
		m_IsStart=TRUE;
		m_btn1.SetWindowTextW(_T("完成抽奖"));
		str=_T("点击按钮结束抽奖");
		m_btn1.Init(str);
		StartReward();
	}
}

设置定时器,定时器中实现模拟抽奖:

void CRewardDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	using namespace std;
	if(1==nIDEvent)
	{
		deque<int> que;
		for(int i=0;i<33;i++)
			que.push_front(i+1);
		for(int i=0;i<6;i++)
		{
			int count=que.size();
			int index=rand()%count;
			blueNum[i]=que.at(index);
			que.erase(que.begin()+index);
			
		}
		redNum=rand()%16+1;	
		Invalidate();
	}
	if(2==nIDEvent)
	{
		KillTimer(1);
	}
	CDialog::OnTimer(nIDEvent);
}

将历史抽奖记录保存到文件中:

void CRewardDlg::SaveRewordData(void)
{
	using namespace std;
	CString strAppPath=GetAppPath();
	ofstream os(strAppPath+_T("\\Reward.log"),ios_base::out|ios_base::app);
	int totalLine=0;
	ifstream is(strAppPath+_T("\\Reward.log"));
	while(!is.eof())
	{
		char c=is.get();
		if(c=='\n')
			totalLine++;
	}

	SYSTEMTIME	sm;
	::GetLocalTime(&sm);
	CString strTime;
	CString strNum;
	strNum.Format(_T("第%d次抽奖结果如下"),m_nCount);
	int len= WideCharToMultiByte(CP_ACP,0,strNum,strNum.GetLength(),NULL,0,NULL,NULL);
	char *ch=new char[len+1];
	WideCharToMultiByte(CP_ACP,0,strNum,strNum.GetLength(),ch,len,NULL,NULL);
	ch[len]='\0';
	os<<ch<<endl;
	////////////////////////////////////////////////////////////////
	strTime.Format(_T("抽奖时间:\n     %d-%d-%d  %02d:%02d:%02d"),
		sm.wYear,sm.wMonth,sm.wDay,sm.wHour,sm.wMinute,sm.wSecond);
	len= WideCharToMultiByte(CP_ACP,0,strTime,strTime.GetLength(),NULL,0,NULL,NULL);
	char *c=new char[len+1];
	WideCharToMultiByte(CP_ACP,0,strTime,strTime.GetLength(),c,len,NULL,NULL);
	c[len]='\0';
	os<<c<<endl;
	CString strReward;
	strReward.Format(_T("抽奖结果:\n     蓝号:%02d\n     红号依次为:%02d %02d %02d %02d %02d %02d"),
		redNum,blueNum[0],blueNum[1],blueNum[2],blueNum[3],blueNum[4],blueNum[5]);
	len= WideCharToMultiByte(CP_ACP,0,strReward,strReward.GetLength(),NULL,0,NULL,NULL);
	char *p=new char[len+1];
	WideCharToMultiByte(CP_ACP,0,strReward,strReward.GetLength(),p,len,NULL,NULL);
	p[len]='\0';
	os<<p<<endl;
	os<<"=============================================================="<<endl;
	os.close();
}

记录抽奖次数,保存到文件中:

void CRewardDlg::WriteRewardCount(void)
{
	using namespace std;
	CString str=GetAppPath()+_T("\\Count.dat");
	ofstream os(str);
	str.Empty();
	str.Format(_T("已经抽奖次数:%d"),m_nCount);
	int len= WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);
	char *c=new char[len+1];
	WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),c,len,NULL,NULL);
	c[len]='\0';
	os<<c;
	os.close();
}

详情请见源码:点击打开链接

版权声明:本文为博主原创文章,未经博主允许不得转载。(博客地址:http://blog.csdn.net/mfcing)

相关文章推荐

java基础项目-抽奖机-模拟双色球-大乐透

java基础项目-抽奖机-模拟双色球-大乐透:创建了很多的方法逐个编译的,做的很新手 不足之处希望多多交流。谢谢。 需求分析: 欢迎界面 欢迎使用超级幸运抽奖机选彩种(1.双色球;2.超级大乐...

用C#简单的实现双色球抽奖

简单说一下 双色球的规则:6 个红球加1个蓝球,红球范围为1到33且不重复,蓝球范围为1到16.一些细节 的问题,一般开双色球的时候,是一个一个开的,且球在不断的跳动,点击一下按钮开一个球。 起初看...

双色球抽奖JAVA编写代码

  • 2010年07月15日 10:09
  • 4KB
  • 下载

Java实现双色球模拟系统

  • 2015年12月07日 09:58
  • 4KB
  • 下载

双色球6+1Java模拟

# 程序运行结果: 一等奖:0次 二等奖:0次 三等奖:2次 四等奖:108次 五等奖:3720次 六等奖:301106次 感谢购买:9695064次 累计购买:10000000次 ...
  • zj_whu
  • zj_whu
  • 2017年06月08日 13:53
  • 109

简易双色球模拟

  • 2013年01月23日 09:13
  • 4.09MB
  • 下载

java模拟双色球彩票程序

/** * 案例 模拟双色球 * 系统生成一个蓝球和六个红球 并存储起来 * 接受用户选号 1个蓝球 和 6个红球 * 验证比较用户是否中奖 * 公布本期中奖号码 */ import java....
  • ebw123
  • ebw123
  • 2013年12月29日 23:49
  • 5353

Java小程序:模拟双色球开奖

Java 编写模拟双色球开奖的程序

C语言模拟中国福利彩票【双色球】

首先,强烈推荐一个C,C++开发的IDE工具,比VC简介万倍。我在学习C语言(大学公共课程C语言【谭浩强版】)的时候,就用的这个开发工具,很好用。 百度搜索: C_C++程序设计学习与实验系...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC模拟双色球抽奖
举报原因:
原因补充:

(最多只允许输入30个字)