设为首页 加入收藏

TOP

VC版八皇后(一)
2014-11-23 17:31:24 】 浏览:329
Tags:皇后

一. 功能需求:

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

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇VC只用GDI实现位图展现简单特效 下一篇VC中常见API函数用法(经验版)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目