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

时间:2024.4.21

《windows程序设计》

     

       学院(系):   计算机科学与技术系   

       班    级:        计专2                    

       学生姓名:    梁剑           学号   0907045233      

       指导教师:                            

      

                 时间: 2010   年1   18  2010   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编程。本课程设计中我们使用的是MFC编程。其具体的设计要求如下所述:


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

2.1 设计环境与器材

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

2.2 原理与说明

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

如图:


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("Can't create DC");

     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("Can't create DC");    

        //是否在棋盘内    

       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);

                     //换黑棋下

                     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);

       //判断放在哪里

       //棋多的位置优先

       //黑白一样多时黑先

    //不是-1就表示已经被赋值!

       if(bpointcan4.x!=-1)

       {

              putdown(bpointcan4);

              return;

       }

       else if(wpointcan4.x!=-1)

       {

              putdown(wpointcan4);

              return;

       }

       else if(bpointcan3.x!=-1)

       {

              putdown(bpointcan3);

              return;

       }

       else if(wpointcan3.x!=-1)

       {

              putdown(wpointcan3);         

              return;

       }

       else if(bpointcan2.x!=-1)

       {

             putdown(bpointcan2);

              return;

       }

       else if(wpointcan2.x!=-1)

       {

              putdown(wpointcan2);

              return;

       }

       else

       {

             putdown(bpointcan1);

              return;

       }

}

上面又有两个新函数,分别定义为空函数,如下:

    //搜索最佳位置    

void bestputdown(int i,int j);

//放下黑棋                                

       void putdown(CPoint point);

现在,我们就必须对上面两个空函数进行定义了。

在指定位置下棋:

由于putdown(CPoint point)函数的原理非常简单,我们先说明如下:

    //黑棋下

void CMy3_1View::putdown(CPoint point)

{

       CDC *pDC=GetDC();

       CDC Dc;

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

          AfxMessageBox("Can't create DC");

       Dc.SelectObject(m_bmblack);

      pDC->BitBlt(point.x*20+32,point.y*20+32,160,160,&Dc,0,0,SRCCOPY);    

     wzq[point.x][point.y]=-1;

//由于原来我们检查是否结束时用的是鼠标点下的坐标,而现在

//putdown(CPoint point)函数用的是数组棋盘的坐标,所以必须转换

       CPoint overpoint;

       overpoint.x=point.x*20+30;

       overpoint.y=point.y*20+30;

       over(overpoint);

       colorwhite=true;

      }

搜索最佳落棋点:

       现在就剩下void bestputdown(int i,int j)函数没有定义了(虽然前面的变量函数已经说明了,当时我们这里是用程序扩展的思路进行的,故如此说明)。它的实现原理是:在四个方向上,各自计算那个方向上棋子的状态,我们的思路是利用原来定义的白棋为1,黑棋为-1,的思想,让同个方向上的五个棋子的值相加,取绝对值并赋值给为这个方向定义的局部变量num[i]。

    为什么要用五个棋子的值相加呢?因为,如果几个棋子是同色的,无论黑白,它的绝对值必然大,而对于几个棋子中有黑棋和白棋的,其值必然相加而抵消变小。所以我们可以利用这种方法来寻找旁边有多个同色棋子的空位置(前面已经具体说明)。

在每一个棋盘位置,计算以它为起点的四个方向(横、竖、撇、捺),再比较这四个方向中哪个值最大,然后在这个方向上寻找落棋点。

//检查四个方向,各算出五个棋子的和并赋值

void CMy3_1View::bestputdown(int i,int j)

{

    //四个方向的值

              int num[4];

              int a,k;

                  ///////////////////////////////  num[0]    -->

              a=0;

           if(i<15)

                     for(k=0;k<5;k++)

                            a=a+wzq[i+k][j];

              num[0]=abs(a);

             

                 //////////////////////////////  num[1]     "|"

              a=0;

              if(j<15)

                     for(k=0;k<5;k++)

                            a=a+wzq[i][j+k];

              num[1]=abs(a);

             

                     ///////////////////////////////   num[2]   "\"

              a=0;

              if(i<15&&j<15)

                     for(k=0;k<5;k++)

                            a=a+wzq[i+k][j+k];

              num[2]=abs(a);

             

                     //////////////////////////////   num[3]    "/"

              a=0;

              if((i>4)&&(j<15))

                     for(k=0;k<5;k++)

                            a=a+wzq[i-k][j+k];

              num[3]=abs(a);     

              //比较哪个方向同色棋最多

//由于我们搜索落棋点时用到最大值和方向,我们可以定义一个Cpoint类变量,//让它返回两个值。可以说,这也是一种巧妙的想法,因为这样你就不用去写//内联函数了

CPoint numbig;

//numbig.x表示方向

//numbig.y表示最大值

              numbig=maxnum(num[0],num[1],num[2],num[3]);

              //在得到最大值和方向上寻找落棋点

              switch(numbig.y)

              {

              case 4:

                     searchcandown4(i,j,numbig.x);break;

              case 3:

                     searchcandown3(i,j,numbig.x);break;

              case 2:

                     searchcandown2(i,j,numbig.x);break;

              default:

                     searchcandown1(i,j,numbig.x);

              }

}

