admin管理员组文章数量:1621657
本篇博文介绍使用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链接
版权声明:本文标题:使用MFC实现五子棋 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1728851145a1176694.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论