MFC实现五子棋详解
MFC课程设计五子棋
Windows程序设计课程考核报告班级:学号:姓名:得分:2016年6月25 日1.设计目的及要求 (3)1.1设计目的及内容 (3)1.2设计要求 (3)1.3软件、硬件环境 (4)2.课程设计步骤 (4)3. 课程设计内容 (10)3.1 概要设计 (10)3.1.1 程序总体框架描述 (11)3.1.2程序常用类声明 (11)3.2主要技术 (11)3.3系统设计结果(界面截图、操作流程) (12)4.设计总结 (13)4.1遇到的问题及如何解决 (13)4.2体会 (13)5.源代码 (14)1.设计目的及要求1.1设计目的及内容描述1.了解Windows编程的基础知识,掌握MFC应用程序的基本知识;2.基本掌握面向对象程序设计的基本思路和方法;3.掌握用VC++开发应用程序的的一般步骤和方法;4.能够利用所学的基本知识, 设计一个简单的五子棋游戏,具有以下功能:①数据结构的设计;五子棋棋盘的绘制。
②两人下棋时,两人下棋算法的设计。
③两人下棋时,判断任一方获胜的算法的设计。
1.2设计要求用VS 2010进行编码,实现应用程序的功能。
注重编码质量,代码要有适当的注释;提交设计报告一份(课程设计任务书、目录、主要的数据结构、设计的基本思路、设计的步骤及主要代码、心得体会、参考文献)。
游戏规则:首先可以在更多选项里面选择进行人人对战与人机对战,并可以在人机对战的功能框里选择难易程度。
当棋子连成有五个时游戏结束。
程序功能模块棋局的绘制、保存、和AI三大块1.3软件、硬件环境软件:Windows 10操作系统,Microsoft Visual studio 2010硬件:Inter(R) Core(TM) i5-4200H CPU @ 3.40GHz 2.课程设计步骤新建单文档程序Gobang_FiveChess接着就是定义变量了,但是,由于这个游戏要添加的变量和函数太多了,我们要建一个新类。
是否应该先添加应该类呢?最好是这样。
五子棋小程序
五子棋小程序1.项目介绍基于MFC的带界面五子棋小游戏。
2.功能介绍实现完整的双人五子棋对战,可以通过鼠标操作界面,鼠标点击界面对应位置产生棋子,基本的输赢判断以及悔棋功能。
3.系统实现概述(1)首先在界面上绘制出棋盘。
(2)当鼠标点击棋盘对应位置会在该位置产生相应的黑白棋子。
(3)每下一步棋则进行一次结果判断,判断是否有输赢产生并且提示输赢结果,此时游戏结束。
(4)一局游戏结束后通过鼠标点击重新开始按钮可以重新开始游戏。
4.关键技术a[15][15] //棋盘数组,1代表玩家1所下棋子,-1代表玩家2Chass chess //记录当前玩家以及结果{private:int now; //当前玩家int flags; //结果public:chess(){ now=0; flags=0; };int Flags(){ return flags; };int Now(){ return now; };void Next(){ now++; };void Result(int a){ flags=a; };void Init(){ now=0; flags=0; };}Class position //记录玩家1和2所下棋子的位置个个数以及判断结果{private:int sum1; //玩家1所下棋子数int sum2; //玩家2所下棋子数struct pos{int x;int y;}pos1[15*15],pos2[15*15]; //棋子坐标public:position(){ sum1=0; sum2=0;for(int i=0;i<15*15;i++) pos1[i].x=pos1[i].y=pos2[i].x=pos2[i].y=0;};void Sum1(int x,int y){ pos1[sum1].x=x; pos1[sum1].y=y;}; //记录坐标void Sum2(int x,int y){ pos2[sum2].x=x; pos2[sum2].y=y;};void add1(){ sum1++;};void add2(){ sum2++;};void Init(){ sum1=0; sum2=0;for(int i=0;i<15*15;i++) pos1[i].x=pos1[i].y=pos2[i].x=pos2[i].y=0;};int judgement(int a[][15],int now) //判断结果,八个方向判断}OnLButtonDown( ) //鼠标响应函数{..........int i,j,flag=0;if(chess.Flags()==0){for(i=0;i<15;i++){for(j=0;j<15;j++){if((point.x>=35+i*40&&point.x<=45+i*40)&&(point.y>=35+j*40&&point.y<=45+j*40)) //判断是否下棋{flag=1;break;}}if(flag==1) break;}}if(flag==1&&a[i][j]==0) //若所下位置没有棋子,则记下所下棋子{if(chess.Now()%2==0){a[i][j]=1;position.Sum1(i,j); //棋子坐标position.add1(); //所棋子数+1}else{a[i][j]=-1;position.Sum2(i,j);position.add2();}chess.Next(); //变更玩家}if(flag==1) Invalidate();..........}OnDraw( ) //画图函数{.....................................................for(int k=0;k<15;k++) //画水平线{pDC->MoveTo(40,40+k*40);pDC->LineTo(15*40,40+k*40);pDC->MoveTo(40+k*40,40);pDC->LineTo(40+k*40,15*40);}int i,j;for(i=0;i<15;i++) //画棋子{for(j=0;j<15;j++){if(a[i][j]==-1){CBitmap bmp;bmp.LoadBitmap(IDB_WHITE);CDC ddc;ddc.CreateCompatibleDC(pDC);CBitmap *pOldmap=ddc.SelectObject(&bmp);BITMAP bm;bmp.GetBitmap(&bm);pDC->BitBlt(30+i*40,30+j*40,bm.bmWidth,bm.bmHeight,&ddc,0,0,SRCCOPY );ddc.SelectObject(pOldmap);}else if(a[i][j]==1){CBitmap bmp;bmp.LoadBitmap(IDB_BLACK);CDC ddc;ddc.CreateCompatibleDC(pDC);CBitmap *pOldmap=ddc.SelectObject(&bmp);BITMAP bm;bmp.GetBitmap(&bm);pDC->BitBlt(30+i*40,30+j*40,bm.bmWidth,bm.bmHeight,&ddc,0,0,SRCCOPY );ddc.SelectObject(pOldmap);}}}if((chess.Now()-1)%2==0) //输出结果chess.Result(position.judgement(a,chess.Now()-1));else chess.Result(position.judgement(a,chess.Now()-1));}。
计算机毕业论文五子棋游戏软件的设计与实现
计算机毕业论文五子棋游戏软件的设计与实现北方工业大学继续教育学院本科毕业论文(设计)序框架,随微软Visual C++开发工具发布。
目前最新版本为10.0(截止2023年3月),并且发布了中文版。
该类库提供一组通用的可重用的类库供开发人员使用,大部分类均从CObject 直接或间接派生,只有少部分类例外。
[1]MFC应用程序的总体结构通常由开发人员从MFC类派生的几个类和一个CWinApp类对象(应用程序对象)组成。
MFC 提供了MFC AppWizard 自动生成框架。
Windows 应用程序中,MFC 的主包含文件为\。
此外MFC的部分类为MFC/ATL 通用,可以在Win32 应用程序中单独包含并使用这些类。
由于它的易用性,初学者常误认为VC++开发必须使用MFC,这种想法是错误的。
作为Application Framework,MFC的使用只能提高一些情况下的开发效率,只起到辅助作用,而不能替代整个Win32 程序设计。
1.5论文结构本论文共分5章,文章的结构安排如下:第1章绪论。
阐明了本课题研究的背景以及有关本课题的介绍、本课题系统设计思想和简单介绍开发工具。
第2章用户需求分析。
详细描述本系统的编写目的,任务概述,进行功能模块分类,表明对系统的要求,为系统设计做好准备。
第3章总体设计。
提出对系统环境的要求,描述本系统的总体设计过程以及系统算法设计。
第4章详细设计。
给出了系统程序流程图,提出了系统运行平台的设置以及描述了系统主要功能的实现。
第5章系统的实现和测试。
主要是给出系统主要功能的实现的截图。
北方工业大学继续教育学院本科毕业论文(设计)2需求分析2.1需求分析的编写目的本需求分析报告的目的是规范化本软件的编写,旨在为五子棋游戏软件的开发做前期调查,进行全面细致的用户需求分析,明确所要开发的软件应具有的功能、性能和界面,提高系统开发过程中的能见度,便于对系统开发过程中的控制与管理,同时提出了本系统的软件开发过程,作为工作成果的原始依据,同时也表明了本系统的共性,以期能够获得更大范围的应用。
mfc五子棋课程实践报告
课程实践报告作品名称:基于MFC的五子棋小游戏一、设计目的掌握利用Visual C++进行程序设计的能力,学会调试一个较长程序的基本方法。
通过设计用户图形界面,用户通过鼠标就可以操作游戏。
二、程序思路介绍:1.建立一个MFC基本对话框,添加内容如下:Bitmap的IDB_BITMAP1、IDB_BITMAP2分别表示棋盘上的黑棋和白棋,IDB_BITMAP3表棋盘背景图。
2.主要功能实现主要功能为两部分:画棋盘,棋子落在棋盘上;判断游戏结束规则。
a.画棋盘通过添加函数void CChessDlg::OnPaint(),由于游戏中可能重画棋盘,而那时棋盘上有棋子,所以函数也要有画棋子的语句。
b.鼠标按下时,棋子落在棋盘上,同时若棋子落下符合结束要求时,再次点击鼠标时会弹出提示窗口。
实现功能程序如下:c.若棋盘已被棋子下满,则提示平局,用full()函数实现;五个同色棋子连在一起,则游戏结束,用isover()函数实现。
在oldchess.cpp中编写这两个函数。
d.添加棋盘背景图片,将IDB_BITMAP3设为棋盘的背景,实现功能在OnEraseBkgnd()函数中。
d.添加按钮“开始游戏”,“结束游戏”。
实现函数如下:四、作品界面介绍:打开程序,棋盘界面显示如下:点击开始游戏,弹出提示窗口,如下图:点击“确定”,点击棋盘,即可开始下棋:当棋盘下满,而双方都没有结束下棋,则平局。
五、设计感想及问题1、存在问题棋盘利用lineto,moveto语句画出,但是棋盘边界线却只有一边可以完全下棋,调试程序与语句未能改变。
判断下棋结束要有四个五子棋排列方式,开始时循环语句返回值设置不对,导致程序始终无法正常运行,后来通过调试程序完成了下棋结束判断功能。
目前程序只是人与人单次下棋,还未能实现人机下棋,该算法后续学习后会继续改进。
2、设计体会通过本次设计作业我们学习到很多关于c语言程序的实践只是,对程序设计这一课程与相关技术有了更深的理解。
MFC五子棋(面向对象程序设计)
目录一、绪论 (1)1.1课题背景 (1)1.2需求分析 (1)2.1游戏流程 (1)2.2系统功能结构图 (2)三、详细设计 (3)3.1.1游戏界面的制作 (3)3.1.2游戏开始 (4)3.1.3游戏结束 (5)3.1.4排行榜 (6)3.2核心算法 (6)四、用户使用说明 (8)4.1游戏开始 (8)4.2游戏中 (8)4.3结束 (9)五、附录 (10)参考资料 (10)一、绪论1.1课题背景本课程设计是C++面向对象程序设计的重要的实践环节之一,是在学生学习完《C++面向对象程序设计》课程后进行的一次全面的综合练习,此次课程设计的题目是自拟的。
在和我的队友反复的讨论下,我们一致同意写以C++和MFC 为主要知识点的MFC人—人对战五子棋。
1.2需求分析(1)设计用户图形界面,用户通过鼠标就可以操作游戏。
(2)以二维数组的形式储存棋盘的下子信息,包括坐标和棋子类型。
(3)设置开始、结束和排行榜用于操作和查看下棋的信息。
(4)游戏有自动保存玩家输赢信息的功能。
(5)为了使算法简单,游戏中的棋盘、棋子等都以位图的形式操作。
二、概要设计2.1游戏流程三、详细设计3.1.1游戏界面的制作利用MFC AppWinzard生成五子棋游戏应用程序框架具体步骤如下:(1)执行VC程序,选择File|New命令,弹出New对话框.单击Projects标签,转到Projects选项卡,选择MFC AppWizard(exe)选项,然后在Project name文本框中输入Fivechess_44 。
Lacation文本框是指项目的本地路径。
(2)单击按钮,弹出MFC AppWinzard_Step1对话框。
选中单选按钮,如图所示。
(3)单击完成按钮,则建立一个单文档应用框架。
(4)将单文档的菜单栏去掉,并加入背景图片。
背景图片中包含了棋盘。
部分代码如下:3.1.2游戏开始(1)界面中的设置,以位图的形式放到背景中。
五子棋MFC源码及注释
五子棋是一种很受人们喜爱的游戏,它的规则简单,但玩法变化多端,富有趣味性, 适合人们消遣。这里我们就来设计一个五子棋游戏。
(一) (一) 人对人游戏
1. 1. 游戏实现
人对人游戏,其实只是对游戏规则的实现,我们只是利用五子棋游戏的规则来编程, 至于真正的游戏实现——计算机的“智能”算法,我们将在后面讲述。 五子棋的规则很简单: 1,判断是否能放下棋子(是否已经有了棋子) ; 2,判断是哪种颜色下棋;
由上面可以看出,当鼠标键松开时判断,如果那个位置没有棋子,则放下,并把棋 盘数组赋相应的值:1 或-1。 是否结束: 接着是用一个 over()函数判断是否结束,是则结束并重新开始;否则,接着把鼠 标变成对方棋子,表示对方下棋。 那 over()函数又是怎样的呢? 此函数是利用刚下棋的位置为中心,检查它各个方向上的连续五个棋子是否同色, 是则结束并重新开始。 然而, 我们又是怎样判断一个方向上的五个棋子的同色的?这就涉及地为什么我要 把五子棋数组赋值为 1 和-1 的问题。 因为这样有一个好处: 利用连续五个棋子的值相加, 如果它们的值的绝对值等于 5,则说明是同色。当然,这只是这样赋值的一点作用,真 正的作用将在后面介绍。添加如下: void CMy3_1View::over(CPoint point) { //获取鼠标指向数组位置,即中心位置 int x=(point.x-30)/20; int y=(point.y-30)/20; //计算开始判断的坐标 xx,yy int xx,yy; if(x<4) xx=0; else xx=x-4; if(y<4) yy=0; else yy=y-4; int i,j,a; //横向判断 for(i=xx;i<15;i++) { a=0; for(j=i;j<i+5;j++) { a=a+wzq[j][y]; //五个都是白棋 if(a==5) { AfxMessageBox("白棋胜!"); //重新开始 OnStart(); return; } //五个都是黑棋 if(a==-5) { AfxMessageBox("黑棋胜!"); OnStart(); return; } }
#C语言游戏2五子棋(人机对战)
}
dc.SelectObject(pOldbmp>。//恢复画刷
}
pDC->BitBlt(x,y,bm.bmWidth,bm.bmHeight,&dc,0,0,SRCCOPY>。
等等一些教育学习办公写作商业经营实用性极强的文档您若觉得对您日常学习商业经营社交沟通办公写作有所帮助的话就关注我吧
五子棋人机对战,AI很低,做参考用,仅仅为大家提供一下思路。
如果有什么好的建议或发现什么问题,希望能告诉我,
开发环境:Visual C++ 6.0
游戏界面:
C语言游戏2-五子棋<人机对战)
tempi=i。tempj=j。
while(tempi>0 && tempi<15 &&
tempj>0 && tempj<15 &&
chess[tempi][tempj]==chess[i][j]>
{
tempi-=m。tempj-=n。
count++。
}
if(chess[tempi][tempj]==0>alive2=1。
函数弄好后就调用这个函数画图了。
先在OnInitDialog函数中加入以下代码,调整对话框大小,并隐藏按钮:
// TODO: Add extra initialization here
MoveWindow(0,0,520,540>。//窗口定位
CenterWindow(>。//居中窗口
MFC程序五子棋实验报告
MFC程序五子棋实验报告1.实验目的:通过学习MFC应用程序开发,编译一个简单的五子棋人人对战游戏。
2.实验进程:(1)实验分工该实验是由小组人员一路合作完成,算法设计有**负责,编码和函数实现由***负责,调试运行和结果测试别离有**和**负责,实验报告的书写由**负责。
(2)算法设计五子棋的游戏规那么对咱们大伙儿来讲都很很清楚的。
只要某一方的棋子在一条直线上,棋子数先达到五或以上,那么该方为胜者。
依照游戏规那么,算法设计分以下几个方面:A.棋盘设计:棋盘设计能够用一个对话框实现,B.棋子设计C.开始函数D.终止函数E.下棋子函数F.选择哪一种棋子先下函数G.判定输赢函数五子棋成功的条件是一方的五个棋子连成一条直线,包括纵,横,左斜,右斜四种,能够用二维数组来保留每一个位置棋子的值,别离用0,1,2来表示无棋,黑棋,白棋,每当下一个棋子后,用值保留其颜色,当白棋或黑棋有一者符合上述四种情形之一时,就能够够够判定出哪方成功。
H.从头开始棋局函数(3)编码和函数实现void CTestDlg::OnButton11(){if(ToStart==1&&Q[0][0]==0){eleteObject();oadBitmap(IDB_BITMAP2);(HBITMAP(m_cBmp[0][0]));Qi++;eleteObject();m_cBmp[0][0].LoadBitmap(IDB_BITMAP3);oadBitmap(IDB_BITMAP1);Q[i][j]=0;}eleteObject();OnButtonStart();MessageBox("点击“开始”,清屏并从头开始游戏");ToStart=0;Qi=0;m_flag_Color=true;}验结果分析:4.实验总结:。
如何用MFC编五子棋游戏
怎样做一个五子棋游戏?五子棋游戏算法比较简单,实现起来比较容易,适合初学者练习。
我这个五子棋游戏是自己花了2天的时间完成的,当时刚学mfc,想练一下手就做了这个游戏。
棋盘和棋子可以用GDI来实现,棋盘用GDI划线,基本上就是LineTo(x,y),MoveTo(x,y),一个棋盘就出来了。
具体代码如下在OnPaint()函数的else内加入如下代码CPaintDC dc(this);dc.SelectStockObject(BLACK_PEN);int i,j;for(i=60;i!=420;i=i+40){dc.MoveTo(i,60);dc.LineTo(i,380);}for(j=60;j!=420;j=j+40){dc.MoveTo(60,j);dc.LineTo(380,j);}一个9×9的棋盘就画好了。
至于如何画棋子,我思考了很长时间,贴图太麻烦,就用GDI来画圆,然后填充上不同的颜色,黑子、白子也就实现了。
这里的棋子不应该是一个独立的量,它有自己的区域,应该能判断鼠标是不是点击到了这个区域,当点击这个区域的时候是否应该显示,应该显示什么颜色的旗子……把这么多东西集合在一起,应该定义一个类,于是CQuyu这个类就出现了。
CQuyu有四个变量如下:int flag;CRect rect;int y;int x;x,y表示这个区域的中心,rect为以x,y为中心的边长为30的矩形,flag 用来表示该对象的状态(0:空白 1:黑子 2:白字)。
然后又定义了5个方法bool isWhite();//如果为白子,返回trueCRect getRect();//获得该对象对应的CRectbool isBlack();//如果为黑子,返回truebool isEmpty();//如果为空,返回truebool isOn(CPoint point);//如果该点出在该区域返回true,用来判断鼠标单击对应的区域在view类中定义了一个vector容器,(需要包含#include <vector>)vector<CQuyu> qy;在OnInitDialog()内对qy进行初始化int i,j;CQuyu q;for(i=60;i!=420;i=i+40){for(j=60;j!=420;j=j+40){q.x=i;q.y=j;qy.push_back(q);}}当鼠标单击的时候,判断单击的是哪一个区域,如果该区域为空则修改区域状态void CWuziqidlgDlg::OnLButtonDown(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call default int i;for(i=0;i!=qy.size();i++)if(qy[i].isOn(point)&&!over&&qy[i].isEmpty()){qy[i].flag=1;ison=1;break;}Invalidate();//引发重绘}在OnLButtonUp()中实现ai,电脑走棋void CWuziqidlgDlg::OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default//flag 1:black 2:white//color 1:white 2:blackint i,temp1,temp2,max1,max2;max1=0;max2=0;temp1=0;temp2=0;for(i=0;i!=qy.size();i++){if(qy[i].isEmpty()){qy[i].flag=2;if(getScore(1)>max1){temp1=getScore(1);max1=temp1;temp1=i;}qy[i].flag=1;if(getScore(2)>max2){temp2=getScore(2);max2=temp2;temp2=i;}qy[i].flag=0;}}if(ison==1&&!over){if(max1>=max2)qy[temp1].flag=2;elseqy[temp2].flag=2;}ison=0;if(!isWin())Invalidate();CDialog::OnLButtonUp(nFlags, point);}OnPaint()函数中实现绘制,每次先把棋盘画好,然后遍历各区域,如果不为空就绘制相应的棋子。
MFC-C++五子棋课程设计报告
课程设计成绩考勤成绩( %) 指导老师评语报告及程序成绩( %)总评成绩指导老师签名:《windows程序设计》课程设计报告学院(系):计算机科学与技术系班级:计专2班学生姓名:梁剑学号**********指导教师:时间:从2010 年1 月18 日到2010 年1 月22 日摘要1.能够利用所学的基本知识, 设计一个简单的五子棋序,具有以下功能:①数据结构的设计;五子棋棋盘的绘制。
②人机下棋时,计算机下棋算法的设计。
③人机下棋时,判断任一方获胜的算法的设计。
关键字:MFC编程,Windows程序目录项目一: 五子棋1 设计目的与要求 (1)1.1 设计目的 (1)1.2 设计内容 (1)1.3 设计要求 (1)2 设计环境或器材、原理与说明 (3)2.1 设计环境与器材 (3)2.2 原理与说明 (3)3 设计过程及程序代码 (6)3.1 服务器端设计 (6)3.1.1 界面设计 (6)3.1.2 人下棋设计 (8)3.1.3 电脑下棋设计 (8)3.1.4 搜索最优下棋点 (9)4 设计结果与分析 (21)4.1 设计结果 (21)4.2 设计分析 (22)5 设计体会与建议 (23)参考文献 (24)五子棋1 设计目的与要求1.1 设计目的1、进一步掌握利用Visual C++进行程序设计的能力;2、进一步理解和运用面向对象程序设计的思想和方法;3、初步掌握开发一个小型实用系统的基本方法;4、学会调试一个较长程序的基本方法;5、理解Windows程序的运行过程;1.2设计内容能够利用所学的基本知识, 设计一个简单的学生信息管理应用程序,具有以下功能:①数据结构的设计;五子棋棋盘的绘制。
②人机下棋时,计算机下棋算法的设计。
③人机下棋时,判断任一方获胜的算法的设计。
1.3 设计要求整个程序使用winsocket 函数做网络数据收发,基于UDP协议。
可以直接使用Windows API编程(SDK编程),也可以使用MFC编程。
五子棋游戏详细设计
五子棋游戏详细设计1、窗体设计利用MFC AppWin zard生成五子棋游戏应用程序框架具体步骤如下:(1)执行VC程序,选择File|N ew命令,弹出New对话框.单击Projects标签,转到Projects选项卡,选择MFC AppWiz ard(exe)选项,然后在Projectname文本框中输入F ivech ess_44 。
Lacati on文本框是指项目的本地路径。
(2)单击按钮,弹出MFC AppWin zard_Step1对话框。
选中单选按钮,如图所示。
(3)单击完成按钮,则建立一个单文档应用框架。
2、游戏项目开发2.1棋盘设计1.在已创建的工程Fivechess_44中添加画棋盘的函数。
首先在“Fivech ess_44.h”头文件中定义一个用于显示棋盘的自定义公有函数:void Checke rboar d(CDC*pDC);然后在“Fivech ess_44View.cpp”源文件中实现该函数。
代码如下:void CFivec hess_44Vie w::Checke rboar d(CDC*pDC){for(int i=0;i<20;i++) //连续画20条竖线{pDC->MoveTo(i*50,0); //画笔移动到(i*50,0)点pDC->LineTo(i*50,1000); // 画笔从(i*50,0)点到(i*50,1000)点}for(i=0;i<20;i++) //连续画20条横线{pDC->MoveTo(0,i*50);pDC->LineTo(1000,i*50);}}2.在应用程序框架的OnD raw()函数中调用该画棋盘函数,将pDC对象作为实参传递给Checkerb oard()函数,代码如下:void CFivec hess_44Vie w::OnDraw(CDC* pDC){CFivec hess_44Doc* pDoc = GetDoc ument();ASSERT_VALI D(pDoc);// TODO: add draw code for native data hereChecke rboar d(pDC); //调用自定义的画键盘函数}3.编译运行得到如下效果:一个空棋盘2.2放置棋子功能的开发按照规划,棋子使用鼠标的左键和右键(分别用这两键来表示下棋的双方)来进行单机下棋,即是当用户单击左键时,下黑色棋子,,用户单击右键时,下白色棋子。
C++ mfc五子棋
GetObject:
函数功能:该函数得到指定图形对象的信息,根据图形对象, 函数把填满的或结构,或表项(用于逻辑调色板)数目放入一个指定的缓冲区。 函数原型:int GetObject(HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject);
境(DC)。通过GetDc()获取的HDC直接与相关设备沟通,而本函数创建的DC, 则是与内存中的一个表面相关联。 函数原型:HDC CreateCompatibleDC(HDC hdc);
AddString:调用此成员函数添加一个字符串到列表框中。 EndDialog:函数功能:该函数清除一个模态对话框,并使系统中止对对话框的任 何处理。 函数原型:BOOL EndDialog(HWND hDlg,int nResult);
PlaySound简介
BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound); 参数pszSound是指定了要播放声音的字符串,该参数可以是WAVE文件的名字, 或是WAV资源的名字,或是内存中声音数据的指针,或是在系统注册表WIN.INI
{PlaySound((LPCTSTR)IDR_WAVE1, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC);}
常用函数说明
LoadBitmap:
函数功能:该函数从模块的可执行文件中加载指定的位图资源。 该函数已经被函数LoadImage替代。 函数原型:HBITMAP LoadBitmap(HINSTANCE hInstance, LPCTSTR lpBitmapName);
c++MFC五子棋_说明书
(面向对象程序设计)设计说明书MFC五子棋起止日期: 2012 年 12 月 30 日至 2013 年 01 月 05 日学生姓名*******班级********学号**********成绩指导教师 (签字)计算机与通信学院(部)年月日目录一、绪论 (2)1.1课题背景 (2)1.2需求分析 (2)2.1游戏流程 (2)2.2系统功能结构图 (3)三、详细设计 (4)3.1.1游戏界面的制作 (4)3.1.2游戏开始 (5)3.1.3游戏结束 (6)3.1.4排行榜 (7)3.2核心算法 (7)四、用户使用说明 (9)4.1游戏开始 (9)4.2游戏中 (9)4.3结束 (10)五、附录 (11)参考资料 (11)一、绪论1.1课题背景本课程设计是C++面向对象程序设计的重要的实践环节之一,是在学生学习完《C++面向对象程序设计》课程后进行的一次全面的综合练习,此次课程设计的题目是自拟的。
在和我的队友反复的讨论下,我们一致同意写以C++和MFC 为主要知识点的MFC人—人对战五子棋。
1.2需求分析(1)设计用户图形界面,用户通过鼠标就可以操作游戏。
(2)以二维数组的形式储存棋盘的下子信息,包括坐标和棋子类型。
(3)设置开始、结束和排行榜用于操作和查看下棋的信息。
(4)游戏有自动保存玩家输赢信息的功能。
(5)为了使算法简单,游戏中的棋盘、棋子等都以位图的形式操作。
二、概要设计2.1游戏流程三、详细设计3.1.1游戏界面的制作利用MFC AppWinzard生成五子棋游戏应用程序框架具体步骤如下:(1)执行VC程序,选择File|New命令,弹出New对话框.单击Projects标签,转到Projects选项卡,选择MFC AppWizard(exe)选项,然后在Project name文本框中输入Fivechess_44 。
Lacation文本框是指项目的本地路径。
(2)单击按钮,弹出MFC AppWinzard_Step1对话框。
使用C++MFC编写一个简单的五子棋游戏程序
使⽤C++MFC编写⼀个简单的五⼦棋游戏程序MFC简介: MFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的⼀个c++类库,主要封装了⼤部分的windows API函数。
MFC除了是⼀个类库以外,还是⼀个框架,在vc++⾥新建⼀个MFC的⼯程,开发环境会⾃动帮你产⽣许多⽂件,同时它使⽤了mfcxx.dll。
xx是版本,它封装了mfc内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专⼼的考虑你程序的逻辑,⽽不是这些每次编程都要重复的东西,但是由于是通⽤框架,没有最好的针对性,当然也就丧失了⼀些灵活性和效率。
但是MFC的封装很浅,所以效率上损失不⼤。
开始正⽂简述在学习了C++ MFC编程后,就萌⽣了编写⼀个五⼦棋程序的想法。
诚然,⽤C#来编写的话可能界⾯会好很多,但是我的主要⽬标不在界⾯⽽是算法,所以利⽤了VS的MFC来编写程序。
程序特点⿏标移动过程中有选中框跟随,下棋位置实时⾃动反馈选中框位置只会在合法的下棋位置出现(即棋线的交叉处并且没有下过的位⼦),所以即使你的⿏标不在棋线交叉处,程序也会实时⾃动反馈⿏标在当前位置将要下棋的位置,这避免了下棋过程中的错下。
提供悔棋功能为了进⼀步避免错下,提⾼程序的可⽤性,本程序还设计了⼀个悔棋按钮(程序设置最⼤悔棋次数为1次)提供多种棋盘⼤⼩标准的五⼦棋棋盘为15x15,为了提供更多样的棋盘⼤⼩,本程序还设有17x17和19x19两种⾮常规棋盘。
提供复盘功能在棋局结束后,程序会给出棋局的复盘结果,可以从中分析出棋局胜败的原因。
解决了MFC绘图窗⼝移出屏幕图像消失的问题你可以在完整代码中看到解决刷新问题的解决⽅案代码较为基础,只需要掌握基础的MFC编程知识就可以⾃⼰实现因为本⼈也是编程⼩⽩,算法设计⽐较基础和简单,只掌握基础的C++编程知识就可以看懂代码程序实现step1:在VS中创建⼀个MFC对话框程序⼯程。
MFC程序五子棋实验报告
MFC程序五子棋实验报告
一、实验内容
本次实验主要以Visual Studio2024为开发工具,以MFC应用程序为开发平台,以五子棋为实现的对象,实现一个基于MFC编写的五子棋游戏程序。
二、实验要求
本次实验的目标是基于MFC应用程序平台,使用Visual Studio2024开发工具,实现一个能够完成基本的五子棋游戏功能的程序。
实现的功能包括:
1、游戏初始界面:实现游戏初始界面,包括游戏开始、设置(玩家姓名)、取消、选择棋子颜色按钮等;
2、逻辑控制:实现玩家双方的棋子及其状态控制,判断双方棋子的落子位置,根据五子棋的规则判断双方输赢,判断本局棋盘是否成和棋;
3、棋盘显示:棋盘支持多种背景皮肤选择,实现了棋子的真实落子位置;
4、功能支持:支持悔棋、撤销悔棋、重开等常用功能,还支持联机对战功能;
5、记录显示:显示游戏状态,如落子数,玩家双方的输赢情况。
三、实验过程
1. 使用Visual Studio2024,以MFC应用程序平台为基础,创建五子棋游戏程序。
2.编写程序界面,实现游戏初始界面,在界面中添加游戏开始、设置(玩家姓名)、取消、选择棋子颜色等按钮。
3.实现五子棋游戏需要的基础函数。
C#WINFORM教学案例——五子棋
C#WINFORM教学案例——五子棋纪辉进【期刊名称】《科技视界》【年(卷),期】2017(000)019【总页数】2页(P138-139)【作者】纪辉进【作者单位】湖北职业技术学院信息学院,湖北孝感 432000【正文语种】中文教学中采用生活化的案例,能提升教学效果,实现后让学生有成就感,提升学习兴趣,让兴趣转化为学习动力。
很多学校的计算机软件技术专业课程中,C、C#是其专业核心课程,本文以C#程序设计语言为例,讲述五子棋的实现过程。
五子棋棋盘为15*15的方格,棋子为黑子和白子,赢棋规则为无论哪一方棋子在横向、纵向或斜向五子无间隔连成线即赢。
用PS软件绘制一张图片,作为窗体的背景棋盘,棋盘为正方形,根据显示器高度来绘制水平线,上下边缘留一些像素的空余,不然棋子落到太边缘不好看,剩余高度均分画15条水平线;用同样的方法绘制垂直方向的线,显示器宽度大于高度,垂直线可以是PS中水平线的90度翻转。
水平线垂直方向居中,垂直线水平方向居中。
用PS软件分别绘制黑子和白子,棋子的直径要比棋盘格小一点,这样才不至于落子后在棋盘上占的太满,为美观给棋子添加斜面浮雕和高光效果,这样棋子看起来更立体真实。
黑白子图片分别保存为png格式。
鼠标在窗体中单击的时候落一颗子,棋子用按钮做,按钮用黑白子的图片做背景,设置一变量,随着落子递增,用变量奇偶性决定按钮背景图的黑白背景图属性。
鼠标单击点并不是落子的真正坐标,因单击点坐标跟棋盘线有间距,棋子应落在横竖线交叉点,单击点离哪个交叉点近就落在哪个交叉点。
用鼠标单击点的横坐标减去一个合适的常量对横坐标做修正,再模棋盘格宽度得到的值为棋子落在第几根竖线上,用得到的整型数乘棋盘格宽度得到的横坐标一定在交叉点上;同样的方法可以得到棋子落在第几根横向上;配合一个15行15列的二维整型数组,初始值为0(对应横纵线交错没落子),落黑子可记为1,落白子可记为2,落子前检查二维数组对应元素,为0的才可以落子。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告要求(1)简述实验原理及方法,并请给出程序设计流程图。
用MFC来建立一个窗体,并添加音乐等模块,载入图片作为棋盘并建立坐标系。
进行游戏时,判断坐标点是否有棋子,再进行下棋。
人机对战时,电脑通过预测函数来进行落子。
程序设计流程图如下:(2)源程序清单:①所建立的wzq类:class wzq{public:wzq(CDC2*tqp,CDC2*tqzh,CDC2*tqzb,CDC2*tmask,CDC2*dead,CDC*dc);wzq();virtual ~wzq();void NewGame();//新游戏void play();//播放音乐void stop(); //暂停音乐//初始化void DrawQZ(int nx,int ny,bool style);//画棋子Void SetDc(CDC2*tqp,CDC2*tqzh,CDC2*tqzb,CDC2*tmask,CDC2*dead,CDC*dc);//设置DCvoid draw();//当需要重画时调用//绘图private:bool userAd(int nx,int ny);//黑色下子bool userBd(int nx,int ny);//白色下子public:bool downzi(int nx,int ny);//外部调用此函数下子bool bewinner2(bool style,int nx,int ny);//判断胜败//下棋bool goback();//悔棋void setback(int nx,int ny,bool style);//记录bool getbackble(){return nowd2<=0?false:true;}//是否可以悔棋//操作CPoint AiGo(bool color);//人工智能外部控制private:void fillin(bool color,bool player,bool type);void setqx(int nx ,int ny,bool style,bool player,int st,bool type);void setall();void clear(bool style);void checkgo(int x,int y,bool color,int nu,int inx,int iny);//预测函数bool bejs(int nx, int ny);bool bj2(int x1,int y1,int x2,int y2,bool style); char ntoc(char num,bool type,bool style);CPoint getmax(bool color);CPoint getbg(bool style); int getaitype();public:bool firstgo;//false:人true:机bool secondgo;//false:人true:机int nturn;wzwin twinner;int AItype;//0低预测6步1中预测10步2高预测16步int Model;//0人->机1机->人2对翌bool backable ;//是否悔棋0=N 1=Yprotected:private:CDC2*qp;//棋盘dcCDC2*qzh;//黑子dcCDC2*qzb;//白子dcCDC2*mask;//屏蔽dcCDC2*dead;//红子CDC*dc;//窗口dcunsigned char user[15][15][4];//储存棋局unsigned char pc[15][15][4];//储存棋局char map[15][15];//储存棋盘地图unsigned char nicest2[15][15];char trygo[15][15];bool dcseted;int nowd2;int aitype2;wzsave wzs[225];};#endif②开始新游戏:void wzq::NewGame()//新游戏{if (wzq::dcseted==false)return;for(int i1=0 ; i1<=14;i1++){for(int i2=0 ; i2<=14;i2++){map[i1][i2]=0;for(int i3=0 ; i3<=3;i3++){user[i1][i2][i3]=255;pc[i1][i2][i3]=255;}}}for (int ix=0;ix<225;ix++){wzq::wzs[ix].used=false;}CSize x=qp->GetSize();dc->BitBlt(0, 0,x.cx,x.cy,qp,0,0,SRCCOPY); wzq::twinner.winner=0;wzq::nturn=0;wzq::nowd2 =0;if (wzq::Model==1){userBd(7,7);}}③黑棋落子:bool wzq::userAd(int nx,int ny)//黑色下子if (wzq::dcseted==false)return false;if (map[nx][ny]==0){map[nx][ny]=1;DrawQZ(nx,ny,false);return true;}else{return false;}wzq::DrawQZ(nx,ny,true);}④白棋落子:bool wzq::userBd(int nx,int ny)//白色下子{if (wzq::dcseted==false)return false;if (map[nx][ny]==0){map[nx][ny]=2;DrawQZ(nx,ny,true);return true;}else{return false;}wzq::DrawQZ(nx,ny,false);}⑤胜败:bool wzq::bewinner2(bool style,int nx,int ny)//胜败{int tx1=0,tx2=0,ty1=0,ty2=0;int yx1=0,yx2=0,yy1=0,yy2=0;int st=(int)style+1;for (int x1=-5 ; x1<= 5 ; x1++){if (map[nx+x1][ny]==st){tx1++;if (tx1==1) yx1=x1;if (tx1>=5){twinner.winner =st;twinner.nx1= nx+yx1;twinner.nx2 =nx+yx1+5;twinner.ny1 =ny;twinner.ny2 =ny;return true;}}else{tx1=0;}if (map[nx][ny+x1]==st){ty1++;if (ty1==1) yy1=x1;if (ty1>=5){twinner.winner =st;twinner.nx1= nx;twinner.nx2 =nx;twinner.ny1 =ny+yy1;return true;}}else{ty1=0;}if (map[nx+x1][ny+x1]==st){tx2++;if (tx2==1) yx2=x1;if (tx2>=5){twinner.winner =st;twinner.nx1= nx+yx2;twinner.nx2 =nx+yx2+5;twinner.ny1 =ny+yx2;twinner.ny2 =ny+yx2+5;return true;}}else{tx2=0;}if (map[nx+x1][ny-x1]==st){ty2++;if (ty2==1) yy2=x1;if (ty2>=5){twinner.winner =st;twinner.nx1= nx+yy2;twinner.ny1 =ny-yy2;twinner.ny2 =ny-yy2-5;return true;}}else{ty2=0;}}return false;}⑥悔棋:bool wzq::goback()//悔棋{ if (wzq::getbackble==false) return false;wzq::nowd2--;if (wzq::Model==2){map[wzq::wzs[nowd2].ix][wzq::wzs[nowd2].iy]=0;wzq::nturn= wzq::wzs[nowd2].color ;wzq::wzs[nowd2].used=false;wzq::dc->BitBlt(wzq::wzs[nowd2].ix*29+7,wzq::wzs[nowd2].iy*29+7,28,28,wz q::qp,wzq::wzs[nowd2].ix*29+7,wzq::wzs[nowd2].iy*29+7,SRCCOPY);}else{map[wzq::wzs[nowd2].ix][wzq::wzs[nowd2].iy]=0;wzq::wzs[nowd2].used=false;wzq::dc->BitBlt(wzq::wzs[nowd2].ix*29+7,wzq::wzs[nowd2].iy*29+7,28,28,wz q::qp,wzq::wzs[nowd2].ix*29+7,wzq::wzs[nowd2].iy*29+7,SRCCOPY);wzq::nowd2--;map[wzq::wzs[nowd2].ix][wzq::wzs[nowd2].iy]=0;wzq::wzs[nowd2].used=false;wzq::dc->BitBlt(wzq::wzs[nowd2].ix*29+7,wzq::wzs[nowd2].iy*29+7,28,28,wz q::qp,wzq::wzs[nowd2].ix*29+7,wzq::wzs[nowd2].iy*29+7,SRCCOPY);}if (wzq::twinner.winner!=0){wzq::twinner.winner =0;wzq::draw();}return false;}void wzq::checkgo(int x,int y,bool color,int nu,int inx,int iny)//预测函数{wzq::trygo[x][y]=(char)color+1;clear(true);fillin(color,true,true);fillin(!color,true,false);CPoint temp=getbg(true);bool four1=false,four2=false,three1=false,three2=false;bool four3=false,four4=false,three3=false,three4=false;for (int i=0 ; i<=3 ; i++){if (user[temp.x][temp.y][i]>=3&&user[temp.x][temp.y][i]<=5){wzq::nicest2[inx][iny]=2;//losereturn;}else{if (user[temp.x][temp.y][i]<3)//win{wzq::nicest2[inx][iny]=1;return;}else{if (user[temp.x][temp.y][i]>=6&&user[temp.x][temp.y][i]<=14){if(four1==true)four2=true;else four1=true;}else{if(user[temp.x][temp.y][i]>=15&&user[temp.x][temp.y][i]<=23){if(four3==true)four4=true;else four3=true;}else{if(user[temp.x][temp.y][i]==24||user[temp.x][temp.y][i]==25){if(three1==true)three2=true;else three1=true;}else{if(user[temp.x][temp.y][i]==26||user[temp.x][temp.y][i]==27){if(three3==true)three4=true;else three3=true;}}}}}}}if (three1+three2+four1+four2>=2){wzq::nicest2[inx][iny]=1;//losereturn;}else{if (three3+three4+four3+four4>=2){wzq::nicest2[inx][iny]=2;//winreturn;}}if (nu>=wzq::aitype2){wzq::nicest2[inx][iny]=3;return;}int xxx=nu+1;checkgo(temp.x ,temp.y ,!color,xxx,inx,iny);}⑦背景音乐播放与停止:void wzq::play()//播放音乐{PlaySound("1.wav",NULL,SND_ASYNC); }void wzq::stop()//播放音乐{PlaySound(NULL,NULL,SND_FILENAME); }(3)实验结果及分析。