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

📄 flooredblocks.cpp

📁 一个完整的俄罗斯方块游戏
💻 CPP
字号:
// FlooredBlocks.cpp: implementation of the CFlooredBlocks class.
//
//////////////////////////////////////////////////////////////////////
#include <windows.h>
#include "BlockList.h"
#include "FlooredBlocks.h"
#include "Resource.h"

extern HINSTANCE g_hInstance;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CFlooredBlocks::CFlooredBlocks(RECT rcBoundary)
{
	m_rcBoundary=rcBoundary;

}

CFlooredBlocks::~CFlooredBlocks()
{

}

bool CFlooredBlocks::IsOccupied(short nX, short nY)
{
	return CBlockList::IsOccupied(nX,nY);
}

void CFlooredBlocks::Display()
{
	CBlockList::Display();
}

bool CFlooredBlocks::Insert(CBlockList &BlockList)
{
	SNODE* pCurr = BlockList.m_pListHead->pNext;
	while (pCurr) {
		if (CBlockList::Insert(pCurr->Block) == false)
			return false;
		pCurr= pCurr->pNext;
	}
	return true;
}

bool CFlooredBlocks::IsGameOver()
{
	for (short nI=0; nI <= m_rcBoundary.right; nI++) {
		if (CBlockList::IsOccupied(nI, 1))
			return true;
	}
	return false;
}

////////////////////////////////////////////////////////
// Returns true if the give location already 
// contains a block
///////////////////////////////////////////////////////
bool CFlooredBlocks::IsOccupied(CBlockList &BlockList, short nX, short nY)
{
	SNODE* pCurr= BlockList.m_pListHead->pNext;
	while (pCurr) {
		if (IsOccupied(pCurr->Block.nX+nX,pCurr->Block.nY+nY)) 
			return true;
		pCurr = pCurr->pNext;
	}
	return false;
}

/////////////////////////////////////////
// Increment all Y < nY
// Used when the floored bricks must fall
/////////////////////////////////////////
void CFlooredBlocks::IncrementYabove(short nY)
{
	SNODE* pCurr = m_pListHead->pNext;
	while (pCurr) {
		if (pCurr->Block.nY < nY)
			pCurr->Block.nY++;
		pCurr= pCurr->pNext;
	}
}
//////////////////////////////////////////////////////////////////
//  Checks and removes any completed rows of blocks
//////////////////////////////////////////////////////////////////
short CFlooredBlocks::CheckAndRemoveContinuousBlocks()
{
	SNODE* pCurr= m_pListHead->pNext;
	SNODE* pPrev= m_pListHead;
	short nRowsDeleted=0;
	short nX1 = (short) m_rcBoundary.left;
	short nX2 = (short) m_rcBoundary.right;

	while (pCurr) {
		while (pCurr && pCurr->Block.nX != nX1) {
			pPrev=pCurr;
			pCurr = pCurr->pNext;
		}
		if (pCurr) {
			SNODE* pBegin= pPrev; // pBegin->Next actually contains the begining.
			while (pCurr && pCurr->pNext && pBegin->pNext->Block.nY == pCurr->Block.nY 
				&& (pCurr->Block.nX+1) == (pCurr->pNext->Block.nX)) {
				pPrev = pCurr;
				pCurr=pCurr->pNext;
			}
			if (pBegin->pNext->Block.nX == nX1 && 
				pBegin->pNext->Block.nY == pPrev->Block.nY &&
				pCurr->Block.nX == nX2)  {       // Found a row to remove
				nRowsDeleted++;
				SNODE* pDelete = pBegin->pNext;
				pCurr=pCurr->pNext;   // Move pointer to next location since the current will be deleted
				IncrementYabove(pBegin->pNext->Block.nY);
				while (pDelete && pDelete != pCurr) {
					SNODE* pDel= pDelete;
					pDelete=pDelete->pNext;
				//	delete pDel;
				}
				pBegin->pNext = pCurr;
	            pCurr= m_pListHead->pNext;
	            pPrev= m_pListHead;
			}
			pPrev = pCurr;
			pCurr=pCurr->pNext;
		}
	}
	if (nRowsDeleted) {
		::PlaySound(MAKEINTRESOURCE( IDR_SOUNDLINECOMPLETE), g_hInstance, SND_RESOURCE | SND_ASYNC);
	}
	return nRowsDeleted;

}

⌨️ 快捷键说明

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