棋类对战小游戏(VS2012 MFC)

游戏规则:

1.通过移动己方棋子来消除对方棋子最终取得胜利

2.己方两个相同棋子可以消除一个对方棋子


运行效果:

代码如下

首先进行函数声明:
public:
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnTimer(UINT_PTR nIDEvent);
	void Hoxiaoyuan(int i,int j);//红色小圆
	void Hexiaoyuan(int i,int j);//黑色小圆
	void dayuan(int i,int j);    //大圆
	void youxiao(CPoint q);      //确定点击的有效位置
	void beijing(CDC* pDC);      //背景
	void qizhi(CDC*pDC);         //初始棋子放置
	void tiaojian(int i,int j,CDC* pDC);//棋子消失(胜负)条件判断
	int pointvalue[5][5];//对点标记,点初始值为0,红棋标记为1,黑棋标记为2
	CPoint q;//保存点信息
	int p,n,c,d;//p=0,游戏刚开始,p=1,黑棋移动,p=2,红棋移动
		    //n=0点未被选定,n=1,点已选定,c,d标记选定的点
	int pblack,pred;//保存红棋和黑棋个数,初始个数均为6
	int i,j;
构造函数:
CMFCApplication2View::CMFCApplication2View()
{
	p=1;n=0;c=-1;d=-1;//p=0,游戏刚开始,p=1,黑棋移动,p=2,红棋移动
			  //n=0点未被选定,n=1,点已选定,c,d标记选定的点
	pblack=6;pred=6;  //保存红棋和黑棋个数,初始个数均为6
	i=-1;j=-1;
}

对点进行初始化:

POINT pointt[5][5]={{{100,100},{200,100},{300,100},{400,100},{0,0}},{{100,200},{200,200},{300,200},{400,200},{0,0}},{{100,300},{200,300},{300,300},{400,300},{0,0}},{{100,400},{200,400},{300,400},{400,400},{0,0}},{{100,500},{200,500},{300,500},{400,500},{0,0}}};//初始化点
调用自定义的成员函数绘图:

void CMFCApplication2View::OnDraw(CDC* pDC)
{
	beijing(pDC);
	qizhi(pDC);
	pDC->SelectStockObject(NULL_BRUSH);
	CMFCApplication2Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;
}
左键按下事件函数如下:
void CMFCApplication2View::OnLButtonDown(UINT nFlags, CPoint point)
{
	i=-1;j=-1;
	CDC *pDC=GetDC();
	q=point;
	youxiao(q);
	if(p==1)//黑棋移动
	{
		if(pointvalue[i][j]==2) 
		{ c=i;d=j;n=1;}//n=1时,表示选定该点   获取i,j的值
		else if(pointvalue[i][j]==0&&n==1) 
		{ 
			if(abs(i-c)==1&&j==d||abs(j-d)==1&&i==c)//判断能够移动,则执行
			{
				pointvalue[c][d]=0;
				pointvalue[i][j]=2;
				dayuan(c,d);
				Hexiaoyuan(i,j); //黑棋时
				tiaojian(i,j,pDC);
				p=2;n=0;c=-1;d=-1;
			}
		}
	}
	else if(p==2)
	{
		if(pointvalue[i][j]==1){c=i;d=j;n=1;}
		else if(pointvalue[i][j]==0&&n==1)
		{
			if(abs(i-c)==1&&j==d||abs(j-d)==1&&i==c)//判断能够移动,则执行
			{
				pointvalue[c][d]=0;
				pointvalue[i][j]=1;//红棋的值
				dayuan(c,d);
				Hoxiaoyuan(i,j);
				tiaojian(i,j,pDC);
				p=1;n=0;c=-1;d=-1;
			}
		}
	}
	ReleaseDC(pDC);
	CView::OnLButtonDown(nFlags, point);
}

void CMFCApplication2View::Hoxiaoyuan(int i,int j)  //绘制红色小圆
{
	CDC *pDC=GetDC();
	CBrush red(RGB(255,0,0));
	pDC->SelectObject(red);
	pDC->Ellipse(pointt[i][j].x-10,pointt[i][j].y-10,pointt[i][j].x+10,pointt[i][j].y+10);
	ReleaseDC(pDC);
}

void CMFCApplication2View::Hexiaoyuan(int i,int j)//绘制黑色小圆
{
	CDC *pDC=GetDC();
	CBrush black(RGB(0,0,0));
	pDC->SelectObject(black);
	pDC->Ellipse(pointt[i][j].x-10,pointt[i][j].y-10,pointt[i][j].x+10,pointt[i][j].y+10);
	ReleaseDC(pDC);
}

