1. 程式人生 > >自己編一個大樂透選號器

自己編一個大樂透選號器

新手,最近自己嘗試著做了一個體彩大樂透的選號器,感覺挺有意思的,下面分享給大家!

具體步驟:

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自帶畫圖軟體改成點陣圖,再新增即可。下面這個是我以前做得雙色球選號器。