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; } }