游戏规则:
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);
}