同样的方法,我们必须为上面还没有定义的函数添加空函数。

    //其中i、j表示搜索起点,n表示方向

       void searchcandown1(int i,int j,int n);

       void searchcandown2(int i,int j,int n);

       void searchcandown3(int i,int j,int n);

       void searchcandown4(int i,int j,int n);

       CPoint maxnum(int a,int b,int c,int d);

最大值函数的实现:

现在先介绍CPoint maxnum(int a,int b,int c,int d)函数,它只是四个整数的比较:

   

CPoint CMy3_1View::maxnum(int a, int b, int c, int d)

{

       //point.x为方向值

       //point.y为最大值

       CPoint point;

       if(a>=b)

       {

              point.x=0;

              point.y=a;

       }

       else

       {

              point.x=1;

              point.y=b;

       }

       if(c>point.y)

       {

              point.x=2;

              point.y=c;

       }

       if(d>point.y)

       {

              point.x=3;

              point.y=d;

       }

       return point;

}

而另外的四个函数,有其相似性,分别介绍如下:

void searchcandown4(int i,int j,int n)函数:

如果最大值是四,它必然有一个空位置;我们可以这样计算,如果第一个是空,那我们把它赋值给相应变量;否则,先找那个空位置,然后判断第一个棋子的颜色,并赋相应的值。

    //由于相似,下面代码只解释第一个方向

       //有四个同色棋

void CMy3_1View::searchcandown4(int i, int j, int n)

{

       int k;

    /////////////////////////////  num[0]    "--"

       if(n==0)

              for(k=0;k<5;k++)

                     //如果第一个是空

                     if(wzq[i][j]==0)

                     {

                            //如果下面有白棋

                            if(wzq[i+1][j]==1)

                            {

                                   //下面位置可以下棋,已经有四个白棋

                                   wpointcan4.x=i;

                                   wpointcan4.y=j;

                                   break;

                            }

                            else

                            {

                                   //下面位置可以下棋,已经有四个黑棋

                                   bpointcan4.x=i;

                                   bpointcan4.y=j;

                                   break;

                            }

                     }

                     //如果找到下棋位置,一定能找到!

                     else if(wzq[i+k][j]==0)

                     {

                            //如果第一个是白棋

                            if(wzq[j][j]==1)

                            {

                                   wpointcan4.x=i+k;

                                   wpointcan4.y=j;

                                   break;

                            }

                            //否则第一个是黑棋

                            else

                            {

                                   bpointcan4.x=i+k;

                                   bpointcan4.y=j;

                                   break;

                            }

                     }

        

      

       ////////////////////////////   num[1]     "|"

       if(n==1)

              for(k=0;k<5;k++)

              {

                     if(wzq[i][j]==0)

                            if(wzq[i][j+1]==1)

                            {

                                   wpointcan4.x=i;

                                   wpointcan4.y=j;

                                   break;

                            }

                            else

                            {

                                   bpointcan4.x=i;

                                   bpointcan4.y=j;

                                   break;

                            }

                    

                     else if(wzq[i][j+k]==0)

                     {

                            if(wzq[i][j]==1)

                            {

                                   wpointcan4.x=i;

                                   wpointcan4.y=j+k;

                                   break;

                            }

                            else

                            {

                                   bpointcan4.x=i;

                                   bpointcan4.y=j+k;

                                   break;

                            }

                     }           

              }

       ///////////////////////////////   num[2]   "\"

    if(n==2)

              for(k=0;k<5;k++)

              {

                     if(wzq[i][j]==0)

                            if(wzq[i+1][j+1]==1)

                            {

                                   wpointcan4.x=i;

                                   wpointcan4.y=j;

                                   break;

                            }

                            else

                            {

                                   bpointcan4.x=i;

                                   bpointcan4.y=j;

                                   break;

                            }

                    

                     else if(wzq[i+k][j+k]==0)

                     {

                            if(wzq[i][j]==1)

                            {

                                   wpointcan4.x=i+k;

                                   wpointcan4.y=j+k;

                                   break;

                            }

                            else

                            {

                                   bpointcan4.x=i+k;

                                   bpointcan4.y=j+k;

                                   break;

                            }

                     }           

              }

       //////////////////////////////   num[3]    "/"

    if(n==3)

              for(k=0;k<5;k++)

              {

                     if(wzq[i][j]==0)

                            if(wzq[i-1][j+1]==1)

                            {

                                   wpointcan4.x=i;

                                   wpointcan4.y=j;

                                   break;

                            }

                            else

                            {

                                   bpointcan4.x=i;

                                   bpointcan4.y=j;

                                   break;

                            }

                    

                     else if(wzq[i-k][j+k]==0)

                     {

                            if(wzq[i][j]==1)

                            {

                                   wpointcan4.x=i-k;

                                   wpointcan4.y=j+k;

                                   break;

                            }

                            else

                            {

                                   bpointcan4.x=i-k;

                                   bpointcan4.y=j+k;

                                   break;

                            }

                     }           

              }

       }

