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

📄 tetrislogic.cpp

📁 一个利用hge游戏引擎
💻 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 + -