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

📄 aidlg.cpp

📁 滑块问题求解系统:利用深度优先搜索和广度优先搜索解决有趣的滑块问题求解系统。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// AIDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "AI.h"
#include "AIDlg.h"
#include ".\aidlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CAIDlg 对话框




CAIDlg::CAIDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CAIDlg::IDD, pParent)	
	, m_maxstep(25)
	, m_sleep(500)
	, m_byhand(false)
	, m_selectval(0)
	, gamestart(false)	
	, search_type(TYPE_ASTAR1)
	, m_heuristic(1)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);	
	memset(pos_begin, -1, sizeof(pos_begin));
	memset(pos_end, -1, sizeof(pos_end));
	memset(pos_begin_return, -1, sizeof(pos_begin_return));
	memset(pos_end_return, -1, sizeof(pos_end_return));
}



void CAIDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);

	for(int i = IDC_INIT_0, j = 0; i <= IDC_INIT_8; ++i, ++j)
		DDX_Control(pDX, i, m_init[j]);
	for(int i = IDC_END_0, j = 0; i <= IDC_END_8; ++i, ++j)
		DDX_Control(pDX, i, m_end[j]);
	for(int i = IDC_HAND_0, j = 1; i <= IDC_HAND_7; ++i, ++j)
		DDX_Control(pDX, i, m_hand[j]);
	for(int i = IDC_CHECK_BEGIN1, j = 1; i <= IDC_CHECK_BEGIN8; ++i, ++j)
		DDX_Control(pDX, i, select_begin[j]);
	for(int i = IDC_CHECK_END1, j = 1; i <= IDC_CHECK_END8; ++i, ++j)
		DDX_Control(pDX, i, select_end[j]);
	DDX_Control(pDX, IDC_CHECK_BEGIN, m_random_begin);
	DDX_Control(pDX, IDC_CHECK_END, m_random_end);
	DDX_Control(pDX, IDC_BUTTON_NEXT, nextstep);
	DDX_Control(pDX, IDC_BUTTON_AUTO, display);
	DDX_Control(pDX, IDC_BUTTON_PREV, prevstep);
	DDX_Control(pDX, IDC_BUTTON_RECOVER, recover);
}

BEGIN_MESSAGE_MAP(CAIDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDC_BUTTON_INTRODUCTION, OnBnClickedButtonIntroduction)
	ON_BN_CLICKED(IDC_BUTTON_HAND, OnBnClickedButtonHand)
	ON_BN_CLICKED(IDC_HAND_0, OnBnClickedHand)
	ON_BN_CLICKED(IDC_HAND_1, OnBnClickedHand)
	ON_BN_CLICKED(IDC_HAND_2, OnBnClickedHand)
	ON_BN_CLICKED(IDC_HAND_3, OnBnClickedHand)
	ON_BN_CLICKED(IDC_HAND_4, OnBnClickedHand)
	ON_BN_CLICKED(IDC_HAND_5, OnBnClickedHand)
	ON_BN_CLICKED(IDC_HAND_6, OnBnClickedHand)
	ON_BN_CLICKED(IDC_HAND_7, OnBnClickedHand)
	ON_BN_CLICKED(IDC_END_0, OnBnClickedEnd)
	ON_BN_CLICKED(IDC_END_1, OnBnClickedEnd)
	ON_BN_CLICKED(IDC_END_2, OnBnClickedEnd)
	ON_BN_CLICKED(IDC_END_3, OnBnClickedEnd)
	ON_BN_CLICKED(IDC_END_4, OnBnClickedEnd)
	ON_BN_CLICKED(IDC_END_5, OnBnClickedEnd)
	ON_BN_CLICKED(IDC_END_6, OnBnClickedEnd)
	ON_BN_CLICKED(IDC_END_7, OnBnClickedEnd)
	ON_BN_CLICKED(IDC_END_8, OnBnClickedEnd)
	ON_BN_CLICKED(IDC_INIT_0, OnBnClickedInit)
	ON_BN_CLICKED(IDC_INIT_1, OnBnClickedInit)
	ON_BN_CLICKED(IDC_INIT_2, OnBnClickedInit)
	ON_BN_CLICKED(IDC_INIT_3, OnBnClickedInit)
	ON_BN_CLICKED(IDC_INIT_4, OnBnClickedInit)
	ON_BN_CLICKED(IDC_INIT_5, OnBnClickedInit)
	ON_BN_CLICKED(IDC_INIT_6, OnBnClickedInit)
	ON_BN_CLICKED(IDC_INIT_7, OnBnClickedInit)
	ON_BN_CLICKED(IDC_INIT_8, OnBnClickedInit)
	ON_BN_CLICKED(IDC_CHECK_HAND, OnBnClickedCheckHand)
	ON_BN_CLICKED(IDC_BUTTON_RANDOM, OnBnClickedButtonRandom)
	ON_BN_CLICKED(IDC_RADIO_DFS, OnBnClickedSearchType)
	ON_BN_CLICKED(IDC_RADIO_BDFS, OnBnClickedSearchType)
	ON_BN_CLICKED(IDC_RADIO_BFS, OnBnClickedSearchType)
	ON_BN_CLICKED(IDC_RADIO_TBFS, OnBnClickedSearchType)
	ON_BN_CLICKED(IDC_RADIO_ASTAR1, OnBnClickedSearchType)
	ON_BN_CLICKED(IDC_RADIO_ASTAR2, OnBnClickedSearchType)
	ON_BN_CLICKED(IDC_RADIO_IDFS, OnBnClickedSearchType)
	ON_BN_CLICKED(IDC_RADIO_IDA, OnBnClickedSearchType)
	ON_BN_CLICKED(IDC_BUTTON_BEGIN, OnBnClickedButtonBegin)
	ON_BN_CLICKED(IDC_BUTTON_NEXT, OnBnClickedButtonNext)
	ON_BN_CLICKED(IDC_BUTTON_PREV, OnBnClickedButtonPrev)
	ON_BN_CLICKED(IDC_BUTTON_DEFAULT, OnBnClickedButtonDefault)
	ON_BN_CLICKED(IDC_BUTTON_RECOVER, OnBnClickedButtonRecover)
	ON_BN_CLICKED(IDC_BUTTON_AUTO, OnBnClickedButtonAuto)
	ON_COMMAND(ID_ABOUT, OnAbout)
	ON_COMMAND(ID_GIRL, OnGirl)
	ON_COMMAND(ID_DIGITS, OnDigits)
	ON_COMMAND(ID_, SetParameter)
	ON_COMMAND(ID_ICO, OnIco)
	ON_COMMAND(ID_CREATE, OnCreate)
	ON_COMMAND(ID_HELP, OnHelp)
	ON_COMMAND(ID_COMPARE, OnCompare)
END_MESSAGE_MAP()


// CAIDlg 消息处理程序

BOOL CAIDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 将\“关于...\”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码


	//设置窗口大小
	GetWindowRect(&rectLarge);
	GetWindowRect(&rectShow);
	GetDlgItem(IDC_EDIT_INTRO)->GetWindowRect(&rectRight);
	GetDlgItem(IDC_SEP)->GetWindowRect(&rectDown);
	rectShow.bottom = rectDown.top;
	rectShow.right = rectRight.left;
	SetWindowPos(NULL,0,0,rectShow.Width(),rectShow.Height(),
			SWP_NOMOVE | SWP_NOZORDER);
	
	//设置各个编辑框初始数据
	SetDlgItemInt(IDC_EDIT_HER, m_heuristic);
	SetDlgItemInt(IDC_EDIT_MAXSTEP, m_maxstep);
	SetDlgItemInt(IDC_EDIT_SLEEP, m_sleep);

	//是否随机状态
	m_random_begin.SetCheck(1);
	m_random_end.SetCheck(1);
	( (CButton *) GetDlgItem(IDC_CHECK_NOANSWER) )->SetCheck(1);
	
	//位图资源
	loadpicture(IDB_BITMAP1);

	//演示按钮初状态
	prevstep.EnableWindow(FALSE);
	nextstep.EnableWindow(FALSE);
	recover.EnableWindow(FALSE);
	display.EnableWindow(FALSE);

	//状态
	SetDlgItemText(IDC_NOWSTEP, "     未开始");
	( (CButton *) GetDlgItem(IDC_RADIO_ASTAR1) )->SetCheck(1);
	search = &astar1;
	SetInstroduction();

	//开始不能生成状态图
	GetMenu()->EnableMenuItem(ID_CREATE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);

	SetClassLong(m_hWnd, GCL_HICON, (LONG)LoadIcon(NULL, MAKEINTRESOURCE(IDR_MAINFRAME) ) );

	return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

void CAIDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CAIDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CAIDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CAIDlg::OnBnClickedButtonIntroduction()
{
	// TODO: 在此添加控件通知处理程序代码
	CString str;
	if(GetDlgItemText(IDC_BUTTON_INTRODUCTION, str), str == "详细>>"){
		SetDlgItemText(IDC_BUTTON_INTRODUCTION, "缩略<<");
	}else{
		SetDlgItemText(IDC_BUTTON_INTRODUCTION, "详细>>");
	}
	if( str == "详细>>")
		rectShow.right = rectLarge.right;
	else
		rectShow.right = rectRight.left;
	SetWindowPos(NULL,0,0,rectShow.Width(),rectShow.Height(),
			SWP_NOMOVE | SWP_NOZORDER);	
}

void CAIDlg::OnBnClickedButtonHand()
{
	// TODO: 在此添加控件通知处理程序代码	
	if(!path.empty() && ((CButton *) GetDlgItem(IDC_BUTTON_HAND) )->GetCheck() &&
		IDOK != MessageBox("将要丢失原来信息,是否确认", "确认", MB_OKCANCEL) ){
			( (CButton *) GetDlgItem(IDC_BUTTON_HAND) )->SetCheck(FALSE);			
			return;
	}	
	if( ( (CButton *) GetDlgItem(IDC_BUTTON_HAND) )->GetCheck() ){		
		path.clear();
		rectShow.bottom = rectLarge.bottom;
		prevstep.EnableWindow(FALSE);
		nextstep.EnableWindow(FALSE);
		display.EnableWindow(FALSE);
		recover.EnableWindow(FALSE);
		SetNowstep(0);
	}else
		rectShow.bottom = rectDown.top;
	SetWindowPos(NULL,0,0,rectShow.Width(),rectShow.Height(),
			SWP_NOMOVE | SWP_NOZORDER);	
	GetMenu()->EnableMenuItem(ID_CREATE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
}

void CAIDlg::OnBnClickedHand()
{
	// TODO: 在此添加控件通知处理程序代码	
	m_selectval = GetFocus()->GetDlgCtrlID() - IDC_HAND_0 + 1;
}


void CAIDlg::changeBitmap(CButton button[], CButton check[], int pos[], int pos_return[], int val){
	static bool exchange = false;
	if(m_selectval){
		if(pos[m_selectval] == val)
			return;
		if(pos_return[val] != -1){
			if(exchange){
				pos[pos_return[val] ] = pos[m_selectval];
			}else{
				check[pos_return[val] ].SetCheck(0);
				pos[pos_return[val] ] = -1;
			}			
		}
		if(pos[m_selectval] != -1){
			if(exchange){
				button[pos[m_selectval]].SetBitmap(m_bitmap[pos_return[val]]);
				pos_return[pos[m_selectval ] ] = pos_return[val];
			}else{
				button[pos[m_selectval]].SetBitmap(NULL);
				pos_return[pos[m_selectval ] ] = -1;
			}
		}
		if(exchange)
			exchange = false;
		pos[m_selectval] = val;
		pos_return[val] = m_selectval;
		button[val].SetBitmap(m_bitmap[m_selectval]);
		check[m_selectval].SetCheck(1);
		m_selectval = 0;
	}else{
		if(pos_return[val] != -1){
			m_selectval = pos_return[val];
			exchange = true;
		}
	}	
}

void CAIDlg::OnBnClickedEnd()
{
	// TODO: 在此添加控件通知处理程序代码
	if(!m_byhand && !gamestart)
		changeBitmap(m_end, select_end, pos_end, pos_end_return, GetFocus()->GetDlgCtrlID() - IDC_END_0);	
}

void CAIDlg::OnBnClickedInit()
{
	// TODO: 在此添加控件通知处理程序代码
	if(!m_byhand && !gamestart)
		changeBitmap(m_init, select_begin, pos_begin, pos_begin_return, GetFocus()->GetDlgCtrlID() - IDC_INIT_0);
	else{
		if(m_byhand){

⌨️ 快捷键说明

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