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

📄 cube.h

📁 用vc实现德罗斯放块游戏 用vc实现德罗斯放块游戏
💻 H
字号:


#define IDI_DRAW 1
#define IDI_ERASE 0

class CCube
{
public:
	CCube();
	void GetCube();
	BOOL Transform();
	BOOL IsLineFull();
	BOOL IsLevelUp();
	BOOL IsLost();
	BOOL Move(int i, int j);

	int m_ActCube[4][4];
	int m_TempCube[4][4];
	int m_Map[23][12];
	int m_xMove, m_yMove;
	int m_speed;
	int m_score;
	int m_level;

protected:
	void UpdateCube(int i);

private:
	int m_Cube[7][4][4];
	int m_xPos, m_yPos;
};

//CCube::CCube()

CCube::CCube()
{
	int x,y,z;

	int Cube[7][4][4] = {
						 {0,0,0,0,
						  1,1,0,0,
						  0,1,1,0,
						  0,0,0,10},

						 {0,0,0,0,
						  0,1,1,0,
						  1,1,0,0,
						  0,0,0,20},

						 {0,0,0,0,
						  1,0,0,0,
						  1,1,1,0,
						  0,0,0,30},

						 {0,0,0,0,
						  0,0,1,0,
						  1,1,1,0,
						  0,0,0,40},

						 {0,0,0,0,
						  0,1,0,0,
						  1,1,1,0,
						  0,0,0,50},

						 {0,0,0,0,
						  0,0,0,0,
						  1,1,1,1,
						  0,0,0,60},

						 {0,0,0,0,
						  0,1,1,0,
						  0,1,1,0,
						  0,0,0,70}
									};

	for(z=0; z<7; z++)
	{
		for(y=0; y<4; y++)
		{
			for(x=0; x<4; x++)
			{
				m_Cube[z][y][x] = Cube[z][y][x];
			}
		}
	}

	srand((unsigned)time(NULL));

	do  z=rand(); while(z<0||z>6);

	for(y=0; y<4; y++)
	{
		for(x=0; x<4; x++)
		{
			m_ActCube[y][x] = m_Cube[z][y][x];
		}
	}

	do  z=rand(); while(z<0||z>6);

	for(y=0; y<4; y++)
	{
		for(x=0; x<4; x++)
		{
			m_TempCube[y][x] = m_Cube[z][y][x];
		}
	}

	for(y=0; y<23; y++)
	{
		for(x=0; x<12; x++)
		{
			if(x==0 || x==11 || y==22)
			{
				m_Map[y][x] = 2;
				continue;
			}
			m_Map[y][x] = 0;
		}
	}

	m_xPos = 7;
	m_yPos = 3;
	m_xMove = 0;
	m_yMove = 0;

	m_score = 0;
	m_level = 1;
	m_speed = 400;

}

//void CCube::GetCube()

void CCube::GetCube()
{
	int x,y,z;
	int score = 0;
	int ix=m_xPos-3;
	int iy=m_yPos-3;

	CCube::UpdateCube(IDI_DRAW);

	for(y=0; y<4; y++)
	{
		for(x=0; x<4; x++)
		{
			m_ActCube[y][x] = m_TempCube[y][x];
		}
	}

	srand((unsigned)time(NULL));

	do  z=rand(); while(z<0||z>6);

	for(y=0; y<4; y++)
	{
		for(x=0; x<4; x++)
		{
			m_TempCube[y][x] = m_Cube[z][y][x];
		}
	}

	while(CCube::IsLineFull())
	{
		do score++;
		while(CCube::IsLineFull());
		if(score==1) score = 0;
		m_score += (int)pow(2, score);
	}

	m_xPos = 7;
	m_yPos = 3;
	
	CCube::UpdateCube(IDI_DRAW);
}

//void CCube::UpdateCube(int m_ActCube[4][4], int i)

void CCube::UpdateCube(int i)
{
	int x,y;
	int ix=m_xPos-3;
	int iy=m_yPos-3;

	for(y=0; y<4; y++)
	{
		for(x=0; x<4; x++)
		{
			if(m_ActCube[y][x] == 1)
			m_Map[iy+y][ix+x] = i;
		}
	}
}

//BOOL CCube::IsLineFull()

BOOL CCube::IsLineFull()
{
	int x, y;
	int i, j;

	for(y=21; y>2; y--)
	{
		for(x=1; x<11; x++)
		{
			if(m_Map[y][x]==0) break;

			else if(m_Map[y][x]==1 && x==10)
			{
				for(i=y; i>2; i--)
				{
					for(j=0; j<11; j++)
					{
						m_Map[i][j] = m_Map[i-1][j];
					}
				}

				return TRUE;
			}

			else continue;
		}
	}

	return FALSE;
}

//BOOL CCube::IsLevelUp()

BOOL CCube::IsLevelUp()
{
	while(m_score/30+1 - m_level)
	{
		m_level = m_score/30 + 1 ;
		m_speed /= 2 ;
		return TRUE;
	}

	return FALSE;
}

//BOOL CCube::IsLost()

BOOL CCube::IsLost()
{
	int x = 1, y;

	while(m_Map[2][x]==0 && x++<11)
	{
		if(x==10) return FALSE; 
	}
	
	for(y=0; y<23; y++)
	{
		for(x=0; x<12; x++)
		{
			if(x==0 || x==11 || y==22)
			{
				m_Map[y][x] = 2;
				continue;
			}
			m_Map[y][x] = 0;
		}
	}

	return TRUE;
}

//BOOL CCube::Move()

BOOL CCube::Move(int i, int j)
{	
	int x,y;
	int ix=m_xPos-3;
	int iy=m_yPos-3;
	
	CCube::UpdateCube(IDI_ERASE);

	for(y=m_yPos-iy; y>=0; y--)
	{
		for(x=m_xPos-ix; x>=0; x--)
		{
			if(m_ActCube[y][x]!=1) continue;

			else if(m_Map[iy+y+j][ix+x-i]!=0)
			{
				CCube::UpdateCube(IDI_DRAW);
				return FALSE;
			}
		}
	}

	m_xPos -= i;	
	m_yPos += j;
	
	CCube::UpdateCube(IDI_DRAW);

	return TRUE;
}

//BOOL CCube::Transform()

