MFC程序五子棋实验报告

  • 格式:doc
  • 大小:191.00 KB
  • 文档页数:8

MFC程序设计实验报告五子棋实验小组人员:XxxXxxXxx2012-12-2MFC程序五子棋实验报告一.实验内容:通过学习MFC应用程序开发,应用MFC控件等方面知识,编译一个简单的五子棋人人对战游戏。

二.实验过程:(1)实验分工该实验是由小组人员共同合作完成,算法设计有彭振负责,编码以及函数实现由赵阳阳负责,调试运行和结果测试分别有杨光和庞腾立负责,实验报告的书写由沈军强负责。

(2)算法设计原理五子棋的游戏规则对我们大家来说都很很清楚的。

只要某一方的棋子在一条直线上,棋子数先达到五或以上,则该方为胜者。

根据游戏规则,算法设计分以下几个方面:A.棋盘设计:棋盘的设计主要是控件知识的应用。

在棋盘的设计中所定义的控件主要有下面几种:IDC_BUTTON_START(开始按钮)IDC_BUTTON_END(结束按钮)IDC_BUTTON_CHOICE(选择按钮)IDC_RADIO1(黑棋先按钮)IDC_RADIO2(白棋先按钮)IDC_STATIC_BITMAP11到IDC_STATIC_BITMAP1012(棋盘位图120个)IDC_BUTTON11到IDC_BUTTON1012(棋盘按钮120个)IDC_TEST_DIOLOG(对话框控件)IDC_STATIC(分组框两个)棋盘设计是用一个对话框实现,再加上控件的使用,就形成一个简单的棋盘。

B.棋子设计棋子的设计是小组人员自己用作图工具做出来的,黑白棋的实际如下图所示,其中最后一个图片是加载棋盘的位图,棋盘就是有多个位图合并出来的。

三个位图分别定义为:BITMAP1,BITMAP2,BITMAP3,如下图C.开始函数开始函数就是为开始按钮添加消息映射函数,开始函数需要实现的功能是,通过单击按钮,能够把所有构成棋盘的位图加载一遍,即相当于初始化棋盘,并且,如果棋盘上有棋子的位图的话,把棋子的位图清除,即相当于“清屏”其函数定义为:DeleteObject();开始函数的定义为:OnButtonStart() 。

D.结束函数结束函数是为结束按钮添加的消息映射函数,其所要实现的功能是,单击结束按钮,弹出一个消息窗口,弹出消息,提示下一步要做什么。

这里提示返回开始按钮,结束函数定义为:OnButtonEnd()。

E.下棋子函数下棋子函数实现的时候,要考虑到两点,一点是单击开始按钮后,是否进行了选择,二是选择黑棋先还是白棋先。

