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

📄 skyblue_rectview.cpp

📁 利用人工智能的经典算法实现迷宫游戏;里面的A星(a*)算法可以很方便的移植到应用程序中
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		InvalidateCurrent();

		//改变形状代码
		m_currentRect = m_lscurrentRect;
	}
	else
	{//恢复原来状态
		GameStatus[x1][y1] = MAP_STATE_NOT_EMPTY;
		GameStatus[x2][y2] = MAP_STATE_NOT_EMPTY;
		GameStatus[x3][y3] = MAP_STATE_NOT_EMPTY;
		GameStatus[x4][y4] = MAP_STATE_NOT_EMPTY;
	}

	//判断是否已到底
	IsBottom();
}


/* * * * * * * * * * * * * * * * * * * * * *
* 内部函数:游戏开始
*
* 最后修改日期:2005.8.6
* * * * * * * * * * * * * * * * * * * * * */
void CSkyblue_RectView::OnGameStart() 
{
	if (!m_bGamePaush)  //如果不是游戏暂停状态,则必须作些初始工作
	{
		m_bGameEnd = FALSE;
		//总分值清零, 并显示总分记分牌
		m_iPerformance = 0;
	
		//显示当前的区域及游戏级别的汉字描述
		CurrentAreaAndLevel();
		
		CRect rect(m_iStartY, m_iStartX, m_iStartY+440, m_iStartX+370);
		InvalidateRect(&rect);
	}

	m_bGamePaush = FALSE;
	SetTimer(1,1500-250*m_iLevel,NULL);
}


//游戏暂停
void CSkyblue_RectView::OnGamePaush() 
{
	m_bGamePaush = TRUE;

	KillTimer(1);
}

/* * * * * * * * * * * * * * * * * * * * * *
* 内部函数:游戏结束
*
* 最后修改日期:2005.8.6
* * * * * * * * * * * * * * * * * * * * * */
void CSkyblue_RectView::OnGameEnd() 
{
	m_bGameEnd = TRUE;

	int i,j;
	for (i=0;i<m_iRow;i++)
		for (j=0;j<m_iCol;j++)
			GameStatus[i][j]=0;

	CRect rect(m_iStartY, m_iStartX, m_iStartY+440, m_iStartX+370);
	InvalidateRect(&rect);

	m_bGamePaush = FALSE;  //清除游戏暂停状态

	KillTimer(1);	

}

/* * * * * * * * * * * * * * * * * * * * * *
* 内部函数:刷新当前的区域
*
* 只刷新需要刷新的四个小方块区域,防止屏幕抖动情况发生
*
* 最后修改日期:2005.8.6
* * * * * * * * * * * * * * * * * * * * * */
void CSkyblue_RectView::InvalidateCurrent()
{
	int i;
	
	for (i=0;i<4;i++)
	{
	CRect rect(m_iStartX+ActiveStatus[i][1]*m_iLarge, 
				m_iStartY+ActiveStatus[i][0]*m_iLarge,
				m_iStartX+(ActiveStatus[i][1]+1)*m_iLarge+5,
				m_iStartY+(ActiveStatus[i][0]+1)*m_iLarge);
			//InvalidateRect(&rect);
			Invalidate(FALSE);
	}
}