void searchcandown3(int i,int j,int n)函数:

如果最大值是三,它有两种情况,一种是三个同色和两个空;一种是四个同色和一个异色。前一种必定能找到一个空位置,赋值;后一种必定找不到空位置,不赋值。所以我们的想法很简单,先找到空位置,证明有三个同色,这对于玩五子棋来说三个同色是很重要的,再判断是哪种颜色,赋相应的值。

       //最多有三个同色

void CMy3_1View::searchcandown3(int i, int j, int n)

{

       int k=0;

  /////////////////////////////  num[0]    "--"

       if(n==0)

              for(k=0;k<5;k++)

                     //找到位置

                     if(wzq[i+k][j]==0)

                     {

                            //下一个是白棋

                         if(wzq[i+k+1][j]==1)

                            {

                                   //下面位置可以下棋,已经有三个白棋

                                  wpointcan3.x=i+k;

                                   wpointcan3.y=j;

                            }  

                            //下一个是黑棋

                            else if(wzq[i+k+1][j]==-1)

                                {

                                         bpointcan3.x=i+k; 

                                          bpointcan3.y=j;

                                   }                 

                     }

       ////////////////////////////   num[1]     "|"

       if(n==1)

              for(k=0;k<5;k++)

                     if(wzq[i][j+k]==0)

                     {

                         if(wzq[i][j+k-1]==1)

                            {

                                wpointcan3.x=i;

                                   wpointcan3.y=j+k;

                            }

                            else if(wzq[i][j+k+1]==-1)

                                   {

                                          bpointcan3.x=i;

                                          bpointcan3.y=j+k;

                                   }                  

                     }    

       ///////////////////////////////   num[2]   "\"

    if(n==2)

              for(k=0;k<5;k++)

                     if(wzq[i+k][j+k]==0)

                     {

                            if(wzq[i+k+1][j+k+1]==1)

                            {

                                   wpointcan3.x=i+k;

                                   wpointcan3.y=j+k;

                            }

                            else if(wzq[i+k+1][j+k+1]==-1)

                                   {

                                          bpointcan3.x=i+k;

                                          bpointcan3.y=j+k;

                                   }

                     }

       //////////////////////////////   num[3]    "/"

    if(n==3)

              for(k=0;k<5;k++)

                     if(wzq[i-k][j+k]==0)

                     {

                            if(wzq[i-k-1][j+k+1]==1)

                            {

                                wpointcan3.x=i-k;

                                   wpointcan3.y=j+k;

                            }

                            else if(wzq[i-k-1][j+k+1]==-1)

                                   {

                                          bpointcan3.x=i-k;

                                          bpointcan3.y=j+k;

                                   }

                     }  

}

void searchcandown2(int i,int j,int n)函数:

如果最大值是二,也有两种情况:一种是有两个同色和三个空位置;一种是有三个同色和一个异色和一个空位置,并且只算三个同色不连在一起的情况(因为如果有三个连续的情况,重全盘搜索的角度看,必然会被另外的情况所代替)。

