public bool AdvanceGeneration()
        {
            GenerationId++;
            var currentGameTable = GameTable.ConvertAll(x => x.DeepCopy());

            for (int i = 0; i < Abscisse; i++)
            {
                for (int j = 0; j < Ordonnee; j++)
                {
                    Case        currentCase = currentGameTable.First(myCase => myCase.X == i && myCase.Y == j);
                    List <Case> neighbours  = GetCaseNeighbours(currentGameTable, currentCase);

                    if (currentCase.isAlive)
                    {
                        //Underpopulation
                        if (neighbours.Where(myCase => myCase.isAlive == false).Count() < 2)
                        {
                            currentCase.isAlive = false;
                        }
                        //Next generation
                        else if (neighbours.Where(myCase => myCase.isAlive == true).Count() == 2 ||
                                 neighbours.Where(myCase => myCase.isAlive == true).Count() == 3)
                        {
                            currentCase.isAlive = true;
                        }
                        //Overpopulation
                        else if (neighbours.Where(myCase => myCase.isAlive == false).Count() > 3)
                        {
                            currentCase.isAlive = false;
                        }
                    }
                    else
                    {
                        //Reproduction
                        if (neighbours.Where(myCase => myCase.isAlive == true).Count() == 3)
                        {
                            currentCase.isAlive = true;
                        }
                    }
                }
            }

            this.GameTable = currentGameTable;

            AddToHistory(currentGameTable);

            return(CheckIfGenerationStucked(MaxHistoryCount));
        }