计算机毕业论文五子棋游戏软件的设计与实现 下载本文

北方工业大学继续教育学院本科毕业论文(设计)

表4.3下棋操作

if(m_color==1) //此时应为黑棋走 { wzq[m_point.x][m_point.y] = 1; Invalidate(); //更新数据 if(IsOver(point,1)) //判断是否结束 m_flag = 0; //已有胜方,不需要再接受鼠标消息 else m_color = -1; //黑棋走完,理所当然下面白棋走 } else if(m_color==-1) //此时应为白棋走 { wzq[m_point.x][m_point.y] = -1; Invalidate(); //更新数据 if(IsOver(point,1)) m_flag = 0; else m_color = 1; } //白棋走完,理所当然下面黑棋走 4.3.4 判断输赢

接着是用一个IsOver()函数判断是否结束,是则结束并重新开始;否则,接着把鼠标变成对方棋子,表示对方下棋。

此函数是利用刚下棋的位置为中心,检查它各个方向上的连续五个棋子是否同色,是则结束并重新开始。

然而,判断一个方向上的五个棋子的是否同色就涉及到声明棋盘数组wzq[SIZE][SIZE],初始情况每一项为0;若黑棋按下,该项值为1;若白棋按下,该项值为-1,这样就可以利用连续五个棋子的值相加,如果它们的值的绝对值等于5,则说明是同色,具体代码如表4.4所示、流程图如图4.4所示。

新游戏下棋N判断输赢Y显示胜方

图4.4判断输赢

20

北方工业大学继续教育学院本科毕业论文(设计)

表4.4判断输赢

BOOL C五子棋Dlg::IsOver(CPoint m_point,int flag) { int temp1,temp2; CPoint temp_point; GetPosition(m_point,temp_point,flag); if(temp_point.x<4) temp1 = 0; else temp1 = temp_point.x-4; if(temp_point.y<4) temp2 = 0; else temp2 = temp_point.y-4; //横向检查 for(int i=temp1;i

AI算法

所谓人机对战就是人和计算机的博弈,计算机如何下棋就需要程序的设计与实现。然而,计算机不能随便在棋盘上面放一颗棋子。计算机要下的那个位置,必定是它认为最好的!当然,这里的最好是程序员给予计算机的,是计算机算法的体现,下面主要介绍一下本文的AI博弈算法。

在上文中声明了wzq棋盘数组,赋值为1和-1,五个连续的棋子的值相加绝对值

21

北方工业大学继续教育学院本科毕业论文(设计)

为5,则判断为胜, 然而,它的功能不止于此,它几乎关系到本程序的全部算法,当绝对值为4时,表示五个棋子中有一个空位置和四个同色的棋子;绝对值为3时,表示五个棋子中有两个空位置和三个同色的棋子,也表示五个棋子中有四个同色棋子和一个异色棋子;绝对值为2时,表示五个棋子中有三个空位置和两个同色棋子,也表示五个棋子中一个空位置和三个同色棋子和一个异色棋子;当绝对值为0或1时,由于出现1和0的机会太少不必多加考虑,具体代码如表4.5所示。

表4.5 AI算法

void C五子棋Dlg::SearchDown4(int i,int j,int n) { //横向 if(n == 0) { if(wzq[i][j]==0) //如果第一个棋子即为空 { //查看其余四个棋子为黑棋或白棋 if(wzq[i+1][j]==-1) //四个白棋 { m_white4.x = i; m_white4.y = j; } else if(wzq[i+1][j]==1) //四个黑棋 { m_black4.x = i; m_black4.y = j; } } else //第一个棋子非空,则寻找为空的棋子 { for(int k=1;k<5;k++) { if(wzq[i+k][j]==0) { break; } else if(wzq[i][j]==1) if(wzq[i][j]==-1) { m_white4.x = i+k; m_white4.y = j; 22

北方工业大学继续教育学院本科毕业论文(设计)

{ } } } } m_black4.x = i+k; m_black4.y = j; break; }

23