使用MFC实现五子棋

来源:互联网 发布:网络架构师下载 编辑:程序博客网 时间:2024/06/06 01:13

使用MFC实现五子棋


本篇博文介绍使用MFC实现五子棋游戏,实现了五子棋的对弈、菜单栏、工具栏以及状态栏。
主界面
这里写图片描述
菜单栏
这里写图片描述
工具栏
这里写图片描述
底部状态栏
这里写图片描述

下面是核心代码,落子之后判断胜负:

void CMy05gobangView::OnLButtonUp(UINT nFlags, CPoint point){    // TODO: 在此添加消息处理程序代码和/或调用默认值    while(bWin)    {        ::MessageBox(NULL,_T("Black Win!"),_T("Game Over"),MB_OK);        return;    }    while(wWin)    {        ::MessageBox(NULL,_T("White Win!"),_T("Game Over"),MB_OK);        return;    }    CDC *pDC;    pDC = GetDC();    CBrush brush;    brush.CreateSolidBrush(RGB(0,0,0));    CBrush *pOldBrush;    CBrush brush2;    brush2.CreateSolidBrush(RGB(255,255,255));    CBrush *pOldBrush2;    int _x = point.x - (point.x%40);    int _y = point.y - (point.y%40);    if(point.x%40>20)    {        _x = _x + 40;    }    if(point.y%40>20)    {        _y = _y + 40;    }    int _m = _x/40;    int _n = _y/40;    if(point.x>40 && point.x < 600 &&point.y>40 && point.y<600)    {        if(i % 2 == 0&&ellipse[_m][_n]!=1&&ellipse[_m][_n]!=-1)        {            pOldBrush2 = pDC->SelectObject(&brush2);            pDC->Ellipse(_x-15,_y-15,_x+15,_y+15);            pDC->SelectObject(pOldBrush2);            ellipse[_m][_n] = -1;            m2 = _m;            n2 = _n;            i++;        }else if(i % 2 == 1 && ellipse[_m][_n]!=1 && ellipse[_m][_n]!=-1){            pOldBrush = pDC->SelectObject(&brush);            pDC->Ellipse(_x-15,_y-15,_x+15,_y+15);            pDC->SelectObject(pOldBrush);            ellipse[_m][_n] = 1;            m1=_m;            n1 = _n;            i++;        }    }    if((m1 != 0 && n1 !=0) || (m2 !=0 && n2 != 0))    {        isEditUndoClick = false;        isSaveGameClick = true;    }    vertial(_m,_n);    horizontal(_m,_n);    left(_m,_n);    right(_m,_n);}void CMy05gobangView::vertial(int x,int y){    int xx,yy;    if(x < 5)    {        xx = 0;    }else{        xx = x-5;    }    if(y < 5)    {        yy = 0;    }else{        yy = y-5;    }    int i,j,a;        //竖向判断    for(i = yy;i<15;i++)    {        a = 0;        for(j = i;j < i+5;j++)        {            a = a+ellipse[x][j];                    if(a >= 5)            {                ::MessageBox(NULL,_T("Black Win!"),_T("Game Over"),MB_OK);                bWin = true;                return;            }            if(a <= -5)            {                ::MessageBox(NULL,_T("White Win!"),_T("Game Over"),MB_OK);                wWin = true;                return;            }                       }    }}void CMy05gobangView::horizontal(int x,int y){    int xx,yy;    if(x < 5)    {        xx = 0;    }else{        xx = x-5;    }    if(y < 5)    {        yy = 0;    }else{        yy = y-5;    }    int i,j,a;    //横向判断    for(i = xx;i < 15;i++)    {        a = 0;        for(j = i;j<i+5;j++)        {            a = a+ellipse[j][y];            //五个都是黑棋            if(a >= 5)            {                ::MessageBox(NULL,_T("Black Win!"),_T("Game Over"),MB_OK);                bWin = true;                return;            }            //五个都是黑棋            if(a <= -5)            {                ::MessageBox(NULL,_T("White Win!"),_T("Game Over"),MB_OK);                wWin = true;                return;            }        }    }}void CMy05gobangView::left(int x,int y){    int xx,yy;    if(x < 4)    {        xx = 0;    }else{        xx = x-4;    }    if(y < 4)    {        yy = 0;    }else{        yy = y-4;    }    int i,j,a;    //向右下角    //判断起点位置    if(x < y)    {        if(xx == 0)        {            yy = y -x;        }    }else{        if( yy == 0)        {            xx = x - y;        }    }    int over = 0;    do{        a = 0;        for(i=0;i<5;i++){             if((xx+i)<19||(yy+i)<19)            {                 a=a+ellipse[xx+i][yy+i];                if(a==5){                    ::MessageBox(NULL,_T("Black Win!"),_T("Game Over"),MB_OK);                    bWin = true;                    return;                }                if(a==-5){                     ::MessageBox(NULL,_T("White Win!"),_T("Game Over"),MB_OK);                    wWin = true;                        return;                }            }else            {                over = 1;            }        }        xx = xx + 1;        yy = yy + 1;    }while(over == 0);}void CMy05gobangView::right(int x,int y){    int xx,yy;    if(x < 4)    {        xx = 0;    }else{        xx = x-4;    }    if(y < 4)    {        yy = 0;    }else{        yy = y-4;    }    int i,j,a;    //向左下角    if(y > (18-x))    {        if(x > 13)        {            yy = y -(18-x);            xx = 18;        }        else{            yy = y-4;            xx = x + 4;        }    }else{        if(y < 5)        {            xx = x + y;            yy = 0;        }else{            yy = y -4;            xx = x + 4;        }    }    int over = 0;    do{        a = 0;        for(int i = 0;i < 5;i++)        {            if((xx-i)>=0||(yy+i)<19)            {                a = a+ellipse[xx-i][yy+i];                if(a==5){                    ::MessageBox(NULL,_T("Black Win!"),_T("Game Over"),MB_OK);                    bWin = true;                    return;                }                if(a==-5){                     ::MessageBox(NULL,_T("White Win!"),_T("Game Over"),MB_OK);                    wWin = true;                    return;                }            }else{                over =1;            }        }        xx = xx-1;        yy = yy+1;    }while(over == 0);}

最后,附上GitHub链接

原创粉丝点击