⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shududlg.cpp

📁 在9格寬×9格高的大九宮格中有9個3格寬×3格高的小九宮格
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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 + -