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

📄 aiantdlg.cpp

📁 本程序实现了在一个二维的网格模型中
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			dc->MoveTo(x+5,y+15);
			dc->LineTo(x+25,y+15);
			dc->LineTo(x+20,y+20);
			dc->MoveTo(x+25,y+15);
			dc->LineTo(x+20,y+10);
			break;
		};
	case 5: 
		{
			dc->Rectangle(x,y,30+x,30+y);
			dc->MoveTo(x+15,y+5);
			dc->LineTo(x+15,y+25);
			dc->LineTo(x+20,y+20);
			dc->MoveTo(x+15,y+25);
			dc->LineTo(x+10,y+20);
			break;
		};
	case 6: 
		{
			dc->Rectangle(x,y,30+x,30+y);
			dc->MoveTo(x+25,y+15);
			dc->LineTo(x+5,y+15);
			dc->LineTo(x+10,y+20);
			dc->MoveTo(x+5,y+15);
			dc->LineTo(x+10,y+10);
			break;
		};
	case 7: 
		{
			dc->Rectangle(x,y,30+x,30+y);
			dc->MoveTo(x+15,y+25);
			dc->LineTo(x+15,y+5);
			dc->LineTo(x+20,y+10);
			dc->MoveTo(x+15,y+5);
			dc->LineTo(x+10,y+10);
			break;
		};
	};

}



void CAIAntDlg::OnAuto() 
{
	// TODO: Add your control notification handler code here
	m_single.EnableWindow(false);
	m_reset.EnableWindow(false);
	m_aiantchoice.EnableWindow(false);
    SetTimer(1,200,NULL);
	
	
}

void CAIAntDlg::OnReset() 
{
	// TODO: Add your control notification handler code here

	KillTimer(1);

	int i=m_aiantchoice.GetCurSel();
    switch (i)
	{
	case 0:
		{
			antnum=1;
			ant.SetPos(13);
			ant.SetDir(1);
			ant.SetTryDir(0);
			break;
		};
	case 1:
		{
			antnum=2;
			ant.SetPos(55);
			ant.SetDir(1);
			ant.SetTryDir(0);
			break;
		};
	case 2:
		{
			antnum=3;
			ant.SetPos(83);
			ant.SetDir(1);
			ant.SetTryDir(0);
			break;
		};
	};

	InitGrid();

	Draw();
	
}

void CAIAntDlg::OnSingle() 
{
	// TODO: Add your control notification handler code here

    m_auto.EnableWindow(false);
	m_reset.EnableWindow(false);
	m_aiantchoice.EnableWindow(false);
	m_single.SetWindowText("下一步");

	CClientDC dc(this),*mydc;
	mydc=&dc;

	if(ant.GetTryDir()==4)//是否蚂蚁已经探测过四周
	{
			
		AfxMessageBox("结束");
		m_auto.EnableWindow(true);
	    m_reset.EnableWindow(true);
		m_aiantchoice.EnableWindow(true);
		m_single.SetWindowText("单步演示");
	}
	else
	{
		int dir,pos,frontpos;

		dir=ant.GetDir();
		pos=ant.GetPos();
        //求前方位置
		frontpos=-1;
        if((dir==1)&&(pos%12!=11))
			frontpos=pos+1;
		if((dir==2)&&(pos<132))
			frontpos=pos+12;
		if((dir==3)&&(pos%12!=1))
			frontpos=pos-1;
		if((dir==4)&&(pos>11))
			frontpos=pos-12;

		if(frontpos!=-1)//可以向前
		{
			switch (grid.Get(frontpos))
			{
			case 0: //前方无路
				{
					int trydir=ant.GetTryDir();
					ant.SetTryDir(trydir+1);
				    if(dir==4)
						ant.SetDir(1);
					else
						ant.SetDir(dir+1);
					DrawGrid(mydc,ant.GetPos(),ant.GetDir()+2);
					DrawCutline(mydc,470,35,ant.GetDir()+3);
					break;
				};
			case 1://前方有路,且状态为关
				{
					grid.Set(frontpos,2);
					DrawGrid(mydc,frontpos,2);
					break;
				};
			case 2://前方有路,且状态为开
				{
					if( ((antnum==1)&&(ant.GetPos()==13))||((antnum==2)&&(ant.GetPos()==55))||((antnum==3)&&(ant.GetPos()==83)) )
					{
						DrawGrid(mydc,ant.GetPos(),0);
					}
					else
					{
						DrawGrid(mydc,ant.GetPos(),2);
					};
					grid.Set(frontpos,3);
					ant.SetPos(frontpos);
					ant.SetTryDir(0);
					DrawGrid(mydc,ant.GetPos(),ant.GetDir()+2);
					break;					
				};
			case 3: //前方有路,但走过
				{
					int trydir=ant.GetTryDir();
					ant.SetTryDir(trydir+1);
				    if(dir==4)
						ant.SetDir(1);
					else
						ant.SetDir(dir+1);
					DrawGrid(mydc,ant.GetPos(),ant.GetDir()+2);
					DrawCutline(mydc,470,35,ant.GetDir()+3);
					break;					
				}
			}
		}
		else//前方不可走
		{
			int trydir=ant.GetTryDir();
			ant.SetTryDir(trydir+1);
			if(dir==4)
				ant.SetDir(1);
			else
				ant.SetDir(dir+1);
			DrawGrid(mydc,ant.GetPos(),ant.GetDir()+2);
			DrawCutline(mydc,470,35,ant.GetDir()+3);
		}
	};	


}



void CAIAntDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default

	CClientDC dc(this),*mydc;
	mydc=&dc;

	if(ant.GetTryDir()==4)//是否蚂蚁已经探测过四周
	{
		KillTimer(1);	
		AfxMessageBox("结束");
		m_single.EnableWindow(true);
	    m_reset.EnableWindow(true);
		m_aiantchoice.EnableWindow(true);
	}
	else
	{
		int dir,pos,frontpos;

		dir=ant.GetDir();
		pos=ant.GetPos();
        //求前方位置
		frontpos=-1;
        if((dir==1)&&(pos%12!=11))
			frontpos=pos+1;
		if((dir==2)&&(pos<132))
			frontpos=pos+12;
		if((dir==3)&&(pos%12!=1))
			frontpos=pos-1;
		if((dir==4)&&(pos>11))
			frontpos=pos-12;

		if(frontpos!=-1)//可以向前
		{
			switch (grid.Get(frontpos))
			{
			case 0: //前方无路
				{
					int trydir=ant.GetTryDir();
					ant.SetTryDir(trydir+1);
				    if(dir==4)
						ant.SetDir(1);
					else
						ant.SetDir(dir+1);
					DrawGrid(mydc,ant.GetPos(),ant.GetDir()+2);
					DrawCutline(mydc,470,35,ant.GetDir()+3);
					break;
				};
			case 1://前方有路,且状态为关
				{
					grid.Set(frontpos,2);
					DrawGrid(mydc,frontpos,2);
					break;
				};
			case 2://前方有路,且状态为开
				{
					if( ((antnum==1)&&(ant.GetPos()==13))||((antnum==2)&&(ant.GetPos()==55))||((antnum==3)&&(ant.GetPos()==83)) )
					{
						DrawGrid(mydc,ant.GetPos(),0);
					}
					else
					{
						DrawGrid(mydc,ant.GetPos(),2);
					};
					grid.Set(frontpos,3);
					ant.SetPos(frontpos);
					ant.SetTryDir(0);
					DrawGrid(mydc,ant.GetPos(),ant.GetDir()+2);
					break;					
				};
			case 3: //前方有路,但走过
				{
					int trydir=ant.GetTryDir();
					ant.SetTryDir(trydir+1);
				    if(dir==4)
						ant.SetDir(1);
					else
						ant.SetDir(dir+1);
					DrawGrid(mydc,ant.GetPos(),ant.GetDir()+2);
					DrawCutline(mydc,470,35,ant.GetDir()+3);
					break;					
				}
			}
		}
		else//前方不可走
		{
			int trydir=ant.GetTryDir();
			ant.SetTryDir(trydir+1);
			if(dir==4)
				ant.SetDir(1);
			else
				ant.SetDir(dir+1);
			DrawGrid(mydc,ant.GetPos(),ant.GetDir()+2);
			DrawCutline(mydc,470,35,ant.GetDir()+3);
		}
	};	
	CDialog::OnTimer(nIDEvent);
}

void CAIAntDlg::OnSelchangeComboAiant() 
{
	// TODO: Add your control notification handler code here

	int i=m_aiantchoice.GetCurSel();

	switch (i)
	{
	case 0:
		{
			antnum=1;
			ant.SetPos(13);
			ant.SetDir(1);
			ant.SetTryDir(0);
			break;
		};
	case 1:
		{
			antnum=2;
			ant.SetPos(55);
			ant.SetDir(1);
			ant.SetTryDir(0);
			break;
		};
	case 2:
		{
			antnum=3;
			ant.SetPos(83);
			ant.SetDir(1);
			ant.SetTryDir(0);
			break;
		};
	};
	OnReset();

	
	
}

void CAIAntDlg::InitGrid()
{
	for(int i=0;i<144;i++)
		grid.Set(i,0);
	grid.Set(25,1);	grid.Set(28,1);	grid.Set(29,1);	grid.Set(30,1); grid.Set(37,1);
	grid.Set(40,1);	grid.Set(42,1);	grid.Set(49,1); grid.Set(50,1); grid.Set(51,1);
	grid.Set(52,1);	grid.Set(54,1); grid.Set(66,1);	grid.Set(78,1);	grid.Set(90,1);
	grid.Set(91,1); grid.Set(92,1); grid.Set(93,1);	grid.Set(94,1);	grid.Set(95,1);
    grid.Set(100,1);grid.Set(101,1);grid.Set(102,1);grid.Set(105,1);grid.Set(112,1);
	grid.Set(117,1);grid.Set(124,1);grid.Set(125,1);grid.Set(126,1);grid.Set(127,1);
	grid.Set(128,1);grid.Set(129,1);
}

void CAIAntDlg::Draw()
{
	CClientDC dc(this),*mydc;
	mydc=&dc;

	//画棋盘
    for(int i=0;i<144;i++)
	{
		if(grid.Get(i)==0)
			DrawGrid(mydc,i,0);
		else if(grid.Get(i)==1)
			DrawGrid(mydc,i,1);
		else 
			DrawGrid(mydc,i,2); 
	};
    
	//画蚂蚁及方向
	if(antnum!=0)
	{
		DrawCutline(mydc,470,35,ant.GetDir()+3);
		DrawGrid(mydc,ant.GetPos(),ant.GetDir()+2);
	}; 

}

⌨️ 快捷键说明

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