📄 cblockpool.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 + -