自己編一個大樂透選號器
阿新 • • 發佈:2019-01-29
新手,最近自己嘗試著做了一個體彩大樂透的選號器,感覺挺有意思的,下面分享給大家!
具體步驟:
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自帶畫圖軟體改成點陣圖,再新增即可。下面這個是我以前做得雙色球選號器。