📄 hanotdlg.cpp
字号:
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 + -