From 2cb4e009b3fd1aea0d8b1762e5d58ae65ed1eab1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Sun, 25 Jul 2021 22:22:27 +0200
Subject: [PATCH] Ensure first cell is not mined (postone put mines on board)

---
 android/gradle.properties                     |  4 ++--
 .../metadata/android/en-US/changelogs/6.txt   |  1 +
 .../metadata/android/fr-FR/changelogs/6.txt   |  1 +
 lib/entities/cell.dart                        |  5 ++++
 lib/provider/data.dart                        |  7 ++++++
 lib/utils/board_utils.dart                    | 24 +++++++++++++------
 lib/utils/game_utils.dart                     |  8 +------
 7 files changed, 34 insertions(+), 16 deletions(-)
 create mode 100644 fastlane/metadata/android/en-US/changelogs/6.txt
 create mode 100644 fastlane/metadata/android/fr-FR/changelogs/6.txt

diff --git a/android/gradle.properties b/android/gradle.properties
index aa51064..135006f 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.5
-app.versionCode=5
+app.versionName=0.0.6
+app.versionCode=6
diff --git a/fastlane/metadata/android/en-US/changelogs/6.txt b/fastlane/metadata/android/en-US/changelogs/6.txt
new file mode 100644
index 0000000..9ff6c06
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/6.txt
@@ -0,0 +1 @@
+Ensure first cell is not mined (postone put mines on board)
diff --git a/fastlane/metadata/android/fr-FR/changelogs/6.txt b/fastlane/metadata/android/fr-FR/changelogs/6.txt
new file mode 100644
index 0000000..0c8a46b
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/6.txt
@@ -0,0 +1 @@
+Impossibilité de tomber sur une mine au premier coup (reporte la génération de la grille)
diff --git a/lib/entities/cell.dart b/lib/entities/cell.dart
index 30b0e1b..8a0984d 100644
--- a/lib/entities/cell.dart
+++ b/lib/entities/cell.dart
@@ -34,6 +34,11 @@ class Cell {
           fit: BoxFit.fill,
         ),
         onTap: () {
+          if (!myProvider.isBoardMined) {
+            myProvider.updateCells(BoardUtils.createBoard(myProvider, row, col));
+            myProvider.updateIsBoardMined(true);
+          }
+
           if (!(myProvider.gameWin || myProvider.gameFail)) {
             if (myProvider.reportMode) {
               BoardUtils.reportCell(myProvider, row, col);
diff --git a/lib/provider/data.dart b/lib/provider/data.dart
index a0ecdf2..ffe9042 100644
--- a/lib/provider/data.dart
+++ b/lib/provider/data.dart
@@ -16,6 +16,7 @@ class Data extends ChangeNotifier {
 
   // Game data
   bool _gameRunning = false;
+  bool _isBoardMined = false;
   bool _gameWin = false;
   bool _gameFail = false;
   bool _reportMode = false;
@@ -102,6 +103,12 @@ class Data extends ChangeNotifier {
     notifyListeners();
   }
 
+  bool get isBoardMined => _isBoardMined;
+  void updateIsBoardMined(bool isBoardMined) {
+    _isBoardMined = isBoardMined;
+    notifyListeners();
+  }
+
   bool get gameWin => _gameWin;
   void updateGameWin(bool gameWin) {
     _gameWin = gameWin;
diff --git a/lib/utils/board_utils.dart b/lib/utils/board_utils.dart
index 7aeb55d..88da048 100644
--- a/lib/utils/board_utils.dart
+++ b/lib/utils/board_utils.dart
@@ -85,22 +85,32 @@ class BoardUtils {
     return minesCount;
   }
 
-  static List createBoard(int sizeHorizontal, int sizeVertical, String level) {
-    List cells = createEmptyBoard(sizeHorizontal, sizeVertical);
+  static List createInitialEmptyBoard(Data myProvider) {
+    myProvider.updateIsBoardMined(false);
+    myProvider.updateCells(createEmptyBoard(myProvider.sizeHorizontal, myProvider.sizeVertical));
+  }
+
+  static List createBoard(Data myProvider, int forbiddenRow, int forbiddenCol) {
+    List cells = myProvider.cells;
+    int sizeHorizontal = myProvider.sizeHorizontal;
+    int sizeVertical = myProvider.sizeVertical;
+    String level = myProvider.level;
 
-    // Shuffle cells to put random mines
-    List cellsArray = [];
+    // Shuffle cells to put random mines, expect on currently selected one
+    List allowedCells = [];
     for (var row = 0; row < sizeVertical; row++) {
       for (var col = 0; col < sizeHorizontal; col++) {
-        cellsArray.add([row, col]);
+        if (!((forbiddenRow == row) && (forbiddenCol == col))) {
+          allowedCells.add([row, col]);
+        }
       }
     }
-    cellsArray.shuffle();
+    allowedCells.shuffle();
 
     // Put random mines on board
     int minesCount = getMinesCount(sizeHorizontal, sizeVertical, level);
     for (var mineIndex = 0; mineIndex < minesCount; mineIndex++) {
-      cells[cellsArray[mineIndex][0]][cellsArray[mineIndex][1]].isMined = true;
+      cells[allowedCells[mineIndex][0]][allowedCells[mineIndex][1]].isMined = true;
     }
 
     // Compute all mines counts on cells
diff --git a/lib/utils/game_utils.dart b/lib/utils/game_utils.dart
index 909c1ed..d4e308f 100644
--- a/lib/utils/game_utils.dart
+++ b/lib/utils/game_utils.dart
@@ -11,13 +11,7 @@ class GameUtils {
     print('Starting game: ' + myProvider.size + ' - ' + myProvider.level);
     myProvider.updateSize(myProvider.size);
     myProvider.updateGameRunning(true);
-    myProvider.updateCells(
-      BoardUtils.createBoard(
-        myProvider.sizeHorizontal,
-        myProvider.sizeVertical,
-        myProvider.level
-      )
-    );
+    BoardUtils.createInitialEmptyBoard(myProvider);
   }
 
 }
-- 
GitLab