基本信息
源码名称:c++ 二十四点小游戏源码
源码大小:0.16M
文件格式:.rar
开发语言:C/C++
更新时间:2019-01-03
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
益智类小游戏二十四点
益智类小游戏二十四点
#include "stdafx.h" #include "Point24.h" #include "Point24Dlg.h" #include "Expression.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define __RDTSC #define BACKGROUNDX 76 #define BACKGROUNDY 40 static struct tagRECT g_rectCard[] = { { 102, 60, 173, 156 }, { 184, 60, 255, 156 }, { 266, 60, 337, 156 }, { 348, 60, 419, 156 } }; static TCHAR* g_szCardName[] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" }; static TCHAR* g_szCardValue[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13" }; inline bool __fastcall Inside(struct tagRECT* r, struct tagPOINT* p) { return ((p->x > r->left) && (p->x < r->right) && (p->y > r->top) && (p->y < r->bottom)); } INT __fastcall random(INT topx) { if (0 == topx) return 0; #ifdef __RDTSC #define cpuid __asm _emit 0x0F __asm _emit 0xA2 #define rdtsc __asm _emit 0x0F __asm _emit 0x31 INT temp; __asm { xor eax, eax; xor ebx, ebx; xor ecx, ecx; xor edx, edx; cpuid; rdtsc; mov DWORD PTR[temp], eax; xor eax, eax; cpuid; } return ::abs(temp % topx); #else INT a, b, c, temp = 99; a = ::rand() % temp; b = ::rand() % temp; c = ::rand() % temp 5; struct tm *t; time_t lt; ::time(<); t = ::gmtime(<); ::srand(a * t->tm_hour b * t->tm_min c * t->tm_sec); return ::abs(::rand() % topx); #endif } CPoint24Dlg::CPoint24Dlg(CWnd* pParent) : CDialog(CPoint24Dlg::IDD, pParent) { //{{AFX_DATA_INIT(CPoint24Dlg) m_editExpression = _T(""); //}}AFX_DATA_INIT m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); ::ZeroMemory(m_nCard, sizeof(INT) * 4); m_nLength = 0; } void CPoint24Dlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPoint24Dlg) DDX_Control(pDX, IDC_COMBO_CARD4, m_comboCard4); DDX_Control(pDX, IDC_COMBO_CARD3, m_comboCard3); DDX_Control(pDX, IDC_COMBO_CARD2, m_comboCard2); DDX_Control(pDX, IDC_COMBO_CARD1, m_comboCard1); DDX_Text(pDX, IDC_EDIT_EXPRESSION, m_editExpression); DDV_MaxChars(pDX, m_editExpression, 64); //}}AFX_DATA_MAP } void CPoint24Dlg::OnOK(){} HCURSOR CPoint24Dlg::OnQueryDragIcon(){ return (HCURSOR) m_hIcon; } void CPoint24Dlg::OnCancel() { // if (IDNO == ::AfxMessageBox("确实要退出吗?", MB_YESNO)) return; CDialog::OnCancel(); } void CPoint24Dlg::OnDestroy() { CDialog::OnDestroy(); m_bmpBackground.DeleteObject(); m_bmpCard.DeleteObject(); } BEGIN_MESSAGE_MAP(CPoint24Dlg, CDialog) //{{AFX_MSG_MAP(CPoint24Dlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_DESTROY() ON_BN_CLICKED(IDC_BUTTON_DEAL, OnButtonDeal) ON_WM_LBUTTONDOWN() ON_BN_CLICKED(IDC_BUTTON_CANCEL, OnButtonCancel) ON_BN_CLICKED(IDC_BUTTON_BACKSPACE, OnButtonBackspace) ON_BN_CLICKED(IDC_BUTTON_OK, OnButtonOk) ON_BN_CLICKED(IDC_BUTTON_ANSWER, OnButtonAnswer) ON_BN_CLICKED(IDC_BUTTON_PLUS, OnButtonPlus) ON_BN_CLICKED(IDC_BUTTON_MINUS, OnButtonMinus) ON_BN_CLICKED(IDC_BUTTON_MULTIS, OnButtonMultis) ON_BN_CLICKED(IDC_BUTTON_DIVIS, OnButtonDivis) ON_BN_CLICKED(IDC_BUTTON_LEFT_PAREN, OnButtonLeftParen) ON_BN_CLICKED(IDC_BUTTON_RIGHT_PAREN, OnButtonRightParen) ON_CBN_SELCHANGE(IDC_COMBO_CARD4, OnSelchangeComboCard4) ON_CBN_SELCHANGE(IDC_COMBO_CARD1, OnSelchangeComboCard1) ON_CBN_SELCHANGE(IDC_COMBO_CARD2, OnSelchangeComboCard2) ON_CBN_SELCHANGE(IDC_COMBO_CARD3, OnSelchangeComboCard3) //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL CPoint24Dlg::OnInitDialog() { CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); INT i; m_bmpBackground.LoadBitmap(IDB_BACK); m_bmpCard.LoadBitmap(IDB_CARDS); for (i = 0; i < 13; i ) m_comboCard4.AddString(g_szCardName[i]); for (i = 0; i < 13; i ) m_comboCard3.AddString(g_szCardName[i]); for (i = 0; i < 13; i ) m_comboCard2.AddString(g_szCardName[i]); for (i = 0; i < 13; i ) m_comboCard1.AddString(g_szCardName[i]); BITMAP BitMap; m_bmpBackground.GetBitmap(&BitMap); m_rectClipBox.bottom = BACKGROUNDY BitMap.bmHeight; m_rectClipBox.right = BACKGROUNDX BitMap.bmWidth; m_rectClipBox.left = BACKGROUNDX; m_rectClipBox.top = BACKGROUNDY; OnButtonDeal(); return TRUE; } void CPoint24Dlg::OnPaint() { CPaintDC dc(this); if (IsIconic()) { SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 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; dc.DrawIcon(x, y, m_hIcon); } else { ASSERT((m_nCard[3] >= 0) && (m_nCard[3] < 52)); ASSERT((m_nCard[2] >= 0) && (m_nCard[2] < 52)); ASSERT((m_nCard[1] >= 0) && (m_nCard[1] < 52)); ASSERT((m_nCard[0] >= 0) && (m_nCard[0] < 52)); CDC dcMem; dcMem.CreateCompatibleDC(&dc); dcMem.SelectObject(m_bmpBackground); dc.BitBlt(BACKGROUNDX, BACKGROUNDY, 368, 130, &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(m_bmpCard); for (INT i = 0; i < 4; i ) dc.BitBlt(g_rectCard[i].left, g_rectCard[i].top, 72, 96, &dcMem, 0, m_nCard[i] * 96, SRCCOPY); dcMem.DeleteDC(); CDialog::OnPaint(); } } bool CPoint24Dlg::FindSameCard(INT No, INT nNum) { for (INT i = 0; i < 4; i ) { if (i == No) continue; if (m_nCard[i] == nNum) { CString s; s.Format("与第 %d 张牌重复!!!", i 1); ::AfxMessageBox(s); return true; } } return false; } void CPoint24Dlg::OnSelchangeComboCard1() { INT i = m_comboCard1.GetCurSel(); if (true == this->FindSameCard(0, i)) return; m_nCard[0] = i; InvalidateRect(g_rectCard 0); } void CPoint24Dlg::OnSelchangeComboCard2() { INT i = m_comboCard2.GetCurSel(); if (true == this->FindSameCard(1, i)) return; m_nCard[1] = i; InvalidateRect(g_rectCard 1); } void CPoint24Dlg::OnSelchangeComboCard3() { INT i = m_comboCard3.GetCurSel(); if (true == this->FindSameCard(2, i)) return; m_nCard[2] = i; InvalidateRect(g_rectCard 2); } void CPoint24Dlg::OnSelchangeComboCard4() { INT i = m_comboCard4.GetCurSel(); if (true == this->FindSameCard(3, i)) return; m_nCard[3] = i; InvalidateRect(g_rectCard 3); } void CPoint24Dlg::OnButtonDeal() { m_nCard[0] = ::random(52); do { m_nCard[1] = ::random(52); } while(m_nCard[1] == m_nCard[0]); do { m_nCard[2] = ::random(52); } while((m_nCard[2] == m_nCard[0]) || (m_nCard[2] == m_nCard[1])); do { m_nCard[3] = ::random(52); } while((m_nCard[3] == m_nCard[0]) || (m_nCard[3] == m_nCard[1]) || (m_nCard[3] == m_nCard[2])); m_editExpression.Empty(); UpdateData(FALSE); m_nLength = 0; InvalidateRect(&m_rectClipBox); } void CPoint24Dlg::Reset(void) { for (INT i = 0; i < 4; i ) m_boUsed[i] = false; m_nLength = 0; } void CPoint24Dlg::OnButtonCancel() { m_editExpression.Empty(); UpdateData(FALSE); this->Reset(); } void CPoint24Dlg::FlushExpression(void) { m_editExpression.Empty(); m_strExpression.Empty(); for (INT i = 0; i < m_nLength; i ) { switch (m_nRecord[i]) { case ' ': m_editExpression = "+"; m_strExpression = ' '; break; case '-': m_editExpression = "-"; m_strExpression = '-'; break; case '*': m_editExpression = "×"; m_strExpression = '*'; break; case '/': m_editExpression = "÷"; m_strExpression = '/'; break; case '(': m_editExpression = '('; m_strExpression = '('; break; case ')': m_editExpression = ')'; m_strExpression = ')'; break; default: m_editExpression = g_szCardValue[m_nCard[m_nRecord[i]] % 13]; m_strExpression = g_szCardValue[m_nCard[m_nRecord[i]] % 13]; break; } } UpdateData(FALSE); } void CPoint24Dlg::OnLButtonDown(UINT nFlags, CPoint point) { if (m_nLength > 31) return; for (INT i = 0 ; i < 4; i ) { if (::Inside(&g_rectCard[i], &point)) { if (true == m_boUsed[i]) { ::AfxMessageBox("这张牌已经用过了"); break; } m_nRecord[m_nLength ] = i; this->FlushExpression(); m_boUsed[i] = true; break; } } CDialog::OnLButtonDown(nFlags, point); } void CPoint24Dlg::OnButtonBackspace() { if (m_nLength <= 0) return; m_nLength--; if ((m_nRecord[m_nLength] >= 0) && (m_nRecord[m_nLength] < 4)) m_boUsed[m_nRecord[m_nLength]] = false; this->FlushExpression(); } void CPoint24Dlg::OnButtonPlus() { if (m_nLength > 31) return; m_nRecord[m_nLength ] = ' '; this->FlushExpression(); } void CPoint24Dlg::OnButtonMinus() { if (m_nLength > 31) return; m_nRecord[m_nLength ] = '-'; this->FlushExpression(); } void CPoint24Dlg::OnButtonMultis() { if (m_nLength > 31) return; m_nRecord[m_nLength ] = '*'; this->FlushExpression(); } void CPoint24Dlg::OnButtonDivis() { if (m_nLength > 31) return; m_nRecord[m_nLength ] = '/'; this->FlushExpression(); } void CPoint24Dlg::OnButtonLeftParen() { if (m_nLength > 31) return; m_nRecord[m_nLength ] = '('; this->FlushExpression(); } void CPoint24Dlg::OnButtonRightParen() { if (m_nLength > 31) return; m_nRecord[m_nLength ] = ')'; this->FlushExpression(); } void CPoint24Dlg::PlaySound(BOOL bResult) { if (bResult) ::sndPlaySound("Win.wav", SND_ASYNC); else ::sndPlaySound("Lose.wav", SND_ASYNC); } void CPoint24Dlg::OnButtonOk() { for (INT i = 0; i < 4; i ) { if (false == m_boUsed[i]) { CString s; s.Format("第 %d 张牌未使用", i 1); ::AfxMessageBox(s); return; } } FLOAT r; CExpression expression; if (expression.GetValue(r, m_strExpression) == 0) { if (r == 24.0) { m_editExpression = " = 24 正确!!!"; this->PlaySound(TRUE); } else { CString s; s.Format(" = %d 错误。", (int)r); m_editExpression = s; this->PlaySound(); } } else m_editExpression = " 表达式有错误"; UpdateData(FALSE); this->Reset(); } void CPoint24Dlg::OnButtonAnswer() { register j, k; INT h, i; for (h = 0; h < 4; h ) { for (i = 0; i < 4; i ) { if (i == h) continue; for (j = 0; j < 4; j ) { if ((j == h) || (j == i)) continue; for (k = 0; k < 4; k ) { if ((k == h) || (k == i) || (k == j)) continue; if (this->Test(m_nCard[h] % 13, m_nCard[i] % 13, m_nCard[j] % 13, m_nCard[k] % 13) == true) { m_editExpression.Empty(); for (i = 0; i < m_strExpression.GetLength(); i ) { switch (m_strExpression[i]) { case ' ': m_editExpression = "+"; continue; case '-': m_editExpression = "-"; continue; case '*': m_editExpression = "×"; continue; case '/': m_editExpression = "÷"; continue; case '(': m_editExpression = '('; continue; case ')': m_editExpression = ')'; continue; default: m_editExpression = m_strExpression[i]; continue; } } UpdateData(FALSE); return; } } } } } m_editExpression.Format("%s、%s、%s、%s,未找到正确答案!!!", g_szCardValue[m_nCard[0] % 13], g_szCardValue[m_nCard[1] % 13], g_szCardValue[m_nCard[2] % 13], g_szCardValue[m_nCard[3] % 13]); UpdateData(FALSE); } bool CPoint24Dlg::Test(INT a, INT b, INT c, INT d) { static const CHAR* exp[] = { "%s%c%s%c%s%c%s", "(%s%c%s)%c%s%c%s", "%s%c(%s%c%s)%c%s", "%s%c%s%c(%s%c%s)", "(%s%c%s%c%s)%c%s", "%s%c(%s%c%s%c%s)", "(%s%c%s)%c(%s%c%s)", "((%s%c%s)%c%s)%c%s", "(%s%c(%s%c%s))%c%s", "%s%c((%s%c%s)%c%s)", "%s%c(%s%c(%s%c%s))", "\0" }; static const CHAR op[] = { ' ', '-', '*', '/' }; CExpression expression; register INT j, k; INT h, i; FLOAT r; for (h = 0; h < 4; h ) { for (i = 0; i < 4; i ) { for (j = 0; j < 4; j ) { for (k = 0; exp[k][0]; k ) { m_strExpression.Format(exp[k], g_szCardValue[a], op[h], g_szCardValue[b], op[i], g_szCardValue[c], op[j], g_szCardValue[d]); if ((expression.GetValue(r, m_strExpression) == 0) && (r == 24.0)) return(true); } } } } return(false); }