分两种算法:一种是有一个空位置,一种是有三个空位置。前者先找到空位置,再判断它下面两个是否同色,同色则赋值给相应变量,异色则不赋值,因为意义不大;后者只要找到一个空位置就行了。

 //最多有两个同色

void CMy3_1View::searchcandown2(int i, int j, int n)

{

int k=0,m=0,a=0,b=0;

  /////////////////////////////  num[0]    "--"

       if(n==0)

       {

              //判断有多少个空位置

              for(k=0;k<5;k++)

                     if(wzq[i+k][j]==0)

                            m+=1;

                     //如果只有一个空位置

              if(m==1)

                     for(a=0;a<5;a++)

                            //找到空位置

                            if(wzq[i+a][j]==0)

                            {

                                   //下面两个棋子值的和

                                   b=wzq[i+a+1][j]+wzq[i+a+2][j];

                                   //都是黑棋

                                   if(b==-2)

                                   {

                                          //下面位置可以下棋,旁边有两个黑棋

                                          bpointcan2.x=i+a;

                                          bpointcan2.y=j;

                                   }

                                   //都是白棋

                                   if(b==2)

                                          {

                                                 wpointcan2.x=i+a;

                                                 wpointcan2.y=j;

                                          }

                            }

                            //如果有三个空位置,说明另外两个同色

              if(m==3)

              {

                     for(a=0;a<5;a++)

                            //如果两个是黑棋

                            if(wzq[i+a][j]==-1)

                            {

                                   for(b=0;b<5;b++)

                                          //如果找到空位置

                                          if(wzq[i+b][j]==0)

                                          {

                                                 //下面位置可以下棋,旁边有两个黑棋

                                                 bpointcan2.x=i+b;

                                                 bpointcan2.y=j;      break;

                                          }

                            }

                            else

                                   //如果两个是白棋

                                   if(wzq[i+a][j]==1)

                                   {

                                          for(b=0;b<5;b++)

                                                 if(wzq[i+b][j]==0)

                                                        {

                                                               wpointcan2.x=i+b;

                                                               wpointcan2.y=j;     break;

                                                        }

                                   }

              }

       }

       ////////////////////////////   num[1]     "|"

       m=0;

       if(n==1)

       {

              for(k=0;k<5;k++)

                     if(wzq[i][j+k]==0)

                            m++;

              if(m==1)

                     for(a=0;a<5;a++)

                            if(wzq[i][j+a]==0)

                            {

                                   b=wzq[i][j+a+1]+wzq[i][j+a+2];

                                   if(b==-2)

                                   {

                                          bpointcan2.x=i;

                                          bpointcan2.y=j+a;

                                   }

                                   if(b==2)

                                          {

                                                 wpointcan2.x=i;

                                                 wpointcan2.y=j+a;

                                          }

                            }

              if(m==3)

              {

                     for(a=0;a<5;a++)

                            if(wzq[i][j+a]==-1)

                            {

                                   for(b=0;b<5;b++)

                                          if(wzq[i][j+b]==0)

                                          {

                                                 bpointcan2.x=i;

                                                 bpointcan2.y=j+b;  break;

                                          }

                            }

                            else

                                   if(wzq[i][j+a]==1)

                                   {

                                          for(b=0;b<5;b++)

                                                 if(wzq[i][j+b]==0)

                                                 {

                                                        wpointcan2.x=i;

                                                        wpointcan2.y=j+b; break;

                                                        }

                                   }

              }

                    

       }

       ///////////////////////////////   num[2]   "\"

       m=0;

    if(n==2)

       {

              for(k=0;k<5;k++)

                     if(wzq[i+k][j+k]==0)

                            m++;

              if(m==1)

                     for(a=0;a<5;a++)

                            if(wzq[i+a][j+a]==0)

                            {

                                   b=wzq[i+a+1][j+a+1]+wzq[i+a+2][j+a+2];

                                   if(b==-2)

                                   {

                                          bpointcan2.x=i+a;

                                          bpointcan2.y=j+a;

                                   }

                                   if(b==2)

                                   {

                                          wpointcan2.x=i+a;

                                          wpointcan2.y=j+a;

                                   }

                            }

              if(m==3)

              {

                     for(a=0;a<5;a++)

                            if(wzq[i+a][j+a]==-1)

                            {

                                   for(b=0;b<5;b++)

                                          if(wzq[i+b][j+b]==0)

                                          {

                                                 bpointcan2.x=i+b;

                                                 bpointcan2.y=j+b;  break;

                                          }

                            }

                            else

                                   if(wzq[i+a][j+a]==1)

                                   {

                                          for(b=0;b<5;b++)

                                                 if(wzq[i+b][j+b]==0)

                                                        {

                                                               wpointcan2.x=i+b;

                                                               wpointcan2.y=j+b; break;

                                                        }

                                   }

              }

                    

       }

       //////////////////////////////   num[3]    "/"

    m=0;

    if(n==3)

       {

              for(k=0;k<5;k++)

                     if(wzq[i-k][j+k]==0)

                            m++;

              if(m==1)

                     for(a=0;a<5;a++)

                            if(wzq[i-a][j+a]==0)

                            {

                                   b=wzq[i-a-1][j+a+1]+wzq[i-a-2][j+a+2];

                                   if(b==-2)

                                   {

                                          bpointcan2.x=i-a;

                                          bpointcan2.y=j+a;

                                   }

                                   if(b==2)

                                          {

                                                 wpointcan2.x=i-a;

                                                 wpointcan2.y=j+a;

                                          }

                            }

              if(m==3)

              {

                     for(a=0;a<5;a++)

                            if(wzq[i-a][j+a]==-1)

                            {

                                   for(b=0;b<5;b++)

                                          if(wzq[i-b][j+b]==0)

                                          {

                                                 bpointcan2.x=i-b;

                                                 bpointcan2.y=j+b;  break;

                                          }

                            }

                            else

                                   if(wzq[i-a][j+a]==1)

                                   {

                                          for(b=0;b<5;b++)

                                                 if(wzq[i-b][j+b]==0)

                                                 {

                                                        wpointcan2.x=i-b;

                                                        wpointcan2.y=j+b; break;

                                                 }

                                   }

              }

       }

}           

void searchcandown1(int i,int j,int n)函数:

最后的一个函数是searchcandown1(int i, int j, int n),这是为了预防用的,如果以上情况不发生怎么办,总该下棋吧!而这个函数就是为了它而生的。这里就说明了为什么我们要添加vspoint的原因了,它保存了上次白棋下棋的位置,而我们在没有办法的情况下,也只能采取这一步,在白棋旁边随便找个位置算了。

       //如果五个位置的和是一

void CMy3_1View::searchcandown1(int i, int j, int n)

{

       //计算刚才白棋落棋点

       int ii=(vspoint.x-30)/20;

      int jj=(vspoint.y-30)/20;

       int a;

       for(a=0;a<5;a++)

              //如果不到边界

              if(ii+a<19)

              {

                     //向右,如果有空位置

                     if(wzq[ii+a][jj]==0)

                     {

                            //在这个位置下黑棋

                            bpointcan1.x=ii+a;

                            bpointcan1.y=jj;

                            return;

                     }

              }

              //到了边界

              else

                     //向左,如果有空位置

                     if(wzq[ii-1][jj]==0)

                     {

                            bpointcan1.x=ii-a;

                            bpointcan1.y=jj;

                            return;

                     }

      }

4 设计结果与分析

4.1 设计结果

4.2 设计分析

       因为该程序是博弈类棋类游戏,其中涉及到了人工智能和搜索最优算法,这对于我现在的水平还不足于设计出足够强大的算法。所以在借鉴和学习的基础上,利用现成的算法加于改进。


5 设计体会与建议

             通过本次基Windows程序设计,我受益匪浅,并对Windows程序设计这一门课程与相关一些技术有了更深一步的认识。在实验中,我们可以把这学期所学的理论知识和实践联系起来,在所要设计的程序中渐渐融会贯通。虽然我们对这些知识还运用得还不是很熟练,但是相信在现在和今后的学习中会得到更加深刻的掌握。本课程设计是设计一个程序,实现 人机和人人之间下棋。通过设计我们进一步掌握利用Visual C++进行程序设计的能力;进一步理解和运用面向对象程序设计的思想和方法;初步掌握开发一个小型实用系统的基本方法;学会调试一个较长程序的基本方法;理解Windows程序的运行过程;掌握windows编程方法。

