1. CChess.h
#ifndef
CHESS_H
#define
CHESS_H
#define
C_ChessWidth 16
#define
C_ChessHeight 16
#define
C_ChessM2 -1 //
乘以二的chess
#define
C_StartPosX 8
#define
C_StartPosY 0
#define
C_ChessNumX 10 //
每行的chess个数
#define
C_ChessNumY 10 //
美列的chess个数
#include
"glob.h"
class
CChess
{
private
:
CGTimer * m_Timer;
TPoint ComputPos( TInt aIndex );
TRect ComputRect();
enum EChessState
{
TSelected,
TRemoved,
TNormal,
TBomb,
};
TInt m_Num;
TInt m_Index; //
在棋盘中的位置。
TInt m_choosenIndex;
EChessState m_state;
CImage * m_NumImages[3];
TInt m_SelectNo; //
被选中的序号
public
:
TInt GetNum();
TBool IsAlive();
CChess( TInt aNum, TInt aIndex, CImage * aNumsImage[3], CGTimer * aTimer );
TInt GetIndex(){ return m_Index; };
TInt Render ( CFbsBitmap * aBmp );
TBool select( TInt & aSelectNums );
void remove();
//
返回这个方块被选中的数
TInt GetSelectIndex(void);
void ResetChess();
void DrawBomb1( CFbsBitmap * aBmp );
void DrawBomb2( CFbsBitmap * aBmp );
};
#endif
2.
CChess.cpp
#include
"chess.h"
CChess::CChess( TInt aNum, TInt aIndex, CImage * aNumsImage[3], CGTimer * aTimer )
{
m_state = TNormal;
// m_bSelect = EFalse;
m_Num = aNum;
m_Index =aIndex;
for ( TInt i = 0; i < 3; i++ ) {
m_NumImages[i] = aNumsImage[i];
}
m_Timer = aTimer;
m_SelectNo = -1;
}
void
CChess::remove()
{
// m_state = TBomb;
m_state = TRemoved;
}
TBool CChess::select( TInt & aSelectNums )
{
if ( m_state == TSelected ) {
m_SelectNo = -1;
aSelectNums --;
m_state = TNormal;
return EFalse;
}
else if ( m_state == TNormal ) {
m_SelectNo = aSelectNums;
aSelectNums ++;
m_state = TSelected;
return ETrue;
}
//return ( m_state & TSelected );
}
// aIndex
是在容器中的位置
TInt CChess::Render( CFbsBitmap* aBmp )
{
int i; i = 0;
switch ( m_state )
{
case TNormal:
m_NumImages[0]->RenderToBitmapL( aBmp, ComputPos(m_Index), ComputRect() );
break;
case TSelected:
m_NumImages[1]->RenderToBitmapL( aBmp, ComputPos(m_Index), ComputRect() );
break;
case TRemoved:
return 0;
break;
case TBomb:
return 0;
break;
}
return 1;
}
//
不负责计算爆炸图片
TRect CChess::ComputRect()
{
if ( m_Num >=1 ) {
return TRect( TPoint(C_ChessWidth * m_Num, 0), TSize(C_ChessWidth,C_ChessHeight) );
}
else if ( m_Num = C_ChessM2 ) {
return TRect ( 0, 0, C_ChessWidth, C_ChessHeight );
}
}
TPoint CChess::ComputPos( TInt aIndex )
{
//
行列的计数都是从0 开始的
TInt x = aIndex % C_ChessNumX; //
每行8个元素
TInt y = aIndex / C_ChessNumY; //
每列8个元素
return TPoint( C_ChessWidth * x + C_StartPosX,
C_ChessHeight * y + C_StartPosY );
}
TBool CChess::IsAlive()
{
if ( m_state != TBomb && m_state != TRemoved ) {
return ETrue;
}
else
{
return EFalse;
}
}
TInt CChess::GetNum()
{
return m_Num;
}
TInt CChess::GetSelectIndex(void)
{
return m_SelectNo;
}
void
CChess::ResetChess()
{
m_state = TNormal;
m_SelectNo = -1;
}
void
CChess::DrawBomb1( CFbsBitmap * aBmp )
{
if ( m_NumImages[2] == NULL ) {
return;
}
m_NumImages[2]->RenderToBitmapL( aBmp, ComputPos(m_Index) - TPoint(2,1),
TRect( 0, 0, C_ChessWidth, C_ChessHeight ) );
}
void
CChess::DrawBomb2( CFbsBitmap * aBmp )
{
if ( m_NumImages[2] == NULL ) {
return;
}
m_NumImages[2]->RenderToBitmapL( aBmp, ComputPos(m_Index) - TPoint(2,1),
TRect( C_ChessWidth, 0, C_ChessWidth * 2, C_ChessHeight ) );
}
3.
CChessBoard.h
#ifndef
CHESSBOARD_H
#define
CHESSBOARD_H
#include
"glob.h"
#include
"chess.h"
#include
"face.h"
#include
"LaneTimer.h"
#include
"ShortTimer.h"
#include
"Cur.h"
#include
"TargetNum.h"
#include
"calculate.h"
#include
"dialog.h"
#include
"GFile.h"
#include
"SoundPlayer.h"
class
CChessBoard
{
private
:
enum EGameState {
TIntroduce,
TNew,
TRun,
TPause,
TResume,
TPassLeave,
TGameOver,
TWin,
TShowScore,
TShowHiS,
TDoHiS,
};
EGameState m_GameState;
TBool m_bGetHi; //
是否获得最高分
CArrayPtrFlat<CChess> * m_AliveChessList; //
让然存在的方块指针数组,用于产生目标数字
CArrayPtrFlat<CChess> * m_BombChessList; //
保存要爆炸的图像文件
CArrayPtrFlat<CChess> * m_WaitKillChessList; //
选中的方块数组,用于按顺序消去
void RemoveChess ( TInt aChessIndex ); //
删除一个方块对象
TInt RandomChess(); //
随即产生方块
CChess ** m_chess; //
方块
CImage * m_ChessImage[3]; //
方块图片
CImage * m_BackGround; //
背景
CFace * m_Face; //
笑脸
CGTimer * m_pAniTimer; //
动画的Timer
CShortTimer * m_ShortTimer; // 10
秒倒计时的Timer;
CLaneTimer * m_pNumTimer; //
总共倒计时
CLaneCur * m_Cur; //
选取框
CTargetNum * m_TargetNum; //
目标数字
TKeyHandler * m_KeyHandler; //
输入控制器
TInt m_NumsList[10]; //
数字索引
TInt64 m_iSeed;
TInt m_Leave; //
游戏关卡
TInt m_Score; //
玩家得分
TInt m_HighScore; //
最高分纪录。
CSoundPlayer * m_SoundPlayer;
//
public
:
CDialog * m_pDlg;
private
:
TInt GameRun( CFbsBitGc* aCallerGc, CFbsBitmap* aBmp );
TInt GameOver ( CFbsBitGc* aCallerGc, CFbsBitmap* aBmp, TBool aWin = EFalse );
TInt ShowSroce( CFbsBitGc* aCallerGc, CFbsBitmap* aBmp );
TInt ShowHiS( CFbsBitGc* aCallerGc, CFbsBitmap* aBmp );
TInt ShowDoHiS( CFbsBitGc* aCallerGc, CFbsBitmap* aBmp );
TInt Win( CFbsBitGc* aCallerGc, CFbsBitmap* aBmp );
public
:
void PassLeave();
void GameStart();
void SetLeave( TInt aLevel );
void ConstructL();
CChessBoard(TKeyHandler * aKeyHandler);
~CChessBoard();
void RenderBomb( CFbsBitmap* aBmp );
TInt Render ( CFbsBitGc* aCallerGc, CFbsBitmap* aBmp );
void NewGame();
void EnableSound( TBool aAble );
void Pause();
void Resume();
};
#endif
4.
CChessboard.cpp
#include
"ChessBoard.h"
CChessBoard::CChessBoard( TKeyHandler * aKeyHandler )
{
m_NumsList[9] = -1; // -1
为乘2的棋子
for ( TInt i = 0; i < 9; i ++ ) {
m_NumsList[i] = i+1; // 1 ~ 9
}
m_chess = NULL;
for ( i = 0; i < 3; i ++ ) {
m_ChessImage[i] = NULL ;
}
m_BackGround = NULL;
m_Face = NULL;
m_pAniTimer = NULL;
m_pNumTimer = NULL;
m_Cur = NULL;
m_ShortTimer = NULL;
m_AliveChessList = NULL;
m_BombChessList = NULL;
m_WaitKillChessList = NULL;
m_TargetNum = NULL;
m_KeyHandler = aKeyHandler;
m_Leave = 1;
m_HighScore = 0;
m_Score = 0;
m_pDlg = NULL;
m_bGetHi = EFalse;
//
m_SoundPlayer = NULL;
}
CChessBoard::~CChessBoard()
{
for ( TInt i = 0; i < C_ChessNumX * C_ChessNumY; i ++ ) {
if ( m_chess[i] ) delete m_chess[i];
}
delete[] m_chess;
for ( i = 0; i < 3; i ++ ) {
delete m_ChessImage[i] ;
}
if ( m_BackGround ) delete m_BackGround;
if ( m_Face ) delete m_Face;
if ( m_pAniTimer ) delete m_pAniTimer;
if ( m_pNumTimer ) delete m_pNumTimer;
if ( m_ShortTimer ) delete m_ShortTimer;
if ( m_Cur ) delete m_Cur;
if ( m_AliveChessList ) delete m_AliveChessList;
if ( m_BombChessList ) delete m_BombChessList;
if ( m_WaitKillChessList ) delete m_WaitKillChessList;
if ( m_TargetNum ) delete m_TargetNum;
if ( m_pDlg ) delete m_pDlg;
if ( m_SoundPlayer ) delete m_SoundPlayer;
}
//
构造游戏需要的资源
void
CChessBoard::ConstructL()
{
//
背景
m_BackGround = CImage::NewL( _L("res.mbm"), 0, ETrue, 0xffff );
m_Face = new CFace;
m_pAniTimer = new CGTimer();
m_pAniTimer->ConstructL();
m_pAniTimer->Stop();
//
正常的chess
m_ChessImage[0] = CImage::NewL( _L("res.mbm"), 3, ETrue, 0xfff );
//
被选中的chess
m_ChessImage[1] = CImage::NewL( _L("res.mbm"), 4, ETrue, 0xfff );
//
爆炸
m_ChessImage[2] = CImage::NewL( _L("res.mbm"), 5, ETrue, 0xfff );
m_chess = new CChess * [C_ChessNumX * C_ChessNumY];
for ( TInt i = 0; i < C_ChessNumX * C_ChessNumY; i ++ ) {
m_chess[i] = NULL;
}
m_pNumTimer = new CLaneTimer;
m_WaitKillChessList = new (ELeave) CArrayPtrFlat<CChess> ( 50 );
m_AliveChessList = new (ELeave) CArrayPtrFlat<CChess> ( C_ChessNumX * C_ChessNumY );
m_BombChessList = new (ELeave) CArrayPtrFlat<CChess> ( C_ChessNumX * C_ChessNumY );
m_Cur = new CLaneCur( m_KeyHandler, m_chess, C_ChessNumX * C_ChessNumY, m_WaitKillChessList );
m_TargetNum = new CTargetNum();
m_pDlg = CDialog::NewL();
//
读取最高分。
#ifdef
__WINS__
CGFile* file = CGFile::NewL(_L("c://HiS.sc"), EFileRead | EFileShareAny);
#else
CGFile* file = CGFile::NewL(_L("HiS.sc"), EFileRead | EFileShareAny);
#endif
file->ReadL((TText8*) & m_HighScore, sizeof(TInt));
delete file;
m_SoundPlayer = CSoundPlayer::NewL();
// m_GameState = TShowScore;
// break;
// case -2:
// m_GameState = TDoHiS;
m_GameState = TNew;
// m_GameState = TIntroduce;
}
//
数据计算跟渲染
TInt CChessBoard::Render( CFbsBitGc* aCallerGc, CFbsBitmap* aBmp )
{
switch( m_GameState ) {
case TIntroduce:
break;
case TNew:
GameStart();
m_GameState = TRun;
break;
case TRun:
switch ( GameRun( aCallerGc, aBmp ) ) {
case -1414: // gameover
m_pDlg->Reset();
m_GameState = TGameOver;
break;
case 8888: //
过关
if ( m_Leave < 3 ) { // not win
m_pDlg->Reset();
m_GameState = TPassLeave;
}
else { // win
m_pDlg->Reset();
m_GameState = TWin;
}
break;
case 3:
break;
default:
break;
}
break;
case TPassLeave:
m_pDlg->PassLeave();
m_pDlg->Render(aCallerGc, aBmp);
if ( m_KeyHandler->IsDown(53) || m_KeyHandler->IsDown(167) ) {
PassLeave();
// m_pDlg->Nothing();
m_pDlg->Reset();
m_GameState = TRun;
}
m_KeyHandler->Reset();
break;
case TPause:
// Pause();
break;
case TShowScore:
if ( ShowSroce( aCallerGc, aBmp ) == -1414 ) {
return -1414;
}
m_KeyHandler->Reset();
break;
case TResume:
// Resume();
m_GameState = TRun;
break;
case TGameOver:
switch ( GameOver( aCallerGc, aBmp ) ) { //
对画框结束
case -1:
m_GameState = TShowScore;
break;
case -2:
m_GameState = TDoHiS;
break;
}
m_KeyHandler->Reset();
break;
case TShowHiS:
if ( ShowHiS( aCallerGc, aBmp ) == -1 ) {
return -1414;
}
break;
case TDoHiS:
if ( ShowDoHiS(aCallerGc, aBmp) == -1 ) {
return -1414;
}
break;
case TWin:
switch ( GameOver( aCallerGc, aBmp, ETrue ) ) { //
对画框结束
case -1:
m_GameState = TShowScore;
break;
case -2:
m_GameState = TDoHiS;
break;
}
// return 9999; //
过全关
break;
}
return 1;
}
TInt CChessBoard::GameRun( CFbsBitGc* aCallerGc, CFbsBitmap* aBmp )
{
// 1
,绘制背景
m_BackGround->RenderToBitmapL( aBmp, TPoint(0,0) );
for ( TInt i = 0; i < m_AliveChessList->Count(); i ++ ) {
m_AliveChessList->At(i)->Render( aBmp );
}
RenderBomb(aBmp);
// 2
,绘制选择框
//
先绘制选择框--里面计算了拾取的哪个方块,该函数返回一共选择了多少个。
//
用temp带到计算类型中。更新数据。根据返回数值进行下一步的操作。
TInt & temp = m_Cur->Render(aBmp);
TInt CResult = CCalculate::UpdateCalcu( m_chess, temp, m_AliveChessList, m_TargetNum->GetTarNum(), m_BombChessList ,
m_WaitKillChessList, m_Score );
if ( CResult == -1 ) { //
正确,消去方块
m_TargetNum->ComputeTarNum( m_AliveChessList );
m_Face->Smile();
m_pAniTimer->Stop();
m_pAniTimer->Play();
m_ShortTimer->Stop();
m_ShortTimer->Play();
m_SoundPlayer->Bomb(); //
爆炸~~~~
}
else if ( CResult == -2 ) { //
错误,扣时间
m_Face->Cry();
m_pNumTimer->SubTime(1000);
}
m_TargetNum->Render(aBmp);
// 4
,先绘制短时间的倒计时---返回是否超时
//
根据短倒计时计时器是否超时,决定是否增减1秒
if ( m_ShortTimer->Render( aCallerGc, aBmp ) == 1 ) { //
短计时器超时了
m_pNumTimer->SubTime(1000);
m_Face->Cry();
}
// 3
,绘制方块-----根据方块的选择情况绘制
// for ( TInt i = 0; i < m_AliveChessList->Count(); i ++ ) {
// m_AliveChessList->At(i)->Render( aBmp );
// }
// RenderBomb(aBmp);
// 6
,根据最后情况绘制笑脸、哭脸
m_Face->Render( aBmp ); //
放在最后
if ( m_AliveChessList->Count() == 0 ) { //
本关胜利
// TInt s = m_pNumTimer->GetLastTime();
m_Score += m_pNumTimer->GetLastTime() / 1000 ;
m_SoundPlayer->PassLeave();
return 8888;
}
// 5
,总计时器
if ( m_pNumTimer->Render( aCallerGc, aBmp ) == -1 ) { //
时间用完了,游戏结束
m_SoundPlayer->Fail();
return -1414;
}
return 1;
}
TInt CChessBoard::GameOver ( CFbsBitGc* aCallerGc, CFbsBitmap* aBmp, TBool aWin )
{
m_Score = m_Score > 99999 ? 99999 : m_Score;
if ( m_Score > m_HighScore ) {
m_HighScore = m_Score;
#ifdef
__WINS__
CGFile* file = CGFile::NewL(_L("c://HiS.sc"), EFileWrite );
#else
CGFile* file = CGFile::NewL(_L("HiS.sc"), EFileWrite );
#endif
file->WriteL((TText8*) & m_Score, sizeof(m_Score));
//m_GameState = TDoHiS;
delete file;
m_bGetHi = ETrue;
}
if ( aWin ) {
m_pDlg->GameWin();
}
else {
m_pDlg->Gameover();
}
m_pDlg->Render(aCallerGc, aBmp);
if ( m_KeyHandler->IsDown(53) || m_KeyHandler->IsDown(167) ) {
m_pDlg->Nothing();
if ( m_bGetHi ) { //
获得最高分
m_bGetHi = EFalse;
return -2;
}
else { //
没有超过最高分
return -1;
}
}
return 0;
}
TInt CChessBoard::ShowSroce ( CFbsBitGc* aCallerGc, CFbsBitmap* aBmp )
{
m_pDlg->ShowS( m_Score );
m_pDlg->Render(aCallerGc, aBmp);
if ( m_KeyHandler->IsDown(53) || m_KeyHandler->IsDown(167) ) {
m_pDlg->Nothing();
// m_GameState = TRun;
return -1414;
}
return 0;
}
TInt CChessBoard::ShowHiS( CFbsBitGc* aCallerGc, CFbsBitmap * aBmp )
{
m_pDlg->ShowHiS();
m_pDlg->Render( aCallerGc, aBmp );
if ( m_KeyHandler->IsDown(53) || m_KeyHandler->IsDown(167) ) {
m_pDlg->Nothing();
return -1;
}
return 0;
}
TInt CChessBoard::ShowDoHiS( CFbsBitGc* aCallerGc, CFbsBitmap* aBmp )
{
m_pDlg->DoHiS( m_Score );
m_pDlg->Render( aCallerGc, aBmp );
if ( m_KeyHandler->IsDown(53) || m_KeyHandler->IsDown(167) ) {
m_pDlg->Nothing();
return -1;
}
return 0;
}
TInt CChessBoard::Win( CFbsBitGc* aCallerGc, CFbsBitmap* aBmp )
{
m_Score = m_Score > 9999 ? 9999 : m_Score;
if ( m_Score > m_HighScore ) {
m_HighScore = m_Score;
#ifdef
__WINS__
CGFile* file = CGFile::NewL(_L("c://HiS.sc"), EFileWrite );
#else
CGFile* file = CGFile::NewL(_L("HiS.sc"), EFileWrite );
#endif
file->WriteL((TText8*) & m_Score, sizeof(m_Score));
delete file;
m_bGetHi = ETrue;
}
m_pDlg->PassLeave();
m_pDlg->Render(aCallerGc, aBmp);
if ( m_KeyHandler->IsDown(53) || m_KeyHandler->IsDown(167) ) {
m_pDlg->Nothing();
if ( m_bGetHi ) {
m_pDlg->DoHiS(m_HighScore);
m_bGetHi = EFalse;
return -2;
}
else {
m_pDlg->ShowS(m_Score);
return -1;
}
}
return 0;
}
//
设置第几个关卡
void
CChessBoard::SetLeave(TInt aLevel)
{
m_Leave = aLevel;
}
//
新一轮的游戏开始
void
CChessBoard::GameStart()
{
//-------------------------------------------------------------------------
m_AliveChessList->Reset();
switch( m_Leave ) {
case 1:
m_pNumTimer->Start( 200000 );
// m_pNumTimer->Start( 200000 );
m_ShortTimer = new CShortTimer( 10000 );
break;
case 2:
m_pNumTimer->Start( 190000 );
// m_pNumTimer->Start( 500000 );
m_ShortTimer = new CShortTimer( 9000 );
break;
case 3:
m_pNumTimer->Start( 170000 );
// m_pNumTimer->Start( 500000 );
m_ShortTimer = new CShortTimer( 8000 );
break;
}
for ( TInt i = 0; i < C_ChessNumX * C_ChessNumY; i ++ ) {
m_chess[i] = new CChess( RandomChess(), i, m_ChessImage, m_pAniTimer );
}
for ( i = 0; i < C_ChessNumX * C_ChessNumY; i ++ ) {
m_AliveChessList->AppendL( m_chess[i] );
}
//
m_TargetNum->ComputeTarNum(m_AliveChessList);
m_ShortTimer->Play();
m_BombChessList->Reset();
m_WaitKillChessList->Reset();
}
//
过关
void
CChessBoard::PassLeave()
{
//-------------------------------------------------------------------------
m_Score = m_Score > 99999 ? 99999 : m_Score;
if ( m_ShortTimer ) {
delete m_ShortTimer;
m_ShortTimer = NULL;
}
m_AliveChessList->Reset();
m_Cur->Reset();
for ( TInt i = 0; i < C_ChessNumX * C_ChessNumY; i ++ ) {
if ( m_chess[i] ) {
delete m_chess[i];
m_chess[i] = NULL;
}
}
m_Leave ++;
GameStart();
}
//
根据关卡随即生成chess的分布
TInt CChessBoard::RandomChess()
{
TInt index = 0;
switch ( m_Leave ) {
case 1:
index = Math::Rand(m_iSeed) % 6; // 1 ~ 6
break;
case 2:
index = Math::Rand(m_iSeed) % 9; // 1 ~ 9
break;
case 3:
index = Math::Rand(m_iSeed) % 10; // 1 ~ 9, *2
break;
}
return m_NumsList[index];
}
//
根据消去的方块绘制爆炸效果
void
CChessBoard::RenderBomb( CFbsBitmap* aBmp )
{
TInt time = m_pAniTimer->GetTime();
for ( TInt i = 0; i < m_BombChessList->Count(); i ++ ) {
if ( time > 0 && time < 180 ) {
m_BombChessList->At(i)->DrawBomb1(aBmp);
}
else if ( time >= 180 && time < 360 ) {
m_BombChessList->At(i)->DrawBomb2(aBmp);
}
else if ( time >= 360 ) {
m_pAniTimer->Stop();
}
}
}
void
CChessBoard::Pause( )
{
m_pAniTimer->Pause(); //
动画的Timer
m_ShortTimer->Pause(); // 10
秒倒计时的Timer;
m_pNumTimer->Pause (); //
总共倒计时
m_GameState = TPause;
}
//
从暂停中恢复。
void
CChessBoard::Resume( )
{
m_pAniTimer->Play();
m_ShortTimer->Resume();
m_pNumTimer->Resume();
m_GameState = TResume;
}
//
开始新的游戏。
void
CChessBoard::NewGame()
{
// m_Leave = 0;
m_Leave = 0;
m_Score = 0;
PassLeave();
}
void
CChessBoard::EnableSound( TBool aAble )
{
m_SoundPlayer->EnableSound( aAble );
}