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

📄 cblockpool.cpp

📁 俄罗斯方块3D 程序+源码俄罗斯方块3D(程序+源码
💻 CPP
字号:
#include "CBlockPool.h"
#include "CBlockFollowing.h"
#include "CGameState.h"
#include <cassert>

extern CGameState		theGameState;
extern CBlockFollowing	theBlockFollowing;

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
CBlockPool::CBlockPool()
{
	m_iRow				= 0;
	m_iColumn			= 0;
	m_iHighestLine		= -1;
	m_iFirstFullLine	= -1;
}

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
CBlockPool::~CBlockPool()
{

}

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
bool CBlockPool::Init( int row, int col )
{
	bool re;
	re = m_BlockPool.SetSize( row, col );					//分配方块池大小

	if ( re )
	{
		m_iRow		= row;
		m_iColumn	= col;

		m_iHighestLine		= -1;							//方块堆最高行
		m_iFirstFullLine	= -1;							//第一个满行
	}
	return re;
}

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
void CBlockPool::Free()
{
	m_BlockPool.Free();
	m_iRow = 0;
	m_iColumn = 0;
	m_iHighestLine		= -1;							//方块堆最高行
	m_iFirstFullLine	= -1;							//第一个满行
}

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
bool CBlockPool::ReSet( int row, int col )
{
	Free();
	return Init( row, col );
}


//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
bool CBlockPool::IsAvailable( int row, int col )
{
	bool re = true;
	re &= ( row >= 0 && row < m_iRow );
	re &= ( col >= 0 && col < m_iColumn );

	if ( re )
		re &= ( m_BlockPool[row][col].IsAvailable() );

	return re;
}

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
void CBlockPool::SetCell( const POSITION &position, int iVaule )
{
	m_BlockPool[ position.row ][ position.col ] = iVaule;
}


//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
void CBlockPool::UpdateHighestLine( int row )
{
#ifdef _DEBUG
	assert( row >= 0 && row < m_iRow );
#endif

	if ( row > m_iHighestLine )
		m_iHighestLine = row;
}


//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
int CBlockPool::GetNumOfLine( int row )
{
	int sum = 0;
	for ( int i = 0; i < m_iColumn; ++i )
	{
		if ( m_BlockPool[row][i].IsAvailable() == false )
			++sum;
	}

	return sum;
}

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
void CBlockPool::ClearLine( int row )
{
	for ( int i = 0; i < m_iColumn; ++i )
		m_BlockPool[row][i] = 0;
}

//////////////////////////////////////////////////////////////////////
//获取需要调整的方块,既需下落的方块
//////////////////////////////////////////////////////////////////////
bool CBlockPool::GetAdjustBlock()
{
	if ( m_iFirstFullLine < 0 || m_iHighestLine < 0 )
		return false;

	theBlockFollowing.OnCreateBlock();

	CBlock block;

	for ( int i = m_iFirstFullLine; i <= m_iHighestLine; ++i )
	{
		for ( int j = 0; j < m_iColumn; ++j )
		{
			if ( m_BlockPool[i][j].IsAvailable() == false )
			{
				block.SetRow( i );
				block.SetCol( j );
				block.SetMaterialIndex( m_BlockPool[i][j].GetData() );

				theBlockFollowing.AddBlocks( block );			//将需要调整的方块装入FollowingBlock中
				m_BlockPool[i][j] = 0;							//对应的格子置0
			}
		}
	}

	if ( theBlockFollowing.GetNumBlock() <= 0 )					//如果没有要调整的方块
		return false;

	return true;
}

//////////////////////////////////////////////////////////////////////
//检测并处理满行
//遍历方块池记录每一行的方块数
//找出满行,并清空他们,记录第一个满行
//////////////////////////////////////////////////////////////////////
void CBlockPool::CheckFullLine()
{
	m_iFirstFullLine = -1;
	int iNumFullLine = 0;
	int j = 0;
	for ( int i = 0; i <= m_iHighestLine; ++i )
	{
		j = GetNumOfLine( i );				//获取每一行数目

		if ( j == m_iColumn || j == 0 )
		{
			if ( m_iFirstFullLine == -1 )
				m_iFirstFullLine = i;					//找出最低的满行

			ClearLine( i );
			
			if ( j == m_iColumn )
				++iNumFullLine;
		}
	}
	
	theGameState.AddScore( iNumFullLine * 10 );

	if ( GetAdjustBlock() )
	{
		theGameState.SetGameState( ADJUST_POOL );		//如果发现满行,则开始调整方块池
	}
	else
	{
		OnFinishAdjust();								//如果没有发现满行,还原重要标志,开始再次下落
	}
}

//////////////////////////////////////////////////////////////////////
//调整方块堆,让空行之上的方块下落填补空位
//////////////////////////////////////////////////////////////////////
void CBlockPool::AdjustPool()
{
	theBlockFollowing.Drop();
}

//////////////////////////////////////////////////////////////////////
//完成方块的调整
//////////////////////////////////////////////////////////////////////
void CBlockPool::OnFinishAdjust()
{
	m_iFirstFullLine	= -1;							//第一个满行
	theGameState.SetGameState( READY_DROP );
}

⌨️ 快捷键说明

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