/* * * * * * * * * * * * * * * * * * * * * *
* 内部函数:游戏设置
*
* 最后修改日期:2005.8.6
* * * * * * * * * * * * * * * * * * * * * */
void CSkyblue_RectView::OnGameOption() 
{
	//参数顺序: 区域大小代码:0-3,分别为:12X10,18X15,24X20,m_iLargeX25
	//级别:0-5,分别为:1500,1200,1000,800,600,400
	//背景音乐:TRUE 或者 FALSE
	int m_lsArea;
	switch(m_iRow)
	{
	case 12:
		m_lsArea = 0;
		break;
	case 18:
		m_lsArea = 1;
		break;
	case 24:
		m_lsArea = 2;
		break;
	case 30:
		m_lsArea = 3;
		break;
	}

	COptionDlg dlg(m_lsArea,m_iLevel,m_iBlockSytle,m_bMusic,m_bDrawGrid);
	
	if (dlg.DoModal()==IDOK)
	{
		//确定区域的大小
		switch(dlg.m_iArea)
		{
		case 0:
			m_iRow = 12;
			m_iCol = 10;
			m_iLarge = 30;
			break;
		case 1:
			m_iRow = 18;
			m_iCol = 15;
			m_iLarge = 20;
			break;
		case 2:
			m_iRow = 24;
			m_iCol = 20;
			m_iLarge = 15;
			break;
		case 3:
			m_iRow = 30;
			m_iCol = 25;
			m_iLarge = 12;
			break;
		}

		//确定级别
		m_iLevel = dlg.m_iLevel;
		//选择的样式
		m_iBlockSytle = dlg.m_iBlockStyle;

		//确定是否绘网格背景
		m_bDrawGrid = dlg.m_bDrawGrid;

        //检查是否插放音乐								  
		m_bMusic = dlg.m_bMusic;
		if (m_bMusic)
			PlayMid();
		else
			StopMid();

		Invalidate();
	}	
}


//用于生成当前区域大小与级别所对应的汉字描述
void CSkyblue_RectView::CurrentAreaAndLevel()
{
	switch(m_iRow)
	{
	case 12:
		m_strArea = "12行10列"; break;
	case 18:
		m_strArea = "18行15列"; break;
	case 24:
		m_strArea = "24行20列"; break;
	case 30:
		m_strArea = "30行25列"; break;
	}

	switch(m_iLevel)
	{
	case 0:
		m_strLevel = "第一级: 入门级"; break;
	case 1:
		m_strLevel = "第二级: 初级级"; break;
	case 2:
		m_strLevel = "第三级: 中级"; break;
	case 3:
		m_strLevel = "第四级: 中高级"; break;
	case 4:
		m_strLevel = "第五级: 高级"; break;
	case 5:
		m_strLevel = "第六级: 顶级"; break;
	}
}


/* * * * * * * * * * * * * * * * * * * * * *
* 内部函数:以下为菜单屏蔽与开启控制
*
* 最后修改日期:2005.8.6
* * * * * * * * * * * * * * * * * * * * * */
//如果游戏开始,则此[开始游戏]按钮被屏蔽
void CSkyblue_RectView::OnUpdateGameStart(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd || m_bGamePaush)
		pCmdUI->Enable(TRUE);
	else
		pCmdUI->Enable(FALSE);
}

//如果游戏开始,则此[游戏设置]按钮被屏蔽
void CSkyblue_RectView::OnUpdateGameOption(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd)
		pCmdUI->Enable(TRUE);
	else
		pCmdUI->Enable(FALSE);
}

//如游戏开始,则[游戏暂停]按钮开启
void CSkyblue_RectView::OnUpdateGamePaush(CCmdUI* pCmdUI) 
{
	if (!m_bGameEnd)
		pCmdUI->Enable(TRUE);
	else
		pCmdUI->Enable(FALSE);
}

//如果游戏开始,则此[游戏结束]按钮被开启
void CSkyblue_RectView::OnUpdateGameEnd(CCmdUI* pCmdUI) 
{
	if (!m_bGameEnd)
		pCmdUI->Enable(TRUE);
	else
		pCmdUI->Enable(FALSE);
	
}

//如果游戏开始,则此[退出系统]按钮被屏蔽
void CSkyblue_RectView::OnUpdateGameExit(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd)
		pCmdUI->Enable(TRUE);
	else
		pCmdUI->Enable(FALSE);
}

//如果游戏开始,则此[关于]按钮被屏蔽
void CSkyblue_RectView::OnUpdateHelpAbout(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd)
		pCmdUI->Enable(TRUE);
	else
		pCmdUI->Enable(FALSE);
}

