双色球与 35 选 7 的规则,不用说。
双色球选号程序:
在 VS2005 中,新建对话框应用程序:CSportLottery
对话框程序:文本ID为:IDC_EDIT1, IDC_EDIT2, IDC_EDIT3, IDC_EDIT4, IDC_EDIT5, IDC_EDIT6,IDC_EDIT_1, IDC_EDIT2, IDC_EDIT_3, IDC_EDIT_4, IDC_EDIT_5, IDC_EDIT_6,
SportLotteryDlg.cpp的整个文件如下:
// SportLotteryDlg.cpp : implementation file
#include "stdafx.h"
#include "SportLottery.h"
#include "SportLotteryDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog{
public:
CAboutDlg();
// Dialog Data
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX){
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CSportLotteryDlg dialog
CSportLotteryDlg::CSportLotteryDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSportLotteryDlg::IDD, pParent){
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSportLotteryDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CSportLotteryDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDOK, &CSportLotteryDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTONSTOP, &CSportLotteryDlg::OnBnClickedButtonstop)
ON_BN_CLICKED(IDOK2, &CSportLotteryDlg::OnBnClickedOk2)
ON_BN_CLICKED(IDC_BUTTONSTOP2, &CSportLotteryDlg::OnBnClickedButtonstop2)
END_MESSAGE_MAP()
struct EditAndNO
{
CEdit *pEdit; //编辑框对象指针
int iNO; //编辑框值
};
HANDLE *g_hThread=NULL; //保存所有线程
HANDLE g_hEvent; //事件对象
int *g_iRand=NULL; //保存随机数
EditAndNO *g_pEAN=NULL; //保存所有EditAndNO结构对象
int *g_piNumNum=NULL; //编辑框个数
CEdit *p_Result_Edit;
/**
双色球的全局变量与35 选7 的共用,也可以分开
*/
DWORD CALLBACK GenerateRand(LPVOID pParam);
DWORD CALLBACK NumberChange(LPVOID pParam);
/*
判断号码是否存在,红色球的号码不同
*/
BOOL IsExistAlready(int *iNum,int n,int num ){
for(int i=0;i
if(*(iNum+i)==num){
return 1;
}
}
return 0;
}
/*
从小到大排序,如果有相同的数就返回0
*/
BOOL sort_1(int arr[],int size)
{//选择排序法
int i,j,pot;
for(i=0;i
for(j=i+1;j
{
if(arr[i]>arr[j]){
pot=arr[i];arr[i]=arr[j];arr[j]=pot;
}
else if(arr[i]==arr[j]){
return 0;
}
}
}
return 1;
}
/
//生成随机数的线程
/*
“双色球”每注投注号码由个红色球号码和个蓝色球号码组成。红色球号码从--33中选择;蓝色球号码从--16中选择。
*/
DWORD CALLBACK GenerateRandDouble(LPVOID pParam){
int l_iNum=*(int *)pParam,i;
while(WaitForSingleObject(g_hEvent,21)==WAIT_TIMEOUT)
{
//生成随机数
srand(rand());
int randt;
//srand( (unsigned)time( NULL ) );
for(i=0;i
randt=(rand()%33)+1;
while(IsExistAlready(g_iRand,i,randt)){
randt=(rand()%33)+1;
}
*(g_iRand+i)=randt;
}
randt=(rand()%16)+1;
while(IsExistAlready(g_iRand,l_iNum-1,randt)){
randt=(rand()%16)+1;
}
*(g_iRand+l_iNum-1)=randt;
}
return 1;
}
/
//生成随机数的线程 35 选7
DWORD CALLBACK GenerateRand(LPVOID pParam)
{
int l_iNum=*(int *)pParam,i;
while(WaitForSingleObject(g_hEvent,21)==WAIT_TIMEOUT)
{
//生成随机数
srand(rand());
//srand( (unsigned)time( NULL ) );
for(i=0;i
int randt=(rand()%35)+1;
while(IsExistAlready(g_iRand,i,randt)){
randt=(rand()%35)+1;
}
*(g_iRand+i)=randt;
}
}
return 1;
}
//更新编辑框数字的线程
DWORD CALLBACK NumberChange(LPVOID pParam)
{
EditAndNO *l_pEAN=(EditAndNO *)pParam;
CEdit *l_pEdit=l_pEAN->pEdit;
int l_iNO=l_pEAN->iNO;
TCHAR l_cNum[2];
// char l_cNum[3];
memset(l_cNum,0,sizeof(l_cNum));
l_cNum[0]='0';
while(WaitForSingleObject(g_hEvent,1)==WAIT_TIMEOUT)
{
//itoa(g_iRand[l_iNO]%35+1,l_cNum,10);
::wsprintf(l_cNum,_T("%0.2d"),g_iRand[l_iNO]);
//改变文本框数字
l_pEdit->SetWindowText((LPCTSTR)(l_cNum));
l_pEdit->UpdateData(false);
}
return 1;
}
// CSportLotteryDlg message handlers
BOOL CSportLotteryDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
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);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CSportLotteryDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CSportLotteryDlg::OnPaint(){
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast (dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CSportLotteryDlg::OnQueryDragIcon()
{
return static_cast (m_hIcon);
}
void CSportLotteryDlg::OnBnClickedOk()//35 选7 的按钮
{
CEdit *l_pEdit[7];
unsigned long id;
//创建事件对象
g_hThread=new HANDLE[8];
g_hEvent=CreateEvent(NULL,true,false,NULL);
g_pEAN=new EditAndNO[7];
g_iRand=new int[7];
//开始生成随机数的线程
g_piNumNum=new int;
*g_piNumNum=7;
g_hThread[7]=CreateThread(NULL,0,GenerateRand,(LPVOID)g_piNumNum,0,&id);
//分别开始更新每个编辑框的线程
l_pEdit[0]=(CEdit *)GetDlgItem(IDC_EDIT1);
g_pEAN[0].pEdit=l_pEdit[0];
g_pEAN[0].iNO=0;
g_hThread[0]=CreateThread(NULL,0,NumberChange,(LPVOID)g_pEAN,0,&id);
l_pEdit[1]=(CEdit *)GetDlgItem(IDC_EDIT2);
g_pEAN[1].pEdit=l_pEdit[1];
g_pEAN[1].iNO=1;
g_hThread[1]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+1),0,&id);
l_pEdit[2]=(CEdit *)GetDlgItem(IDC_EDIT3);
g_pEAN[2].pEdit=l_pEdit[2];
g_pEAN[2].iNO=2;
g_hThread[2]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+2),0,&id);
l_pEdit[3]=(CEdit *)GetDlgItem(IDC_EDIT4);
g_pEAN[3].pEdit=l_pEdit[3];
g_pEAN[3].iNO=3;
g_hThread[3]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+3),0,&id);
l_pEdit[4]=(CEdit *)GetDlgItem(IDC_EDIT5);
g_pEAN[4].pEdit=l_pEdit[4];
g_pEAN[4].iNO=4;
g_hThread[4]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+4),0,&id);
l_pEdit[5]=(CEdit *)GetDlgItem(IDC_EDIT6);
g_pEAN[5].pEdit=l_pEdit[5];
g_pEAN[5].iNO=5;
g_hThread[5]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+5),0,&id);
l_pEdit[6]=(CEdit *)GetDlgItem(IDC_EDIT7);
g_pEAN[6].pEdit=l_pEdit[6];
g_pEAN[6].iNO=6;
g_hThread[6]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+6),0,&id);
p_Result_Edit=(CEdit *)GetDlgItem(IDC_EDIT_Result1);
//更新按钮状态
GetDlgItem(IDC_BUTTONSTOP)->EnableWindow(true);
GetDlgItem(IDOK)->EnableWindow(false);
GetDlgItem(IDC_BUTTONSTOP2)->EnableWindow(true);
GetDlgItem(IDOK2)->EnableWindow(false);
GetDlgItem(IDCANCEL)->EnableWindow(false);
}
void CSportLotteryDlg::OnBnClickedButtonstop(){
//关闭所有线程
SetEvent(g_hEvent);
CloseHandle(g_hThread[0]);
CloseHandle(g_hThread[1]);
CloseHandle(g_hThread[2]);
CloseHandle(g_hThread[3]);
CloseHandle(g_hThread[4]);
CloseHandle(g_hThread[5]);
CloseHandle(g_hEvent);
//更新按钮状态
GetDlgItem(IDC_BUTTONSTOP)->EnableWindow(false);
GetDlgItem(IDOK)->EnableWindow(true);
GetDlgItem(IDC_BUTTONSTOP2)->EnableWindow(false);
GetDlgItem(IDOK2)->EnableWindow(true);
GetDlgItem(IDCANCEL)->EnableWindow(true);
UpdateData(1);
int aa[7];//=new int[7];
//for(int i=0;i<7;i++){}
CString ss;
g_pEAN[0].pEdit->GetWindowText(ss);
swscanf(ss.GetBuffer(0), _T("%d"), &aa[0]);
ss.ReleaseBuffer();
g_pEAN[1].pEdit->GetWindowText(ss);
swscanf(ss.GetBuffer(0), _T("%d"), &aa[1]);
ss.ReleaseBuffer();
g_pEAN[2].pEdit->GetWindowText(ss);
swscanf(ss.GetBuffer(0), _T("%d"), &aa[2]);
ss.ReleaseBuffer();
g_pEAN[3].pEdit->GetWindowText(ss);
swscanf(ss.GetBuffer(0), _T("%d"), &aa[3]);
ss.ReleaseBuffer();
g_pEAN[4].pEdit->GetWindowText(ss);
swscanf(ss.GetBuffer(0), _T("%d"), &aa[4]);
ss.ReleaseBuffer();
g_pEAN[5].pEdit->GetWindowText(ss);
swscanf(ss.GetBuffer(0), _T("%d"), &aa[5]);
ss.ReleaseBuffer();
g_pEAN[6].pEdit->GetWindowText(ss);
swscanf(ss.GetBuffer(0), _T("%d"), &aa[6]);
ss.ReleaseBuffer();
/**从小到大排序
**/
if(!sort_1(aa,6)){
MessageBox(_T(" 有相同数"));
}
CString s_Result;
s_Result.Format(_T("%0.2d %0.2d %0.2d %0.2d %0.2d %0.2d + %0.2d"),aa[0],aa[1],aa[2],aa[3],aa[4],aa[5],aa[6]);
p_Result_Edit->SetWindowText(s_Result);
p_Result_Edit->UpdateData(false);
delete [] g_hThread;
delete [] g_iRand;
delete [] g_pEAN;
delete [] g_piNumNum;
//delete []aa;
}
void CSportLotteryDlg::OnBnClickedOk2()
{
CEdit *l_pEdit[7];
unsigned long id;
//创建事件对象
g_hThread=new HANDLE[8];
g_hEvent=CreateEvent(NULL,true,false,NULL);
g_pEAN=new EditAndNO[7];
g_iRand=new int[7];
//开始生成随机数的线程
g_piNumNum=new int;
*g_piNumNum=7;
g_hThread[7]=CreateThread(NULL,0,GenerateRandDouble,(LPVOID)g_piNumNum,0,&id);
//分别开始更新每个编辑框的线程
l_pEdit[0]=(CEdit *)GetDlgItem(IDC_EDIT_1);
g_pEAN[0].pEdit=l_pEdit[0];
g_pEAN[0].iNO=0;
g_hThread[0]=CreateThread(NULL,0,NumberChange,(LPVOID)g_pEAN,0,&id);
l_pEdit[1]=(CEdit *)GetDlgItem(IDC_EDIT_2);
g_pEAN[1].pEdit=l_pEdit[1];
g_pEAN[1].iNO=1;
g_hThread[1]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+1),0,&id);
l_pEdit[2]=(CEdit *)GetDlgItem(IDC_EDIT_3);
g_pEAN[2].pEdit=l_pEdit[2];
g_pEAN[2].iNO=2;
g_hThread[2]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+2),0,&id);
l_pEdit[3]=(CEdit *)GetDlgItem(IDC_EDIT_4);
g_pEAN[3].pEdit=l_pEdit[3];
g_pEAN[3].iNO=3;
g_hThread[3]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+3),0,&id);
l_pEdit[4]=(CEdit *)GetDlgItem(IDC_EDIT_5);
g_pEAN[4].pEdit=l_pEdit[4];
g_pEAN[4].iNO=4;
g_hThread[4]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+4),0,&id);
l_pEdit[5]=(CEdit *)GetDlgItem(IDC_EDIT_6);
g_pEAN[5].pEdit=l_pEdit[5];
g_pEAN[5].iNO=5;
g_hThread[5]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+5),0,&id);
l_pEdit[6]=(CEdit *)GetDlgItem(IDC_EDIT_7);
g_pEAN[6].pEdit=l_pEdit[6];
g_pEAN[6].iNO=6;
g_hThread[6]=CreateThread(NULL,0,NumberChange,(LPVOID)(g_pEAN+6),0,&id);
p_Result_Edit=(CEdit *)GetDlgItem(IDC_EDIT_Result2);
//更新按钮状态
GetDlgItem(IDC_BUTTONSTOP)->EnableWindow(true);
GetDlgItem(IDOK)->EnableWindow(false);
GetDlgItem(IDC_BUTTONSTOP2)->EnableWindow(true);
GetDlgItem(IDOK2)->EnableWindow(false);
GetDlgItem(IDCANCEL)->EnableWindow(false);
}
void CSportLotteryDlg::OnBnClickedButtonstop2()
{
OnBnClickedButtonstop();
}
运行结果:
点击按钮“Start”,开始选号,“Stop”选出