这是我用VC写的五子棋小游戏,双人对战,不含人工智能
但是就现在还是有不少问题
其中有关于重绘时闪屏的解决,论坛中有人提出双缓冲绘图,我参照他们给的代码修改后发现
客户区一片漆黑~~这是问题1,没办法,我只能改回来(原代码中包含有双缓冲绘图的代码),闪屏就将就着~
问题2:对于改变窗口大小 以及会引起窗口重绘的操作,我在OnDraw中写了ReDrawChess,
将目前已下的棋子在重绘时重新也再画一次,问题来了~,这时重画的棋子的外围是红色的~
经过我测试,发现这个红色来自于m_MessagePen而这个成员变量是我用来画显示信息区域的边框的
没办法,我删~~不要这个现实信息区域的边框了~结果,棋子的边框又变成我用来画棋盘线条的颜色了~~
这个问题让我狂了~~~这是为什么!!!!!!
问题3:当游戏出现结局,即有胜负或平局出现时,我设计为提示是否继续,点击是后~调用ReStart函数
为什么~~~~这时的显示的SURCOR是白子?点击后下的也是白子?~!!!
在ReStart函数中我初始化后特意加了一条另当前为执黑先行的指令的~~
如果点击菜单栏或者工具栏中的重新开始却没有这种情况!!!
望各位路过的大大帮帮忙!!谢谢!!
小弟感激涕零!!!

解决方案 »

  1.   

    恩,邮箱是[email protected]
    谢谢了!!!
      

  2.   

    我也做过五子棋程序,有空的话可以去看看:http://blog.csdn.net/biaozai06/archive/2008/09/11/2914150.aspx
      

  3.   

    发现了一个问题:你的pDc->SelectObject后没有重新selected回来
    这样就导致了你的第二个问题无论是什么object,selected用完后都要重新selected回来
    比如 
    CPen* pOldPen = pDc->SelectObject(NewPen);
    // 使用newpen来画
    // 画完后
    pDc->SelectObject(pOldPen);brush也是需要这样。应该是这个问题导致你的第二个问题
      

  4.   

    双缓冲的问题你按照下面的放到你view的OnDraw中就可以了
    你可能还没有理解双缓冲的原理。
    双缓冲是创建一个内存画布,先将现在的pDC的内容复制过去
    然后在内存画布中画你所需要的东西
    画完后再将内存画布的东西画会原来的pDC中显示出来
    这样pDC就只画一次都可以了,避免了闪烁。但是你代码中传递过去的仍然是pDC, 内存画布没有起到作用。
    CRect rect;
    this->GetClientRect(&rect); CDC memDC;
    memDC.CreateCompatibleDC(pDC);
    HBITMAP Screen = ::CreateCompatibleBitmap(pDC->m_hDC, rect.Width(), rect.Height());
    HBITMAP holdbitmap = (HBITMAP)memDC.SelectObject(Screen);
      //画背景 
      memDC.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), pDC, 0, 0, SRCCOPY); fivechess.DrawChessBoard(&memDC); if(0 != fivechess.m_Byturn && 0 != fivechess.m_Count)
    {
    fivechess.ReDrawChess(&memDC);
    } // 一次性的将内存设备环境上绘制完毕的图形"贴"到屏幕上
    pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
    memDC.SelectObject(holdbitmap);
    ::DeleteObject(Screen);
    Screen = NULL;
      

  5.   

    按照7楼的,我在每个SelectObject前后都加了必要的代码~
    结果显示信息区域的背景没了~~
    还有我的第三个问题,我晕死了~~看半天没弄明白哪有问题~~
    楼上的,算法就是
    每次按下鼠标左键后对整个棋盘扫描,分4个方向,从0,0位置开始
    如果有练成5个的就有了胜负,你看看我的代码里面的CheckWin函数里面