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

📄 tetrisdata.cpp

📁 一个小游戏程序!! 大家可以来
💻 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 + -