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

📄 tetriscontrol.cpp

📁 自己写的俄罗斯方块
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			m_nCurScore += m_nScoreLevel[m_nCurDelFloors - 1];
		if(m_nHighestBlock - m_nCurDelFloors + m_nFloorsBuffer > VERTICAL_BLOCKS_NUMBER)
		{
			m_bIsGameOver = TRUE;
			m_bIsWillFix = FALSE;
		}
		else
		{
		}
		return m_nCurDelFloors;
	}
	else
	{
		m_CurShape.m_ptPos.y++;
		return -1;
	}
}

BOOL CTetrisControl::CreateNewShape()
{
	// finished the last time operation
	if(m_nCurDelFloors > 0)
		DeleteFloors();
	if(m_nFloorsBuffer > 0)
		AddFloors();

	m_CurShape = m_NextShape;
	m_nCurShapeType = m_nNextShapeType;
	m_nCurShapeDir = m_nNextShapeDir;
	CreateShape();
	int x, y;
	for(int i = 0; i < m_CurShape.m_bBlocks; i++)
	{
		x = m_CurShape.m_ptPos.x + WALL_THICKNESS + m_CurShape.m_ptBlocks[i].x;
		y = m_CurShape.m_ptPos.y + WALL_THICKNESS + m_CurShape.m_ptBlocks[i].y;
		if(m_Blocks[x][y].m_nStatus == HAVE_BLOCK)
		{
			m_bIsGameOver = TRUE;
			FixCurShape();
			return FALSE;
		}
	}
	return TRUE;
}

int CTetrisControl::OnSmoothDown(float fSmoothInc)
{
	int nResult = -1;
	m_fSmoothDown += fSmoothInc;
	if(m_fSmoothDown > 1)
	{
		nResult = OnDown();
		m_fSmoothDown -= 1;
		if(nResult > -1)
			m_fSmoothDown = 0;
	}
	return nResult;
}

int CTetrisControl::OnDownToBottom()
{
	int nResult;
	while((nResult = OnDown()) == -1);
	m_fSmoothDown = 0;
	return nResult;
}

void CTetrisControl::FixCurShape()
{
	if(m_bIsWillFix)
	{
		int x, y;
		for(int i = 0; i < m_CurShape.m_bBlocks; i++)
		{
			x = m_CurShape.m_ptPos.x + WALL_THICKNESS + m_CurShape.m_ptBlocks[i].x;
			y = m_CurShape.m_ptPos.y + WALL_THICKNESS + m_CurShape.m_ptBlocks[i].y;
			m_Blocks[x][y].m_nStatus = HAVE_BLOCK;
			m_Blocks[x][y].m_nColor = m_CurShape.m_nColor;
			m_Blocks[x][y].m_nStyle = int(rand()*32/RAND_MAX);
			m_nCurBlocksInFloor[VERTICAL_BLOCKS_NUMBER + WALL_THICKNESS - 1 - y]++;
			if(VERTICAL_BLOCKS_NUMBER + WALL_THICKNESS - y > m_nHighestBlock)
				m_nHighestBlock = VERTICAL_BLOCKS_NUMBER + WALL_THICKNESS - y;
		}
	}
	else
		m_bIsWillFix = TRUE;
}

int CTetrisControl::CalcDeletedFloors()
{
	int nDelFloors = 0;
	for(int i = 0; i < m_CurShape.m_bBlocks; i++)
	{
		int y = m_CurShape.m_ptPos.y + WALL_THICKNESS + m_CurShape.m_ptBlocks[i].y;
		if(m_nCurBlocksInFloor[VERTICAL_BLOCKS_NUMBER + WALL_THICKNESS - 1 - y] == HORIZONTAL_BLOCKS_NUMBER)
		// the current floor is full
		{
			// save the index (y-coordiate) of the floor
			for(int j = 0; j < BLOCKS_IN_SHAPE; j++)
			{
				// the floor existed, don't save anymore
				if(m_nCramedFloors[j] == (y - WALL_THICKNESS))
					break;
			}
			if(j == BLOCKS_IN_SHAPE)
			{
				nDelFloors++;
				for(j = 0; j < nDelFloors; j++)
					if(m_nCramedFloors[j] < (y - WALL_THICKNESS))
					{
						for(int k = nDelFloors - 1; k > j ; k--)
							m_nCramedFloors[k] = m_nCramedFloors[k - 1];
						m_nCramedFloors[j] = y - WALL_THICKNESS;
						break;
					}
			}
		}
	}
	return nDelFloors;
}

void CTetrisControl::DeleteFloors()
{
	// delete floors 
	int nDelCounter = 0;
	for(int i = 0; i < BLOCKS_IN_SHAPE; i++)
		if(m_nCramedFloors[i] != -1)
		{
			for(int k = WALL_THICKNESS; k < HORIZONTAL_BLOCKS_NUMBER + WALL_THICKNESS; k++)
				m_Blocks[k][m_nCramedFloors[i] + WALL_THICKNESS].m_nStatus = NO_BLOCK;
			m_nCurBlocksInFloor[VERTICAL_BLOCKS_NUMBER - 1 - m_nCramedFloors[i]] = 0;
			nDelCounter--;
		}
	// move the remaining floors
	for(i = VERTICAL_BLOCKS_NUMBER - 1;
		i > VERTICAL_BLOCKS_NUMBER - 1 - m_nHighestBlock; i--)
	{
		for(int j = 0; j < BLOCKS_IN_SHAPE; j++)
			if(m_nCramedFloors[j] <= i)
				break;
		if(j > 0)
		{
			for(int k = WALL_THICKNESS; k < HORIZONTAL_BLOCKS_NUMBER + WALL_THICKNESS; k++)
			{
				m_Blocks[k][i + j + WALL_THICKNESS] = m_Blocks[k][i + WALL_THICKNESS];
				m_Blocks[k][i + WALL_THICKNESS].m_nStatus = NO_BLOCK;
			}
			m_nCurBlocksInFloor[VERTICAL_BLOCKS_NUMBER - 1 - i - j]
				= m_nCurBlocksInFloor[VERTICAL_BLOCKS_NUMBER - 1 - i];
			m_nCurBlocksInFloor[VERTICAL_BLOCKS_NUMBER - 1 - i] = 0;
		}
	}
	// reset the m_nCramedFloors array
	for(i = 0; i < BLOCKS_IN_SHAPE; i++)
		m_nCramedFloors[i] = -1;
	m_nHighestBlock += nDelCounter;
	m_nCurDelFloors = 0;
}

int CTetrisControl::AddFloorsBuffer(int nAdd)
{
	m_nFloorsBuffer += nAdd;
	return m_nFloorsBuffer;
}

void CTetrisControl::AddFloors()
{
	// find the start floor to move
	int nStart;
	if(m_nFloorsBuffer + m_nHighestBlock > VERTICAL_BLOCKS_NUMBER)
		nStart = m_nFloorsBuffer + WALL_THICKNESS;
	else
		nStart = VERTICAL_BLOCKS_NUMBER - m_nHighestBlock + WALL_THICKNESS;
	// move the remaining floors;
	for(int i = nStart; i < VERTICAL_BLOCKS_NUMBER + WALL_THICKNESS; i++)
		for(int j = WALL_THICKNESS; j < HORIZONTAL_BLOCKS_NUMBER + WALL_THICKNESS; j++)
		{
			m_Blocks[j][i - m_nFloorsBuffer] = m_Blocks[j][i];
			m_nCurBlocksInFloor[VERTICAL_BLOCKS_NUMBER + WALL_THICKNESS - 1 - i + m_nFloorsBuffer]
				= m_nCurBlocksInFloor[VERTICAL_BLOCKS_NUMBER + WALL_THICKNESS - 1 - i];
		}
	// add new floors from the bottom
	BYTE nStatus;
	for(int j = 0; j < m_nFloorsBuffer; j++)
	{
		CalcBlocksStatusInFloor();
		m_nCurBlocksInFloor[j] = 0;
		for(int i = WALL_THICKNESS; i < HORIZONTAL_BLOCKS_NUMBER + WALL_THICKNESS; i ++)
		{
			// choose a existence status randomly
			if((nStatus = m_bBlocksStatusInFloor[i - WALL_THICKNESS])== HAVE_BLOCK)
				m_nCurBlocksInFloor[j]++;
			m_Blocks[i][VERTICAL_BLOCKS_NUMBER + WALL_THICKNESS - 1 - j].m_nStatus = nStatus;
			// choose a color randomly
			m_nBlockSeed = Rand(m_nBlockSeed);
			m_Blocks[i][VERTICAL_BLOCKS_NUMBER + WALL_THICKNESS - 1 - j].m_nColor = 
				m_nBlockSeed * m_nBlockColorsNum / OWN_RAND_MAX;
			m_Blocks[i][VERTICAL_BLOCKS_NUMBER + WALL_THICKNESS - 1 - j].m_nStyle = 
				int(rand()*32/RAND_MAX);
		}
	}
	m_nHighestBlock += m_nFloorsBuffer;
	m_nFloorsBuffer = 0;
}

void CTetrisControl::CalcBlocksStatusInFloor()
{
	for(int i = 0; i < HORIZONTAL_BLOCKS_NUMBER; i++)
		m_bBlocksStatusInFloor[i] = HAVE_BLOCK;
	m_nBlockSeed = Rand(m_nBlockSeed);
	int nNoBlockNum = MIN_NO_BLOCK_NUMBER + (MAX_NO_BLOCK_NUMBER - MIN_NO_BLOCK_NUMBER + 1)
		* m_nBlockSeed / OWN_RAND_MAX;
	int nPos;
	for(i = 0; i < nNoBlockNum; i++)
	{
		m_nBlockSeed = Rand(m_nBlockSeed);
		nPos = HORIZONTAL_BLOCKS_NUMBER * m_nBlockSeed / OWN_RAND_MAX;
		m_bBlocksStatusInFloor[nPos] = NO_BLOCK;
	}
}

int CTetrisControl::Rand(int nSeed, int nMax)
{
	return	(nSeed*25173+13849) % nMax;
}

////////////////////////////////////////////////////////

CBlock::CBlock(BYTE nStatus,BYTE nColor, BYTE nStyle)
{
	m_nStatus = nStatus;
	m_nColor = nColor;
	m_nStyle = nStyle;
}

void CBlock::operator = (const CBlock& block)
{
	m_nStatus = block.m_nStatus;
	m_nColor = block.m_nColor;
	m_nStyle = block.m_nStyle;
}

////////////////////////////////////////////////////////

CBasicShape::CBasicShape()
{
	for(int i = 0; i < BLOCKS_IN_SHAPE; i++)
		m_ptBlocks[i] = CPoint(-BLOCKS_IN_SHAPE, -BLOCKS_IN_SHAPE);
	m_bBlocks = 0;
}

void CBasicShape::operator = (const CBasicShape& shape)
{
	for(int i = 0; i < BLOCKS_IN_SHAPE; i++)
		m_ptBlocks[i] = shape.m_ptBlocks[i];
	m_bBlocks = shape.m_bBlocks;
}

BOOL CBasicShape::operator == (const CBasicShape& shape)
{
	BOOL bResult = TRUE;
	for(int i = 0; i < BLOCKS_IN_SHAPE; i++)
		if(m_ptBlocks[i] != shape.m_ptBlocks[i])
			return FALSE;
	return bResult;
}

////////////////////////////////////////////////////////

CShape::CShape()
{
	CBasicShape::CBasicShape();
	m_nColor = 0;
	m_ptPos = CPoint(0, 0);
}

void CShape::operator = (const CShape& shape)
{
	for(int i = 0; i < BLOCKS_IN_SHAPE; i++)
		m_ptBlocks[i] = shape.m_ptBlocks[i];
	m_bBlocks = shape.m_bBlocks;
	m_nColor = shape.m_nColor;
	m_ptPos = shape.m_ptPos;
}

void CShape::operator = (const CBasicShape& shape)
{
	for(int i = 0; i < BLOCKS_IN_SHAPE; i++)
		m_ptBlocks[i] = shape.m_ptBlocks[i];
	m_bBlocks = shape.m_bBlocks;
}

⌨️ 快捷键说明

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