//如果游戏开始,则此[帮助]按钮被屏蔽
void CSkyblue_RectView::OnUpdateHelpHelp(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd)
		pCmdUI->Enable(FALSE);
	else
		pCmdUI->Enable(FALSE);	
}


void CSkyblue_RectView::OnHelpHelp() 
{

}


//用菜单设置区域大小
void CSkyblue_RectView::OnUpdateOptionArea1(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd) 
		pCmdUI -> Enable(TRUE);
	else 
		pCmdUI -> Enable(FALSE);

	if (m_iRow==12)
		pCmdUI -> SetCheck(TRUE);
	else
		pCmdUI -> SetCheck(FALSE);	
}
void CSkyblue_RectView::OnUpdateOptionArea2(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd) 
		pCmdUI -> Enable(TRUE);
	else 
		pCmdUI -> Enable(FALSE);

	if (m_iRow==18)
		pCmdUI -> SetCheck(TRUE);
	else
		pCmdUI -> SetCheck(FALSE);	
}
void CSkyblue_RectView::OnUpdateOptionArea3(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd) 
		pCmdUI -> Enable(TRUE);
	else 
		pCmdUI -> Enable(FALSE);

	if (m_iRow==24)
		pCmdUI -> SetCheck(TRUE);
	else
		pCmdUI -> SetCheck(FALSE);	
}

void CSkyblue_RectView::OnUpdateOptionArea4(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd) 
		pCmdUI -> Enable(TRUE);
	else 
		pCmdUI -> Enable(FALSE);

	if (m_iRow==30)
		pCmdUI -> SetCheck(TRUE);
	else
		pCmdUI -> SetCheck(FALSE);	
}


//用菜单设置区域大小
void CSkyblue_RectView::OnOptionArea1() 
{
	m_iRow = 12;
	m_iCol = 10;
	m_iLarge = 30;
	Invalidate();
}

void CSkyblue_RectView::OnOptionArea2() 
{
	m_iRow = 18;
	m_iCol = 15;
	m_iLarge = 20;
	Invalidate();
}

void CSkyblue_RectView::OnOptionArea3() 
{
	m_iRow = 24;
	m_iCol = 20;
	m_iLarge = 15;
	Invalidate();
}

void CSkyblue_RectView::OnOptionArea4() 
{
	m_iRow = 30;
	m_iCol = 25;
	m_iLarge = 12;
	Invalidate();
}

// 用菜单设置游戏级别 
void CSkyblue_RectView::OnUpdateOptionLevel1(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd) 
		pCmdUI -> Enable(TRUE);
	else 
		pCmdUI -> Enable(FALSE);

	if (m_iLevel == 0)
		pCmdUI -> SetCheck(TRUE);
	else
		pCmdUI -> SetCheck(FALSE);
}

void CSkyblue_RectView::OnUpdateOptionLevel2(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd) 
		pCmdUI -> Enable(TRUE);
	else 
		pCmdUI -> Enable(FALSE);

	if (m_iLevel == 1)
		pCmdUI -> SetCheck(TRUE);
	else
		pCmdUI -> SetCheck(FALSE);
}

void CSkyblue_RectView::OnUpdateOptionLevel3(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd) 
		pCmdUI -> Enable(TRUE);
	else 
		pCmdUI -> Enable(FALSE);

	if (m_iLevel == 2)
		pCmdUI -> SetCheck(TRUE);
	else
		pCmdUI -> SetCheck(FALSE);
}

void CSkyblue_RectView::OnUpdateOptionLevel4(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd) 
		pCmdUI -> Enable(TRUE);
	else 
		pCmdUI -> Enable(FALSE);

	if (m_iLevel == 3)
		pCmdUI -> SetCheck(TRUE);
	else
		pCmdUI -> SetCheck(FALSE);
}

void CSkyblue_RectView::OnUpdateOptionLevel5(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd) 
		pCmdUI -> Enable(TRUE);
	else 
		pCmdUI -> Enable(FALSE);

	if (m_iLevel == 4)
		pCmdUI -> SetCheck(TRUE);
	else
		pCmdUI -> SetCheck(FALSE);
}

void CSkyblue_RectView::OnUpdateOptionLevel6(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd) 
		pCmdUI -> Enable(TRUE);
	else 
		pCmdUI -> Enable(FALSE);

	if (m_iLevel == 5)
		pCmdUI -> SetCheck(TRUE);
	else
		pCmdUI -> SetCheck(FALSE);
}


//用菜单设置游戏级别
void CSkyblue_RectView::OnOptionLevel1() 
{
	m_iLevel = 0;
}

void CSkyblue_RectView::OnOptionLevel2() 
{
	m_iLevel = 1;
}

void CSkyblue_RectView::OnOptionLevel3() 
{
	m_iLevel = 2;
}

void CSkyblue_RectView::OnOptionLevel4() 
{
	m_iLevel = 3;
}

void CSkyblue_RectView::OnOptionLevel5() 
{
	m_iLevel = 4;
}

void CSkyblue_RectView::OnOptionLevel6() 
{
	m_iLevel = 5;
}


//用菜单设置是否有网格
void CSkyblue_RectView::OnUpdateOptionGrid(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd)
		pCmdUI -> Enable(TRUE);
	else
		pCmdUI -> Enable(FALSE);

	if (m_bDrawGrid)
		pCmdUI -> SetCheck(TRUE);
	else
		pCmdUI -> SetCheck(FALSE);
}

void CSkyblue_RectView::OnOptionGrid() 
{
	if (m_bDrawGrid)
		m_bDrawGrid = FALSE;
	else
		m_bDrawGrid = TRUE;

	Invalidate();
}

//
//插放背景音乐, 所有错误忽略
//
void CSkyblue_RectView::PlayMid()
{
	HWND hWnd;
	hWnd = GetSafeHwnd();
	//分配命令字符串缓冲,错误信息储存缓冲,播放的文件名
	char szCmdBuf[300],errBuf[60],szfileName[255];
	//错误码
	MCIERROR mciError;

	//初始化设备元素
	strcpy(szfileName,"skyblue_rect.mid"); 
	//初始化命令字符串
	wsprintf( szCmdBuf,"open %s type sequencer alias bkMusic",szfileName);
	//打开设备
	mciError = mciSendString( szCmdBuf, errBuf, sizeof(errBuf), NULL);
	if (mciError == 0)
	{//如果打开成功则播放
		mciError = mciSendString("play bkMusic notify",NULL,0, hWnd);
		//根据播放操作是否成功决定是否关闭设备
		if (mciError != 0)
			mciSendString("close bkMusic",NULL,0,NULL);
	}
}

//
//终止插放背景音乐
//
void CSkyblue_RectView::StopMid()
{
	//关闭设备
	mciSendString("close bkMusic",NULL,0,NULL);
}

//用菜单设置是否插放音乐
void CSkyblue_RectView::OnUpdateOptionMusic(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd)
		pCmdUI -> Enable(TRUE);
	else
		pCmdUI -> Enable(FALSE);

	if (m_bMusic)
		pCmdUI -> SetCheck(TRUE);
	else
		pCmdUI -> SetCheck(FALSE);
}

void CSkyblue_RectView::OnOptionMusic() 
{
	if (m_bMusic)
	{
		m_bMusic = FALSE;
		StopMid();
	}
	else
	{
		m_bMusic = TRUE;
		PlayMid();
	}
	
}

void CSkyblue_RectView::OnGameExit() 
{
	//清理内存设备环境,释放资源
	DCEnvClear();	
}

void CSkyblue_RectView::OnHelpAbout() 
{
	HWND hwnd = ::AfxGetMainWnd()->GetSafeHwnd();

	ShellAbout(hwnd,"俄罗斯方块  作者:skyblue 风中解码","E-mail:skyblue@yahoo.com.cn",NULL);	
}

⌨️ 快捷键说明

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