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

📄 tetrisdata.cpp

📁 俄罗斯方块 VC++ 单机版 可双人单机对战
💻 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 + -