📄 cube.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 + -