examples/Bluetooth/BTExample1/src/cardgamedealer.cpp

00001 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
00002 // All rights reserved.
00003 // This component and the accompanying materials are made available
00004 // under the terms of "Eclipse Public License v1.0"
00005 // which accompanies this distribution, and is available
00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
00007 //
00008 // Initial Contributors:
00009 // Nokia Corporation - initial contribution.
00010 //
00011 // Contributors:
00012 //
00013 // Description:
00014 //
00015 
00016 #include <e32base.h>
00017 #include <e32math.h>
00018 
00019 #include "cardgamedealer.h"
00020 #include "cardgamebase.h"
00021 
00022 const TInt KCardDesLength = 2; // Descriptor length for a single card
00023 
00027 CCardGameDealer::~CCardGameDealer()
00028         {
00029         }
00030 
00034 void CCardGameDealer::ConstructL(RArray<TInetAddr>& aRemoteNames, RSocket& aSocket)
00035         {
00036         iRemoteNames = aRemoteNames;
00037         CCardGameBase::ConstructL(aSocket);
00038         }       
00039 
00047 void CCardGameDealer::ShuffleCards(TDesC8& aCards)
00048         {
00049     RArray<TInt> usedNumbers;// Array of used positions
00050         TBool oldNum = ETrue;
00051         TPtrC8 ptr;
00052         TInt random = 0;
00053         const TInt deckLength = aCards.Length();
00054         RBuf8 tempBuffer;
00055         tempBuffer.Create(deckLength);
00056         //Take first card (2chars) and put it into tempBuffer in random position
00057         // make a note of this pos as we can use it again. or just check if empty
00058         for (TInt i=0; i<=deckLength; i=i+KCardDesLength)
00059                 {
00060                 while (oldNum)
00061                         {
00062                         //generate random number between 0 and 96
00063                         random = Math::Random() % deckLength-KCardDesLength;
00064                         if (random <= deckLength-KCardDesLength && random >= 0)
00065                                 {
00066                                 TReal remainder;
00067                                 Math::Mod(remainder,random,KCardDesLength);
00068                                 if (remainder)// if true then we have an odd , make it into an even.
00069                                         random++;
00070                                 // now we have an even number check that we haven't used it before
00071                                 oldNum = EFalse;
00072                                 for (TInt j=0; j<usedNumbers.Count();j++)
00073                                         {
00074                                         if (random == usedNumbers[j])
00075                                                 oldNum = ETrue;
00076                                         }
00077                                         
00078                                 if (!oldNum)
00079                                         {
00080                                         // We have a card that we haven't used before
00081                                         usedNumbers.Append(random);
00082                                         }
00083                                 }
00084 
00085                         }
00086                 
00087                 
00088                 ptr.Set(aCards.Mid(random,KCardDesLength));
00089                 tempBuffer.Append(ptr);
00090                 oldNum = ETrue;
00091                 }
00092                 
00093         //finished shuffle, now copy into full deck.
00094         aCards = tempBuffer;
00095         tempBuffer.FillZ();// clear the temp. buffer
00096         usedNumbers.Close();
00097         tempBuffer.Close();
00098         }
00099 
00107 void CCardGameDealer::DealCardsL(TDesC8& aCards)
00108         {
00109         TInt deckLength = aCards.Length();
00110         TInt playerCount = iRemoteNames.Count();
00111         // playerCount is used to divide deck.
00112 
00113 
00114         ShuffleCards(aCards);
00115         TInt handLength = (deckLength) / playerCount;
00116         TReal remainder;
00117         Math::Mod(remainder, deckLength, playerCount);
00118         // we want to give each player handlength *2 cards
00119         // then n(remainder) players one card extra each
00120         
00121         // send out a message to each player stating the size of recieve buffer they will need
00122         TRequestStatus status;
00123         TInt size;
00124         TInt startPoint = 0;
00125         for (TInt i=0;i<iRemoteNames.Count();i++)
00126                 {
00127                 if (remainder > 0)
00128                         {
00129                         // we want to set recieve buffer to handLength*2 + 2
00130                         size = handLength*2 + 2;
00131                         // Send pointer to portion of the deck
00132                         iSocket.SendTo(aCards.Mid(startPoint,size), iRemoteNames[i], 0, status);
00133                         User::WaitForRequest(status);
00134                         User::LeaveIfError(status.Int());
00135                         startPoint = size;// change start point to end of last hand sent out
00136                         remainder--;
00137                         }
00138                 else
00139                         {
00140                         //we want to set the players recieve buffer to handlength * 2
00141                         size = handLength*2;            
00142                         iSocket.SendTo(aCards.Mid(startPoint,size), iRemoteNames[i], 0, status);
00143                         User::WaitForRequest(status);
00144                         User::LeaveIfError(status.Int());
00145                         startPoint = size+startPoint;
00146                         }
00147                 }
00148         
00149         }

Generated on Thu Jan 21 10:32:57 2010 for TB10.1 Example Applications by  doxygen 1.5.3