在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++游戏开发 → c++ 二十四点小游戏源码

c++ 二十四点小游戏源码

C/C++游戏开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.16M
  • 下载次数:19
  • 浏览次数:311
  • 发布时间:2019-01-03
  • 实例类别:C/C++游戏开发
  • 发 布 人:微若凡尘
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 游戏 小游戏 24点

实例介绍

【实例简介】益智类小游戏二十四点

【实例截图】


from clipboard

【核心代码】

#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(&lt);
	t = ::gmtime(&lt);
	::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);
}

标签: 游戏 小游戏 24点

实例下载地址

c++ 二十四点小游戏源码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警