📄 findthebombappui.cpp
字号:
// Copyright (c) 2004, Symbian Software Ltd. All rights reserved.
#include <avkon.hrh>
#include <aknnotewrappers.h>
#include "FindTheBomb.pan"
#include "FindTheBombAppUi.h"
#include "FindTheBombAppView.h"
#include "findthebombdefs.h"
#include "FindTheBomb.hrh"
#include <FindTheBomb.rsg>
#include <aknnavi.h>
#include <eikspane.h>
#include <aknnavide.h>
#include <findthebomb.mbg>
#include <eikfutil.h>
#include <e32math.h>
#include <e32std.h>
#define MaxInfoNoteTextLen 40
CFindTheBombAppUi::CFindTheBombAppUi()
{
}
CFindTheBombAppUi::~CFindTheBombAppUi()
{
if (iAppView)
{
iEikonEnv->RemoveFromStack(iAppView);
delete iAppView;
iAppView = NULL;
}
iTileState.Close();
iWinLines.Close();
delete iNaviDecorator;
}
void CFindTheBombAppUi::SetWinLineL(TInt aTile)
{
User::LeaveIfError(iWinLines.Append(aTile));
}
void CFindTheBombAppUi::GetBombAddress()
{ const TUint KMaxRndNumber = KNumberOfTiles;
for (TInt k=0;k<TotalNumber;k++)
{
time.HomeTime();
iChangeSeed=time.Int64();
iRndSeed = time.Int64()*iChangeSeed;
TUint number = Math::Rand(iRndSeed) % KMaxRndNumber;
iWinLines[k]=number;
for (TInt j=k-1;j>0;j--)
{
if(iWinLines[j]==iWinLines[k])
k--;
}
iChangeSeed*=number;
}
}
void CFindTheBombAppUi::FindTheBombNearby(TInt i)
{
TInt iBombsAround=0;
if(i-KTilesPerRow>=0)
iBombsAround+=iBombAddress[i-KTilesPerRow];
if(i+KTilesPerRow<KNumberOfTiles)
iBombsAround+=iBombAddress[i+KTilesPerRow];
if((i%KTilesPerRow)>0)
iBombsAround+=iBombAddress[i-1];
if((i%KTilesPerRow)<(KTilesPerRow-1))
iBombsAround+=iBombAddress[i+1];
if((i-KTilesPerRow>=0)&&(i%KTilesPerRow>0))
iBombsAround+=iBombAddress[i-KTilesPerRow-1];
if((i+KTilesPerRow<=KNumberOfTiles)&&(i%KTilesPerRow>0))
iBombsAround+=iBombAddress[i+KTilesPerRow-1];
if(((i%KTilesPerRow)<(KTilesPerRow-1))&&(i-KTilesPerRow>=0))
iBombsAround+=iBombAddress[i+1-KTilesPerRow];
if(((i%KTilesPerRow)<(KTilesPerRow-1))&&(i+KTilesPerRow<KNumberOfTiles))
iBombsAround+=iBombAddress[i+1+KTilesPerRow];
iTileState[i]=iBombsAround/100;
if (iTileState[i]==0)
{
if((i-KTilesPerRow>=0)&&(iTileState[i-KTilesPerRow]==StartState))
FindTheBombNearby(i-KTilesPerRow);
if((i+KTilesPerRow<KNumberOfTiles)&&(iTileState[i+KTilesPerRow]==StartState))
FindTheBombNearby(i+KTilesPerRow);
if(((i%KTilesPerRow)>0)&&(iTileState[i-1]==StartState))
FindTheBombNearby(i-1);
if(((i%KTilesPerRow)<(KTilesPerRow-1))&&(iTileState[i+1]==StartState))
FindTheBombNearby(i+1);
if(((i-KTilesPerRow>=0)&&(i%KTilesPerRow>0))&&(iTileState[i-KTilesPerRow-1]==StartState))
FindTheBombNearby(i-KTilesPerRow-1);
if(((i+KTilesPerRow<=KNumberOfTiles)&&(i%KTilesPerRow>0))&&(iTileState[i+KTilesPerRow-1]==StartState))
FindTheBombNearby(i+KTilesPerRow-1);
if((((i%KTilesPerRow)<(KTilesPerRow-1))&&(i-KTilesPerRow>=0))&&(iTileState[i+1-KTilesPerRow]==StartState))
FindTheBombNearby(i+1-KTilesPerRow);
if((((i%KTilesPerRow)<(KTilesPerRow-1))&&(i+KTilesPerRow<KNumberOfTiles))&&(iTileState[i+1+KTilesPerRow]==StartState))
FindTheBombNearby(i+1+KTilesPerRow); }
}
void CFindTheBombAppUi::ConstructL()
{
BaseConstructL(EAknEnableSkin);
iAppView = new(ELeave) CFindTheBombAppView();
iAppView->ConstructL(ClientRect(), this);
AddToStackL(iAppView); // Enable keypresses to the view
for (TInt i=0; i<TotalNumber; i++)
{
User::LeaveIfError(iWinLines.Append(ETileBlank));
}
for (TInt j=0; j<KNumberOfTiles; j++)
{
User::LeaveIfError(iBombAddress.Append(ETileBlank));
}
for (TInt k=0; k<KNumberOfTiles; k++)
{
User::LeaveIfError(iTileState.Append(StartState));
}
GetBombAddress();
for (TInt m=0; m<TotalNumber; m++)
{
iBombAddress[iWinLines[m]]=NumOfBomb;
}
CEikStatusPane* sp = StatusPane();
iNaviPane = (CAknNavigationControlContainer*)sp->ControlL(TUid::Uid(EEikStatusPaneUidNavi));
}
void CFindTheBombAppUi::HandleCommandL(TInt aCommand)
{
switch(aCommand)
{
case EEikCmdExit:
case EAknSoftkeyExit:
{
SaveL();
Exit();
}
break;
case EFindTheBombNewGame:
{
for (TInt i=0; i<KNumberOfTiles; i++)
{
iTileState[i] = StartState;
iBombAddress[i]=0;
}
for (TInt j=0; j< TotalNumber;j++)
{
iWinLines[j]=0;
}
GetBombAddress();
for (TInt k=0; k<TotalNumber; k++)
{
iBombAddress[iWinLines[i]]=NumOfBomb;
}
iGameStatus=EGameNew;
iAppView->ResetView();
}
break;
case EFindTheBombHelp:
{
_LIT(message,"There are 9 bombs,find them");
CAknInformationNote* informationNote = new (ELeave) CAknInformationNote;
informationNote->ExecuteLD(message);
}
break;
case EFindABomb:
{
SquareState=Bomb;
}
break;
case ECancelTheSign:
{
SquareState=Cancel;
}
break;
default:
{
break;
}
break;
}
}
void CFindTheBombAppUi::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)
{
if (aResourceId == R_FINDTHEBOMB_MENU)
{
if (iGameStatus == EGameNew)
{
CEikMenuPaneItem::SData item;
item.iFlags = 0;
item.iCascadeId = 0;
aMenuPane->AddMenuItemL(item);
}
}
}
TBool CFindTheBombAppUi::IsCrossTurn()
{
return iCrossTurn;
}
TBool CFindTheBombAppUi::HitSquareL(TInt aIndex)
{
if (iGameStatus == EGameEnded)
{
return EFalse;
}
if (iGameStatus == EGameNew)
{
iGameStatus = EGamePlaying;
}
if ((SquareState==Cancel)&&(iTileState[aIndex]==Bomb))
{
iTileState[aIndex]=StartState;
}
if (iTileState[aIndex] ==StartState)
{
if (SquareState==Bomb)
{
iTileState[aIndex]=Bomb;
}
else if (iBombAddress[aIndex]==NumOfBomb)
{
iTileState[aIndex]=NumOfBomb;
iGameStatus= EGameEnded;
for(TInt i=0;i<KNumberOfTiles;i++)
{
if (iTileState[i]==StartState)
iTileState[i]=0;
if (iBombAddress[i]==NumOfBomb)
iTileState[i]=NumOfBomb;
}
TBuf<MaxInfoNoteTextLen> text;
iEikonEnv->ReadResource(text, R_FINDTHEBOMB_YOU_LOSS);
CAknInformationNote* informationNote = new (ELeave) CAknInformationNote;
informationNote->ExecuteLD(text);
}
else
{
FindTheBombNearby(aIndex);
TInt j=0;
for (TInt i=0;i<KNumberOfTiles;i++)
{
if((iTileState[i]!=StartState)&&(iTileState[i]!=Bomb))
j++;
if (j==72)
{
iGameStatus= EGameEnded;
TBuf<MaxInfoNoteTextLen> text;
iEikonEnv->ReadResource(text, R_FINDTHEBOMB_YOU_WINS);
CAknInformationNote* informationNote = new (ELeave) CAknInformationNote;
informationNote->ExecuteLD(text);
for (TInt i=0;i<KNumberOfTiles;i++)
{
if (iBombAddress[i]==NumOfBomb)
{
iTileState[i]=Bomb;
}
}
}
}
}
SquareState=0;
return EFalse;
}
}
TInt CFindTheBombAppUi::SquareStatus(TInt aIndex)
{
return iTileState[aIndex];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -