diff --git a/android/gradle.properties b/android/gradle.properties
index aa51064abebb79ba519e600afb7af23779154d4e..135006f9c1386c8757595c43e890e911f732f5a3 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 0000000000000000000000000000000000000000..225484365293ec1901bdd603b09ba42bde099356
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/6.txt
@@ -0,0 +1 @@
+Count and display allowed moves count
\ No newline at end of file
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 0000000000000000000000000000000000000000..c8555df537ef7f04e3aa6039558a67812da892cd
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/6.txt
@@ -0,0 +1 @@
+Calcule et affiche le nombre de coups possibles
\ No newline at end of file
diff --git a/lib/layout/game.dart b/lib/layout/game.dart
index e0c193b5f55e87056ba426556b929199db77f0e7..aeeeab7844029cca9f4abcb0d6a1d8548d9d7b77 100644
--- a/lib/layout/game.dart
+++ b/lib/layout/game.dart
@@ -47,7 +47,7 @@ class Game {
             Column(
               children: [
                 Text(
-                  myProvider.movesCount.toString(),
+                  GameUtils.countAllowedMoves(myProvider).toString(),
                   style: TextStyle(
                     fontSize: 20,
                     fontWeight: FontWeight.w600,
diff --git a/lib/utils/board_utils.dart b/lib/utils/board_utils.dart
index ad74ca521767c6cc3aeed49be61cbf2733ed7cee..5f60126993ddea1db46d2e9f72e7d4d4e4b60b17 100644
--- a/lib/utils/board_utils.dart
+++ b/lib/utils/board_utils.dart
@@ -2,7 +2,6 @@ import 'dart:math';
 
 import 'package:solitaire_game/entities/tile.dart';
 import 'package:solitaire_game/provider/data.dart';
-import 'package:solitaire_game/utils/game_utils.dart';
 
 class BoardUtils {
   static printGrid(List cells) {
diff --git a/lib/utils/game_utils.dart b/lib/utils/game_utils.dart
index 9b14d5675a64feec3b886fd1c2ef4fc4574a88c8..2d7d7cc6f55679be90d86c8e256d930807605645 100644
--- a/lib/utils/game_utils.dart
+++ b/lib/utils/game_utils.dart
@@ -1,5 +1,4 @@
 import 'package:solitaire_game/entities/tile.dart';
-import 'package:solitaire_game/layout/game.dart';
 import 'package:solitaire_game/provider/data.dart';
 import 'package:solitaire_game/utils/board_utils.dart';
 
@@ -44,34 +43,51 @@ class GameUtils {
   }
 
   static bool isMoveAllowed(Data myProvider, List<int> source, List<int> target) {
+    // print('(test) Pick from ' + source.toString() + ' and drop on ' + target.toString());
     List<List<Tile?>> board = myProvider.board;
     int sourceCol = source[0];
     int sourceRow = source[1];
     int targetCol = target[0];
     int targetRow = target[1];
 
+    // ensure source and target are inside range
+    if (sourceRow < 0 ||
+        sourceRow > (myProvider.boardSize - 1) ||
+        sourceCol < 0 ||
+        sourceCol > (myProvider.boardSize - 1)) {
+      // print('move forbidden: source is out of board');
+      return false;
+    }
+    if (targetRow < 0 ||
+        targetRow > (myProvider.boardSize - 1) ||
+        targetCol < 0 ||
+        targetCol > (myProvider.boardSize - 1)) {
+      // print('move forbidden: target is out of board');
+      return false;
+    }
+
     // ensure source exists and has a peg
     if (board[sourceRow][sourceCol] == null || board[sourceRow][sourceCol]?.hasPeg == false) {
-      print('move forbidden: source peg does not exist');
+      // print('move forbidden: source peg does not exist');
       return false;
     }
 
     // ensure target exists and is empty
     if (board[targetRow][targetCol] == null || board[targetRow][targetCol]?.hasPeg == true) {
-      print('move forbidden: target does not exist or already with a peg');
+      // print('move forbidden: target does not exist or already with a peg');
       return false;
     }
 
     // ensure source and target are in the same line/column
     if ((targetCol != sourceCol) && (targetRow != sourceRow)) {
-      print('move forbidden: source and target are not in the same line or column');
+      // print('move forbidden: source and target are not in the same line or column');
       return false;
     }
 
     // ensure source and target are separated by exactly one tile
     if (((targetCol == sourceCol) && ((targetRow - sourceRow).abs() != 2)) ||
         ((targetRow == sourceRow) && ((targetCol - sourceCol).abs() != 2))) {
-      print('move forbidden: source and target must be separated by exactly one tile');
+      // print('move forbidden: source and target must be separated by exactly one tile');
       return false;
     }
 
@@ -79,7 +95,7 @@ class GameUtils {
     int middleRow = (sourceRow + ((targetRow - sourceRow) / 2)).round();
     int middleCol = (sourceCol + ((targetCol - sourceCol) / 2)).round();
     if (board[middleRow][middleCol] == null || board[middleRow][middleCol]?.hasPeg == false) {
-      print('move forbidden: tile between source and target does not contain a peg');
+      // print('move forbidden: tile between source and target does not contain a peg');
       return false;
     }
 
@@ -110,19 +126,45 @@ class GameUtils {
     myProvider.updateRemainingPegsCount(GameUtils.countRemainingPegs(myProvider));
   }
 
-  static int countRemainingPegs(Data myProvider) {
-    int count = 0;
+  static List<Tile> listRemainingPegs(Data myProvider) {
+    List<Tile> pegs = [];
 
     List<List<Tile?>> board = myProvider.board;
     for (var rowIndex = 0; rowIndex < board.length; rowIndex++) {
       for (var colIndex = 0; colIndex < board[rowIndex].length; colIndex++) {
         Tile? tile = board[rowIndex][colIndex];
         if (tile != null && tile.hasPeg == true) {
-          count++;
+          pegs.add(tile);
         }
       }
     }
 
-    return count;
+    return pegs;
+  }
+
+  static int countRemainingPegs(Data myProvider) {
+    return GameUtils.listRemainingPegs(myProvider).length;
+  }
+
+  static int countAllowedMoves(Data myProvider) {
+    int allowedMovesCount = 0;
+    List<Tile> pegs = GameUtils.listRemainingPegs(myProvider);
+    pegs.forEach((tile) {
+      int row = tile.currentRow;
+      int col = tile.currentCol;
+      List<int> source = [col, row];
+      List<List<int>> targets = [
+        [col - 2, row],
+        [col + 2, row],
+        [col, row - 2],
+        [col, row + 2],
+      ];
+      targets.forEach((target) {
+        if (GameUtils.isMoveAllowed(myProvider, source, target)) {
+          allowedMovesCount++;
+        }
+      });
+    });
+    return allowedMovesCount;
   }
 }