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

📄 hanotdlg.cpp

📁 实现了汉诺塔的程序设计
💻 CPP
📖 第 1 页 / 共 2 页
字号:
void CHanotDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	
	if(A.get_pan_bianhao(A_add)!=C.get_pan_bianhao(C_add))
		dome_mov();
	else {KillTimer(1);zhuangtai=0;}

	CDialog::OnTimer(nIDEvent);
}
void dome_mov() //移动汉诺塔模块
{
	int step_s,step_d,j,temp; //setp_s: 技术
	//CDC* XX=GetDC();
	CImageList* ilist1=&bmplist;
		
 if(fmod(ta_jie,2)){step_s=2;step_d=1;}else {step_s=1;step_d=2;}//判断奇数盘的步数和偶数盘的步数
 switch(to)
  {
   case 1:
                if(B.get_pan_bianhao(B_add) < C.get_pan_bianhao(C_add))
				{
					from=2;temp=B.get_pan_bianhao(B_add);
					B.set_pan_bianhao(B_add--,0);
				}
				else 
				{
					from=3;temp=C.get_pan_bianhao(C_add);
					C.set_pan_bianhao(C_add--,0);
				}
	break;
   case 2:
                if(A.get_pan_bianhao(A_add) < C.get_pan_bianhao(C_add))
				{
					j=A.get_pan_bianhao(A_add);
					from=1;temp=A.get_pan_bianhao(A_add);
					A.set_pan_bianhao(A_add--,0);
				}
				else 
				{
					from=3;temp=C.get_pan_bianhao(C_add);
					C.set_pan_bianhao(C_add--,0);
				}
	break;
   case 3:
                if(A.get_pan_bianhao(A_add) < B.get_pan_bianhao(B_add))
				{
					j=A.get_pan_bianhao(A_add);
					from=1;temp=A.get_pan_bianhao(A_add);
					A.set_pan_bianhao(A_add--,0);
				}
				else 
				{
					from=2;temp=B.get_pan_bianhao(B_add);
					B.set_pan_bianhao(B_add--,0);
				}
	break;
  }  
  //以下一行求得下一步将要移动到的柱子
  switch(from)
  {
  case 1:if(fmod(temp,2))
		 {
			 to=from+step_d;
			 if(to==2)B.set_pan_bianhao(++B_add,temp);
			 else C.set_pan_bianhao(++C_add,temp);
		 }
	     else 
		 {
			 to=from+step_s;
			 if(to==2)B.set_pan_bianhao(++B_add,temp);
			 else C.set_pan_bianhao(++C_add,temp);
		 }
	  break;
  case 2:if(fmod(temp,2))
		 {
			 to=from+step_d;
			 if(to==4) to=1;
			 else;
			 if(to==1)A.set_pan_bianhao(++A_add,temp);
			 else C.set_pan_bianhao(++C_add,temp);
		 }
	     else 
		 {
			 to=from+step_s;
			 if(to==4) to=1;
			 else;
			 if(to==1)A.set_pan_bianhao(++A_add,temp);
			 else C.set_pan_bianhao(++C_add,temp);
		 }
	  break;
  case 3:if(fmod(temp,2))
		 {
			 to=step_d;
			 if(to==1)A.set_pan_bianhao(++A_add,temp);
			 else B.set_pan_bianhao(++B_add,temp);
		 }
	     else 
		 {
			 to=step_s;
			 if(to==1)A.set_pan_bianhao(++A_add,temp);
			 else B.set_pan_bianhao(++B_add,temp);
		 }
	  break;
 } 
A.gunshow(10,300,ilist1,nwe);
B.gunshow(220,300,ilist1,nwe);
C.gunshow(430,300,ilist1,nwe);  
}

void CHanotDlg::OnDOME() 
{
	if(zhuangtai!=1)
	{
	SetTimer(1,m_time*100,NULL);
	//dome_mov();
	zhuangtai=2;//正在进行自动
	m_zhuangtai="正在进行自动演示";
	UpdateData(false);
	}
}

void CHanotDlg::OnCustomdrawSlider2(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	m_time=m_slider2.GetPos(); //显示并设定汉诺塔的阶数
	UpdateData(false);
	*pResult = 0;
}

void CHanotDlg::OnA_B() 
{
	if(zhuangtai!=2){
	if(A.get_pan_bianhao(A_add)<B.get_pan_bianhao(B_add))
	{
		from=1;to=2;
		B.set_pan_bianhao(++B_add,A.get_pan_bianhao(A_add));
		A.set_pan_bianhao(A_add--,0);
	}
	else
	{AfxMessageBox("不能移动");}
	ta_show();
	zhuangtai=1; //手动之后由于破坏了自动的移动顺序.
				//只能再进行手动,否则会出错.
	m_zhuangtai="只能手动操作";
	UpdateData(false);
	}
}

void CHanotDlg::OnA_C() 
{
	if(zhuangtai!=2){
	if(A.get_pan_bianhao(A_add)<C.get_pan_bianhao(C_add))
	{
		from=1;to=3;
		C.set_pan_bianhao(++C_add,A.get_pan_bianhao(A_add));
		A.set_pan_bianhao(A_add--,0);
	}
	else
	{AfxMessageBox("不能移动");}
	ta_show();
	zhuangtai=1;
	m_zhuangtai="只能手动操作";
	UpdateData(false);
	}
}

