• VC版八皇后


    一.  功能需求: 

    1. 可以让玩家摆棋,并让电脑推断是否正确

    2. 能让电脑给予帮助(给出全部可能结果)

    3. 实现悔棋功能

    4. 实现重置功能

    5. 加入点按键音效果更佳

    二.  整体设计计:

    1.   核心算法:

       递归实现(回溯算法):

       思路:按行分别安排皇后(Q),Q数目眼下为8.

               Q1从第一行第一列開始到最后一列,先放在第一列;

               Q2从第二行第一列到最后一列,每次都检查冲突,不冲突才干够落子;

               依次尝试Qm… 假设Qm没有可摆放的位置,则返回Qm-1,同一时候Qm-1放弃刚才的位置;

               当Q1尝试过首行的全部列的位置后,算法结束。

              统计递归并罗列全部解法。

    2.   详细功能实现的设计:

    (1)  电脑推断玩家的摆法正确与否:

    对每个棋子向右、下、右下和左下四个方向检查,若遇到不论什么一个方向存在棋子,则返回错误,若八个棋子都遍历完后都不冲突,则返回正确。

    (2)  电脑给予帮助:

    调用核心算法,遍历全部结果,并显示结果

    (3)  实现悔棋:

    用栈来存储每一个棋子的位置,以实现悔棋。

    (4)  实现重置:

    将二维数组赋值为空,并显示。

    (5)  加音乐:

    使用sndPlaySound(lpSound1,SND_ASYNC|SND_MEMORY)函数播放音乐。

      

    三.  具体设计:

    1. 电脑推断玩家的摆法正确与否:

      //-------------电脑检查玩家摆放是否正确----------------

    bool CQueenDlg::Check()

    {

        intcolumn = -1;

        introw  = -1;

        intcount = 0;

        for(int i = 0; i < 8; i++)

        {

           for(int j = 0 ; j < 8; j++)

           {

               if(Image[i][j]== 1 || Image[i][j] == 2)//若找到皇后,向左、下、右下、左下扫描看是否有与其在同一条线上的皇后

               {

                  

                  count++;

                  if(column== j || row == i) //若右或下方是否有与其在一条斜线上的棋子

                  {

                      returnfalse;

                  }

                  column= j;

                  row= i;

                  intm = i+1;

                  intn = j+1;

                  while(m< 8 && n < 8) //检查其右下方是否有与其在一条斜线上的棋子

                  {

                     

                      if(Image[m][n]== 1 || Image[m][n] == 2)

                      {

                         returnfalse;

                      }

                      m++;

                      n++;

                  }

                  m= i+1;

                  n= j-1;

                  while(m < 8 && n >-1)//检查其左下方是否有与其在一条斜线上的棋子

                  {

                      if(Image[m][n]== 1 || Image[m][n] == 2)

                      {

                         returnfalse;

                      }

                      m++;

                      n--;

                  }

               }

           }

        }

        if(count!= 8)

        {returnfalse;}

        returntrue;

    }

    2. 电脑给予帮助:

    //------------------存储摆放的结果.----------------

    voidCQueenDlg::StoreAllResult()

    {

    inti,j;

    //  InitImage();

    for(i=0;i<8;i++)

    {

        for(j=0;j<8;j++)

        {

            if(line[i]==j)

            {

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

               {

                    StoreImage[answer][j][i] = 1;

               }

               elseif(Image[j][i] == -1)

               {

                 StoreImage[answer][j][i] = 2;

               }

            }  

        }

    }

       answer++;

    }

    //-----------推断摆放的位置是否正确,不对返回1,正确返回0.-------------

    int CQueenDlg::Judge(int t)

    {

    inti,n=0;

    for(i=0;i<t;i++)

    {

        if(line[i]==line[t])

        {

            n=1;

            break;

        }

        if(line[i]+i==line[t]+t)

        {

            n=1;

            break;

        }

        if(line[i]-i==line[t]-t)

        {

            n=1;

            break;

        }

    }

    returnn;

    }

    //--------------主要控制函数.----------------

    void CQueenDlg::control(intn)

    {

    intt=8;

    for(line[n]=0;line[n]<t;line[n]++)

    {

        if(Judge(n))

            continue;

        else

        {

            if(n!=7)

               control(n+1);

            else

            {

                StoreAllResult();          

            }

        }

    }

    }

    3. 实现悔棋:

     //---------悔棋(消息响应函数)-----------------

    void CQueenDlg::OnBtnReback()

    {

        //TODO: Add your control notification handler code here

        introw,column;

        if(!IsComputerHelp)

        {

           if(queen!= 0)

           {

               queen--;

               row= storeStep[queen].row;//存放每一个棋子的位置(即列号)

               column= storeStep[queen].column;

           if(Image[row][column]== 1) //原皇后背景为白色,设置为白色

               {

                  Image[row][column]= 0;

               }

        elseif(Image[row][column] == 2) //原皇后背景为黑色,设置为黑色

               {

                  Image[row][column]= -1;

               }

               Invalidate(FALSE);

           }

        }

       

    }

    4. 实现重置:

     //-----------初始化界面的二维数组---------------

    void CQueenDlg::InitImage()

    {

        intm = 0;

        for(inti = 0; i < 8 ; i++)

           {

               for(intj = 0; j < 8; j++)

               {

                  if(m%2== 0)

                  {

                      Image[i][j]= 0;

                  }

                  else

                  {

                      Image[i][j]= -1;

                  }

                  m++;

               }

               m++;

           }

    }

    5. 加音乐:

      void CQueenDlg::PlayMusic(int Id)

    {

        ////////////加按键音

        switch(Id)

        {

        case1:res=FindResource(::AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDR_WAVE_PUTSTONE),"WAVE");break;//落子音乐

        case 2:res=FindResource(::AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDR_WAVE_ERROR),"WAVE");break;//不能落子音乐

        case3:res=FindResource(::AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDR_WAVE_WIN),"WAVE");break;   //玩家胜利音乐

        case4:res=FindResource(::AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDR_WAVE_LOSE),"WAVE");break;  //玩家失败音乐

        default:break;

        }

       

        hSound1=LoadResource(::AfxGetApp()->m_hInstance,res);

        lpSound1=(LPSTR)LockResource(hSound1);

                      sndPlaySound(lpSound1,SND_ASYNC|SND_MEMORY);

    }

    四.  測试与实现:

     


      

    五.  总结:

        通过对八皇后问题的求解,使我对递归算法有了更进一步的了解,类似八皇后及迷宫这种问题都能够用回溯算法来解决。这些都是数据结构与算法中重要的算法,当时学的不是非常好,通过不断地练习才逐步掌握了。

    本程序的长处:实现了八皇后的基本功能,实现了悔棋功能,界面友好,有音乐提示等。

    本程序的缺点:仅仅实现了八皇后,而没能实现五皇后、六皇后等其它格式,提示与找出玩家错误不足等。

  • 相关阅读:
    ASP.NET权限管理系统(FrameWork) 1.0.4 Release
    广告统计分析系统(ADCount) 1.0.0 Beta
    Asp.Net权限管理系统 专用代码生成工具(DDBuildTools) 1.1.0
    ASP.NET权限管理系统(FrameWork) 1.0.7 Release
    remoting缓存设计总结
    关于在Page_Load定义外部变量输出
    ASP.NET权限管理系统(FrameWork) 1.0.5 Release
    DDBuildTools 1.3.0 Release发布
    ASP.NET权限管理系统(FrameWork) 1.0.6 Release
    缺席
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4004424.html
Copyright © 2020-2023  润新知