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

📄 oandxappui.cpp

📁 一个类似黑白棋的软件源码,可用再symbina上.不错的
💻 CPP
字号:
// Copyright (c) 2004, Symbian Software Ltd. All rights reserved.

#include <avkon.hrh>
#include <aknnotewrappers.h>

#include "OandX.pan"
#include "OandXAppUi.h"
#include "OandXAppView.h"
#include "oandxdefs.h"
#include "OandX.hrh"
#include <OandX.rsg>
#include <aknnavi.h>
#include <eikspane.h>
#include <aknnavide.h>
#include <oandx.mbg>
#include <eikfutil.h>

#define MaxInfoNoteTextLen 40

// Only needed for Series60-specific listbox dialog
//#include <aknselectionlist.h> 


// First player selection dialog

/*
// Use this class for 'standard' dialog processing
// Not needed for Series60-specific listbox dialog

class COandXFirstPlayDialog : public CEikDialog
    {
public:
    COandXFirstPlayDialog(TBool aCrossTurn, TBool& aFlag);
private:
    // from CEikDialog
    void PostLayoutDynInitL(); // initialization
    TBool OkToExitL(TInt aKeycode); // termination
private:
    TBool iCrossTurn;
    TBool& iChanged;
    };

COandXFirstPlayDialog::COandXFirstPlayDialog(TBool aCrossTurn, TBool& aFlag)
	: iCrossTurn(aCrossTurn), iChanged(aFlag)
	{
	}

void COandXFirstPlayDialog::PostLayoutDynInitL()
    {
    CEikListBox *listBox = (CEikListBox *)Control(EOandXPlayerListControl);
    listBox->SetCurrentItemIndex(iCrossTurn ? 0:1); // Suggest a change
    };

TBool COandXFirstPlayDialog::OkToExitL(TInt [/]*aKeycode*[/])

	{
    CEikListBox *listBox = (CEikListBox *)Control(EOandXPlayerListControl);
    TInt index = listBox->CurrentItemIndex();
    if (((index == 1) && !iCrossTurn) || ((index == 0) && iCrossTurn))
        {
        iChanged = ETrue;
        }
	return ETrue;
	}
*/

// AppUi class functions

COandXAppUi::COandXAppUi()
    {
    }

COandXAppUi::~COandXAppUi()
    {
    if (iAppView)
        {
        iEikonEnv->RemoveFromStack(iAppView);
        delete iAppView;
        iAppView = NULL;
        }
    iTileState.Close();
    iWinLines.Close();
    delete iNaviDecorator;
    }

void COandXAppUi::SetWinLineL(TInt aTile0, TInt aTile1, TInt aTile2)
    {
    User::LeaveIfError(iWinLines.Append(aTile0));
    User::LeaveIfError(iWinLines.Append(aTile1));
    User::LeaveIfError(iWinLines.Append(aTile2));
    }


void COandXAppUi::ConstructL()
    {
    BaseConstructL(EAknEnableSkin); // for v1.x SDKs, use: BaseConstructL();
    iAppView = new(ELeave) COandXAppView();
    iAppView->ConstructL(ClientRect(), this);
    AddToStackL(iAppView); // Enable keypresses to the view
    for (TInt i=0; i<KNumberOfTiles; i++)
        {
        User::LeaveIfError(iTileState.Append(ETileBlank));
        }
    // Set the eight possible winning lines
    SetWinLineL(0,1,2);
    SetWinLineL(3,4,5);
    SetWinLineL(6,7,8);
    SetWinLineL(0,3,6);
    SetWinLineL(1,4,7);
    SetWinLineL(2,5,8);
    SetWinLineL(0,4,8);
    SetWinLineL(2,4,6);
    
    CEikStatusPane* sp = StatusPane();
    iNaviPane = (CAknNavigationControlContainer*)sp->ControlL(TUid::Uid(EEikStatusPaneUidNavi));
    SetNavigationPaneL(iCrossTurn);
    }


void COandXAppUi::HandleCommandL(TInt aCommand)
    {
    switch(aCommand)
        {
        case EEikCmdExit:
        case EAknSoftkeyExit:
            {
            SaveL();
            Exit();
            }
            break;
        case EOandXNewGame:
            {
            for (TInt i=0; i<KNumberOfTiles; i++)
                {
                iTileState[i] = 0;
                }
            iGameStatus = EGameNew;
            if (IsCrossTurn())
                {
                SwitchTurnL();
                }
            iAppView->ResetView();
            }
            break;
        case EOandXSwitchTurn:
            {
// Use this code for 'standard' dialog processing
/*
            TBool playerChanged=EFalse;
            CEikDialog *dialog=new(ELeave) COandXFirstPlayDialog(iCrossTurn,playerChanged);
            if (dialog->ExecuteLD(R_OANDX_FIRST_MOVE_DIALOG))
                {
                if (playerChanged)
                    {
                    SwitchTurnL();
                    }
                }
*/
// Use this code for Series60-specific listbox dialog
/*
            TInt openedItem = 0;
            TInt initialItem = iCrossTurn ? 1:0;
            CDesCArrayFlat *array = new(ELeave) CDesCArrayFlat(2);
            CleanupStack::PushL(array);
            _LIT(KNoughts, "\tNoughts first");
            _LIT(KCrosses, "\tCrosses first");
            array->AppendL(KNoughts);
            array->AppendL(KCrosses);
            CAknSelectionListDialog *dialog = CAknSelectionListDialog::NewL(openedItem, array, R_OANDX_FIRST_MOVE_MENUBAR);
            TInt result = dialog->ExecuteLD(R_OANDX_FIRST_MOVE_DIALOG);
            CleanupStack::PopAndDestroy(array);
            if (result && (openedItem != initialItem))
                {
                SwitchTurnL();
                }
*/
// Use this code for menu-only first player selection
            SwitchTurnL();
// End of code alternatives
            }
            break;
        default:
            {
            break;
            }
            break;
        }
    }

void COandXAppUi::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)
    {
    if (aResourceId == R_OANDX_MENU)
        {
        if (iGameStatus == EGameNew)
            {
            CEikMenuPaneItem::SData item;

// Use this line for menu-only first player selection
            iCoeEnv->ReadResource(item.iText, IsCrossTurn()?R_OANDX_O_MOVES_FIRST:R_OANDX_X_MOVES_FIRST );

// Use this line for first player selection by dialog
//            iCoeEnv->ReadResource(item.iText, R_OANDX_WHO_MOVES_FIRST );

            item.iCommandId = EOandXSwitchTurn;
            item.iFlags = 0;
            item.iCascadeId = 0;
            aMenuPane->AddMenuItemL(item);
            }
        }
    }

TBool COandXAppUi::IsCrossTurn()
    {
    return iCrossTurn;
    }

void COandXAppUi::SetNavigationPaneL(TBool aCrossTurn)
    {
    delete iNaviDecorator;
    iNaviDecorator = NULL;
    TResourceReader reader;
    iCoeEnv->CreateResourceReaderLC(reader, aCrossTurn ? R_OANDX_NAVIX_IMAGE_RESOURCE : R_OANDX_NAVIO_IMAGE_RESOURCE);
    iNaviDecorator = iNaviPane->CreateNavigationImageL(reader);
    CleanupStack::PopAndDestroy();  // resource reader
    iNaviPane->PushL(*iNaviDecorator);
    }

void COandXAppUi::SwitchTurnL()
    {
    SetNavigationPaneL(!iCrossTurn);    
    iCrossTurn = !iCrossTurn;
    }

TBool COandXAppUi::HitSquareL(TInt aIndex)
    {
    if (iGameStatus == EGameEnded)
        {
        return EFalse;
        }
    if (iGameStatus == EGameNew)
        {
        iGameStatus = EGamePlaying;
        }
    if (iTileState[aIndex] == ETileBlank)
        {
        TBool crossTurn = IsCrossTurn();
        SwitchTurnL();
        iTileState[aIndex] = crossTurn ? ETileCross : ETileNought;
        if (TInt winner = GameWonBy())
            {
            iGameStatus = EGameEnded;
            TBuf<MaxInfoNoteTextLen> text;
            iEikonEnv->ReadResource(text, winner==ETileCross ? R_OANDX_X_WINS : R_OANDX_O_WINS);
            CAknInformationNote* informationNote = new (ELeave) CAknInformationNote;
            informationNote->ExecuteLD(text);
            }
        return ETrue;
        }
    return EFalse;
    }

TInt COandXAppUi::SquareStatus(TInt aIndex)
    {
    return iTileState[aIndex];
    }

TInt COandXAppUi::GameWonBy()
    {
    TInt sum = 0;
    for (TInt i=0; i<KCountWinLines; i++)
        {
        for (TInt j=0; j<KTilesPerWinLine; j++)
            {
            sum += iTileState[iWinLines[i*KTilesPerWinLine+j]];
            }
        if ((sum == KTilesPerWinLine * ETileNought) || (sum == KTilesPerWinLine * ETileCross))
            { // all noughts or all crosses
            sum /= KTilesPerWinLine; // equal to ETileNought or ETileCross
            break;
            }
        else
            {
            sum = 0; // no winner
            }
        }
    return sum;
    }

TStreamId COandXAppUi::StoreL(CStreamStore& aStore) const
    {
    RStoreWriteStream stream;
    TStreamId id = stream.CreateLC(aStore);
    stream << *this; // alternatively, use ExternalizeL(stream)
    stream.CommitL();
    CleanupStack::PopAndDestroy();
    return id;
    }

void COandXAppUi::RestoreL(const CStreamStore& aStore, TStreamId aStreamId)
    {
    RStoreReadStream stream;
    stream.OpenLC(aStore,aStreamId);
    stream >> *this; // alternatively use InternalizeL(stream)
    CleanupStack::PopAndDestroy();
    }

void COandXAppUi::ExternalizeL(RWriteStream& aStream) const
    {
    for (TInt i = 0; i<KNumberOfTiles; i++)
        {
        aStream.WriteInt8L(iTileState[i]);
        }
    aStream.WriteInt8L(iGameStatus);
    aStream.WriteInt8L(iCrossTurn);
    aStream.WriteInt8L(iAppView->IdOfFocusControl());
    }

void COandXAppUi::InternalizeL(RReadStream& aStream)
    {
    for (TInt i = 0; i<KNumberOfTiles; i++)
        {
        iTileState[i] = aStream.ReadInt8L();
        }
    iGameStatus = aStream.ReadInt8L();
    iCrossTurn = aStream.ReadInt8L();
    SetNavigationPaneL(iCrossTurn);
    iAppView->MoveFocusTo(aStream.ReadInt8L());
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -