From 54fb2799b893a7fe62ded03911b053cf29d7c72c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Mon, 29 Aug 2022 16:01:46 +0200
Subject: [PATCH] Add game end check

---
 android/gradle.properties                     |  4 ++--
 .../metadata/android/en-US/changelogs/7.txt   |  1 +
 .../metadata/android/fr-FR/changelogs/7.txt   |  1 +
 lib/layout/game.dart                          |  8 ++++---
 lib/provider/data.dart                        | 22 +++++++++++++++++--
 lib/utils/game_utils.dart                     |  3 +++
 6 files changed, 32 insertions(+), 7 deletions(-)
 create mode 100644 fastlane/metadata/android/en-US/changelogs/7.txt
 create mode 100644 fastlane/metadata/android/fr-FR/changelogs/7.txt

diff --git a/android/gradle.properties b/android/gradle.properties
index 135006f..85b94f8 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx1536M
 android.useAndroidX=true
 android.enableJetifier=true
-app.versionName=0.0.6
-app.versionCode=6
+app.versionName=0.0.7
+app.versionCode=7
diff --git a/fastlane/metadata/android/en-US/changelogs/7.txt b/fastlane/metadata/android/en-US/changelogs/7.txt
new file mode 100644
index 0000000..8011497
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/7.txt
@@ -0,0 +1 @@
+Add check end game
\ No newline at end of file
diff --git a/fastlane/metadata/android/fr-FR/changelogs/7.txt b/fastlane/metadata/android/fr-FR/changelogs/7.txt
new file mode 100644
index 0000000..a290942
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/7.txt
@@ -0,0 +1 @@
+Ajout du test de fin de partie
\ No newline at end of file
diff --git a/lib/layout/game.dart b/lib/layout/game.dart
index aeeeab7..1b13727 100644
--- a/lib/layout/game.dart
+++ b/lib/layout/game.dart
@@ -5,7 +5,7 @@ import 'package:solitaire_game/utils/game_utils.dart';
 
 class Game {
   static Container buildGameWidget(Data myProvider) {
-    bool gameIsFinished = myProvider.isGameFinished;
+    bool gameIsFinished = myProvider.gameIsFinished;
 
     return Container(
       child: Column(
@@ -28,6 +28,8 @@ class Game {
   }
 
   static Widget buildTopIndicatorWidget(Data myProvider) {
+    int allowedMovesCount = myProvider.allowedMovesCount;
+
     return Table(
       children: [
         TableRow(
@@ -47,7 +49,7 @@ class Game {
             Column(
               children: [
                 Text(
-                  GameUtils.countAllowedMoves(myProvider).toString(),
+                  allowedMovesCount.toString(),
                   style: TextStyle(
                     fontSize: 20,
                     fontWeight: FontWeight.w600,
@@ -79,7 +81,7 @@ class Game {
     if (myProvider.gameWon()) {
       decorationImageAssetName = 'assets/icons/game_win.png';
     } else {
-      decorationImageAssetName = 'assets/icons/game_fail.png';
+      decorationImageAssetName = 'assets/icons/placeholder.png';
     }
 
     Image decorationImage = Image(
diff --git a/lib/provider/data.dart b/lib/provider/data.dart
index 4dbc65c..a1c0aa6 100644
--- a/lib/provider/data.dart
+++ b/lib/provider/data.dart
@@ -24,11 +24,13 @@ class Data extends ChangeNotifier {
   // Game data
   bool _assetsPreloaded = false;
   bool _gameIsRunning = false;
+  bool _gameIsFinished = false;
   List<List<Tile?>> _board = [];
   int _boardSize = 0;
   double _tileSize = 0;
   int _movesCount = 0;
   int _remainingPegsCount = 0;
+  int _allowedMovesCount = 0;
   String _currentState = '';
 
   void updateParameterSkin(String parameterSkin) {
@@ -152,6 +154,7 @@ class Data extends ChangeNotifier {
     _board = board;
     updateBoardSize(board.length);
     updateRemainingPegsCount(GameUtils.countRemainingPegs(this));
+    updateAllowedMovesCount(GameUtils.countAllowedMoves(this));
     notifyListeners();
   }
 
@@ -180,19 +183,34 @@ class Data extends ChangeNotifier {
     notifyListeners();
   }
 
+  int get allowedMovesCount => _allowedMovesCount;
+  void updateAllowedMovesCount(int allowedMovesCount) {
+    _allowedMovesCount = allowedMovesCount;
+    if (allowedMovesCount == 0) {
+      updateGameIsFinished(true);
+    }
+    notifyListeners();
+  }
+
   bool get gameIsRunning => _gameIsRunning;
-  bool get isGameFinished => !_gameIsRunning;
+  bool get gameIsFinished => _gameIsFinished;
   void updateGameIsRunning(bool gameIsRunning) {
     _gameIsRunning = gameIsRunning;
     notifyListeners();
   }
 
+  void updateGameIsFinished(bool gameIsFinished) {
+    _gameIsFinished = gameIsFinished;
+    notifyListeners();
+  }
+
   bool gameWon() {
-    return isGameFinished;
+    return gameIsFinished && (remainingPegsCount == 1);
   }
 
   void resetGame() {
     _gameIsRunning = false;
+    _gameIsFinished = false;
     _movesCount = 0;
     _remainingPegsCount = 0;
     notifyListeners();
diff --git a/lib/utils/game_utils.dart b/lib/utils/game_utils.dart
index 2d7d7cc..78b2154 100644
--- a/lib/utils/game_utils.dart
+++ b/lib/utils/game_utils.dart
@@ -124,6 +124,8 @@ class GameUtils {
     myProvider.incrementMovesCount();
     // update remaining pegs count
     myProvider.updateRemainingPegsCount(GameUtils.countRemainingPegs(myProvider));
+    // update allowed moves count
+    myProvider.updateAllowedMovesCount(GameUtils.countAllowedMoves(myProvider));
   }
 
   static List<Tile> listRemainingPegs(Data myProvider) {
@@ -165,6 +167,7 @@ class GameUtils {
         }
       });
     });
+
     return allowedMovesCount;
   }
 }
-- 
GitLab