VC做的五子棋时存在的问题 如第一幅图所示,显示了白棋胜的情形.当我将对话框游过白棋时,白棋就变成黑色.而对话框在其他地方游动的时候是不会改变它的颜色的.请问这是为什么????? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 大概是你的操作引起了重繪可能有一個bool值代表黑白 分出勝負之後 還沒點掉彈出的對話框 就把所有棋子都初始化為黑色了 當然只是我的推測 你的問題不太詳細 OnDraw(CDC* pDC) 函数里面相关的代码 //重画时显示存在的棋子 CDC Dc; if(Dc.CreateCompatibleDC(pDC)==FALSE) AfxMessageBox("Can't create DC"); for(int n=0;n<19;n++) { for(int m=0;m<19;m++) { if(wzq[n][m]==1) { //显示白棋 Dc.SelectObject(m_bmwhite); pDC->BitBlt(n*20+32,m*20+32,16,16,&Dc,0,0,SRCCOPY); } else if(wzq[n][m]==-1) { //显示黑棋 Dc.SelectObject(m_bmblack); pDC->BitBlt(n*20+32,m*20+32,16,16,&Dc,0,0,SRCCOPY); } } } Dc.DeleteDC() ; 下棋操作的函数 OnLButtonUp(UINT nFlags, CPoint point){ // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); CDC Dc; if(Dc.CreateCompatibleDC(pDC)==FALSE) AfxMessageBox("Can't create DC"); //是否在棋盘内 if(point.x>30&&point.x<410&&point.y>30&&point.y<410) { int px=(point.x-30)/20; int py=(point.y-30)/20; //是否已经有棋子 if(colorwhite&&wzq[px][py]==0) { Dc.SelectObject(m_bmwhite); pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY); //表示存在白棋 wzq[px][py]=1; //检查是否结束 over(point); //换黑棋下 colorwhite=false; } else if(wzq[px][py]==0) { Dc.SelectObject(m_bmblack); pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY); wzq[px][py]=-1; over(point); colorwhite=true; } } CView::OnLButtonUp(nFlags, point); } 检查是否获胜的函数:over(CPoint point){//获取鼠标指向数组位置,即中心位置 int x=(point.x-30)/20; int y=(point.y-30)/20; //计算开始判断的坐标 xx,yy int xx,yy; if(x<4) xx=0; else xx=x-4; if(y<4) yy=0; else yy=y-4; int i,j,a; //横向判断 for(i=xx;i<15;i++) { a=0; for(j=i;j<i+5;j++) { a=a+wzq[j][y]; //五个都是白棋 if(a==5) { AfxMessageBox("白棋胜!"); OnStart();//重新开始 return; } //五个都是黑棋 if(a==-5) { AfxMessageBox("黑棋胜!"); OnStart(); return; } } } //竖向判断 for(i=yy;i<15;i++) { a=0; for(j=i;j<i+5;j++) { a=a+wzq[x][j]; if(a==5) { AfxMessageBox("白棋胜!"); OnStart(); return; } if(a==-5) { AfxMessageBox("黑棋胜!"); OnStart(); return; } } } //向右下角 //判断起点位置 if(x<y) { if(xx==0) yy=y-x; } else { if(yy==0) xx=x-y; } //参数over=1时退出循环 int over=0; do { a=0; for(i=0;i<5;i++) { if((xx+i)<19||(yy+i)<19) { a=a+wzq[xx+i][yy+i]; if(a==5) { AfxMessageBox("白棋胜!"); OnStart(); return; } if(a==-5) { AfxMessageBox("黑棋胜!"); OnStart(); return; } } //到了边界 else over=1; } xx+=1; yy+=1; }while(over==0); //向左下角 if(y>(18-x)) { if(x>13) { yy=y-(18-x); xx=18; } else { yy=y-4; xx=x+4; } } else { if(y<5) { xx=x+y; yy=0; } else { yy=y-4; xx=x+4; } } over=0; do { a=0; for(i=0;i<5;i++) { if((xx-i)>=0||(yy+i)<19) { a=a+wzq[xx-i][yy+i]; if(a==5) { AfxMessageBox("白棋胜!"); OnStart(); return; } if(a==-5) { AfxMessageBox("黑棋胜!"); OnStart(); return; } } //到了边界 else over=1; } xx-=1; yy+=1; }while(over==0); } 没打印机,怎样看打印的效果(不是预览)? 求教一个时间问题 如何获取和使用和某个已知hdc一样的调色板 关于中英文切换 有没有关于UML的电子书或比较好的站点?? 本人是VC++的初学者,如何建立VC++的工作目录,使建立程序文件在保存时自动对应到这个目录! 被一段Win32绘图程序搞得头大死了,真心求教? 简单问题请教。 CComVariant当函数的参数有误。怎么解决 如何在VC中彻底删除一个类? 如何能在菜单栏上加个ComboBox下拉框,就像word2003右上角那样? 求助:状态栏显示工具栏按钮名,鼠标移动到工具栏时出错??
可能有一個bool值代表黑白 分出勝負之後 還沒點掉彈出的對話框 就把所有棋子都初始化為黑色了 當然只是我的推測 你的問題不太詳細
OnDraw(CDC* pDC) 函数里面相关的代码
//重画时显示存在的棋子
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can't create DC");
for(int n=0;n<19;n++)
{
for(int m=0;m<19;m++)
{
if(wzq[n][m]==1)
{
//显示白棋
Dc.SelectObject(m_bmwhite);
pDC->BitBlt(n*20+32,m*20+32,16,16,&Dc,0,0,SRCCOPY);
}
else if(wzq[n][m]==-1)
{
//显示黑棋
Dc.SelectObject(m_bmblack);
pDC->BitBlt(n*20+32,m*20+32,16,16,&Dc,0,0,SRCCOPY);
}
}
}
Dc.DeleteDC() ;
下棋操作的函数
OnLButtonUp(UINT nFlags, CPoint point)
{ // TODO: Add your message handler code here and/or call default
CDC *pDC=GetDC();
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can't create DC");
//是否在棋盘内
if(point.x>30&&point.x<410&&point.y>30&&point.y<410)
{
int px=(point.x-30)/20;
int py=(point.y-30)/20;
//是否已经有棋子
if(colorwhite&&wzq[px][py]==0)
{
Dc.SelectObject(m_bmwhite);
pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);
//表示存在白棋
wzq[px][py]=1;
//检查是否结束
over(point);
//换黑棋下
colorwhite=false;
}
else if(wzq[px][py]==0)
{
Dc.SelectObject(m_bmblack);
pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);
wzq[px][py]=-1;
over(point);
colorwhite=true;
}
}
CView::OnLButtonUp(nFlags, point);
} 检查是否获胜的函数:over(CPoint point)
{//获取鼠标指向数组位置,即中心位置
int x=(point.x-30)/20;
int y=(point.y-30)/20;
//计算开始判断的坐标 xx,yy
int xx,yy;
if(x<4)
xx=0;
else
xx=x-4;
if(y<4)
yy=0;
else
yy=y-4;
int i,j,a;
//横向判断
for(i=xx;i<15;i++)
{
a=0;
for(j=i;j<i+5;j++)
{
a=a+wzq[j][y];
//五个都是白棋
if(a==5)
{
AfxMessageBox("白棋胜!");
OnStart();//重新开始
return;
}
//五个都是黑棋
if(a==-5)
{
AfxMessageBox("黑棋胜!");
OnStart();
return;
}
}
}
//竖向判断
for(i=yy;i<15;i++)
{
a=0;
for(j=i;j<i+5;j++)
{
a=a+wzq[x][j];
if(a==5)
{
AfxMessageBox("白棋胜!");
OnStart();
return;
}
if(a==-5)
{
AfxMessageBox("黑棋胜!");
OnStart();
return;
}
}
}
//向右下角
//判断起点位置
if(x<y)
{
if(xx==0)
yy=y-x;
}
else
{
if(yy==0)
xx=x-y;
}
//参数over=1时退出循环
int over=0;
do
{
a=0;
for(i=0;i<5;i++)
{
if((xx+i)<19||(yy+i)<19)
{
a=a+wzq[xx+i][yy+i];
if(a==5)
{
AfxMessageBox("白棋胜!");
OnStart();
return;
}
if(a==-5)
{
AfxMessageBox("黑棋胜!");
OnStart();
return;
}
}
//到了边界
else
over=1;
}
xx+=1;
yy+=1;
}while(over==0);
//向左下角
if(y>(18-x))
{
if(x>13)
{
yy=y-(18-x);
xx=18;
}
else
{
yy=y-4;
xx=x+4;
}
}
else
{
if(y<5)
{
xx=x+y;
yy=0;
}
else
{
yy=y-4;
xx=x+4;
}
}
over=0;
do
{
a=0;
for(i=0;i<5;i++)
{
if((xx-i)>=0||(yy+i)<19)
{
a=a+wzq[xx-i][yy+i];
if(a==5)
{
AfxMessageBox("白棋胜!");
OnStart();
return;
}
if(a==-5)
{
AfxMessageBox("黑棋胜!");
OnStart();
return;
}
}
//到了边界
else
over=1;
}
xx-=1;
yy+=1;
}while(over==0);
}