gamecontrol.cpp

来自「俄罗斯方块」· C++ 代码 · 共 120 行

CPP
120
字号
#include "GameControl.h"
GameControl::GameControl(Box *b,Grid *g,GameForm *f)
{
	pBox = b;
	pGrid = g;
	pGameForm = f;
}
void GameControl::moveBoxLeft(void)
{
	pGameForm->eraseBox(*pBox);//擦除原有方块
	Box b = *pBox;//保存原有方块
	pBox->left();
	if(isObstacle())//若遇障碍则撤销移动
	{
		*pBox = b;
	}
	pGameForm->drawBox(*pBox);//重新绘制新的方块
}
void GameControl::moveBoxRight(void)
{
	pGameForm->eraseBox(*pBox);//擦除原有方块
	Box b = *pBox;//保存原有方块
	pBox->right();
	if(isObstacle())//若遇障碍则撤销移动
	{
		*pBox = b;
	}
	pGameForm->drawBox(*pBox);//重新绘制新的方块
}
void GameControl::dropBox(void)
{
	pGameForm->eraseBox(*pBox);//擦除原有方块
	Box b = *pBox;//保存原有方块
	pBox->drop();
	if(isObstacle())//若遇障碍则接收方块
	{
		*pBox = b;
		pGameForm->eraseGrid();
		if(!pGrid->acceptBox(*pBox))
		{
			exit(0);
		}
		
		pGameForm->drawGrid(*pGrid);
		pBox->init();
		//待完善接收失败的处理
	}
	pGameForm->drawBox(*pBox);//重新绘制新的方块
}
void GameControl::straightDown(void)
{
}
void GameControl::rotateBox(void)
{
	pGameForm->eraseBox(*pBox);//擦除原有方块
	Box b = *pBox;//保存原有方块
	pBox->rotate();
	if(isObstacle())//若遇障碍则撤销移动
	{
		*pBox = b;
	}
	pGameForm->drawBox(*pBox);//重新绘制新的方块
}
bool GameControl::isObstacle(void)
{
	Coord location = pBox->getLocation();
	BoxCode code = pBox->getCode();
	
	int x,y;
	for (int i=0; i<16;i++)
	{
		if (true == code.test(15-i))
		{
			x = location.x+ i%4;
			y = location.y+ i/4;
			
			if(x<0||x>=COLUMNS||y<0||y>=LINES)
			{
				return true;
			}

			if (pGrid->isOccupied(y,x))
			{
				return true;
			}			
		}
	}
	return false;
}

void GameControl::startGame(void)
{
	pGameForm->draw();
	pGameForm->drawGrid(*pGrid);
	pGameForm->drawBox(*pBox);
	
	Command c;
	while (c != QUIT)
	{
		c = pGameForm->readOperator();
		switch(c) {
		case LEFT:
			moveBoxLeft();
			break;
		case RIGHT:
			moveBoxRight();
			break;
		case ROTATE:
			rotateBox();
			break;
		case NONE:
			dropBox();
			break;	

		//default:
		}
		Sleep(400);
	}

}

⌨️ 快捷键说明

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