BOOL CCube::Transform()
{
	int ix=m_xPos-3;
	int iy=m_yPos-3;

	CCube::UpdateCube(IDI_ERASE);

	switch(m_ActCube[3][3])
	{
	case 10:
		if(m_Map[iy][ix+2]==0 && m_Map[iy-1][ix+2]==0)
		{
			m_ActCube[0][2] = 1;
			m_ActCube[1][2] = 1;
			m_ActCube[1][0] = 0;
			m_ActCube[2][2] = 0;
			m_ActCube[3][3] = 11;
		}
		break;
	case 11:
		if(m_Map[iy+1][ix]==0 && m_Map[iy+2][ix+2]==0)
		{
			m_ActCube[0][2] = 0;
			m_ActCube[1][2] = 0;
			m_ActCube[1][0] = 1;
			m_ActCube[2][2] = 1;
			m_ActCube[3][3] = 10;
		}
		else if(m_Map[iy+1][ix+3]==0 && m_Map[iy+2][ix+2]==0 && m_Map[iy+2][ix+3]==0)
		{
			m_xMove++;
			m_xPos++;
			CCube::Transform();
		}
		break;
	case 20:
		if(m_Map[iy][ix+1]==0 && m_Map[iy+2][ix+2]==0)
		{
			m_ActCube[0][1] = 1;
			m_ActCube[2][2] = 1;
			m_ActCube[2][0] = 0;
			m_ActCube[2][1] = 0;
			m_ActCube[3][3] = 21;
		}
		break;
	case 21:
		if(m_Map[iy+2][ix]==0 && m_Map[iy+2][ix+1]==0)
		{
			m_ActCube[0][1] = 0;
			m_ActCube[2][2] = 0;
			m_ActCube[2][0] = 1;
			m_ActCube[2][1] = 1;
			m_ActCube[3][3] = 20;
		}
		else if(m_Map[iy+1][ix+3]==0 && m_Map[iy+2][ix+1]==0)
		{
			m_xMove++;
			m_xPos++;
			CCube::Transform();
		}
		break;
	case 30:
		if(m_Map[iy][ix+1]==0 && m_Map[iy][ix+2]==0 && m_Map[iy+1][ix+1]==0)
		{
			m_ActCube[0][1] = 1;
			m_ActCube[0][2] = 1;
			m_ActCube[1][1] = 1;
			m_ActCube[1][0] = 0;
			m_ActCube[2][0] = 0;
			m_ActCube[2][2] = 0;
			m_ActCube[3][3] = 31;
		}
		break;
	case 31:
		if(m_Map[iy+1][ix]==0 && m_Map[iy+1][ix+2]==0 && m_Map[iy+2][ix+2]==0)
		{
			m_ActCube[1][0] = 1;
			m_ActCube[1][2] = 1;
			m_ActCube[2][2] = 1;
			m_ActCube[0][1] = 0;
			m_ActCube[0][2] = 0;
			m_ActCube[2][1] = 0;
			m_ActCube[3][3] = 32;
		}
		else if(m_Map[iy+1][ix+3]==0 && m_Map[iy+2][ix+2]==0 && m_Map[iy+2][ix+3]==0)
		{
			m_xMove++;
			m_xPos++;
			CCube::Transform();
		}
		break;
	case 32:
		if(m_Map[iy][ix+2]==0 && m_Map[iy+2][ix+1]==0)
		{
			m_ActCube[0][2] = 1;
			m_ActCube[2][1] = 1;
			m_ActCube[1][0] = 0;
			m_ActCube[1][1] = 0;
			m_ActCube[3][3] = 33;
		}
		break;
	case 33:
		if(m_Map[iy+1][ix]==0 && m_Map[iy+2][ix]==0)
		{
			m_ActCube[1][0] = 1;
			m_ActCube[2][0] = 1;
			m_ActCube[0][2] = 0;
			m_ActCube[1][2] = 0;
			m_ActCube[3][3] = 30;
		}
		else if(m_Map[iy+1][ix]==0 && m_Map[iy+2][ix]==0)
		{
			m_xMove--;
			m_xPos--;
			CCube::Transform();
		}
		break;
	case 40:
		if(m_Map[iy][ix+1]==0 && m_Map[iy+1][ix+1]==0)
		{
			m_ActCube[0][1] = 1;
			m_ActCube[1][1] = 1;
			m_ActCube[1][2] = 0;
			m_ActCube[2][0] = 0;
			m_ActCube[3][3] = 41;
		}
		break;
	case 41:
		if(m_Map[iy+1][ix+2]==0 && m_Map[iy+1][ix+3]==0)
		{
			m_ActCube[1][2] = 1;
			m_ActCube[1][3] = 1;
			m_ActCube[0][1] = 0;
			m_ActCube[2][2] = 0;
			m_ActCube[3][3] = 42;
		}
		else if(m_Map[iy+1][ix]==0 && m_Map[iy+2][ix]==0 && m_Map[iy+1][ix+2]==0)
		{
			m_xMove--;
			m_xPos--;
			CCube::Transform();
		}
		break;
	case 42:
		if(m_Map[iy][ix+1]==0 && m_Map[iy][ix+2]==0 && m_Map[iy+2][ix+2]==0)
		{
			m_ActCube[0][1] = 1;
			m_ActCube[0][2] = 1;
			m_ActCube[2][2] = 1;
			m_ActCube[1][1] = 0;
			m_ActCube[1][3] = 0;
			m_ActCube[2][1] = 0;
			m_ActCube[3][3] = 43;
		}
		break;
	case 43:
		if(m_Map[iy+2][ix]==0 && m_Map[iy+2][ix+1]==0)
		{
			m_ActCube[2][0] = 1;
			m_ActCube[2][1] = 1;
			m_ActCube[0][1] = 0;
			m_ActCube[0][2] = 0;
			m_ActCube[3][3] = 40;
		}
		else if(m_Map[iy+1][ix+3]==0 && m_Map[iy+2][ix+3]==0)
		{
			m_xMove++;
			m_xPos++;
			CCube::Transform();
		}
		break;
	case 50:
		if(m_Map[iy][ix+1]==0 && m_Map[iy+1][ix+2]==0)
		{
			m_ActCube[0][1] = 1;
			m_ActCube[1][2] = 1;
			m_ActCube[2][0] = 0;
			m_ActCube[2][2] = 0;
			m_ActCube[3][3] = 51;
		}
		break;
	case 51:
		if(m_Map[iy+1][ix]==0 && m_Map[iy+2][ix]==0)
		{
			m_ActCube[1][0] = 1;
			m_ActCube[0][1] = 0;
			m_ActCube[3][3] = 52;
		}
		else if(m_Map[iy+1][ix+3]==0 && m_Map[iy+2][ix+2]==0)
		{
			m_xMove++;
			m_xPos++;
			CCube::Transform();
		}
		break;
	case 52:
		if(m_Map[iy][ix+2]==0 && m_Map[iy+2][ix+2]==0)
		{
			m_ActCube[0][2] = 1;
			m_ActCube[2][2] = 1;
			m_ActCube[1][0] = 0;
			m_ActCube[2][1] = 0;
			m_ActCube[3][3] = 53;
		}
		break;
	case 53:
		if(m_Map[iy+2][ix]==0 && m_Map[iy+2][ix+1]==0)
		{
			m_ActCube[2][0] = 1;
			m_ActCube[2][1] = 1;
			m_ActCube[0][2] = 0;
			m_ActCube[1][2] = 0;
			m_ActCube[3][3] = 50;
		}
		else if(m_Map[iy+1][ix+3]==0 && m_Map[iy+2][ix+1]==0 && m_Map[iy+2][ix+3]==0)
		{
			m_xMove++;
			m_xPos++;
			CCube::Transform();
		}
		break;
	case 60:
		if(m_Map[iy+0][ix+1]==0 && m_Map[iy+1][ix+1]==0 && m_Map[iy+3][ix+1]==0)
		{
			m_ActCube[2][0] = 0;
			m_ActCube[2][2] = 0;
			m_ActCube[2][3] = 0;
			m_ActCube[0][1] = 1;
			m_ActCube[1][1] = 1;
			m_ActCube[3][1] = 1;
			m_ActCube[3][3] = 61;
		}
		break;
	case 61:
		if(m_Map[iy+2][ix]==0 && m_Map[iy+2][ix+2]==0 && m_Map[iy+2][ix+3]==0)
		{
			m_ActCube[2][0] = 1;
			m_ActCube[2][2] = 1;
			m_ActCube[2][3] = 1;
			m_ActCube[0][1] = 0;
			m_ActCube[1][1] = 0;
			m_ActCube[3][1] = 0;
			m_ActCube[3][3] = 60;
		}
		else if(m_Map[iy+2][ix+2]==0 && m_Map[iy+2][ix+3]==0 && m_Map[iy+2][ix+4]==0)
		{
			m_xMove++;
			m_xPos++;
			CCube::Transform();
		}
		else if(m_Map[iy+2][ix-1]==0 && m_Map[iy+2][ix]==0 && m_Map[iy+2][ix+1]==0)
		{
			m_xMove--;
			m_xPos--;
			if(CCube::Transform()) break;
			else
			{
				CCube::UpdateCube(IDI_ERASE);
				m_xMove++;
				m_xPos++;
			}
		}
		else if(m_Map[iy+2][ix-2]==0 && m_Map[iy+2][ix-1]==0 && m_Map[iy+2][ix]==0)
		{
			m_xMove -= 2;
			m_xPos -= 2;
			CCube::Transform();
		}
		else
		{
			CCube::UpdateCube(IDI_DRAW);
			return FALSE;
		}
		break;
	}

	CCube::UpdateCube(IDI_DRAW);

	return TRUE;
}

⌨️ 快捷键说明

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