基于对话框的五子棋,为什么棋子不出现

T技术沙龙
博客专家认证
2010-06-20 03:00:10
void CShinRenjuDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default

//CPaintDC dc(this);
//CRect rect;
//GetClientRect(&rect);

//CDC *pDC=GetDC();
//CDC Dc;
//Dc.CreateCompatibleDC(pDC);

CClientDC dc(this);

//判断是否在棋盘内
if(point.x>40&&point.x<520&&point.y>60&&point.y<540)
{
//转换成数组坐标:(40,60)为棋盘第一个点的像素坐标

int px=(point.x-40)/40;
int py=(point.y-60)/40;

//判断是否已经有棋子
if(ColorWhite==TRUE&&Renju[px][py]==0)
{
//创建白棋位图刷子并绘制
CDC dcWhite;
dcWhite.CreateCompatibleDC(&dc);
dcWhite.SelectObject(m_bmWhite);
dc.BitBlt(px*40+40,py*40+60,160,160,&dcWhite,0,0,SRCCOPY);

//Dc.SelectObject(m_bmWhite);
//pDC->BitBlt(px*40+40,py*40+60,36,36,&Dc,0,0,SRCCOPY);

//表示存在白棋
Renju[px][py]=1;

Invalidate();

//检查是否结束
GameOver(point);

//换黑棋下
ColorWhite=FALSE;
}

else if(ColorWhite==FALSE&&Renju[px][py]==0)
{
CDC dcBlack;
dcBlack.CreateCompatibleDC(&dc);
dcBlack.SelectObject(m_bmBlack);
dc.BitBlt(px*40+40,py*40+60,160,160,&dcBlack,0,0,SRCCOPY);

//Dc.SelectObject(m_bmBlack);
//pDC->BitBlt(px*40+40,py*40+60,36,36,&Dc,0,0,SRCCOPY);

//表示存在黑棋
Renju[px][py]=-1;

//变数组坐标为棋盘坐标
CPoint OverPoint;
OverPoint.x=px*40+40;
OverPoint.y=py*40+60;

Invalidate();

//检查是否结束
GameOver(OverPoint);

//换白棋下
ColorWhite=TRUE;
}
}

CDialog::OnLButtonUp(nFlags, point);
}

这个是对鼠标弹起消息的响应,请高手看看,为什么棋子不出现,而且数组的值也没有变,就好像这个函数根本没有响应一样
...全文
209 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
blpluto 2010-07-05
  • 打赏
  • 举报
回复
你重绘的时候你得把棋子也重绘了~
向立天 2010-07-05
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
向立天 2010-06-27
  • 打赏
  • 举报
回复
你可以一部分一部分的注释掉
然后看看效果
alangsos 2010-06-27
  • 打赏
  • 举报
回复
要学会调试啊,在那地方下断点,然后单步跟踪就知道是怎么执行了!
T技术沙龙 2010-06-26
  • 打赏
  • 举报
回复
谢谢了,目的就是要重绘,重绘的时候会把存在的棋子加载上去,这个是Onpaint函数的内容
void CShinRenjuDlg::OnPaint() 
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//CDialog::OnPaint();

CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
if(GameStart==FALSE){//加载ShinRenju Dailog的封面
CDC dcCover;
dcCover.CreateCompatibleDC(&dc);
dcCover.SelectObject(m_bmCover);
dc.BitBlt(0,0,rect.Width(),rect.Height(),&dcCover,0,0,SRCCOPY);
}
//如果开始画棋盘
else
{
CBitmap bmpdot;
bmpdot.LoadBitmap(IDB_BKGROUND_DOT);//加载棋盘
CBrush brushdot;
brushdot.CreatePatternBrush(&bmpdot);
dc.FillRect(&rect,&brushdot);

//测试代码
// CDC dcWhite;
// dcWhite.CreateCompatibleDC(&dc);
// dcWhite.SelectObject(m_bmWhite);
// dc.BitBlt(40,60,36,36,&dcWhite,0,0,SRCCOPY);
// CDC dcBlack;
// dcBlack.CreateCompatibleDC(&dc);
// dcBlack.SelectObject(m_bmBlack);
// dc.BitBlt(80,60,36,36,&dcBlack,0,0,SRCCOPY);

//重画时显示存在的棋子
for(int n=0;n<13;n++)
for(int m=0;m<13;m++)
{
if(Renju[n][m]==1)
{
//显示白棋
CDC dcWhite;
dcWhite.CreateCompatibleDC(&dc);
dcWhite.SelectObject(m_bmWhite);
dc.BitBlt(n*40+40,m*40+60,36,36,&dcWhite,0,0,SRCCOPY);
}
else if(Renju[n][m]==-1)
{
//显示黑棋
CDC dcBlack;
dcBlack.CreateCompatibleDC(&dc);
dcBlack.SelectObject(m_bmBlack);
dc.BitBlt(n*40+40,m*40+60,36,36,&dcBlack,0,0,SRCCOPY);
}
}
}


}
//Invalidate();
}

麻烦大家看看了……感觉不是刷新之后才没有,而是在点击之后根本就没有任何反应
Eleven 2010-06-20
  • 打赏
  • 举报
回复
囧,你在OnLButtonDown中绘图,那你窗口一刷新,不是啥都没了。。。
xhuacmer 2010-06-20
  • 打赏
  • 举报
回复
好像你的重绘了啊,你的OnDraw里是什么样子呢?
CPoint OverPoint;
OverPoint.x=px*40+40;
OverPoint.y=py*40+60;