void CMFCApplication2View::dayuan(int i,int j)  //绘制大圆
{
	CDC *pDC=GetDC();
	pDC->Ellipse(pointt[i][j].x-20,pointt[i][j].y-20,pointt[i][j].x+20,pointt[i][j].y+20);
	ReleaseDC(pDC);
}
设置点击的有效位置:
void CMFCApplication2View::youxiao(CPoint q)
{
	if(q.x>=80&&q.x<=120&&q.y>=80&&q.y<=120)   {i=0;j=0;}//设置点有效位置
	if(q.x>=80&&q.x<=120&&q.y>=180&&q.y<=220)  {i=1;j=0;}
	if(q.x>=80&&q.x<=120&&q.y>=280&&q.y<=320)  {i=2;j=0;}
	if(q.x>=80&&q.x<=120&&q.y>=380&&q.y<=420)  {i=3;j=0;}
	if(q.x>=80&&q.x<=120&&q.y>=480&&q.y<=520)  {i=4;j=0;}
	if(q.x>=180&&q.x<=220&&q.y>=80&&q.y<=120)  {i=0;j=1;}
	if(q.x>=180&&q.x<=220&&q.y>=180&&q.y<=220) {i=1;j=1;}
	if(q.x>=180&&q.x<=220&&q.y>=280&&q.y<=320) {i=2;j=1;}
	if(q.x>=180&&q.x<=220&&q.y>=380&&q.y<=420) {i=3;j=1;}
	if(q.x>=180&&q.x<=220&&q.y>=480&&q.y<=520) {i=4;j=1;}
	if(q.x>=280&&q.x<=320&&q.y>=80&&q.y<=120)  {i=0;j=2;}
	if(q.x>=280&&q.x<=320&&q.y>=180&&q.y<=220) {i=1;j=2;}
	if(q.x>=280&&q.x<=320&&q.y>=280&&q.y<=320) {i=2;j=2;}
	if(q.x>=280&&q.x<=320&&q.y>=380&&q.y<=420) {i=3;j=2;}
	if(q.x>=280&&q.x<=320&&q.y>=480&&q.y<=520) {i=4;j=2;}
	if(q.x>=380&&q.x<=420&&q.y>=80&&q.y<=120)  {i=0;j=3;}
	if(q.x>=380&&q.x<=420&&q.y>=180&&q.y<=220) {i=1;j=3;}
	if(q.x>=380&&q.x<=420&&q.y>=280&&q.y<=320) {i=2;j=3;}
	if(q.x>=380&&q.x<=420&&q.y>=380&&q.y<=420) {i=3;j=3;}
	if(q.x>=380&&q.x<=420&&q.y>=480&&q.y<=520) {i=4;j=3;}
}
绘制背景:
void CMFCApplication2View::beijing(CDC* pDC)  //背景绘制
{
	
	pDC->Rectangle(100,100,400,500);
	pDC->MoveTo(100,200);   pDC->LineTo(400,200);
	pDC->MoveTo(100,300);   pDC->LineTo(400,300);
	pDC->MoveTo(100,400);   pDC->LineTo(400,400);
	pDC->MoveTo(200,100);   pDC->LineTo(200,500);
	pDC->MoveTo(300,100);	pDC->LineTo(300,500);
	for(i=0;i<5;i++)
	{
		for(j=0;j<4;j++)
			dayuan(i,j);//绘制背景圆
	}
}
绘制初始棋子,并对棋盘各点进行标记:
void CMFCApplication2View::qizhi(CDC* pDC)//初始棋子绘制
{ 
	SetTimer(1,500,NULL);
	for(i=0;i<5;i++)     //点初始值为0,红棋标记为1,黑棋标记为2
	{
		for(j=0;j<5;j++)
			pointvalue[i][j]=0;
	}
	//初始化棋盘(红棋)
	Hoxiaoyuan(0,0); pointvalue[0][0]=1;
	Hoxiaoyuan(0,1); pointvalue[0][1]=1;
	Hoxiaoyuan(0,2); pointvalue[0][2]=1;
	Hoxiaoyuan(0,3); pointvalue[0][3]=1;
	Hoxiaoyuan(1,1); pointvalue[1][1]=1;
	Hoxiaoyuan(1,2); pointvalue[1][2]=1;
	//初始化棋盘(黑棋)
	Hexiaoyuan(3,1); pointvalue[3][1]=2;
	Hexiaoyuan(3,2); pointvalue[3][2]=2;
	Hexiaoyuan(4,0); pointvalue[4][0]=2;
	Hexiaoyuan(4,1); pointvalue[4][1]=2;
	Hexiaoyuan(4,2); pointvalue[4][2]=2;
	Hexiaoyuan(4,3); pointvalue[4][3]=2;
}
棋子消失以及胜负条件判断:
void CMFCApplication2View::tiaojian(int i,int j,CDC* pDC)//棋子消失(胜负)条件判断
{
	if(pointvalue[i][j]==2) //黑棋时
	{
		if(pointvalue[i-1][j]==2)//上
		{
			if(pointvalue[i+1][j]==1&&pointvalue[i+2][j]!=1)
			{
				pointvalue[i+1][j]=0;
				dayuan(i+1,j);
				pred--;
			}
			if(pointvalue[i-2][j]==1&&pointvalue[i-3][j]!=1)
			{
				pointvalue[i-2][j]=0;
				dayuan(i-2,j);
				pred--;
			}
		}
		if(pointvalue[i+1][j]==2)//下
		{
			if(pointvalue[i-1][j]==1&&pointvalue[i-2][j]!=1)
			{
				pointvalue[i-1][j]=0;
				dayuan(i-1,j);
				pred--;
			}
			if(pointvalue[i+2][j]==1&&pointvalue[i+3][j]!=1)
			{
				pointvalue[i+2][j]=0;
				dayuan(i+2,j);
				pred--;
			}
		}
		if(pointvalue[i][j-1]==2)//左
		{
			if(pointvalue[i][j+1]==1&&pointvalue[i][j+2]!=1)
			{
				pointvalue[i][j+1]=0;
				dayuan(i,j+1);
				pred--;
			}
			if(pointvalue[i][j-2]==1&&pointvalue[i][j-3]!=1)
			{
				pointvalue[i][j-2]=0;
				dayuan(i,j-2);
				pred--;
			}
		}
		if(pointvalue[i][j+1]==2)//右
		{
			if(pointvalue[i][j-1]==1&&pointvalue[i][j-2]!=1)
			{
				pointvalue[i][j-1]=0;
				dayuan(i,j-1);
				pred--;
			}
			if(pointvalue[i][j+2]==1&&pointvalue[i][j+3]!=1)
			{
				pointvalue[i][j+2]=0;
				dayuan(i,j+2);
				pred--;
			}
		}
		if(pred==0)
		{
			CFont font;
			font.CreatePointFont(500,TEXT(""));
			pDC->SelectObject(&font);
			pDC->SetTextColor(RGB(0,0,0));
			pDC->TextOut(500,100,TEXT("黑棋获胜"));
		}
	}
	else if(pointvalue[i][j]==1)//红棋时
	{
		if(pointvalue[i-1][j]==1)//上
		{
			if(pointvalue[i+1][j]==2&&pointvalue[i+2][j]!=2)
			{
				pointvalue[i+1][j]=0;
				dayuan(i+1,j);
				pblack--;
			}
			if(pointvalue[i-2][j]==2&&pointvalue[i-3][j]!=2)
			{
				pointvalue[i-2][j]=0;
				dayuan(i-2,j);
				pblack--;
			}
		}
		if(pointvalue[i+1][j]==1)//下
		{
			if(pointvalue[i-1][j]==2&&pointvalue[i-2][j]!=2)
			{
				pointvalue[i-1][j]=0;
				dayuan(i-1,j);
				pblack--;
			}
			if(pointvalue[i+2][j]==2&&pointvalue[i+3][j]!=2)
			{
				pointvalue[i+2][j]=0;
				dayuan(i+2,j);
				pblack--;
			}
		}
		if(pointvalue[i][j-1]==1)//左
		{
			if(pointvalue[i][j+1]==2&&pointvalue[i][j+2]!=2)
			{
				pointvalue[i][j+1]=0;
				dayuan(i,j+1);
				pblack--;
			}
			if(pointvalue[i][j-2]==2&&pointvalue[i][j-3]!=2)
			{
				pointvalue[i][j-2]=0;
				dayuan(i,j-2);
				pblack--;
			}
		}
		if(pointvalue[i][j+1]==1)//右
		{
			if(pointvalue[i][j-1]==2&&pointvalue[i][j-2]!=2)
			{
				pointvalue[i][j-1]=0;
				dayuan(i,j-1);
				pblack--;
			}
			if(pointvalue[i][j+2]==2&&pointvalue[i][j+3]!=2)
			{
				pointvalue[i][j+2]=0;
				dayuan(i,j+2);
				pblack--;
			}
		}
		if(pblack==0)
		{
			CFont font;
			font.CreatePointFont(500,TEXT(""));
			pDC->SelectObject(&font);
			pDC->SetTextColor(RGB(255,0,0));
			pDC->TextOut(500,100,TEXT("红棋获胜"));
		}
	}
}
选定棋子时,棋子闪烁(通过计时器函数SetTimer()开始)
void CMFCApplication2View::OnTimer(UINT_PTR nIDEvent)  //棋子选定闪烁
{
	if(pointvalue[i][j]==2&&p==1) 
	{
		dayuan(i,j); 
		Hexiaoyuan(i,j);
	}
	else if(pointvalue[i][j]==1&&p==2)
	{
		dayuan(i,j);
		Hoxiaoyuan(i,j);
	}
	CView::OnTimer(nIDEvent);
} 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值