当点击棋盘上按钮时,如果没有进行选择,就弹出消息对话框,输出“请选择开局棋色”,如果进行了选择,就执行所对应的函数,白棋先的对应函数是LoadBitmap(IDB_BITMAP2);黑棋先的对应函数是:LoadBitmap(IDB_BITMAP3);下棋子函数定义为OnButton11()~OnButton1012();F.选择先下棋色函数该函数所要实现的功能是点击选择按钮,来选择开局先下棋子的棋色,其中,单击选择后,默认为白棋先下,如果想要改变的话,可以单击选择上面的复选框按钮,进行改变,白棋先下所对应的消息映射函数是:CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO2);黑棋先下所对应的消息映射函数是:CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1);选择函数的定义为:OnButtonChoice();G.判断输赢函数五子棋胜利的条件是一方的五个棋子连成一条直线,包括纵,横,左斜,右斜四种,可以用二维数组来保存每个位置棋子的值,分别用0,1,2来表示无棋,黑棋,白棋,每当下一个棋子后,用值保存其颜色,当白棋或者黑棋有一者符合上述四种情况之一时,就可以判断出哪方胜利.判断输赢函数定义为:IsOver(int x,int y,int z)(3)编码以及函数实现void CTestDlg::OnButton11(){if(ToStart==1&&Q[0][0]==0){//Tostart为1时,棋局开始x=0;y=0;//表示棋子所在坐标if(Qi==0){MessageBox("请选择开局棋色");z=0;}//Qi表示棋子是黑色还是白色,若为0,则棋盘;1表示黑色棋子,2表示白色棋子else if(Qi==1){//Qi为1,表示此棋子上一个棋子为黑色,此次单击放白棋m_cBmp[0][0].DeleteObject();//m_cBmp[0][0].LoadBitmap(IDB_BITMAP2);m_ctrBmp11.SetBitmap(HBITMAP(m_cBmp[0][0]));Qi++;//表示下一棋子需要放黑棋子z=1;//棋子颜色}else if(Qi==2){m_cBmp[0][0].DeleteObject();m_cBmp[0][0].LoadBitmap(IDB_BITMAP3);//m_ctrBmp11.SetBitmap(HBITMAP(m_cBmp[0][0]));Qi--;z=2;}Q[0][0]=z;//IsOver(x,y,z);}//判断谁赢SetBmp();//再次加载所有位图}void CTestDlg::IsOver(int x,int y,int z)//胜负判断函数{ // SetBmp();bool flag1=false,flag2=false;int n,m,count=0;n=m=x;while(n>=0){//判断纵轴是否五子相连n--;if(Q[n][y]!=z)break;else count++;}while(m<=10){ m++;if(Q[m][y]!=z) break;else count++;}if(z==1&&count>=4)flag1=true;if(z==2&&count>=4)flag2=true;count=0;n=m=y; //判断横轴是否五子相连while(n--&&n>-1){if(Q[x][n]!=z)break;else count++;}while(m++&&m<=11){if(Q[x][m]!=z) break;else count++;}if(z==1&&count>=4)flag1=true;if(z==2&&count>=4)flag2=true;int n1,m1;n1=n=x;m1=m=y;//判断左斜是否五子相连count=0;while(n1--&&n1>=0&&m1--&&m1>=0)if(Q[n1][m1]!=z)break;else count++;while(n++&&n<=11&&m++&&m<=11)if(Q[n][m]!=z) break;else count++;if(z==1&&count>=4)flag1=true;if(z==2&&count>=4)flag2=true;n1=n=x;m1=m=y;count=0; //右斜是否五子相连while(n1++&&n1<=11&&m1--&&m1>=0)if(Q[n1][m1]!=z)break;else count++;while(n--&&n>=0&&m++&&m<=11)if(Q[n][m]!=z) break;else count++;if(z==1&&count>=4)flag1=true;if(z==2&&count>=4)flag2=true;if(flag1==true) MessageBox("黑棋获胜");if(flag2==true) MessageBox("白棋获胜");}void CTestDlg::OnButtonStart() //选择开始函数{// TODO: Add your control notification handler code hereif(ToStart==0){for(i=0;i<10;i++)for(j=0;j<12;j++){ m_cBmp[i][j].LoadBitmap(IDB_BITMAP1);Q[i][j]=0;}// SetBmp();ToStart=1;Qi=0;// CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1);m_flag_Color=true;}}void CTestDlg::OnButtonEnd() //结束函数{// TODO: Add your control notification handler code herefor(i=0;i<10;i++)for(j=0;j<12;j++)m_cBmp[i][j].DeleteObject();OnButtonStart();MessageBox("点击“开始”,清屏并重新开始游戏");ToStart=0;Qi=0;m_flag_Color=true;}//结束函数void CTestDlg::OnButtonChoice() //改变选择的开局棋色{// TODO: Add your control notification handler code hereif(m_flag_Color==true){ CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_ RADIO2);m_flag_Color=false;Qi=2;UpdateData(false);}else { CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1);m_flag_Color=true;Qi=1;UpdateData(false);}}(4)调试运行以及实验结果分析下面是程序运行结果的主窗口,如图,包括棋盘,选择开始按钮,结束按钮,以及选择开局棋色。

点击开始按钮,所有位图加载一遍,准备开始棋局。

下图是点击开始按钮之后,棋盘发生的变化,由于还没有选择开局颜色,会弹出手选择开局棋色的的窗口,因此,在点击开始按钮之后,一定要选择开局棋色。