📄 shududlg.cpp
字号:
if (!m_element[m][n].GetNum())
{
for (int a=0;a<9;a++)
{
if (m_element[m][n].GetNums(a)==m_element[i][j].GetNum())
{
m_element[m][n].SetNums(a,0);
}
}
}
}
}
}
void CshuduDlg::m_ResetNum()
{
for (int i=0;i<9;i++)
{
for (int j=0;j<9;j++)
{
for (int a=0;a<9;a++)
{
m_element[i][j].SetNums(a,a+1);
}
}
}
}
int CshuduDlg::m_FindTimes(int i,int j,int TheValue,int Style)
{
int Times;
switch (Style)
{
case DFS_ROW:
Times=0;
for (int n=0;n<9;n++)
if (!m_element[i][n].GetNum())
for (int a=0;a<9;a++)
if (m_element[i][n].GetNums(a)==TheValue)
Times++;
break;
case DFS_LIST:
Times=0;
for (int m=0;m<9;m++)
if(!m_element[m][j].GetNum())
for (int a=0;a<9;a++)
if (m_element[m][j].GetNums(a)==TheValue)
Times++;
break;
case DFS_RECT9:
Times=0;
for (int m=i/3*3;m<i/3*3+3;m++)
for (int n=j/3*3;n<j/3*3+3;n++)
if (!m_element[m][n].GetNum())
for (int a=0;a<9;a++)
if(m_element[m][n].GetNums(a)==TheValue)
Times++;
break;
}
return Times;
}
BOOL CshuduDlg::m_CheckIsRight()
{
for (int i=0;i<9;i++)
{
for (int j=0;j<8;j++)
{
if (m_element[i][j].GetNum()==0)
{
continue;
}
for (int n=j+1;n<9;n++)
if (m_element[i][n].GetNum()==0)
continue;
else
{
if (m_element[i][j].GetNum()==m_element[i][n].GetNum())
return FALSE;
}
}
}
for (int i=0;i<9;i++)
{
for (int j=0;j<8;j++)
{
if (m_element[j][i].GetNum()==0)
continue;
for (int n=j+1;n<9;n++)
if (m_element[n][i].GetNum()==0)
continue;
else
{
if (m_element[j][i].GetNum()==m_element[n][i].GetNum())
return FALSE;
}
}
}
for (int i=0;i<3;i++)
for(int j=0;j<3;j++)
for (int m=i*3;m<i*3+2;m++)
for (int n=j*3;n<j*3+2;n++)
if (m_element[m][n].GetNum()==0)
continue;
else
for (int mm=m;mm<i*3+3;mm++)
for (int nn=n+1;nn<j*3+3;nn++)
if (m_element[m][n].GetNum()==m_element[mm][nn].GetNum())
return FALSE;
int sum;
for (int i=0;i<9;i++)
{
for (int j=0;j<9;j++)
{
sum=0;
if(m_element[i][j].GetNum()!=0)
continue;
for (int a=0;a<9;a++)
{
sum+=m_element[i][j].GetNums(a);
}
if(sum==0)
return FALSE;
}
}
return TRUE;
}
BOOL CshuduDlg::m_CheckEvery(int i,int j)
{
if (i!=-1&&j==-1)
for (int n=0;n<8;n++)
for (int nn=n+1;nn<9;nn++)
if (m_element[i][n].GetNum()==m_element[i][nn].GetNum())
return FALSE;
if (i==-1&&j!=-1)
for(int m=0;m<8;m++)
for(int mm=m;mm<9;mm++)
if(m_element[m][j].GetNum()==m_element[mm][j].GetNum())
return FALSE;
if(i!=-1&&j!=-1)
for(int m=i*3;m<i*3+2;m++)
for(int n=j*3;n<j*3+2;n++)
for(int mm=m;mm<i*3+3;mm++)
for(int nn=n+1;nn<j*3+3;nn++)
if(m_element[m][n].GetNum()==m_element[mm][nn].GetNum())
return FALSE;
return TRUE;
}
BOOL CshuduDlg::m_Try(int i,int j,int *pValue)
{
if (m_element[i][j].GetNum()!=0)
{
if (j+1!=9)
return m_Try(i,j+1,pValue);
else if (i+1==9)
{
return true;
}
else
return m_Try(i+1,0,pValue);
}
else
{
int amount=m_GetNumsAmount(i,j);//有一种情况大小数字都为0
int *p=new int [amount*9*9];
m_CopyNum(pValue,p,amount);
int a,b;
for(a=0,b=0;a<9;)
{
if(m_element[i][j].GetNums(a)==0)
{
a++;
continue;
}
m_element[i][j].SetNum(m_element[i][j].GetNums(a));
m_UpDate();
m_ElementToNum(&p[b*9*9]);
if (m_CheckIsRight()==TRUE)
{
//检查下一个if真return真
if (j!=8)
{
//MessageBox(_T("Next"));
BOOL bbb=m_Try(i,j+1,&p[b*9*9]);
if (bbb)
{
delete(p);
return TRUE;
}
else
{
if(b+1==amount)
{
delete(p);
return FALSE;
}
a++;
b++;
for (int m=0;m<9;m++)
{
for (int n=0;n<9;n++)
{
m_element[m][n].SetNum(p[b*9*9+m*9+n]);
}
}
m_ResetNum();
m_UpDate();
}
}
else
{
//MessageBox(_T("Next"));
BOOL bbb=m_Try(i+1,0,&p[b*9*9]);
if (bbb)
{
delete(p);
return TRUE;
}
else
{
if(b+1==amount)
{
delete(p);
return FALSE;
}
a++;
b++;
for (int m=0;m<9;m++)
{
for (int n=0;n<9;n++)
{
m_element[m][n].SetNum(p[b*9*9+m*9+n]);
}
}
m_ResetNum();
m_UpDate();
}
}
}
else
{
if(b+1==amount)
{
delete(p);
return FALSE;
}
a++;
b++;
for (int m=0;m<9;m++)
{
for (int n=0;n<9;n++)
{
m_element[m][n].SetNum(p[b*9*9+m*9+n]);
}
}
m_ResetNum();
m_UpDate();
}
}
if (a==9)
{
delete(p);
return FALSE;
}
}
}
void CshuduDlg::m_SaveNum()
{
for (int i=0;i<9;i++)
for (int j=0;j<9;j++)
m_nSavedNum[i][j]=m_element[i][j].GetNum();
}
int CshuduDlg::m_GetNumsAmount(int i,int j)
{
int amount=0;
for (int a=0;a<9;a++)
if (m_element[i][j].GetNums(a)!=0)
amount++;
return amount;
}
void CshuduDlg::m_NumToElement(int *Src)
{
for (int i=0;i<9;i++)
for (int j=0;j<9;j++)
m_element[i][j].SetNum(*(Src++));
}
void CshuduDlg::m_ElementToNum(int *Des)
{
for (int i=0;i<9;i++)
for (int j=0;j<9;j++)
*Des++=m_element[i][j].GetNum();
}
BOOL CshuduDlg::m_IsFinish()
{
if(!m_CheckIsRight())
return FALSE;
for (int i=0;i<9;i++)
{
for (int j=0;j<9;j++)
{
if (m_element[i][j].GetNum()==0)
return FALSE;
}
}
return TRUE;
}
void CshuduDlg::m_UpDate()
{
m_Clean();
m_LastOne();
m_FindOnce();
}
void CshuduDlg::m_CopyNum(int *pSrc,int *pDes,int Times)
{
for (int a=0;a<Times;a++)
{
for (int i=0;i<9*9;i++)
{
pDes[i+a*9*9]=pSrc[i];
}
}
}
void CshuduDlg::OnBnClickedButton1()
{
if(m_IsFinish()==FALSE)
MessageBox(_T("不完整或错误"),_T(""));
else
MessageBox(_T("正确"),_T(""));
}
void CshuduDlg::OnBnClickedOk()
{
for (int i=0;i<9;i++)
{
for (int j=0;j<9;j++)
{
m_element[i][j].SetNum(0);
m_element[i][j].SetRGB(0);
}
}
m_ResetNum();
Invalidate();
}
void CshuduDlg::OnOK()
{
// TODO: 在此添加专用代码和/或调用基类
//CDialog::OnOK();
}
void CshuduDlg::OnReset()
{
OnBnClickedOk();
}
void CshuduDlg::OnStrat()
{
OnBnClickedBtnStart();
}
void CshuduDlg::OnCheck()
{
OnBnClickedButton1();
}
void CshuduDlg::OnAuthor()
{
CDlgAuther dlg;
dlg.DoModal();
}
void CshuduDlg::OnAbout()
{
CAboutDlg dlg;
dlg.DoModal();
}
void CshuduDlg::OnHelp()
{
MessageBox(_T("小数字为备选数字。\n单击小数字确定,右击大数字取消确定。\n填写数字的时候一定要细心。\n欢迎到vc群64998725讨论"),_T(""));
}
void CshuduDlg::OnBnClickedRestart()
{
for (int i=0;i<9;i++)
{
for (int j=0;j<9;j++)
{
if(m_element[i][j].GetRGB()!=RGB(255,0,0))
m_element[i][j].SetNum(0);
}
}
m_ResetNum();
}
int CshuduDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
srand(time(0));
SetTimer(0,100,0);
return 0;
}
void CshuduDlg::OnBnClickedRandomGame()
{
OnBnClickedOk();
BOOL b=false;
do
{
int nClickedNum;
do
{
int x=m_ptLeftTop.x+rand()%360+1;
int y=m_ptLeftTop.y+rand()%360+1;
//mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0);
OnLButtonDown(0,CPoint(x,y));
if (m_CheckIsRight()==FALSE)
{
OnBnClickedOk();
continue;
}
nClickedNum=0;
for (int i=0;i<9;i++)
for (int j=0;j<9;j++)
if (m_element[i][j].GetNum())
nClickedNum++;
} while (nClickedNum<=17);
m_UpDate();
m_SaveNum();
b=m_Try(0,0,&m_nSavedNum[0][0]);
} while (!b);
OnBnClickedRestart();
//mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE,-80,-80,0,0);
// mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
// mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
//OnLButtonDown(0,CPoint(40,40));
}
void CshuduDlg::OnRestart()
{
OnBnClickedRestart();
}
void CshuduDlg::OnRandomGame()
{
OnBnClickedRandomGame();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -