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

📄 findthebombappui.cpp

📁 symbian手机应用开发
💻 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 + -