一.  功能需求:

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

}

四.  測试与实现:

五.  总结:

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

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

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

VC版八皇后的更多相关文章

  1. 【算法导论】八皇后问题的算法实现(C、MATLAB、Python版)

    八皇后问题是一道经典的回溯问题.问题描述如下:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉?         看到这个问题,最容易想 ...

  2. 算法学习 八皇后问题的递归实现 java版 回溯思想

    1.问题描述 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或 ...

  3. Python 八皇后问题

    八皇后问题描述:在一个8✖️8的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行,同一列,同一斜线上,问有多少种解法. 规则分析: 任意两个棋子不能在同一行比较好办,设置一个队列,队列里的每个元 ...

  4. 【算法】八皇后问题 Python实现

    [八皇后问题] 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...

  5. LeetCode 回溯法 别人的小结 八皇后 递归

    #include <iostream> #include <algorithm> #include <iterator> #include <vector&g ...

  6. Python解决八皇后问题的代码【解读】

    八皇后问题 来自于西方象棋(现在叫 国际象棋,英文chess),详情可见百度百科. 在西方象棋中,有一种叫做皇后的棋子,在棋盘上,如果双方的皇后在同一行.同一列或同一斜线上,就会互相攻击. 八皇后问题 ...

  7. 八皇后问题Python实现

    八皇后问题描述 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...

  8. 八皇后算法的另一种实现(c#版本)

    八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...

  9. 数据结构0103汉诺塔&八皇后

    主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...

随机推荐

  1. Android开发5:布局管理器2(表格布局TableLayout)

    版本:Android4.3 API18  学习整理:liuxinming 概念      TableLayout继承了LinearLayout,因此它的本质依然是线性布局管理器.      表格布局采 ...

  2. YUV格式具体解释

    YUV是指亮度參量和色度參量分开表示的像素格式,而这样分开的优点就是不但能够避免相互干扰,还能够减少色度的採样率而不会对图像质量影响太大.YUV是一个比較笼统地说法,针对它的详细排列方式,能够分为非常 ...

  3. Jobbox.io(职位盒子): 新兴的面向技术人才的职场招聘众推平台

    人才招聘市场一个主要问题在于猎头中介费昂贵.这对于大公司而言,或可接受. 但对于海量小微企业而言招聘成本和效率之间的平衡是非常大的一个问题. 现在产品猎场(Product Hunt)上出现了一些新的招 ...

  4. c# WinForm开发 DataGridView控件的各种操作总结(单元格操作,属性设置)

    一.单元格内容的操作 *****// 取得当前单元格内容 Console.WriteLine(DataGridView1.CurrentCell.Value); // 取得当前单元格的列 Index ...

  5. Ajax改动购物车

    1.购物车类的设计 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hpeWVxaWFuZ2xkaA==/font/5a6L5L2T/fontsize/4 ...

  6. Cocos2d-x精华教程汇总(第三期) cocos2d-x最新离线API文档下载(最新版3.6更新。。。)

    其实使用doxygen在Cocos2d-x引擎的doc目录下可以生成离线文档,但是可能每个人为了生成一个离线文档去安装甚至编译doxygen毕竟麻烦,而且现有的doxygen无法生成多语言版本的离线文 ...

  7. Java调用IIS发布的WebService

    之前的一篇博客说了一个实例,就是用VS2005在IIS上发布WebService.今天我们来实现在Eclipse上用Java来调用昨天发布的WebService. 首先咋在浏览器中输入http://1 ...

  8. hdu4003(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 题意:给定一棵n个节点的树,遍历每条数边都需要费用cost,现在给定k个机器人,要求用这个k个机 ...

  9. How to debug with IntelliJ IDEA + Grails 2.3.x (转)

    问题: 最近访问grails.org,看到grails framework已经发展到2.3.x了,不免想尝尝鲜.下载了最新的grails-2.3.x之后,创建了一个新的grails app. 添加Bo ...

  10. dede 首页或列表页调用文章内容页body内容

    在使用dede过程,有的朋友会调调出文章的列表的内容出来,怎么调呢?当然是用dede的传参的数据查询语句了,方法如下: {dede:arclist flag=h typeid=2 row=1 titl ...