📄 tetrisdata.cpp
字号:
//---------------------------------------------------------------------------
#include "TetrisData.h"
//---------------------------------------------------------------------------
bool TBaseTetris::RandomInitialized = false;
//---------------------------------------------------------------------------
const TBaseTetris::TTetrisUnits TBaseTetris::BaseUnits[NumUnits+NumMonsters+1] =
{
{{{{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,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,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},{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,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,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},{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}}},0},
{{{{0,0,0,0},{0, 0,12, 0},{0,11,15,13},{0, 0,14, 0}},
{{0,0,0,0},{0, 0,11, 0},{0,14,15,12},{0, 0,13, 0}},
{{0,0,0,0},{0, 0,14, 0},{0,13,15,11},{0, 0,12, 0}},
{{0,0,0,0},{0, 0,13, 0},{0,12,15,14},{0, 0,11, 0}}},0},
{{{{0,0,0,0},{0,11,13,11},{0, 0,14, 0},{0, 0,12, 0}},
{{0,0,0,0},{0, 0, 0,11},{0,12,14,13},{0, 0, 0,11}},
{{0,0,0,0},{0, 0,12, 0},{0, 0,14, 0},{0,11,13,11}},
{{0,0,0,0},{0,11, 0, 0},{0,13,14,12},{0,11, 0, 0}}},0},
{{{{0,0,0,0},{0, 0, 0,14},{0,12,15,13},{0,11, 0, 0}},
{{0,0,0,0},{0,11,12, 0},{0, 0,15, 0},{0, 0,13,14}},
{{0,0,0,0},{0, 0, 0,11},{0,13,15,12},{0,14, 0, 0}},
{{0,0,0,0},{0,14,13, 0},{0, 0,15, 0},{0, 0,12,11}}},0},
{{{{0,0,0,0},{0,12, 0, 0},{0,11,15,14},{0, 0, 0,13}},
{{0,0,0,0},{0, 0,11,12},{0, 0,15, 0},{0,13,14, 0}},
{{0,0,0,0},{0,13, 0, 0},{0,14,15,11},{0, 0, 0,12}},
{{0,0,0,0},{0, 0,14,13},{0, 0,15, 0},{0,12,11, 0}}},0},
{{{{0,0,0,0},{0, 0, 0, 0},{0,11,15,14},{0,12, 0,13}},
{{0,0,0,0},{0,12,11, 0},{0, 0,15, 0},{0,13,14, 0}},
{{0,0,0,0},{0,13, 0,12},{0,14,15,11},{0, 0, 0, 0}},
{{0,0,0,0},{0, 0,14,13},{0, 0,15, 0},{0, 0,11,12}}},0},
{{{{0,0,0,0},{0, 0,12, 0},{0,11, 0,13},{0, 0,14, 0}},
{{0,0,0,0},{0, 0,11, 0},{0,14, 0,12},{0, 0,13, 0}},
{{0,0,0,0},{0, 0,14, 0},{0,13, 0,11},{0, 0,12, 0}},
{{0,0,0,0},{0, 0,13, 0},{0,12, 0,14},{0, 0,11, 0}}},0},
{{{{0,0,0,0},{0, 0,13,14},{0,12,15, 0},{0,11, 0, 0}},
{{0,0,0,0},{0,11,12, 0},{0, 0,15,13},{0, 0, 0,14}},
{{0,0,0,0},{0, 0, 0,11},{0, 0,15,12},{0,14,13, 0}},
{{0,0,0,0},{0,14, 0, 0},{0,13,15, 0},{0, 0,12,11}}},0},
{{{{0,0,0,0},{0,11, 0,12},{0, 0,15, 0},{0,14, 0,13}},
{{0,0,0,0},{0,14, 0,11},{0, 0,15, 0},{0,13, 0,12}},
{{0,0,0,0},{0,13, 0,14},{0, 0,15, 0},{0,12, 0,11}},
{{0,0,0,0},{0,12, 0,13},{0, 0,15, 0},{0,11, 0,14}}},0},
{{{{0,0,0,0},{0,0,0,0},{0,0,16,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0},{0,0,16,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0},{0,0,16,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0},{0,0,16,0},{0,0,0,0}}},1},
};
//---------------------------------------------------------------------------
TBaseTetris::TBaseTetris()
{
if(!RandomInitialized)
{
randomize();
RandomInitialized=true;
}
Ux0 = MapXsize/2-2;
Uy0 = -1;
_bStarted = false;
_bGameOver = false;
_iRemoving = 0;
_iScore = 0;
_iLines = 0;
_iMonsters = 0;
_iBombs = 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;
}
//---------------------------------------------------------------------------
void TBaseTetris::CheckBomb(void)
{
if(CurrUnit.a&tbaBomb)
{
int Bx=CurrUnit.x+2, By=CurrUnit.y+2;
for(int y=MapYsize-1; y>=CurrUnit.y; y--)
if(BlockBuffer.TetrisBuffer[y][Bx]==0)
{
By=y;
break;
}
for(int x=0; x<MapXsize; x++)
BlockBuffer.TetrisBuffer[By][x]=10;
CurrUnit.y = By-2;
DispTetris();
}
}
//---------------------------------------------------------------------------
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] = (CurrUnit.a&tbaBomb)?10:(NumUnits+1);
_iRemoving = 2;
}
}
}
return _iRemoving;
}
//---------------------------------------------------------------------------
void TBaseTetris::GenNewUnit(void)
{
CurrUnit = IncmUnit;
if(_iMonsters>0)
{
_iMonsters--;
IncmUnit = BaseUnits[NumUnits+random(NumMonsters)];
}
else if(_iBombs>0)
{
_iBombs--;
IncmUnit = BaseUnits[NumUnits+NumMonsters];
}
else
{
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;
}
if(r!=CurrUnit.r)
{
int x0=3,x1=0;
for(int ty=0; ty<4; ty++)
for(int tx=0; tx<4; tx++)
if(CurrUnit.un[r][ty][tx])
{
if(x0>tx)x0=tx;
if(x1<tx)x1=tx;
}
if(x+x0<0)
x=-x0;
if(x+x1>=MapXsize)
x=MapXsize-x1-1;
}
ck=CheckUnit(x,y,r);
if((ck)&&(CurrUnit.a&tbaBomb)&&(iMdir==btmDown))
{
int Bx=CurrUnit.x+2, By=CurrUnit.y+2;
for(int y=MapYsize-1; y>=CurrUnit.y; y--)
if(BlockBuffer.TetrisBuffer[y][Bx]==0)
{
By=y;
break;
}
if(CurrUnit.y<By-2)
ck=0;
}
if(ck&2)
{
if(iMdir==btmDown)
{
CheckBomb();
BlockBuffer = DispBuffer;
TryToRemove();
}
return;
}
CurrUnit.x=x; CurrUnit.y=y; CurrUnit.r=r;
DispTetris();
if((ck)&&(iMdir!=btmDown))
{
CheckBomb();
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));
_iMonsters = 0;
_iBombs = 0;
GenNewUnit();
GenNewUnit();
_bStarted = true;
_bGameOver = false;
_iRemoving = 0;
_iScore = 0;
_iLines = 0;
_iMonsters = 0;
_iBombs = 0;
DispTetris();
}
//---------------------------------------------------------------------------
void TBaseTetris::AddLines(int Ln)
{
if(!_bGameOver)
{
for(int y=0;y<MapYsize-Ln;y++)
for(int x=0;x<MapXsize;x++)
{
BlockBuffer.TetrisBuffer[y][x]=BlockBuffer.TetrisBuffer[y+Ln][x];
DispBuffer.TetrisBuffer[y][x]=DispBuffer.TetrisBuffer[y+Ln][x];
}
for(int y=MapYsize-Ln;y<MapYsize;y++)
{
for(int x=0;x<MapXsize;x++)
BlockBuffer.TetrisBuffer[y][x]=random(3)?(NumUnits+2):0;
BlockBuffer.TetrisBuffer[y][random(MapXsize)]=0;
}
CurrUnit.y-=Ln+1;
DispTetris();
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -