?? tetrislogic.cpp
字號:
//// http://dotlive.cnblogs.com/
// TetrisLogic.cpp: implementation of the TetrisLogic class.
//
//////////////////////////////////////////////////////////////////////
#include "TetrisLogic.h"
#include <cstdio>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
TetrisLogic::TetrisLogic(IGameEngine* pGE):GameLogic(pGE)
{
byte nGameBoxCell[10][4][5][5]=
{
{//id = 0
{//state =0
{0,0,0,0,0},
{0,0,0,0,0},
{0,1,1,0,0},
{0,1,1,0,0},
{0,0,0,0,0}
},
{//state =1
{0,0,0,0,0},
{0,0,0,0,0},
{0,1,1,0,0},
{0,1,1,0,0},
{0,0,0,0,0}
},
{//state =2
{0,0,0,0,0},
{0,0,0,0,0},
{0,1,1,0,0},
{0,1,1,0,0},
{0,0,0,0,0}
},
{//state =3
{0,0,0,0,0},
{0,0,0,0,0},
{0,1,1,0,0},
{0,1,1,0,0},
{0,0,0,0,0}
}
},
{//id = 1
{//state =0
{0,0,0,0,0},
{0,0,0,0,0},
{1,1,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{//state =1
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,0,0,0}
},
{//state =2
{0,0,0,0,0},
{0,0,0,0,0},
{1,1,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{//state =3
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,0,0,0}
}
},
{//id = 2
{//state =0
{0,0,0,0,0},
{0,0,0,0,0},
{0,1,1,0,0},
{0,0,1,1,0},
{0,0,0,0,0}
},
{//state =1
{0,0,0,0,0},
{0,0,1,0,0},
{0,1,1,0,0},
{0,1,0,0,0},
{0,0,0,0,0}
},
{//state =2
{0,0,0,0,0},
{0,0,0,0,0},
{0,1,1,0,0},
{0,0,1,1,0},
{0,0,0,0,0}
},
{//state =3
{0,0,0,0,0},
{0,0,1,0,0},
{0,1,1,0,0},
{0,1,0,0,0},
{0,0,0,0,0}
}
},
{//id = 3
{//state =0
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,1,1,0},
{0,1,1,0,0},
{0,0,0,0,0}
},
{//state =1
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,1,1,0},
{0,0,0,1,0},
{0,0,0,0,0}
},
{//state =2
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,1,1,0},
{0,1,1,0,0},
{0,0,0,0,0}
},
{//state =3
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,1,1,0},
{0,0,0,1,0},
{0,0,0,0,0}
}
},
{//id = 4
{//state =0
{0,0,0,0,0},
{0,0,0,0,0},
{0,1,1,1,0},
{0,1,0,0,0},
{0,0,0,0,0}
},
{//state =1
{0,0,0,0,0},
{0,1,1,0,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,0,0,0}
},
{//state =2
{0,0,0,0,0},
{0,0,0,1,0},
{0,1,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{//state =3
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,1,1,0},
{0,0,0,0,0}
}
},
{//id = 5
{//state =0
{0,0,0,0,0},
{0,0,0,0,0},
{0,1,1,1,0},
{0,0,0,1,0},
{0,0,0,0,0}
},
{//state =1
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,1,1,0,0},
{0,0,0,0,0}
},
{//state =2
{0,0,0,0,0},
{0,1,0,0,0},
{0,1,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{//state =3
{0,0,0,0,0},
{0,0,1,1,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,0,0,0}
}
},
{//id = 6
{//state =0
{0,0,0,0,0},
{0,0,0,0,0},
{0,1,1,1,0},
{0,0,1,0,0},
{0,0,0,0,0}
},
{//state =1
{0,0,0,0,0},
{0,0,1,0,0},
{0,1,1,0,0},
{0,0,1,0,0},
{0,0,0,0,0}
},
{//state =2
{0,0,0,0,0},
{0,0,1,0,0},
{0,1,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{//state =3
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,1,1,0},
{0,0,1,0,0},
{0,0,0,0,0}
}
},
{//id = 7
{//state =0
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{//state =1
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{//state =2
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{//state =3
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}
}
},
{//id = 8
{//state =0
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{//state =1
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{//state =2
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{//state =3
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}
}
},
{//id = 9
{//state =0
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{//state =1
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{//state =2
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{//state =3
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}
}
}
};
memcpy( (void*)m_nGameBoxCell, (void*)nGameBoxCell, 10*4*5*5 );
// Init();
}
TetrisLogic::~TetrisLogic()
{
}
INT TetrisLogic::GameStep( float fTimeEscape )
{
m_nLogicTimer = m_nLogicTimer>100000?m_nLogicTimer-100000:m_nLogicTimer ;
INT n = m_nLogicTimer/m_fFallingSpeed ;
m_nLogicTimer += fTimeEscape*1000;
INT n2 = m_nLogicTimer/m_fFallingSpeed ;
if ( n2>n )
{
GameInput(KeyDown,n2-n);
}
return 0;
}
int TetrisLogic::GetBoxCell(int nBoxid,int nState,int x,int y)
{
if (nBoxid>=0&&nBoxid<10
&&nState>=0&&nState<4
&&x>=0&&x<5
&&y>=0&&y<5
)
{
return m_nGameBoxCell[nBoxid][nState][y][x];
}
return -1;
}
BOOL TetrisLogic::TestHit(TetrisBox stTmpBox)
{
for (int x=0;x<5;x++)
{
for (int y=0;y<5;y++)
{
if (1==GetBoxCell(stTmpBox.m_nBoxID,stTmpBox.m_nState,x,y))
{
if (1==GameStage(stTmpBox.m_ptPosition.x+x-2,stTmpBox.m_ptPosition.y+y-2))
{
return TRUE;
}
}
}
}
return FALSE;
}
INT TetrisLogic::GameInput( INT nKeyCode ,int nStep)
{
TetrisBox tmpBox = m_stFallingBox;
switch(nKeyCode)
{
case KeyTurn:
tmpBox.m_nState = (tmpBox.m_nState+1)%4;
// tmpBox.m_nState = (tmpBox.m_nState+3)%4;
break;
case KeyRight:
tmpBox.m_ptPosition.x ++;
break;
case KeyLeft:
tmpBox.m_ptPosition.x --;
break;
case KeyDown:
tmpBox.m_ptPosition.y ++;
break;
// case KeyDown:
// break;
}
if (!TestHit(tmpBox))
{
m_stFallingBox = tmpBox;
}
else
{
if (KeyDown == nKeyCode)
{
BoxDone();
}
}
return 0;
}
void TetrisLogic::BoxDone()
{
for (int x=0;x<5;x++)
{
for (int y=0;y<5;y++)
{
if (1 == GetBoxCell(m_stFallingBox.m_nBoxID,m_stFallingBox.m_nState, x, y ))
{
int dx = m_stFallingBox.m_ptPosition.x+x-2;
int dy = m_stFallingBox.m_ptPosition.y+y-2;
if(dx<10&&dx>=0&&dy<30&&dy>=0)
m_nGameStage[dx][dy] = 1;
}
}
}
//check record
CheckScore();
//reset fallbox to next
//get next
m_stFallingBox = m_stNextBox;
m_stNextBox.m_nBoxID = GetRadomType();
return;
}
void TetrisLogic::Init()
{
m_nLogicTimer = 0;
m_stFallingBox.m_nBoxID = GetRadomType();
m_stFallingBox.m_nState = 0;
m_stFallingBox.m_ptPosition.y = 0;
m_stFallingBox.m_ptPosition.x = 4;
m_stNextBox.m_nBoxID = GetRadomType();
m_stNextBox.m_nState = 0;
m_stNextBox.m_ptPosition.y = 0;
m_stNextBox.m_ptPosition.x = 4;
memset ( m_nGameStage, 0, 30*10* sizeof(byte) );
m_fFallingSpeed = 1000;
m_nScore = 100;
}
int TetrisLogic::GetRadomType()
{
return m_pGE->IGE_GetRandomInt(0,6);
}
byte TetrisLogic::GameStage( int x,int y ) const
{
if(x<10&&x>=0&&y<30&&y>=0)
return m_nGameStage[x][y];
return 1;
}
void TetrisLogic::CheckScore()
{
int nV = 0;
int nF = 0;
int x,y;
int nFI[5] = {-1,-1,-1,-1,-1};
for ( y=30-1;y>=0;y--)
{
BOOL bFull = (1==m_nGameStage[0][y]);
BOOL bEmpty = !bFull;
for (x=1; (bFull || bEmpty) && x<10 ;x++)
{
if (1!=m_nGameStage[x][y])
{
bFull = FALSE;
}
else
{
bEmpty = FALSE;
}
}
if (bEmpty)
{
nV = y;
break;
}
if ( bFull )
{
nFI[nF] = y;
nF ++;
}
}
if (nF>0)
{
int k = 1;
for (y=nFI[0]-1;y>nV;y--)
{
if (y==nFI[k])
{
k++;
}
else
{
for (x=0;x<10;x++)
{
m_nGameStage[x][y+k]=m_nGameStage[x][y];
}
}
}
for (;k>0;k--)
{
for (x=0;x<10;x++)
{
m_nGameStage[x][nV+k]=0;
}
}
}
m_nScore = m_nScore + nF*nF*100 + (nF-1)*10;
}
void TetrisLogic::PrintScore()
{
char str[50] = {0};
sprintf(str,"Score:%20d", m_nScore);
m_pGE->IGE_DrawText(0,32,0xFFFF00FF,str);
}
void TetrisLogic::DrawLandEdge()
{
for(int x=-1;x<11;x++)
{
m_pGE->IGE_DrawABoxCell(x,-1,0xffffff00,0);
m_pGE->IGE_DrawABoxCell(x,30,0xffffff00,0);
}
for (int y=-1;y<31;y++)
{
m_pGE->IGE_DrawABoxCell(-1,y,0xffffff00,0);
m_pGE->IGE_DrawABoxCell(10,y,0xffffff00,0);
}
}
void TetrisLogic::DrawLand()
{
for(int x=0;x<10;x++)
{
for (int y=0;y<30;y++)
{
if ( m_nGameStage[x][y]==1)
{
m_pGE->IGE_DrawABoxCell(x,y,0xff00ff00,0);
}
}
}
}
void TetrisLogic::DrawBox()
{
TetrisBox stTmpBox = GetFallingBox();
for (int x=0;x<5;x++)
{
for (int y=0;y<5;y++)
{
if (1==GetBoxCell(stTmpBox.m_nBoxID,stTmpBox.m_nState,x,y))
{
m_pGE->IGE_DrawABoxCell(stTmpBox.m_ptPosition.x+x-2,stTmpBox.m_ptPosition.y+y-2,0xff00ff00,0);
}
}
}
}
void TetrisLogic::DrawNextBox()
{
TetrisBox stTmpBox = m_stNextBox;
for (int x=0;x<5;x++)
{
for (int y=0;y<5;y++)
{
if (1==GetBoxCell(stTmpBox.m_nBoxID,stTmpBox.m_nState,x,y))
{
m_pGE->IGE_DrawABoxCell(15+x-2,5+y-2,0xff0000ff,0);
}
}
}
}
void TetrisLogic::Render()
{
DrawNextBox();
DrawBox();
DrawLand();
DrawLandEdge();
PrintScore();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -