基本信息
源码名称: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);
}