做完五子棋后的一点感受
#1 做完五子棋后的一点感受 作者:有志青年 发表时间:2007-4-21 8:36:16
五子棋是这个学期网络编程课程的其中一个实习题目,题目要求是做一个基于网络对战的五子棋程序。本来没打算做这个程序的,因为前段时间我正在学习HTML和javascript,但是后面用JAVASCRIPT做井子棋的时候碰到了麻烦,所以就决定放弃那个,来做五子棋,当时看见龙少做出来也挺羡慕的。刚开始做五子棋的时候,因为有了做井子棋的经历,所以算法部分新里面有了一点想法,但是具体的还没有想好。反正想的就是刚开始先把界面做好。做界面的时候并不轻松,由于很久没用MFC了,所以对于对话框有点生疏了。第一次把画背景的函数放到了OnInitDialog()函数中,执行程序时不能画出图形,后来才知道应该放在OnPaint()函数中,因为绘制对话框是在这个函数中来完成的。接下来就是要在棋盘上画棋子,这个步骤最郁闷,画了一个下午,刚开始都好好的,后来不知道怎么回事,棋子方上去之后隔几秒钟就消失了,在VC6.0和VC2005中都是这样。但是我重新新建一个解决方案,再把代码复制进去,又好了,现在程序做完了也不知道当时是什么原因。在画棋子的过程中,由于背景图和要加载的位图之间的颜色问题,还需要用到>中的掩码知识,代码如下,至于为什么要这么做,我也只是懂了一个大概,还需要看书学习。
CDC pdcmask;
CDC dcmask;
pdcmask.CreateCompatibleDC(NULL);
pdcmask.SelectObject(&m_bitmap);
CBitmap m_bitmask;
m_bitmask.CreateBitmap(mapInfo.bmWidth,mapInfo.bmHeight,1,1,NULL);
dcmask.CreateCompatibleDC(NULL);
dcmask.SelectObject(&m_bitmask);
dcmask.SelectObject(GetStockObject(BLACK_BRUSH));
dcmask.Rectangle(0,0,mapInfo.bmWidth,mapInfo.bmHeight);
dcmask.SelectObject(GetStockObject(WHITE_BRUSH));
dcmask.Ellipse(0,0,mapInfo.bmWidth,mapInfo.bmHeight);
pdcmask.BitBlt(0,0,mapInfo.bmWidth,mapInfo.bmHeight,&dcmask,0,0,SRCAND);
dcmask.DeleteDC();
pdcmask.DeleteDC();
CDC newpdcmask;
CDC newdcmask;
newpdcmask.CreateCompatibleDC(dc);
newpdcmask.SelectObject(&m_bitmap);
newdcmask.CreateCompatibleDC(dc);
newdcmask.SelectObject(&m_bitmask);
dc->BitBlt(m_DrawXpos,m_DrawYpos,mapInfo.bmWidth,mapInfo.bmHeight,&newdcmask,0,0,0x220326);
dc->BitBlt(m_DrawXpos,m_DrawYpos,mapInfo.bmWidth,mapInfo.bmHeight,&newpdcmask,0,0,SRCPAINT);
把界面基本上弄好之后,就要开始写算法了。首先是判断用户点鼠标的位置是否能够放置棋子,然后就是判断该位置上是否已经有了棋子,最后就是判断输赢了。
判断胜负的代码如下
int FirstIndex = GetFirstIndex(Xpos);
int SecondIndex = GetSecondIndex(Ypos);
//向左横向检查
int iLeft = 0;//记录在此棋子左边还有多少棋子
int RowCheckLeft = Xpos;
while(RowCheckLeft - 35 > 0)
{
RowCheckLeft = RowCheckLeft - 35;
iLeft++;
if(iLeft>=4)
break;
}
if(position[FirstIndex-iLeft][SecondIndex]==position[FirstIndex-iLeft+1][SecondIndex]&&position[FirstIndex-iLeft+1][SecondIndex]==position[FirstIndex-iLeft+2][SecondIndex]&&position[FirstIndex-iLeft+2][SecondIndex]==position[FirstIndex-iLeft+3][SecondIndex]&&position[FirstIndex-iLeft+3][SecondIndex]==position[FirstIndex-iLeft+4][SecondIndex])
return true;
//向右横向检查
int iRight = 0;//记录此棋子右边还有多少棋子
int RowCheckRight = Xpos;
while(RowCheckRight + 35 =4)
break;
}
if(position[FirstIndex+iRight][SecondIndex]==position[FirstIndex+iRight-1][SecondIndex]&&position[FirstIndex+iRight-1][SecondIndex]==position[FirstIndex+iRight-2][SecondIndex]&&position[FirstIndex+iRight-2][SecondIndex]==position[FirstIndex+iRight-3][SecondIndex]&&position[FirstIndex+iRight-3][SecondIndex]==position[FirstIndex+iRight-4][SecondIndex])
return true;
//向上纵向检查
int jUp = 0;//记录在此棋子上面还有多少棋子
int ColCheckUp = Ypos;
while(ColCheckUp - 35 > 0)
{
ColCheckUp = ColCheckUp - 35;
&n