📄 subject_21601.htm
字号:
<p>
序号:21601 发表者:&lt;&lt;我思故我在 发表日期:2002-11-19 08:59:14
<br>主题:纸牌游戏
<br>内容:我最想自己用VC做一个斗地主的纸牌游戏,有问题如下:<BR>1,写一人纸牌类需不需要从MFC类中继承,<BR>2,采用一种什么数据结构,<BR>3,怎么实现人工智能,<BR>请教各位大侠;如有源码更好,
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:郁闷的人 回复日期:2002-11-19 10:49:43
<br>内容:我也想做这方面的东西,网络型的,如果有好消息,告我一下,QQ:662097<BR>也请高手指点
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:目不识丁 回复日期:2002-11-19 18:46:51
<br>内容:与界面无关的类最好不要用MFC,便于移植
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:徐景周 回复日期:2002-11-20 15:56:47
<br>内容:扑克控件制作实例 <BR>前言本文以扑克控件的制作过程为实例,介绍了MFC ActiveX控件的详细制作过程,希望对学习控件编写的朋友有所帮助。下载扑克控件源代码 大小:92K 一、扑克控件的制作1、新建一个“MFC ActiveX ControlWizard”工程。为工程名起名为Cards,然后用向导的默认值一路OK生成工程。 2、为工程中添加五十四张扑克牌位图以及扑克背景位图资源。注意位图中有一张IDB_CARDS位图为控件显示时的图标,可以自行修改成自己喜欢的图样。3、为控件填加属性值,打开View—>ClassWizard。点击Automation标签。从类名下拉框中选择CCardsCtrl,点击“Add Property”按钮弹出属性添加对话框。在External name中输入value,Type选择为short类型。同时在Implementation一项中选择Get/Set methods,还有两项不管它,就用它自己设置的函数就行了。现在我们已经为控件添加好了一个属性,它是用来处理扑克牌的点数的。4、按照第三步的方法,我们再依次设置几个属性,分别是backbmp,类型为short,用来处理背景图案是什么;background,类型为BOOL,用来处理显示牌正面还是反面。5、属性添加好了,下面为这些属性设置初始值:打开CardsCtl.cpp文件,在构造函数CCardsCtrl::CCardsCtrl()中加入代码:value=1;backbmp=1;6、为了使控件能够在程序中正常显示出来,我们还需要对CCardsCtrl::OnDraw进行修改。修改后的内容如下: void CCardsCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid){ CBitmap *pOldBitmap; CBitmap bitmap; CRect rect; GetClientRect(rect); CDC ppdc; CClientDC dc(this); ppdc.CreateCompatibleDC(&dc); if(background)//背景图案 { if(backbmp==1)bitmap.LoadBitmap(255); if(backbmp==2)bitmap.LoadBitmap(256); } else//前景图案 bitmap.LoadBitmap(IDB_BITMAP1+value-1); pOldBitmap=ppdc.SelectObject(&bitmap); dc.BitBlt(0,0,rect.Width(),rect.Height(),&ppdc,0,0,SRCCOPY); ppdc.SelectObject(pOldBitmap);}在上面的代码中,要注意的是bitmap.LoadBitmap(IDB_BITMAP1+value-1);语句,一定要保证你在资源中插入的位图资源连续。可以打开Resource.h文件看一看,你的位图资源是否是连续的。7、接下来要修改属性函数了。修改前在CardsCtl.h中加入成员变量(有些在后面能够用得上): protected: short value,backbmp; BOOL background; BOOL IsMove,m_IsMove; BOOL IsGoHome; CPoint OldPoint; CRect rect; long xx,yy;修改后的函数如下: short CCardsCtrl::GetValue() { return value;}void CCardsCtrl::SetValue(short nNewValue) { value=nNewValue; SetModifiedFlag(); InvalidateControl();//立即刷新}BOOL CCardsCtrl::GetBackground() { return background;}void CCardsCtrl::SetBackground(BOOL bNewValue) { background=bNewValue; SetModifiedFlag(); InvalidateControl();}short CCardsCtrl::GetBackbmp() { return backbmp;}void CCardsCtrl::SetBackbmp(short nNewValue) { backbmp=nNewValue; SetModifiedFlag(); InvalidateControl();}可以看出,这些函数的修改都是大同小异,GetXXXXX()是用来得到属性值,SetXXXXX()用来设置属性值。InvalidateControl()函数用来刷新控件,使修改属性后的控件能立刻反映在屏幕上。 8、为了能使控件能够被随意拖动,我们还需要做下面的准备工作,首先按照第三步的方法添加两个属性:IsMove,类型为BOOL,用来处理控件是否能被拖动;IsGoHome,类型为BOOL,用来处理控件拖动后是否回到原位置。之后为这两个属性设置初始值,也是在构造函数CCardsCtrl::CCardsCtrl()中增加代码 IsMove=false;m_IsMove=false;IsGoHome=true;9、使控件能被拖动,需要处理鼠标左键按下、鼠标拖动以及鼠标左键抬起三个消息。在ClassWizard的“Message Maps”标签中,为WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP增加消息处理函数,然后修改这三个函数如下: void CCardsCtrl::OnLButtonDown(UINT nFlags, CPoint point) { if(IsMove)//是否是允许拖动鼠标 { m_IsMove=true; SetCapture();//捕获鼠标 xx=point.x;//得到鼠标(相对于控件左上角)的坐标 yy=point.y; GetClientRect(&rect);//保存拖动前的扑克位置 ::ClientToScreen(m_hWnd,&rect.TopLeft()); OldPoint=rect.TopLeft(); MoveWindow(0,0,0,0);//得到相对量 GetClientRect(&rect); ::ClientToScreen(m_hWnd,&rect.TopLeft()); } COleControl::OnLButtonDown(nFlags, point);}void CCardsCtrl::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CPoint MyPoint=point; if(m_IsMove) { ClientToScreen(&MyPoint); MoveWindow(MyPoint.x-xx-rect.left,MyPoint.y-yy-rect.top,71,96); } COleControl::OnMouseMove(nFlags, point);}void CCardsCtrl::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if(m_IsMove) { ReleaseCapture(); m_IsMove=false; if(IsGoHome) MoveWindow(OldPoint.x-rect.left,OldPoint.y-rect.top,71,96);//还原到扑克牌拖动前的位置 } COleControl::OnLButtonUp(nFlags, point);}10、到了这一步,此控件的主要工作已经完成了,现在我们为控件添加属性页,以使它和用户的交流更友好。首先在ResourceView中修改默认的属性页对话框为你需要的(详见程序源代码)。然后在ClassWizard的“Member Variables”中。从类中选择CCardsPropPage,点击“Add Variable…”按钮分别为你加入在属性页中的控件添加变量。这里添加变量的方法大致和为普通对话框添加变量相同,唯一有区别的是这里多了一项可选属性名(Optional property name),用于选择和变量相连的属性。具体设置详见下表: 控件名 变量名 组件 变量类型 可选属性名<BR>IDC_CHECK1 m_check1 value BOOL background<BR>IDC_CHECK2 m_check2 value BOOL IsMove<BR>IDC_CHECK4 m_check4 value BOOL IsGoHome<BR>IDC_EDIT1 m_edit1 value short value<BR>IDC_EDIT2 m_edit2 value short backbmp<BR>11、最后,为了使属性页和控件关联起来,我们再在void CCardsCtrl::DoPropExchange(CPropExchange* pPX)函数中添加代码: PX_Short(pPX,"value",value,1);PX_Short(pPX,"backbmp",backbmp,1);PX_Bool(pPX,"background",background,false);PX_Bool(pPX,"IsMove",IsMove,false);PX_Bool(pPX,"IsGoHome",IsGoHome,false);补充:控件中的右键单击处理因为和制作此控件无关,这里没有解释,若想知详情请看源代码。 二、控件测试1、新建一“MFC AppWizard(exe)”工程,取名为test,建立完毕,在Project(工程)中选择“Add Project(添加工程)”,再选“Components and Controls…”选项。 之后从弹出的对话框中双击“Registered ActiveX Controls”目录。从目录中选择刚才我们编的控件“Cards Control”,点“Insert”按钮把此控件插入到test工程中。2、打开对话框资源,把控件拖动至对话框中,用鼠标右键单击Cards控件,进行属性设置,完毕后就可以运行了。另外你也可以通过调用SetValue(short propVal)来手工设置扑克点数。好了,一切都OK了! <BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:徐景周 回复日期:2002-11-20 15:58:26
<br>内容:参看
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:目不识丁 回复日期:2002-11-20 20:10:01
<br>内容:www.vchelp.net上有个纸牌的源代码,用Card做关键字搜索一下
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:郁闷的人 回复日期:2002-11-21 09:21:40
<br>内容:徐大哥,我加上着几句总是出错,不知怎么改:<BR>PX_Short(pPX,"value",value,1);<BR>PX_Short(pPX,"backbmp",backbmp,1);<BR>PX_Bool(pPX,"background",background,false);<BR>PX_Bool(pPX,"IsMove",IsMove,false);<BR>PX_Bool(pPX,"IsGoHome",IsGoHome,false);
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:徐景周 回复日期:2002-11-21 10:21:50
<br>内容:可到:<BR>http://www.vckbase.com/document/viewdoc.asp?id=279
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:郁闷的人 回复日期:2002-11-21 13:16:56
<br>内容:就是那个程序,我按文档说明加上了那几句,但是出错。。。。。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:&lt;&lt;我思故我在 回复日期:2002-11-21 14:51:26
<br>内容:非常感谢徐大哥的指导,不胜感激,请问可不可以不用ActiveX来做呢?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:徐景周 回复日期:2002-11-21 15:07:31
<br>内容:可以把它内部的主要实现代码提出来,新建一个工程加出去,加以修改既可。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -