VC编程版八皇后
小标 2018-08-14 来源 : 阅读 970 评论 0

摘要:本文主要向大家介绍了VC编程版八皇后,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程版八皇后,通过具体的内容向大家展示,希望对大家学习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
{
    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]
{
    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);
}
四.  测试与实现:
 

<喎�"https://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICA8aW1nIHNyYz0="https://www.2cto.com/uploadfile/Collfiles/20140712/20140712090820179.jpg" alt="">
五.  总结:
    通过对八皇后问题的求解,使我对递归算法有了更进一步的了解,类似八皇后及迷宫这样的问题都可以用回溯算法来解决。这些都是数据结构与算法中重要的算法,当时学的不是很好,通过不断地练习才逐步掌握了。
本程序的优点:实现了八皇后的基本功能,实现了悔棋功能,界面友好,有音乐提示等。
本程序的缺点:只实现了八皇后,而没能实现五皇后、六皇后等其他格式,提示与找出玩家错误不足等。    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程