做完五子棋后的一点感受

五子棋缘


#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