00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include <e32math.h>
00032
00033 #include "CLifeEngine.h"
00034
00035 CLifeEngine::CLifeEngine(const TInt64& aSeed)
00036 : iSeed(aSeed)
00037 {
00038 Reset();
00039 }
00040
00041
00042 void CLifeEngine::Reset()
00043 {
00044 for (TInt y=0; y < DIM_Y_ARRAY; y++)
00045 for (TInt x=0; x < DIM_X_ARRAY; x++)
00046 iCellArray[x][y] = (Math::Rand(iSeed) > KMaxTInt/2) ? (TBool)ETrue : (TBool)EFalse;
00047 }
00048
00049
00050
00051 void CLifeEngine::AddGeneration()
00052 {
00053 TInt numNeighbours;
00054
00055 for (TInt y=0; y < DIM_Y_ARRAY; y++)
00056 {
00057 for (TInt x=0; x < DIM_X_ARRAY; x++)
00058 {
00059 numNeighbours=NumNeighbors(x,y);
00060
00061 if (iCellArray[x][y])
00062
00063 {
00064 if ((numNeighbours == 2) || (numNeighbours == 3))
00065 iTempCellArray[x][y]=ETrue;
00066 else
00067 iTempCellArray[x][y]=EFalse;
00068 }
00069 else
00070
00071 {
00072 if (numNeighbours == 3)
00073 iTempCellArray[x][y]=ETrue;
00074 else
00075 iTempCellArray[x][y]=EFalse;
00076 }
00077 }
00078 }
00079
00080 for (TInt y2 =0; y2 < DIM_Y_ARRAY; y2++)
00081 for (TInt x2=0; x2 < DIM_X_ARRAY; x2++)
00082 iCellArray[x2][y2]=iTempCellArray[x2][y2];
00083 }
00084
00085
00086
00087 TInt CLifeEngine::NumNeighbors(TInt x, TInt y)
00088 {
00089 TInt numNeighbors=0;
00090 TInt i =0;
00091
00092
00093 if ((x-1) >= 0)
00094 for (i=y-1; i <= y+1; i++)
00095 if ((i >= 0) && (i < DIM_Y_ARRAY))
00096 if (iCellArray[x-1][i])
00097 numNeighbors++;
00098
00099
00100 if (x+1 < DIM_X_ARRAY)
00101 for (i=y-1; i <= y+1; i++)
00102 if ((i >= 0) && (i < DIM_Y_ARRAY))
00103 if (iCellArray[x+1][i])
00104 numNeighbors++;
00105
00106
00107 if ((y-1) >= 0)
00108 if (iCellArray[x][y-1])
00109 numNeighbors++;
00110
00111
00112 if ((y+1) < DIM_Y_ARRAY)
00113 if (iCellArray[x][y+1])
00114 numNeighbors++;
00115
00116 return numNeighbors;
00117 }