diff --git a/android/gradle.properties b/android/gradle.properties index a4d089355d0e23f8f0d2c5ec98c696bf5825657a..f629a20a0b72abb5c9f2fbd24198fe318b5f422f 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.1.5 -app.versionCode=26 +app.versionName=0.1.6 +app.versionCode=27 diff --git a/fastlane/metadata/android/en-US/changelogs/27.txt b/fastlane/metadata/android/en-US/changelogs/27.txt new file mode 100644 index 0000000000000000000000000000000000000000..09b12da598cf3a218f2012355d31050c4d67a469 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/27.txt @@ -0,0 +1 @@ +Update parameters page, fix/clean code diff --git a/fastlane/metadata/android/fr-FR/changelogs/27.txt b/fastlane/metadata/android/fr-FR/changelogs/27.txt new file mode 100644 index 0000000000000000000000000000000000000000..1e8982ac28e8f01f43a9580d31b7d21b48fca5b9 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/27.txt @@ -0,0 +1 @@ +Améliorations sur la page des paramètres, corrections/améliorations de code diff --git a/lib/entities/cell.dart b/lib/entities/cell.dart index e4ad3b2faded8e7947ed38124128f247cc76cdf8..5f50e799ca406b7193306a75691d78ebdc36f8ec 100644 --- a/lib/entities/cell.dart +++ b/lib/entities/cell.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; - -import '../provider/data.dart'; -import '../utils/board_animate.dart'; -import '../utils/board_utils.dart'; +import 'package:minehunter/provider/data.dart'; +import 'package:minehunter/utils/board_animate.dart'; +import 'package:minehunter/utils/board_utils.dart'; class Cell { bool isMined = false; @@ -14,7 +13,7 @@ class Cell { bool isAnimated = false; Cell( - @required this.isMined, + this.isMined, ); /* @@ -59,7 +58,7 @@ class Cell { } } }, - ) + ), ); } @@ -78,7 +77,11 @@ class Cell { imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_mine.png'; } else { // Show mines count around - imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_' + this.minesCountAround.toString() + '.png'; + imageAsset = 'assets/skins/' + + myProvider.parameterSkin + + '_tile_' + + this.minesCountAround.toString() + + '.png'; } } else { if (this.isMarked) { @@ -98,7 +101,11 @@ class Cell { } } else { // Show all mines counts - imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_' + this.minesCountAround.toString() + '.png'; + imageAsset = 'assets/skins/' + + myProvider.parameterSkin + + '_tile_' + + this.minesCountAround.toString() + + '.png'; } } diff --git a/lib/layout/board.dart b/lib/layout/board.dart index bec58cad43e68d42dea6107b859547b533ebee06..19da7ab54cff58c686970387a96ad5dcea40f7e6 100644 --- a/lib/layout/board.dart +++ b/lib/layout/board.dart @@ -1,17 +1,14 @@ import 'package:flutter/material.dart'; - -import '../provider/data.dart'; -import '../utils/board_utils.dart'; +import 'package:minehunter/provider/data.dart'; class Board { - static Container buildGameBoard(Data myProvider) { return Container( margin: EdgeInsets.all(2), padding: EdgeInsets.all(2), child: Column( children: [ - buildGameTileset(myProvider) + buildGameTileset(myProvider), ], ), ); @@ -34,29 +31,32 @@ class Board { defaultColumnWidth: IntrinsicColumnWidth(), children: [ for (var row = 0; row < myProvider.sizeVertical; row++) - TableRow(children: [ - for (var col = 0; col < myProvider.sizeHorizontal; col++) - Column(children: [ - cells[row][col].widget( - myProvider, - row, - col - ) - ]), - ], - ), - ] + TableRow( + children: [ + for (var col = 0; col < myProvider.sizeHorizontal; col++) + Column( + children: [ + cells[row][col].widget(myProvider, row, col), + ], + ), + ], + ), + ], ), ); } - static FlatButton buildToggleFlagModeButton(Data myProvider) { + static TextButton buildToggleFlagModeButton(Data myProvider) { String reportModeSuffix = myProvider.reportMode ? 'on' : 'off'; - return FlatButton( + return TextButton( child: Container( child: Image( - image: AssetImage('assets/skins/' + myProvider.parameterSkin + '_button_mark_mine_' + reportModeSuffix + '.png'), + image: AssetImage('assets/skins/' + + myProvider.parameterSkin + + '_button_mark_mine_' + + reportModeSuffix + + '.png'), fit: BoxFit.fill, ), ), @@ -85,5 +85,4 @@ class Board { ], ); } - } diff --git a/lib/layout/game.dart b/lib/layout/game.dart index f57e986297bdd213919bc04352deab6d708827b9..49573e1abe2817961453e017f80f850e37f921b9 100644 --- a/lib/layout/game.dart +++ b/lib/layout/game.dart @@ -1,12 +1,10 @@ import 'package:flutter/material.dart'; - -import '../layout/board.dart'; -import '../provider/data.dart'; -import '../utils/board_utils.dart'; -import '../utils/game_utils.dart'; +import 'package:minehunter/layout/board.dart'; +import 'package:minehunter/provider/data.dart'; +import 'package:minehunter/utils/board_utils.dart'; +import 'package:minehunter/utils/game_utils.dart'; class Game { - static Container buildGameWidget(Data myProvider) { bool gameIsFinished = myProvider.gameWin || myProvider.gameFail; @@ -24,8 +22,8 @@ class Game { SizedBox(height: 2), Container( child: gameIsFinished - ? Game.buildEndGameMessage(myProvider) - : Board.buildToggleFlagModeLayout(myProvider), + ? Game.buildEndGameMessage(myProvider) + : Board.buildToggleFlagModeLayout(myProvider), ), SizedBox(height: 8), ], @@ -55,7 +53,7 @@ class Game { style: TextStyle( fontSize: blockSize, fontWeight: FontWeight.bold, - color: Colors.black + color: Colors.black, ), ); Text placedMinesCountBlock = Text( @@ -63,7 +61,7 @@ class Game { style: TextStyle( fontSize: blockSize, fontWeight: FontWeight.bold, - color: Colors.black + color: Colors.black, ), ); @@ -82,11 +80,12 @@ class Game { placedMinesCountBlock, ], ) - ]); + ], + ); } - static FlatButton buildRestartGameButton(Data myProvider) { - return FlatButton( + static TextButton buildRestartGameButton(Data myProvider) { + return TextButton( child: Container( child: Image( image: AssetImage('assets/icons/button_back.png'), @@ -99,33 +98,39 @@ class Game { static Container buildEndGameMessage(Data myProvider) { Image decorationImage = Image( - image: AssetImage( - myProvider.gameWin + image: AssetImage(myProvider.gameWin ? 'assets/icons/game_win.png' : myProvider.gameFail - ? 'assets/icons/game_fail.png' - : '' - ), - fit: BoxFit.fill + ? 'assets/icons/game_fail.png' + : ''), + fit: BoxFit.fill, ); return Container( margin: EdgeInsets.all(2), padding: EdgeInsets.all(2), - child: Table( defaultColumnWidth: IntrinsicColumnWidth(), children: [ TableRow( children: [ - Column(children: [ decorationImage ]), - Column(children: [ myProvider.animationInProgress ? decorationImage : buildRestartGameButton(myProvider) ]), - Column(children: [ decorationImage ]), + Column( + children: [decorationImage], + ), + Column( + children: [ + myProvider.animationInProgress + ? decorationImage + : buildRestartGameButton(myProvider) + ], + ), + Column( + children: [decorationImage], + ), ], ), - ] - ) + ], + ), ); } - } diff --git a/lib/layout/parameters.dart b/lib/layout/parameters.dart index fc15126618110d9ddea25a12c9237fa72d76629b..f7a868cbf69da0efd3e1c6999daae3dd6aa14f9d 100644 --- a/lib/layout/parameters.dart +++ b/lib/layout/parameters.dart @@ -1,76 +1,97 @@ import 'package:flutter/material.dart'; - -import '../provider/data.dart'; -import '../utils/game_utils.dart'; +import 'package:minehunter/provider/data.dart'; +import 'package:minehunter/utils/game_utils.dart'; class Parameters { + static double separatorHeight = 2.0; + static double blockMargin = 3.0; + static double blockPadding = 2.0; + static Color buttonBackgroundColor = Colors.white; + static Color buttonBorderColorActive = Colors.blue; + static Color buttonBorderColorInactive = Colors.white; + static double buttonBorderWidth = 10.0; + static double buttonBorderRadius = 8.0; + static double buttonPadding = 0.0; + static double buttonMargin = 0.0; static Container buildParametersSelector(Data myProvider) { + List<Widget> lines = []; + + List parameters = myProvider.availableParameters; + for (var index = 0; index < parameters.length; index++) { + lines.add(buildParameterSelector(myProvider, parameters[index])); + lines.add(SizedBox(height: separatorHeight)); + } + return Container( child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ - SizedBox(height: 5), + SizedBox(height: separatorHeight), Expanded( child: Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, - children: [ - Parameters.buildParameterSelector(myProvider, 'level'), - SizedBox(height: 5), - Parameters.buildParameterSelector(myProvider, 'size'), - SizedBox(height: 5), - ], + children: lines, ), ), - SizedBox(height: 5), + SizedBox(height: separatorHeight), Container( - child: Parameters.buildStartGameButton(myProvider), + child: buildStartNewGameButton(myProvider), ), ], ), ); } - static Container buildStartGameButton(Data myProvider) { - Column decorationImage = Column( + static Image buildImageWidget(String imageAssetCode) { + return Image( + image: AssetImage('assets/icons/' + imageAssetCode + '.png'), + fit: BoxFit.fill, + ); + } + + static Container buildImageContainerWidget(String imageAssetCode) { + return Container( + child: buildImageWidget(imageAssetCode), + ); + } + + static Column buildDecorationImageWidget() { + return Column( children: [ - Image( - image: AssetImage('assets/icons/placeholder.png'), - fit: BoxFit.fill + TextButton( + child: buildImageContainerWidget('placeholder'), + onPressed: () => null, ), - ] + ], ); + } + static Container buildStartNewGameButton(Data myProvider) { return Container( - margin: EdgeInsets.all(2), - padding: EdgeInsets.all(2), - + margin: EdgeInsets.all(blockMargin), + padding: EdgeInsets.all(blockPadding), child: Table( defaultColumnWidth: IntrinsicColumnWidth(), children: [ TableRow( children: [ - decorationImage, + buildDecorationImageWidget(), Column( children: [ - FlatButton( - child: Container( - child: Image( - image: AssetImage('assets/icons/button_start.png'), - fit: BoxFit.fill, - ), - ), - onPressed: () => GameUtils.startGame(myProvider), + TextButton( + child: buildImageContainerWidget('button_start'), + onPressed: () => GameUtils.startNewGame(myProvider), ), - ] + ], ), - decorationImage, + buildDecorationImageWidget(), ], ), - ] - ) + ], + ), ); } @@ -78,7 +99,7 @@ class Parameters { List availableValues = myProvider.getParameterAvailableValues(parameterCode); if (availableValues.length == 1) { - return SizedBox(height: 1); + return SizedBox(height: 0.0); } return Table( @@ -90,7 +111,7 @@ class Parameters { Column( children: [ _buildParameterButton(myProvider, parameterCode, availableValues[index]) - ] + ], ), ], ), @@ -98,30 +119,28 @@ class Parameters { ); } - static Widget _buildParameterButton(Data myProvider, String parameterCode, String parameterValue) { + static Widget _buildParameterButton( + Data myProvider, String parameterCode, String parameterValue) { String currentValue = myProvider.getParameterValue(parameterCode).toString(); bool isActive = (parameterValue == currentValue); - String imageAsset = 'assets/icons/' + parameterCode + '_' + parameterValue + '.png'; + String imageAsset = parameterCode + '_' + parameterValue; return TextButton( child: Container( - padding: EdgeInsets.all(2), + margin: EdgeInsets.all(buttonMargin), + padding: EdgeInsets.all(buttonPadding), decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(10), + color: buttonBackgroundColor, + borderRadius: BorderRadius.circular(buttonBorderRadius), border: Border.all( - color: isActive ? Colors.blue : Colors.white, - width: 10, + color: isActive ? buttonBorderColorActive : buttonBorderColorInactive, + width: buttonBorderWidth, ), ), - child: Image( - image: AssetImage(imageAsset), - fit: BoxFit.fill, - ), + child: buildImageWidget(imageAsset), ), onPressed: () => myProvider.setParameterValue(parameterCode, parameterValue), ); } - } diff --git a/lib/main.dart b/lib/main.dart index 7f448662ed2c1ea856492d67bacbf56f62d81c3a..867441b06fb9afb9c6e3494c356b64c9d2506457 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,11 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:minehunter/provider/data.dart'; +import 'package:minehunter/screens/home.dart'; import 'package:provider/provider.dart'; import 'package:overlay_support/overlay_support.dart'; -import 'provider/data.dart'; -import 'screens/home.dart'; - void main() { WidgetsFlutterBinding.ensureInitialized(); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) diff --git a/lib/provider/data.dart b/lib/provider/data.dart index 22a07e4093304b88b69d618133ab0d9bf5f2f0f3..96d5dbc71fa780519536eaf28ed5e005dbc7f8f5 100644 --- a/lib/provider/data.dart +++ b/lib/provider/data.dart @@ -2,6 +2,9 @@ import 'package:flutter/foundation.dart'; import 'package:shared_preferences/shared_preferences.dart'; class Data extends ChangeNotifier { + // Configuration available parameters + List _availableParameters = ['level', 'size', 'skin']; + List get availableParameters => _availableParameters; // Configuration available values List _availableLevelValues = ['easy', 'medium', 'hard', 'nightmare']; @@ -58,37 +61,61 @@ class Data extends ChangeNotifier { } String getParameterValue(String parameterCode) { - switch(parameterCode) { - case 'level': { return _parameterLevel; } - break; - case 'size': { return _parameterSize; } - break; - case 'skin': { return _parameterSkin; } - break; + switch (parameterCode) { + case 'level': + { + return _parameterLevel; + } + case 'size': + { + return _parameterSize; + } + + case 'skin': + { + return _parameterSkin; + } } return ''; } List getParameterAvailableValues(String parameterCode) { - switch(parameterCode) { - case 'level': { return _availableLevelValues; } - break; - case 'size': { return _availableSizeValues; } - break; - case 'skin': { return _availableSkinValues; } - break; + switch (parameterCode) { + case 'level': + { + return _availableLevelValues; + } + + case 'size': + { + return _availableSizeValues; + } + + case 'skin': + { + return _availableSkinValues; + } } return []; } setParameterValue(String parameterCode, String parameterValue) async { - switch(parameterCode) { - case 'level': { updateParameterLevel(parameterValue); } - break; - case 'size': { updateParameterSize(parameterValue); } - break; - case 'skin': { updateParameterSkin(parameterValue); } - break; + switch (parameterCode) { + case 'level': + { + updateParameterLevel(parameterValue); + } + break; + case 'size': + { + updateParameterSize(parameterValue); + } + break; + case 'skin': + { + updateParameterSkin(parameterValue); + } + break; } final prefs = await SharedPreferences.getInstance(); prefs.setString(parameterCode, parameterValue); @@ -133,7 +160,7 @@ class Data extends ChangeNotifier { _cells[row][col].isMarked = false; if (_cells[row][col].isMined) { _cells[row][col].isExploded = true; - }; + } notifyListeners(); } @@ -148,7 +175,6 @@ class Data extends ChangeNotifier { _assetsPreloaded = assetsPreloaded; } - bool get isBoardMined => _isBoardMined; void updateIsBoardMined(bool isBoardMined) { _isBoardMined = isBoardMined; @@ -160,7 +186,6 @@ class Data extends ChangeNotifier { _minesCount = minesCount; } - bool get reportMode => _reportMode; void updateReportMode(bool reportMode) { _reportMode = reportMode; @@ -181,6 +206,7 @@ class Data extends ChangeNotifier { } notifyListeners(); } + void resetAnimatedBackground() { for (var row = 0; row < _sizeVertical; row++) { for (var col = 0; col < _sizeHorizontal; col++) { diff --git a/lib/screens/home.dart b/lib/screens/home.dart index d7d778a6652a3b0d147e57c3bdfc038069bb07ac..18986beeaff26baeaf9a058812265a4bf158d14e 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -1,12 +1,11 @@ import 'package:flutter/material.dart'; +import 'package:minehunter/layout/game.dart'; +import 'package:minehunter/layout/parameters.dart'; +import 'package:minehunter/provider/data.dart'; +import 'package:minehunter/utils/game_utils.dart'; import 'package:provider/provider.dart'; import 'package:overlay_support/overlay_support.dart'; -import '../layout/game.dart'; -import '../layout/parameters.dart'; -import '../provider/data.dart'; -import '../utils/game_utils.dart'; - class Home extends StatefulWidget { static const String id = 'home'; @@ -32,16 +31,10 @@ class _HomeState extends State<Home> { 'game_fail', 'game_win', ]; - myProvider.availableLevelValues.forEach( - (level) => gameImages.add('level_' + level) - ); - myProvider.availableSizeValues.forEach( - (size) => gameImages.add('size_' + size) - ); + myProvider.availableLevelValues.forEach((level) => gameImages.add('level_' + level)); + myProvider.availableSizeValues.forEach((size) => gameImages.add('size_' + size)); - gameImages.forEach( - (image) => assets.add('assets/icons/' + image + '.png') - ); + gameImages.forEach((image) => assets.add('assets/icons/' + image + '.png')); List skinImages = [ 'button_mark_mine_off', @@ -57,9 +50,7 @@ class _HomeState extends State<Home> { skinImages.add('tile_' + value.toString()); } - skinImages.forEach( - (image) => assets.add('assets/skins/default_' + image + '.png') - ); + skinImages.forEach((image) => assets.add('assets/skins/default_' + image + '.png')); assets.add('assets/skins/default_empty.png'); @@ -72,9 +63,7 @@ class _HomeState extends State<Home> { if (!myProvider.assetsPreloaded) { List assets = getImagesAssets(myProvider); - assets.forEach( - (asset) => precacheImage(AssetImage(asset), context) - ); + assets.forEach((asset) => precacheImage(AssetImage(asset), context)); myProvider.updateAssetsPreloaded(true); } @@ -82,19 +71,11 @@ class _HomeState extends State<Home> { if (myProvider.gameIsRunning) { menuActions = [ - FlatButton( + TextButton( child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4), - border: Border.all( - color: Colors.blue, - width: 4, - ), - ), - margin: EdgeInsets.all(8), child: Image( image: AssetImage('assets/icons/button_back.png'), - fit: BoxFit.fill + fit: BoxFit.fill, ), ), onPressed: () => toast('Long press to quit game...'), @@ -110,10 +91,10 @@ class _HomeState extends State<Home> { body: SafeArea( child: Center( child: myProvider.gameIsRunning - ? Game.buildGameWidget(myProvider) - : Parameters.buildParametersSelector(myProvider) + ? Game.buildGameWidget(myProvider) + : Parameters.buildParametersSelector(myProvider), ), - ) + ), ); } } diff --git a/lib/utils/board_animate.dart b/lib/utils/board_animate.dart index 7e16e73a3f5373fc09fa815c874af43dd8b16a8f..5a83bfcda89ea5632a14e197970609052eb5a600 100644 --- a/lib/utils/board_animate.dart +++ b/lib/utils/board_animate.dart @@ -1,10 +1,9 @@ import 'dart:async'; import 'dart:math'; -import '../provider/data.dart'; +import 'package:minehunter/provider/data.dart'; class BoardAnimate { - // Start game animation: blinking tiles static List createStartGameAnimationPatterns(Data myProvider) { List<List> patterns = []; @@ -56,7 +55,8 @@ class BoardAnimate { for (var col = 0; col < sizeHorizontal; col++) { bool isHilighted = false; for (var mineIndex = 0; mineIndex < explodedMines.length; mineIndex++) { - double distance = sqrt(pow((explodedMines[mineIndex][0] - row), 2) + pow((explodedMines[mineIndex][1] - col), 2)); + double distance = sqrt(pow((explodedMines[mineIndex][0] - row), 2) + + pow((explodedMines[mineIndex][1] - col), 2)); isHilighted = isHilighted || ((patternIndex + distance) % 4 < 2); } patternRow.add(isHilighted); @@ -119,7 +119,7 @@ class BoardAnimate { static void startAnimation(Data myProvider, String animationType) { List patterns = []; - switch(animationType) { + switch (animationType) { case 'start': patterns = createStartGameAnimationPatterns(myProvider); break; @@ -137,9 +137,8 @@ class BoardAnimate { myProvider.updateAnimationInProgress(true); - Timer _timerAnimateBoard; const interval = const Duration(milliseconds: 200); - _timerAnimateBoard = new Timer.periodic( + Timer.periodic( interval, (Timer timer) { if (_patternIndex == 0) { diff --git a/lib/utils/board_utils.dart b/lib/utils/board_utils.dart index 8d5394165881169f9c598ba449d8cde295fd09d1..a82c965b4a2b30c7cd434fc0a815905aeeb9033e 100644 --- a/lib/utils/board_utils.dart +++ b/lib/utils/board_utils.dart @@ -1,16 +1,15 @@ -import '../entities/cell.dart'; -import '../provider/data.dart'; +import 'package:minehunter/entities/cell.dart'; +import 'package:minehunter/provider/data.dart'; class BoardUtils { - static printGrid(List cells) { - final String IS_MINED = 'X'; - final String IS_SAFE = '.'; + final String isMined = 'X'; + final String isSafe = '.'; - final String MINE_FOUND = '#'; - final String WRONG_MARKED_CELL = '0'; - final String EXPLORED_SAFE_CELL = '.'; - final String UNKNOWN_STATE = ' '; + final String mineFound = '#'; + final String wrongMarkedCell = '0'; + final String exploredSafeCell = '.'; + final String unkownState = ' '; print(''); String line = '--'; @@ -22,17 +21,17 @@ class BoardUtils { String currentLine = ''; String solvedLine = ''; for (var colIndex = 0; colIndex < cells[rowIndex].length; colIndex++) { - solvedLine += cells[rowIndex][colIndex].isMined ? IS_MINED : IS_SAFE; + solvedLine += cells[rowIndex][colIndex].isMined ? isMined : isSafe; - String cellString = UNKNOWN_STATE; + String cellString = unkownState; if (cells[rowIndex][colIndex].isExplored) { - cellString = EXPLORED_SAFE_CELL; + cellString = exploredSafeCell; } if (cells[rowIndex][colIndex].isMarked) { if (cells[rowIndex][colIndex].isMined) { - cellString = MINE_FOUND; + cellString = mineFound; } else { - cellString = WRONG_MARKED_CELL; + cellString = wrongMarkedCell; } } currentLine += cellString; @@ -44,7 +43,6 @@ class BoardUtils { } static List createEmptyBoard(int sizeHorizontal, int sizeVertical) { - int index = 0; List cells = []; for (var rowIndex = 0; rowIndex < sizeVertical; rowIndex++) { List row = []; @@ -59,23 +57,27 @@ class BoardUtils { static int getMinesCount(int sizeHorizontal, int sizeVertical, String level) { int minesCountRatio = 0; - switch(level) { - case 'easy': { - minesCountRatio = 5; - } - break; - case 'medium': { - minesCountRatio = 10; - } - break; - case 'hard': { - minesCountRatio = 15; - } - break; - case 'nightmare': { - minesCountRatio = 20; - } - break; + switch (level) { + case 'easy': + { + minesCountRatio = 5; + } + break; + case 'medium': + { + minesCountRatio = 10; + } + break; + case 'hard': + { + minesCountRatio = 15; + } + break; + case 'nightmare': + { + minesCountRatio = 20; + } + break; } int minesCount = ((sizeHorizontal * sizeVertical) * minesCountRatio / 100).round(); @@ -87,14 +89,14 @@ class BoardUtils { static void createInitialEmptyBoard(Data myProvider) { myProvider.updateIsBoardMined(false); - myProvider.updateCells(createEmptyBoard(myProvider.sizeHorizontal, myProvider.sizeVertical)); + 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.parameterLevel; // Shuffle cells to put random mines, expect on currently selected one List allowedCells = []; @@ -156,13 +158,9 @@ class BoardUtils { for (var deltaCol = -1; deltaCol <= 1; deltaCol++) { int candidateRow = row + deltaRow; int candidateCol = col + deltaCol; - if ( - (candidateRow >= 0 && candidateRow < sizeVertical) - && - (candidateCol >= 0 && candidateCol < sizeHorizontal) - && - !cells[candidateRow][candidateCol].isExplored - ) { + if ((candidateRow >= 0 && candidateRow < sizeVertical) && + (candidateCol >= 0 && candidateCol < sizeHorizontal) && + !cells[candidateRow][candidateCol].isExplored) { safeCellsCoordinates.add([candidateRow, candidateCol]); } } @@ -179,13 +177,9 @@ class BoardUtils { int minesCountAround = 0; for (var deltaRow = -1; deltaRow <= 1; deltaRow++) { for (var deltaCol = -1; deltaCol <= 1; deltaCol++) { - if ( - (row + deltaRow >= 0 && row + deltaRow < sizeVertical) - && - (col + deltaCol >= 0 && col + deltaCol < sizeHorizontal) - && - (cells[row + deltaRow][col + deltaCol].isMined) - ) { + if ((row + deltaRow >= 0 && row + deltaRow < sizeVertical) && + (col + deltaCol >= 0 && col + deltaCol < sizeHorizontal) && + (cells[row + deltaRow][col + deltaCol].isMined)) { minesCountAround++; } } @@ -217,12 +211,10 @@ class BoardUtils { for (var row = 0; row < sizeVertical; row++) { for (var col = 0; col < sizeHorizontal; col++) { if ( - // Mine not already found - (cells[row][col].isMined == true && cells[row][col].isMarked == false) - || - // Safe cell marked as mined - (cells[row][col].isMined == false && cells[row][col].isMarked == true) - ) { + // Mine not already found + (cells[row][col].isMined == true && cells[row][col].isMarked == false) || + // Safe cell marked as mined + (cells[row][col].isMined == false && cells[row][col].isMarked == true)) { return false; } } diff --git a/lib/utils/game_utils.dart b/lib/utils/game_utils.dart index 8e2db5d96d30400f3fa3cd8cf95e47b815e7ea2b..02de51a917025dfbd62584e2bca9c78c0683356c 100644 --- a/lib/utils/game_utils.dart +++ b/lib/utils/game_utils.dart @@ -1,20 +1,19 @@ -import '../provider/data.dart'; -import '../utils/board_animate.dart'; -import '../utils/board_utils.dart'; +import 'package:minehunter/provider/data.dart'; +import 'package:minehunter/utils/board_animate.dart'; +import 'package:minehunter/utils/board_utils.dart'; class GameUtils { - static void resetGame(Data myProvider) { myProvider.updateGameIsRunning(false); } - static void startGame(Data myProvider) { + static void startNewGame(Data myProvider) { print('Starting game: ' + myProvider.parameterSize + ' - ' + myProvider.parameterLevel); myProvider.updateParameterSize(myProvider.parameterSize); - myProvider.updateMinesCount(BoardUtils.getMinesCount(myProvider.sizeHorizontal, myProvider.sizeVertical, myProvider.parameterLevel)); + myProvider.updateMinesCount(BoardUtils.getMinesCount( + myProvider.sizeHorizontal, myProvider.sizeVertical, myProvider.parameterLevel)); myProvider.updateGameIsRunning(true); BoardUtils.createInitialEmptyBoard(myProvider); BoardAnimate.startAnimation(myProvider, 'start'); } - } diff --git a/test/widget_test.dart b/test/widget_test.dart deleted file mode 100644 index 4ae14e644425f8a4f704c9a44a394dc439dedca8..0000000000000000000000000000000000000000 --- a/test/widget_test.dart +++ /dev/null @@ -1,14 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:minehunter/main.dart'; - -void main() { -}