admin管理员组

文章数量:1621658

本篇博文介绍使用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