void CHanotDlg::OnB_A() 
{
	if(zhuangtai!=2){
	if(B.get_pan_bianhao(B_add)<A.get_pan_bianhao(A_add))
	{
		from=2;to=1;
		A.set_pan_bianhao(++A_add,B.get_pan_bianhao(B_add));
		B.set_pan_bianhao(B_add--,0);
	}
	else
	{AfxMessageBox("不能移动");}
	ta_show();
	zhuangtai=1;
	m_zhuangtai="只能手动操作";
	UpdateData(false);
	}
}

void CHanotDlg::OnB_C() 
{
	if(zhuangtai!=2){
	if(B.get_pan_bianhao(B_add)<C.get_pan_bianhao(C_add))
	{
		from=2;to=3;
		C.set_pan_bianhao(++C_add,B.get_pan_bianhao(B_add));
		B.set_pan_bianhao(B_add--,0);
	}
	else
	{AfxMessageBox("不能移动");}
	ta_show();
	zhuangtai=1;
	m_zhuangtai="只能手动操作";
	UpdateData(false);
	}
}

void CHanotDlg::OnC_A() 
{
	if(zhuangtai!=2){
	if(C.get_pan_bianhao(C_add)<A.get_pan_bianhao(A_add))
	{
		from=3;to=1;
		A.set_pan_bianhao(++A_add,C.get_pan_bianhao(C_add));
		C.set_pan_bianhao(C_add--,0);
	}
	else
	{AfxMessageBox("不能移动");}
	ta_show();
	zhuangtai=1;
	m_zhuangtai="只能手动操作";
	UpdateData(false);
	}
}

void CHanotDlg::OnC_B() 
{
	if(zhuangtai!=2){
	if(C.get_pan_bianhao(C_add)<B.get_pan_bianhao(B_add))
	{
		from=3;to=2;
		B.set_pan_bianhao(++B_add,C.get_pan_bianhao(C_add));
		C.set_pan_bianhao(C_add--,0);
	}
	else
	{AfxMessageBox("不能移动");}
	ta_show();
	zhuangtai=1;
	m_zhuangtai="只能手动操作";
	UpdateData(false);
	}
}
void ta_show()//显示塔模块
{
	CImageList* ilist1=&bmplist;
	A.gunshow(10,300,ilist1,nwe);
	B.gunshow(220,300,ilist1,nwe);
	C.gunshow(430,300,ilist1,nwe); 
}


void CHanotDlg::OnSAVE() 
{
	int i;
	int temp[7],ta_temp[17];
	CFile savedate;
	UpdateData(true);
    //char* savename=m_save;
	if(zhuangtai!=2){
	savedate.Open(m_save,CFile::modeCreate|CFile::modeWrite,NULL);
	//保存当前基本状态
	temp[0]=zhuangtai;
	temp[1]=from;
	temp[2]=to;
	temp[3]=A_add;
	temp[4]=B_add;
	temp[5]=C_add;
	temp[6]=ta_jie;
	savedate.Write(temp,7*sizeof(int));
	//保存A、B、C塔盘数组
	for(i=0;i<17;i++)
	{
		ta_temp[i]=A.get_pan_bianhao(i);
	}
	savedate.Write(ta_temp,17*sizeof(int));
	for(i=0;i<17;i++)
	{
		ta_temp[i]=B.get_pan_bianhao(i);
	}
	savedate.Write(ta_temp,17*sizeof(int));
	for(i=0;i<17;i++)
	{
		ta_temp[i]=C.get_pan_bianhao(i);
	}
	savedate.Write(ta_temp,17*sizeof(int));
	AfxMessageBox("保存完毕");
	savedate.Close();}

}

void CHanotDlg::OnLOAD() 
{
	int i;
	int temp[7],ta_temp[17];
	CFile savedate;
	UpdateData(true);
	//char* savename="hanot.sav";
	//strcat(savename, ".save");
	if(zhuangtai!=2){
	CFileException e;
	if(!savedate.Open(m_save,CFile::modeRead,&e))
	{
#ifdef _DEBUG
		AfxMessageBox("文件不存在");
		afxDump<<"文件不存在"<<e.m_cause<<"\n";
#endif
	}
	else
	{
	//保存当前基本状态
	savedate.Read(temp,7*sizeof(int));
	zhuangtai=temp[0];
	from=temp[1];
	to=temp[2];
	A_add=temp[3];
	B_add=temp[4];
	C_add=temp[5];
	ta_jie=temp[6];
	savedate.Read(ta_temp,17*sizeof(int));
	for(i=0;i<17;i++)
	{
		A.set_pan_bianhao(i,ta_temp[i]);
	}
	savedate.Read(ta_temp,17*sizeof(int));
	for(i=0;i<17;i++)
	{
		B.set_pan_bianhao(i,ta_temp[i]);
	}
	savedate.Read(ta_temp,17*sizeof(int));
	for(i=0;i<17;i++)
	{
		C.set_pan_bianhao(i,ta_temp[i]);
	}
	ta_show();
	switch(zhuangtai)
	{
	case 0:m_zhuangtai="可以手动和自动";
		break;
	case 1:m_zhuangtai="只可以手动";
		break;
	}
	UpdateData(false);
	savedate.Close();}}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -