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

📄 hgameview.cpp

📁 贪吃蛇
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		xx1=x1+1; xx2=x2+2; yy2=y2-1; xx3=x3-1; yy4=y4-1;
		m_lscurrentRect = 5;
		break;
	case 6:
		xx2=x1+1; yy2=y2-1; xx3=x3-1; xx4=x4-2; yy4 = yy4+1;
		m_lscurrentRect = 61;
		break;
	case 61:
		xx3=x3+2; yy3=y3-1; xx4=x4+2; yy4=y4-1;
		m_lscurrentRect = 62;
		break;
	case 62:
		xx1=x1+1; yy1=y1-1; xx3=x3-2; yy3=y3+1; xx4=x4-1;
		m_lscurrentRect = 63;
		break;
	case 63:
		xx1=x1-2; yy1=y1+1; xx2=x2-2; yy2=y2+1;
		m_lscurrentRect = 6;
		break;
	case 7:
		xx3=x3-1; yy3=y3+1; xx4=x4+1; yy4=y4+1;
		m_lscurrentRect = 71;
		break;
	case 71:
		xx1=x1+2; xx2=x2-1; yy2=y2+1; xx4=x4+1; yy4=y4-1;
		m_lscurrentRect = 72;
		break;
	case 72:
		xx1=x1-2; xx3=x3-1; yy3=y3+1; xx4=x4-1; yy4=y4+1;
		m_lscurrentRect = 73;
		break;
	case 73:
		xx2=x2+1; yy2=y2-1; xx3=x3+2; yy3=y3-2; xx4=x4-1; yy4=y4-1;
		m_lscurrentRect = 7;
		break;
	}

	//如果变形后所在的区域内无其他方块,则表示有足够空间,可以变形
	//且不能超越边界
	GameStatus[x1][y1] = MAP_STATE_EMPTY;
	GameStatus[x2][y2] = MAP_STATE_EMPTY;
	GameStatus[x3][y3] = MAP_STATE_EMPTY;
	GameStatus[x4][y4] = MAP_STATE_EMPTY;
	if (GameStatus[xx1][yy1]==MAP_STATE_EMPTY &&
		GameStatus[xx2][yy2]==MAP_STATE_EMPTY &&
		GameStatus[xx3][yy3]==MAP_STATE_EMPTY && 
		GameStatus[xx4][yy4]==MAP_STATE_EMPTY 
		&& yy1>=0 && yy4<=m_iCol-1 
		&& !(xx1<0 || xx2<0 || xx3<0 || xx4<0) 
		&& !(xx1>m_iRow-1 || xx2>m_iRow-1 || xx3>m_iRow-1 || xx4>m_iRow-1) )
	{
		InvalidateCurrent();

		ActiveStatus[0][0]=xx1;
		ActiveStatus[1][0]=xx2;
		ActiveStatus[2][0]=xx3;
		ActiveStatus[3][0]=xx4;
		ActiveStatus[0][1]=yy1;
		ActiveStatus[1][1]=yy2;
		ActiveStatus[2][1]=yy3;
		ActiveStatus[3][1]=yy4;

		GameStatus[xx1][yy1] = MAP_STATE_NOT_EMPTY;
		GameStatus[xx2][yy2] = MAP_STATE_NOT_EMPTY;
		GameStatus[xx3][yy3] = MAP_STATE_NOT_EMPTY;
		GameStatus[xx4][yy4] = MAP_STATE_NOT_EMPTY;

		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();
}

void CHGAMEView::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 CHGAMEView::OnGamePaush() 
{
	m_bGamePaush = TRUE;

	KillTimer(1);
}

void CHGAMEView::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);	

}

void CHGAMEView::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);
	}
}


//用于生成当前区域大小与级别所对应的汉字描述
void CHGAMEView::CurrentAreaAndLevel()
{
	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;
	}
}

void CHGAMEView::OnUpdateGameStart(CCmdUI* pCmdUI) 
{
	if (m_bGameEnd || m_bGamePaush)
		pCmdUI->Enable(TRUE);
	else
		pCmdUI->Enable(FALSE);
}

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

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

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

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

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

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



void CHGAMEView::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 CHGAMEView::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 CHGAMEView::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 CHGAMEView::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 CHGAMEView::OnOptionArea1() 
{
	m_iRow = 12;
	m_iCol = 10;
	m_iLarge = 30;
	Invalidate();
}

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

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

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

// 用菜单设置游戏级别 
void CHGAMEView::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 CHGAMEView::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 CHGAMEView::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 CHGAMEView::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 CHGAMEView::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 CHGAMEView::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 CHGAMEView::OnOptionLevel1() 
{
	m_iLevel = 0;
}

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

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

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

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

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


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

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

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

	Invalidate();
}



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

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

	ShellAbout(hwnd,L"俄罗斯方块  作者:MG",L"E-mail:guoxb@mail2.sysu.edu.cn",NULL);	
}
// CHGAMEView 诊断

#ifdef _DEBUG
void CHGAMEView::AssertValid() const
{
	CView::AssertValid();
}

void CHGAMEView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CHGAMEDoc* CHGAMEView::GetDocument() const // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CHGAMEDoc)));
	return (CHGAMEDoc*)m_pDocument;
}
#endif //_DEBUG


// CHGAMEView 消息处理程序

⌨️ 快捷键说明

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