Invalidate();这句去掉你试试
五子棋游戏 1.课程设计的目的 计算机技术的不断发展给人们的日常工作和生活都带来了许多益处, 从Windows系统的推出使电脑从高雅的学术殿堂走入了寻常百姓家开始,各行各业的人们 无须经过特别的训练就能够使用电脑完成许许多多复杂的工作。然而,虽然现在世界上 已经充满了花样繁多的各种软件,但它们依然不能满足用户的各种特殊需要,人们还不 得不开发适合自己特殊需求的软件。Java语言作为一种面向对象的编程语言,具有分布 式,可移植,高性能等特点。通过系统的学习,就可以使用它开发出功能齐全,满足特 殊需求的应用程序。它对学习者掌握技能,开拓思维都有很大的帮助。 Java语言的开发方法是当今世界最流行的开发方法,是当今流行的网络编程语言。它 具有面向对象、跨平台、分布应用等特点。它不仅具有更贴近自然的语义,而且有利于 软件的维护和继承。很多程序开发人员得第一选择。为了将课堂上得知识掌握得更加透 彻,深刻把握Java语言的重要概念及其面向对象的特性,锻炼学生熟练的应用面向对象 的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。让学生自己动 手动脑,将书本上得知识运用到实践当中去,使知识能更好得融会贯通。 通过自己动手,自主得学习,对Java这门课程有更深得了解与认识,并通过自己动手 ,自主得学习,对Java这门课程有更深得了解与认识,通过本次课设,实现本学期容的回 顾与综合运用,包括类的建立,用类创建对象,方法的调用,图形组建的使用方法,图 形界面的布局形式,事件处理机制,文件对话框的使用,文件操作的基本方法,数据读 写的基本用法等。 学习任何知识得目的都是要将它运用到实践中去,所以我们要运用已有的知识,独立 得将这个课程设计完成,只有这样,我们才能将知识变成本领,变成属于自己得东西, 通过一个学习得学习,我们已经有可一定得Java基础,现在我们就要利用这些基础,来 完成课程设计。 这次课程设计我主要研究了利用已学的Java知识编辑一个五子棋小游戏。通过此次课 程设计,来巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、JCreato r等开发工具的运用,拓宽常用类库的应用。 2.设计方案论证 2.1设计思路 (1)棋盘界面设计 在对棋盘界面设计方面要考虑简洁友好,符合游戏者需求。棋子的设计方面系统中设 置了两种棋子颜色,yellow或者red, 游戏者可自行选择。棋子怎样画出来,怎样使棋子按我们所想的方式来绘制出来是设计 的主要难题。运行时要求当每次点击鼠标的时候就在点击鼠标的地方画一个棋子,所以 得定义一个棋子的类使点击鼠标时系统把棋子绘制出来。这样主界面里的棋子就确定了 ,而且也确定了几个所需要的类。可以先定义好这些类了。 有了以上的准备就可以把棋盘绘制出来了,下棋时每次在适当位置点击鼠标的时候就 在所点击的位置上画出你这个角色的颜色,然后计算机会自动的下棋,计算机自动下棋 要有一个控制变量来控制能不能下棋。人可以随意的下子,可是计算机就要计算在哪个 位置下子了。这里由计算机下子的算法来确定,人人对战的话就不象单机游戏一样,要 计算机来判断人下子之后计算机下那一个地方了,人人对战只要在双方下子的时候判断 赢棋情况,当然还要同步的控制两个人下棋的顺序,这样的话就要用到线程了,各自都 继承或实现线程类或接口,以便各自能随时单独控制接发消息。 (2)算法设计 对于五子棋游戏,无论人机对战,还是双人对战,都需要判断棋盘上是否存在五子连 珠情况,这既是游戏名字的由来,也是游戏结束的标志。判断五子连珠的原理是从横, 竖,左斜线,右斜线4条线上判断是否存在5个相连的同类棋子。 对战一方落子后,在该处向8个方向检测连续的同类棋子,如果检测到直线方向上存在5 个连续的同类棋子(包含本位置棋子),则判断为"连五"并结束检测循环。基于检测结 果,可以判断游戏是否结束,并根据获胜方的落子代码判断获胜方是谁。 由于不考虑禁手问题,在实现"连五"过程中,我们可以考虑完成"双四","四三","双三 ","冲四","活三","活四"来实现目的。 活四:有两个点能形成"连五"的四就是活四; 冲四:只有一个点能形成"连五"的四叫做"冲四",或者叫做"单四"; 活三:己方在落一子就能形成"活四"的三叫做"活三"。"活三"分为"连活三"和"跳活三" 。连活三:在棋盘某一条阳线或阴线上有同色三子相连,且在此三子两端延长线上有一 端至少有一个,另一端至少有两个无子的交叉点与此三子紧密相连。跳活三:中间仅间 隔一个无子交叉点的连三,但两端延长线均至少有一个无子的交叉点与此三子相连。 双三:由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方 " 活 " 的局面。 双四:由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方 " 四 " 的
五子棋游戏 1.课程设计的目的 计算机技术的不断发展给人们的日常工作和生活都带来了许多益处, 从Windows系统的推出使电脑从高雅的学术殿堂走入了寻常百姓家开始,各行各业的人们 无须经过特别的训练就能够使用电脑完成许许多多复杂的工作。然而,虽然现在世界上 已经充满了花样繁多的各种软件,但它们依然不能满足用户的各种特殊需要,人们还不 得不开发适合自己特殊需求的软件。Java语言作为一种面向对象的编程语言,具有分布 式,可移植,高性能等特点。通过系统的学习,就可以使用它开发出功能齐全,满足特 殊需求的应用程序。它对学习者掌握技能,开拓思维都有很大的帮助。 Java语言的开发方法是当今世界最流行的开发方法,是当今流行的网络编程语言。它 具有面向对象、跨平台、分布应用等特点。它不仅具有更贴近自然的语义,而且有利于 软件的维护和继承。很多程序开发人员得第一选择。为了将课堂上得知识掌握得更加透 彻,深刻把握Java语言的重要概念及其面向对象的特性,锻炼学生熟练的应用面向对象 的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。让学生自己动 手动脑,将书本上得知识运用到实践当中去,使知识能更好得融会贯通。 通过自己动手,自主得学习,对Java这门课程有更深得了解与认识,并通过自己动手 ,自主得学习,对Java这门课程有更深得了解与认识,通过本次课设,实现本学期内容的 回顾与综合运用,包括类的建立,用类创建对象,方法的调用,图形组建的使用方法, 图形界面的布局形式,事件处理机制,文件对话框的使用,文件操作的基本方法,数据 读写的基本用法等。 学习任何知识得目的都是要将它运用到实践中去,所以我们要运用已有的知识,独立 得将这个课程设计完成,只有这样,我们才能将知识变成本领,变成属于自己得东西, 通过一个学习得学习,我们已经有可一定得Java基础,现在我们就要利用这些基础,来 完成课程设计。 这次课程设计我主要研究了利用已学的Java知识编辑一个五子棋小游戏。通过此次课 程设计,来巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、JCreato r等开发工具的运用,拓宽常用类库的应用。 2.设计方案论证 设计思路 (1)棋盘界面设计 在对棋盘界面设计方面要考虑简洁友好,符合游戏者需求。棋子的设计方面系统中设 置了两种棋子颜色,yellow或者red, 游戏者可自行选择。棋子怎样画出来,怎样使棋子按我们所想的方式来绘制出来是设计 的主要难题。运行时要求当每次点击鼠标的时候就在点击鼠标的地方画一个棋子,所以 得定义一个棋子的类使点击鼠标时系统把棋子绘制出来。这样主界面里的棋子就确定了 ,而且也确定了几个所需要的类。可以先定义好这些类了。 有了以上的准备就可以把棋盘绘制出来了,下棋时每次在适当位置点击鼠标的时候就 在所点击的位置上画出你这个角色的颜色,然后计算机会自动的下棋,计算机自动下棋 要有一个控制变量来控制能不能下棋。人可以随意的下子,可是计算机就要计算在哪个 位置下子了。这里由计算机下子的算法来确定,人人对战的话就不象单机游戏一样,要 计算机来判断人下子之后计算机下那一个地方了,人人对战只要在双方下子的时候判断 赢棋情况,当然还要同步的控制两个人下棋的顺序,这样的话就要用到线程了,各自都 继承或实现线程类或接口,以便各自能随时单独控制接发消息。 (2)算法设计 对于五子棋游戏,无论人机对战,还是双人对战,都需要判断棋盘上是否存在五子连 珠情况,这既是游戏名字的由来,也是游戏结束的标志。判断五子连珠的原理是从横, 竖,左斜线,右斜线4条线上判断是否存在5个相连的同类棋子。 对战一方落子后,在该处向8个方向检测连续的同类棋子,如果检测到直线方向上存在5 个连续的同类棋子(包含本位置棋子),则判断为"连五"并结束检测循环。基于检测结 果,可以判断游戏是否结束,并根据获胜方的落子代码判断获胜方是谁。 由于不考虑禁手问题,在实现"连五"过程中,我们可以考虑完成"双四","四三","双三 ","冲四","活三","活四"来实现目的。 活四:有两个点能形成"连五"的四就是活四; 冲四:只有一个点能形成"连五"的四叫做"冲四",或者叫做"单四"; 活三:己方在落一子就能形成"活四"的三叫做"活三"。"活三"分为"连活三"和"跳活三" 。连活三:在棋盘某一条阳线或阴线上有同色三子相连,且在此三子两端延长线上有一 端至少有一个,另一端至少有两个无子的交叉点与此三子紧密相连。跳活三:中间仅间 隔一个无子交叉点的连三,但两端延长线均至少有一个无子的交叉点与此三子相连。 双三:由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方 " 活 " 的局面。 双四:由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方 " 四 " 的局面

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