?? 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 + -