📄 tetrisdata.cpp
字号:
//---------------------------------------------------------------------------
#include "TetrisData.h"
//---------------------------------------------------------------------------
const TBaseTetris::TTetrisUnits TBaseTetris::BaseUnits[NumUnits] =
{
{{{{0,0,0,0},{0,0,0,0},{1,1,1,1},{0,0,0,0}},
{{0,0,1,0},{0,0,1,0},{0,0,1,0},{0,0,1,0}},
{{0,0,0,0},{0,0,0,0},{1,1,1,1},{0,0,0,0}},
{{0,0,1,0},{0,0,1,0},{0,0,1,0},{0,0,1,0}}}},
{{{{0,0,0,0},{0,0,2,0},{0,2,2,2},{0,0,0,0}},
{{0,0,2,0},{0,0,2,2},{0,0,2,0},{0,0,0,0}},
{{0,0,0,0},{0,2,2,2},{0,0,2,0},{0,0,0,0}},
{{0,0,2,0},{0,2,2,0},{0,0,2,0},{0,0,0,0}}}},
{{{{0,0,0,0},{0,0,0,3},{0,3,3,3},{0,0,0,0}},
{{0,0,3,0},{0,0,3,0},{0,0,3,3},{0,0,0,0}},
{{0,0,0,0},{0,3,3,3},{0,3,0,0},{0,0,0,0}},
{{0,3,3,0},{0,0,3,0},{0,0,3,0},{0,0,0,0}}}},
{{{{0,0,0,0},{0,4,0,0},{0,4,4,4},{0,0,0,0}},
{{0,0,4,4},{0,0,4,0},{0,0,4,0},{0,0,0,0}},
{{0,0,0,0},{0,4,4,4},{0,0,0,4},{0,0,0,0}},
{{0,0,4,0},{0,0,4,0},{0,4,4,0},{0,0,0,0}}}},
{{{{0,0,5,0},{0,5,5,0},{0,5,0,0},{0,0,0,0}},
{{0,0,0,0},{0,5,5,0},{0,0,5,5},{0,0,0,0}},
{{0,0,5,0},{0,5,5,0},{0,5,0,0},{0,0,0,0}},
{{0,0,0,0},{0,5,5,0},{0,0,5,5},{0,0,0,0}}}},
{{{{0,0,6,0},{0,0,6,6},{0,0,0,6},{0,0,0,0}},
{{0,0,0,0},{0,0,6,6},{0,6,6,0},{0,0,0,0}},
{{0,0,6,0},{0,0,6,6},{0,0,0,6},{0,0,0,0}},
{{0,0,0,0},{0,0,6,6},{0,6,6,0},{0,0,0,0}}}},
{{{{0,0,0,0},{0,7,7,0},{0,7,7,0},{0,0,0,0}},
{{0,0,0,0},{0,7,7,0},{0,7,7,0},{0,0,0,0}},
{{0,0,0,0},{0,7,7,0},{0,7,7,0},{0,0,0,0}},
{{0,0,0,0},{0,7,7,0},{0,7,7,0},{0,0,0,0}}}},
};
//---------------------------------------------------------------------------
TBaseTetris::TBaseTetris()
{
randomize();
Ux0 = MapXsize/2-2;
Uy0 = -1;
_bStarted = false;
_bGameOver = false;
_iRemoving = 0;
_iScore = 0;
_iLines = 0;
memset(&CurrUnit,0,sizeof(TTetrisUnits));
memset(&IncmUnit,0,sizeof(TTetrisUnits));
memset(&DispBuffer,0,sizeof(TTetrisBuffer));
memset(&BlockBuffer,0,sizeof(TTetrisBuffer));
GenNewUnit();
}
//---------------------------------------------------------------------------
TBaseTetris::~TBaseTetris()
{
//do nothing.
}
//---------------------------------------------------------------------------
int TBaseTetris::CheckUnit(int x, int y, int r)
{
int bx,by,v=0;
for(int i=0; i<4; i++)
{
by = i+y;
for(int k=0; k<4; k++)
{
bx = k+x;
if(CurrUnit.un[r][i][k])
{
if((bx<0)||(bx>=MapXsize)||(by>=MapYsize))
{
v|=2;
return v; //illegal move
}
if(by>=0)
{
if(BlockBuffer.TetrisBuffer[by][bx])
{
v|=2; //illegal move
return v;
}
if(by>=MapYsize-1)
v|=1; //dropped
else if(BlockBuffer.TetrisBuffer[by+1][bx])
v|=1; //dropped
}
}
}
}
return v;
}
//---------------------------------------------------------------------------
int TBaseTetris::TryToRemove(void)
{
if(_iRemoving)
{
if(--_iRemoving==0)
{
int irmlines = 0;
for(int y=0; y<MapYsize; y++)
{
bool bOK = true;
for(int x=0; x<MapXsize; x++)
if(BlockBuffer.TetrisBuffer[y][x]==0)
{
bOK = false;
break;
}
if(bOK)
{
int m;
for(m=y; m>0; m--)
for(int x=0; x<MapXsize; x++)
BlockBuffer.TetrisBuffer[m][x] = BlockBuffer.TetrisBuffer[m-1][x];
for(int x=0; x<MapXsize; x++)
BlockBuffer.TetrisBuffer[m][x] = 0;
irmlines ++;
}
}
AddScore(irmlines);
}
}
else
{
_iRemoving = 1;
for(int y=0; y<MapYsize; y++)
{
bool bOK = true;
for(int x=0; x<MapXsize; x++)
if(BlockBuffer.TetrisBuffer[y][x]==0)
{
bOK = false;
break;
}
if(bOK)
{
for(int x=0; x<MapXsize; x++)
BlockBuffer.TetrisBuffer[y][x] = NumUnits+1;
_iRemoving = 2;
}
}
}
return _iRemoving;
}
//---------------------------------------------------------------------------
void TBaseTetris::GenNewUnit(void)
{
CurrUnit = IncmUnit;
IncmUnit = BaseUnits[random(NumUnits)];
IncmUnit.x = Ux0;
IncmUnit.y = Uy0;
IncmUnit.r = random(4);
}
//---------------------------------------------------------------------------
void TBaseTetris::DispTetris(void)
{
DispBuffer = BlockBuffer;
if(!_iRemoving)
{
for(int i=0; i<4; i++)
for(int k=0; k<4; k++)
if((i+CurrUnit.y>=0)&&(CurrUnit.un[CurrUnit.r][i][k]))
DispBuffer.TetrisBuffer[i+CurrUnit.y][k+CurrUnit.x] = CurrUnit.un[CurrUnit.r][i][k];
}
}
//---------------------------------------------------------------------------
void TBaseTetris::Move(int iMdir)
{
if(_bStarted)
{
if(_iRemoving)
{
if(!TryToRemove())
{
GenNewUnit();
if(CheckUnit(CurrUnit.x,CurrUnit.y,CurrUnit.r))
_bGameOver = true;
}
DispTetris();
}
else
{
int ck, x=CurrUnit.x, y=CurrUnit.y, r=CurrUnit.r;
switch(iMdir)
{
case btmLeft : x--; break;
case btmRight: x++; break;
case btmDown : y++; break;
case btmCW : r++; r&=3; break;
case btmCCW : r--; r&=3; break;
}
ck=CheckUnit(x,y,r);
if(ck&2)
{
if(iMdir==btmDown)
{
BlockBuffer = DispBuffer;
TryToRemove();
}
return;
}
CurrUnit.x=x; CurrUnit.y=y; CurrUnit.r=r;
DispTetris();
if((ck)&&(iMdir!=btmDown))
{
BlockBuffer = DispBuffer;
TryToRemove();
}
}
}
}
//---------------------------------------------------------------------------
void TBaseTetris::AddScore(int iRmv)
{
switch(iRmv)
{
case 0: _iScore++; break;
case 1: _iScore+=10; break;
case 2: _iScore+=30; break;
case 3: _iScore+=50; break;
case 4: _iScore+=80; break;
}
_iLines+=iRmv;
}
//---------------------------------------------------------------------------
void TBaseTetris::NewGame(void)
{
memset(&DispBuffer,0,sizeof(TTetrisBuffer));
memset(&BlockBuffer,0,sizeof(TTetrisBuffer));
GenNewUnit();
_bStarted = true;
_bGameOver = false;
_iRemoving = 0;
_iScore = 0;
_iLines = 0;
DispTetris();
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -