这是我用VC写的五子棋小游戏,双人对战,不含人工智能
但是就现在还是有不少问题
其中有关于重绘时闪屏的解决,论坛中有人提出双缓冲绘图,我参照他们给的代码修改后发现
客户区一片漆黑~~这是问题1,没办法,我只能改回来(原代码中包含有双缓冲绘图的代码),闪屏就将就着~
问题2:对于改变窗口大小 以及会引起窗口重绘的操作,我在OnDraw中写了ReDrawChess,
将目前已下的棋子在重绘时重新也再画一次,问题来了~,这时重画的棋子的外围是红色的~
经过我测试,发现这个红色来自于m_MessagePen而这个成员变量是我用来画显示信息区域的边框的
没办法,我删~~不要这个现实信息区域的边框了~结果,棋子的边框又变成我用来画棋盘线条的颜色了~~
这个问题让我狂了~~~这是为什么!!!!!!
问题3:当游戏出现结局,即有胜负或平局出现时,我设计为提示是否继续,点击是后~调用ReStart函数
为什么~~~~这时的显示的SURCOR是白子?点击后下的也是白子?~!!!
在ReStart函数中我初始化后特意加了一条另当前为执黑先行的指令的~~
如果点击菜单栏或者工具栏中的重新开始却没有这种情况!!!
望各位路过的大大帮帮忙!!谢谢!!
小弟感激涕零!!!
但是就现在还是有不少问题
其中有关于重绘时闪屏的解决,论坛中有人提出双缓冲绘图,我参照他们给的代码修改后发现
客户区一片漆黑~~这是问题1,没办法,我只能改回来(原代码中包含有双缓冲绘图的代码),闪屏就将就着~
问题2:对于改变窗口大小 以及会引起窗口重绘的操作,我在OnDraw中写了ReDrawChess,
将目前已下的棋子在重绘时重新也再画一次,问题来了~,这时重画的棋子的外围是红色的~
经过我测试,发现这个红色来自于m_MessagePen而这个成员变量是我用来画显示信息区域的边框的
没办法,我删~~不要这个现实信息区域的边框了~结果,棋子的边框又变成我用来画棋盘线条的颜色了~~
这个问题让我狂了~~~这是为什么!!!!!!
问题3:当游戏出现结局,即有胜负或平局出现时,我设计为提示是否继续,点击是后~调用ReStart函数
为什么~~~~这时的显示的SURCOR是白子?点击后下的也是白子?~!!!
在ReStart函数中我初始化后特意加了一条另当前为执黑先行的指令的~~
如果点击菜单栏或者工具栏中的重新开始却没有这种情况!!!
望各位路过的大大帮帮忙!!谢谢!!
小弟感激涕零!!!
解决方案 »
- 我用vc2010编程序,程序需要向另外一台电脑传输几个数据。知道应该用socket编,但是不会,跪求高人指点!!
- bitblt和setbitmap哪个效率高?
- 在文件过滤驱动钩子里,如何获得当前操作的文件的文件名?
- 请问一下,VC编译器的编译信息输出窗口是用什么控件做的?
- 新手学DLL编程--在DLL中开新线程的疑问!
- ADO数据库记录对象问题,很不解
- 一个有意思得问题!
- PostThreadMessage函数为什么传递不了消息?
- 数据库 高效插入 之最
- 各位编写ACTIVEX和COM一般用什么开发工具最方便?????
- 为什么只显示二维 应该是三维的 帮帮忙啊
- openGl显示问题(三角剖分)
谢谢了!!!
这样就导致了你的第二个问题无论是什么object,selected用完后都要重新selected回来
比如
CPen* pOldPen = pDc->SelectObject(NewPen);
// 使用newpen来画
// 画完后
pDc->SelectObject(pOldPen);brush也是需要这样。应该是这个问题导致你的第二个问题
你可能还没有理解双缓冲的原理。
双缓冲是创建一个内存画布,先将现在的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;
结果显示信息区域的背景没了~~
还有我的第三个问题,我晕死了~~看半天没弄明白哪有问题~~
楼上的,算法就是
每次按下鼠标左键后对整个棋盘扫描,分4个方向,从0,0位置开始
如果有练成5个的就有了胜负,你看看我的代码里面的CheckWin函数里面