第一范文网 - 专业文章范例文档资料分享平台

MFC-C++五子棋课程设计报告

来源:用户分享 时间:2025/6/22 15:58:02 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

《Windows程序设计》课程设计报告

2 设计环境或器材、原理与说明

2.1 设计环境与器材

因为选择使用MFC编程Windows环境与Microsoft Visual C++ 6.0 编译环境;

2.2 原理与说明

首先利用mfc建立单文档窗口,在窗口上画19*19的表格,把每个表格点的信息存在二维数组wzq[19][19]中。白棋为1,黑棋为-1,这样当要测是否结束时只要查看4个方向的绝对值是否等于5,就可以判定输赢了 如图:

5

《Windows程序设计》课程设计报告

3.1设计过程及程序代码

3.11界面设计:

图3-2 五子棋界面设计

打开应用程序时游戏会自动开始。 显示表格代码:

CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

// TODO: add draw code for native data here CBrush mybrush1;

mybrush1.CreateSolidBrush(RGB(192,192,192)); CRect myrect1(0,0,1200,800); pDC->FillRect(myrect1,&mybrush1); //画棋盘框线

CPen mypen; CPen*myoldPen;

mypen.CreatePen(PS_SOLID,1,RGB(0,0,0)); myoldPen=pDC->SelectObject(&mypen); for(int i=0;i<19;i++) {

pDC->MoveTo(40,40+i*20); pDC->LineTo(400,40+i*20); pDC->MoveTo(40+i*20,40); pDC->LineTo(40+i*20,400); }

//重画时显示存在的棋子 CDC Dc;

if(Dc.CreateCompatibleDC(pDC)==FALSE) AfxMessageBox(\

6

《Windows程序设计》课程设计报告

for(int n=0;n<19;n++)

for(int m=0;m<19;m++) if(wzq[n][m]==1 {

//显示白棋

Dc.SelectObject(m_bmwhite); pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY); }

else if(wzq[n][m]==-1) { //显示黑棋

Dc.SelectObject(m_bmblack); pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY); }

3.1.2 人下棋设计

涉及到OnLButtonDown(UINT nFlags, CPoint point)和OnLButtonUp(UINT nFlags, CPoint point)两个函数了。要用哪一个或用两个?用Down函数时是在鼠标按下时放下棋子,可是,要是我们按下后意识到按错了怎么办;那就改用Up函数,表示当鼠标键松开时放下棋子。

这样子当鼠标点下并放开时界面上会显示相应的棋子。并调用over函数判断输赢。 代码如下:

void CMy3_1View::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); CDC Dc; if(Dc.CreateCompatibleDC(pDC)==FALSE) AfxMessageBox(\ //是否在棋盘内 if(point.x>30&&point.x<410&&point.y>30&&point.y<410) { int px=(point.x-30)/20; int py=(point.y-30)/20; //是否已经有棋子 if(colorwhite&&wzq[px][py]==0) { Dc.SelectObject(m_bmwhite); pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY); //表示存在白棋 wzq[px][py]=1; //检查是否结束 over(point);

7

《Windows程序设计》课程设计报告

}

//换黑棋下 colorwhite=false; } else if(wzq[px][py]==0) { Dc.SelectObject(m_bmblack); pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY); wzq[px][py]=-1; over(point); colorwhite=true; } }

CView::OnLButtonUp(nFlags, point);

3.1.3 电脑下棋:

计算机要下棋?就要定位。即搜索棋盘,找出一个最佳点,放下黑棋。实现的方法是:全盘搜索,并把搜索到的位置,保存在变量。由于有多种情况,我们定义变量如下:

CPoint bpointcan4, //这个位置空,它旁边有四个黑棋 wpointcan4, //这个位置空,它旁边有四个白棋 bpointcan3, //这个位置空,它的旁边有三个黑棋 wpointcan3, //这个位置空,它的旁边有三个白棋 bpointcan2, //这个位置空,它的旁边有两个黑棋 wpointcan2, //这个位置空,它的旁边有两个白棋 bpointcan1; //不是以上情况,这个位置空 3.1.4搜索最优下棋点

并在搜索之前都赋值为(-1,-1),然后,进行搜索,并把相应的值保存在相应变量里面,而如果前面已经对变量赋值,我们依然赋值,用新值代替旧值。注意:我们只保存最后一个值,这样的一个好处是,避免了每次都从左上角开始,并且它的随机性比随机函数还随机。

全盘搜索完之后,由于上面的变量中至少有一个已经被赋值,即不是(-1,-1),我们可以采用多数优先的方法,让已经有多个同色棋子的位置先下棋。其原理是,如果已经有四个黑棋,计算机再下一个黑棋就赢了;否则,如果人已经有四个白棋,那么计算机就必须放下一个黑棋,阻止白棋下一步赢;如果已经有三个黑棋,再下一个黑棋,变成四个;否则,如果已经有三个白棋,下一个黑棋,破坏它;两个棋子的同理;否则,在刚才白棋下的地方,顺便找一个位置,下棋。computerdown()函数如下:

//轮到计算机下棋

void CMy3_1View::computerdown() { //把各种情形赋值为如下 bpointcan4=(-1,-1); wpointcan4=(-1,-1); bpointcan3=(-1,-1); wpointcan3=(-1,-1); bpointcan2=(-1,-1); wpointcan2=(-1,-1); bpointcan1=(-1,-1); //搜索最好的落棋点 for(int i=0;i<19;i++) for(int j=0;j<19;j++) bestputdown(i,j); //判断放在哪里

8

搜索更多关于: MFC-C++五子棋课程设计报告 的文档
MFC-C++五子棋课程设计报告.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c5r6683kxcj4n25q6n2ei_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top