总的来说通过本次实验,我学习到了许多东西,增强了一定的实践能力。课程设计过程中我们一边设计一边探索,发现理论和实践要充分地结合,是需要扎实的基本功的,这就表明学好基础知识是理论付诸实践的前提。希望在以后我们能充分利用实习的机会充实自己,并希望有更多的这样的实践机会。


参考文献:

[1].Charles Petzold 著,Windows程序设计.北京博彦科技发展有限公司译.北京.北京大学出版社,1998

[2].杨祥金,杨丹等.Windows程序设计教程.北京:清华大学出版社,2007

[3].Charles Prterzold.Programming Windows by Charles Prterzold.Microsoft Press,1998

[4].何立起著,陆东晖,杜坚贞改编.Borland C++ Windows程序设计.北京:人民邮电出版社,1994

[5].Vc+++游戏编程 作者:王鹏生 2001.12

更多相关推荐:
五子棋游戏 课程设计报告(含源代码可以运行)

五子棋游戏课程设计报告(含源代码可以运行)目录第一章需求分析.11.1总体分析.11.2初始化.11.3主循环控制模块.11.4玩家下子.11.5盘面分析填写棋型表.21.6对方下子.21.7胜负判断.2第二章…

C语言图形五子棋课程设计报告

北京师范大学C语言课程设计报告课题名称:游戏五子棋指导教师:课题组员:院系:信息科学与技术时间:20##.3.15-20##.4.20摘要五子棋是一种两人对弈的纯策略型棋类游戏,应用C语言编写程序可以在计算机上…

《C++语言程序设计》课程设计报告--五子棋

C语言程序设计课程设计报告课程题目年级专业学号姓名指导教师江苏师范大学数学与统计学院摘要五子棋是我国古代的传统的黑白棋种之一五子棋不仅能增强思维能力提高智力而且富含哲理有助于修身养性本游戏是以C语言作为开发工具...

20xx年C语言五子棋课程设计报告

本科控制软件设计课程设计题目五子棋学院计信院专业自动化年级学号姓名谯平同组人张健李益指导教师黄仁杰20xx年9月6日1目录1设计简介32设计模块3小组分工4流程图5设计过程6调试过程7分析与总结8源程序4445...

c++五子棋课程设计报告

福建农林大学计算机与信息学院课程设计报告课程名称课程设计题目姓名系专业年级学号指导教师职称面向对象程序设计课程设计五子棋计算机软件工程年月日福建农林大学计算机与信息学院计算机类课程设计报告结果评定2目录1设计目...

五子棋JAVA语言课程设计报告

封面Java语言程序设计课程设计报告分院电信分院班级电子商务1班姓名何芳林学号20xx0210460123指导教师吴军良课设时间20xx1220至20xx1231二O一一年十二月二十日10电商1班何芳林Java...

java课程设计报告-五子棋

目录第一章软件开发平台游戏设计思路第二章小游戏五子棋的开发过程第一节JAVA基础知识第二节启动程序的分析第三节游戏设计过程第三章总结第四章参考文献第五章附录第一章游戏设计思路第二章第一节java程序基础知识本系...

Java课程设计报告

烟台工程职业技术学院系专业级课程设计论文题目Java五子棋游戏设计姓名学号指导教师签名二一零年七月十二日Java五子棋游戏设计xxx摘要五子棋游戏大家都比较熟悉且老少皆宜我个人也很喜欢五子棋游戏易学易操作使用J...

java课程设计_五子棋(附源代码)

课程设计报告20xx20xx年度第二学期科目业面向对象课程设计网络工程董志文13级2班1308020xx7江涛专学生姓名班学级号指导教师完成日期永磁同步电机双环调速系统的仿真研究目录1概述311课程设计目的31...

java课程设计人机对弈五子棋

Java程序设计课程设计报告学院理学院班级姓名学号指导教师课设时间20xx0623至20xx0625二O一五年六月二十五日课程设计论文任务书理学院信息与计算科学专业20xx2班一课程设计论文题目人机对弈五子棋游...

java课程设计五子棋

下面的原始码分为4个文件chessclientjava客户端主程式chessinterfacejava客户端的界面chesspadjava棋盘的绘制chessserverjava服务器端可同时容纳50个人同时在...

Java五子棋课程设计报告

目录第一章概述错误未定义书签课程设计意义课程设计目的课程设计要求第二章网络五子棋设计的需求分析和总体设计21需求分析211功能需求分析212性能需求分析213用户界面需求22系统的主要功能23系统包含的类及类之...

五子棋课程设计报告(33篇)