Skip to content
Snippets Groups Projects
Commit 29a65de5 authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Improve parameters page, fix/update/clean code

parent 9549f21a
No related branches found
No related tags found
1 merge request!30Resolve "Improve / normalize parameters page"
Pipeline #3098 passed
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
app.versionName=0.1.5 app.versionName=0.1.6
app.versionCode=26 app.versionCode=27
Update parameters page, fix/clean code
Améliorations sur la page des paramètres, corrections/améliorations de code
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:minehunter/provider/data.dart';
import '../provider/data.dart'; import 'package:minehunter/utils/board_animate.dart';
import '../utils/board_animate.dart'; import 'package:minehunter/utils/board_utils.dart';
import '../utils/board_utils.dart';
class Cell { class Cell {
bool isMined = false; bool isMined = false;
...@@ -14,7 +13,7 @@ class Cell { ...@@ -14,7 +13,7 @@ class Cell {
bool isAnimated = false; bool isAnimated = false;
Cell( Cell(
@required this.isMined, this.isMined,
); );
/* /*
...@@ -59,7 +58,7 @@ class Cell { ...@@ -59,7 +58,7 @@ class Cell {
} }
} }
}, },
) ),
); );
} }
...@@ -78,7 +77,11 @@ class Cell { ...@@ -78,7 +77,11 @@ class Cell {
imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_mine.png'; imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_mine.png';
} else { } else {
// Show mines count around // 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 { } else {
if (this.isMarked) { if (this.isMarked) {
...@@ -98,7 +101,11 @@ class Cell { ...@@ -98,7 +101,11 @@ class Cell {
} }
} else { } else {
// Show all mines counts // Show all mines counts
imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_' + this.minesCountAround.toString() + '.png'; imageAsset = 'assets/skins/' +
myProvider.parameterSkin +
'_tile_' +
this.minesCountAround.toString() +
'.png';
} }
} }
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:minehunter/provider/data.dart';
import '../provider/data.dart';
import '../utils/board_utils.dart';
class Board { class Board {
static Container buildGameBoard(Data myProvider) { static Container buildGameBoard(Data myProvider) {
return Container( return Container(
margin: EdgeInsets.all(2), margin: EdgeInsets.all(2),
padding: EdgeInsets.all(2), padding: EdgeInsets.all(2),
child: Column( child: Column(
children: [ children: [
buildGameTileset(myProvider) buildGameTileset(myProvider),
], ],
), ),
); );
...@@ -34,29 +31,32 @@ class Board { ...@@ -34,29 +31,32 @@ class Board {
defaultColumnWidth: IntrinsicColumnWidth(), defaultColumnWidth: IntrinsicColumnWidth(),
children: [ children: [
for (var row = 0; row < myProvider.sizeVertical; row++) for (var row = 0; row < myProvider.sizeVertical; row++)
TableRow(children: [ TableRow(
for (var col = 0; col < myProvider.sizeHorizontal; col++) children: [
Column(children: [ for (var col = 0; col < myProvider.sizeHorizontal; col++)
cells[row][col].widget( Column(
myProvider, children: [
row, cells[row][col].widget(myProvider, row, col),
col ],
) ),
]), ],
], ),
), ],
]
), ),
); );
} }
static FlatButton buildToggleFlagModeButton(Data myProvider) { static TextButton buildToggleFlagModeButton(Data myProvider) {
String reportModeSuffix = myProvider.reportMode ? 'on' : 'off'; String reportModeSuffix = myProvider.reportMode ? 'on' : 'off';
return FlatButton( return TextButton(
child: Container( child: Container(
child: Image( 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, fit: BoxFit.fill,
), ),
), ),
...@@ -85,5 +85,4 @@ class Board { ...@@ -85,5 +85,4 @@ class Board {
], ],
); );
} }
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:minehunter/layout/board.dart';
import '../layout/board.dart'; import 'package:minehunter/provider/data.dart';
import '../provider/data.dart'; import 'package:minehunter/utils/board_utils.dart';
import '../utils/board_utils.dart'; import 'package:minehunter/utils/game_utils.dart';
import '../utils/game_utils.dart';
class Game { class Game {
static Container buildGameWidget(Data myProvider) { static Container buildGameWidget(Data myProvider) {
bool gameIsFinished = myProvider.gameWin || myProvider.gameFail; bool gameIsFinished = myProvider.gameWin || myProvider.gameFail;
...@@ -24,8 +22,8 @@ class Game { ...@@ -24,8 +22,8 @@ class Game {
SizedBox(height: 2), SizedBox(height: 2),
Container( Container(
child: gameIsFinished child: gameIsFinished
? Game.buildEndGameMessage(myProvider) ? Game.buildEndGameMessage(myProvider)
: Board.buildToggleFlagModeLayout(myProvider), : Board.buildToggleFlagModeLayout(myProvider),
), ),
SizedBox(height: 8), SizedBox(height: 8),
], ],
...@@ -55,7 +53,7 @@ class Game { ...@@ -55,7 +53,7 @@ class Game {
style: TextStyle( style: TextStyle(
fontSize: blockSize, fontSize: blockSize,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: Colors.black color: Colors.black,
), ),
); );
Text placedMinesCountBlock = Text( Text placedMinesCountBlock = Text(
...@@ -63,7 +61,7 @@ class Game { ...@@ -63,7 +61,7 @@ class Game {
style: TextStyle( style: TextStyle(
fontSize: blockSize, fontSize: blockSize,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: Colors.black color: Colors.black,
), ),
); );
...@@ -82,11 +80,12 @@ class Game { ...@@ -82,11 +80,12 @@ class Game {
placedMinesCountBlock, placedMinesCountBlock,
], ],
) )
]); ],
);
} }
static FlatButton buildRestartGameButton(Data myProvider) { static TextButton buildRestartGameButton(Data myProvider) {
return FlatButton( return TextButton(
child: Container( child: Container(
child: Image( child: Image(
image: AssetImage('assets/icons/button_back.png'), image: AssetImage('assets/icons/button_back.png'),
...@@ -99,33 +98,39 @@ class Game { ...@@ -99,33 +98,39 @@ class Game {
static Container buildEndGameMessage(Data myProvider) { static Container buildEndGameMessage(Data myProvider) {
Image decorationImage = Image( Image decorationImage = Image(
image: AssetImage( image: AssetImage(myProvider.gameWin
myProvider.gameWin
? 'assets/icons/game_win.png' ? 'assets/icons/game_win.png'
: myProvider.gameFail : myProvider.gameFail
? 'assets/icons/game_fail.png' ? 'assets/icons/game_fail.png'
: '' : ''),
), fit: BoxFit.fill,
fit: BoxFit.fill
); );
return Container( return Container(
margin: EdgeInsets.all(2), margin: EdgeInsets.all(2),
padding: EdgeInsets.all(2), padding: EdgeInsets.all(2),
child: Table( child: Table(
defaultColumnWidth: IntrinsicColumnWidth(), defaultColumnWidth: IntrinsicColumnWidth(),
children: [ children: [
TableRow( TableRow(
children: [ children: [
Column(children: [ decorationImage ]), Column(
Column(children: [ myProvider.animationInProgress ? decorationImage : buildRestartGameButton(myProvider) ]), children: [decorationImage],
Column(children: [ decorationImage ]), ),
Column(
children: [
myProvider.animationInProgress
? decorationImage
: buildRestartGameButton(myProvider)
],
),
Column(
children: [decorationImage],
),
], ],
), ),
] ],
) ),
); );
} }
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:minehunter/provider/data.dart';
import '../provider/data.dart'; import 'package:minehunter/utils/game_utils.dart';
import '../utils/game_utils.dart';
class Parameters { 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) { 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( return Container(
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
SizedBox(height: 5), SizedBox(height: separatorHeight),
Expanded( Expanded(
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: lines,
Parameters.buildParameterSelector(myProvider, 'level'),
SizedBox(height: 5),
Parameters.buildParameterSelector(myProvider, 'size'),
SizedBox(height: 5),
],
), ),
), ),
SizedBox(height: 5), SizedBox(height: separatorHeight),
Container( Container(
child: Parameters.buildStartGameButton(myProvider), child: buildStartNewGameButton(myProvider),
), ),
], ],
), ),
); );
} }
static Container buildStartGameButton(Data myProvider) { static Image buildImageWidget(String imageAssetCode) {
Column decorationImage = Column( 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: [ children: [
Image( TextButton(
image: AssetImage('assets/icons/placeholder.png'), child: buildImageContainerWidget('placeholder'),
fit: BoxFit.fill onPressed: () => null,
), ),
] ],
); );
}
static Container buildStartNewGameButton(Data myProvider) {
return Container( return Container(
margin: EdgeInsets.all(2), margin: EdgeInsets.all(blockMargin),
padding: EdgeInsets.all(2), padding: EdgeInsets.all(blockPadding),
child: Table( child: Table(
defaultColumnWidth: IntrinsicColumnWidth(), defaultColumnWidth: IntrinsicColumnWidth(),
children: [ children: [
TableRow( TableRow(
children: [ children: [
decorationImage, buildDecorationImageWidget(),
Column( Column(
children: [ children: [
FlatButton( TextButton(
child: Container( child: buildImageContainerWidget('button_start'),
child: Image( onPressed: () => GameUtils.startNewGame(myProvider),
image: AssetImage('assets/icons/button_start.png'),
fit: BoxFit.fill,
),
),
onPressed: () => GameUtils.startGame(myProvider),
), ),
] ],
), ),
decorationImage, buildDecorationImageWidget(),
], ],
), ),
] ],
) ),
); );
} }
...@@ -78,7 +99,7 @@ class Parameters { ...@@ -78,7 +99,7 @@ class Parameters {
List availableValues = myProvider.getParameterAvailableValues(parameterCode); List availableValues = myProvider.getParameterAvailableValues(parameterCode);
if (availableValues.length == 1) { if (availableValues.length == 1) {
return SizedBox(height: 1); return SizedBox(height: 0.0);
} }
return Table( return Table(
...@@ -90,7 +111,7 @@ class Parameters { ...@@ -90,7 +111,7 @@ class Parameters {
Column( Column(
children: [ children: [
_buildParameterButton(myProvider, parameterCode, availableValues[index]) _buildParameterButton(myProvider, parameterCode, availableValues[index])
] ],
), ),
], ],
), ),
...@@ -98,30 +119,28 @@ class Parameters { ...@@ -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(); String currentValue = myProvider.getParameterValue(parameterCode).toString();
bool isActive = (parameterValue == currentValue); bool isActive = (parameterValue == currentValue);
String imageAsset = 'assets/icons/' + parameterCode + '_' + parameterValue + '.png'; String imageAsset = parameterCode + '_' + parameterValue;
return TextButton( return TextButton(
child: Container( child: Container(
padding: EdgeInsets.all(2), margin: EdgeInsets.all(buttonMargin),
padding: EdgeInsets.all(buttonPadding),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: buttonBackgroundColor,
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(buttonBorderRadius),
border: Border.all( border: Border.all(
color: isActive ? Colors.blue : Colors.white, color: isActive ? buttonBorderColorActive : buttonBorderColorInactive,
width: 10, width: buttonBorderWidth,
), ),
), ),
child: Image( child: buildImageWidget(imageAsset),
image: AssetImage(imageAsset),
fit: BoxFit.fill,
),
), ),
onPressed: () => myProvider.setParameterValue(parameterCode, parameterValue), onPressed: () => myProvider.setParameterValue(parameterCode, parameterValue),
); );
} }
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.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:provider/provider.dart';
import 'package:overlay_support/overlay_support.dart'; import 'package:overlay_support/overlay_support.dart';
import 'provider/data.dart';
import 'screens/home.dart';
void main() { void main() {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
......
...@@ -2,6 +2,9 @@ import 'package:flutter/foundation.dart'; ...@@ -2,6 +2,9 @@ import 'package:flutter/foundation.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
class Data extends ChangeNotifier { class Data extends ChangeNotifier {
// Configuration available parameters
List _availableParameters = ['level', 'size', 'skin'];
List get availableParameters => _availableParameters;
// Configuration available values // Configuration available values
List _availableLevelValues = ['easy', 'medium', 'hard', 'nightmare']; List _availableLevelValues = ['easy', 'medium', 'hard', 'nightmare'];
...@@ -58,37 +61,61 @@ class Data extends ChangeNotifier { ...@@ -58,37 +61,61 @@ class Data extends ChangeNotifier {
} }
String getParameterValue(String parameterCode) { String getParameterValue(String parameterCode) {
switch(parameterCode) { switch (parameterCode) {
case 'level': { return _parameterLevel; } case 'level':
break; {
case 'size': { return _parameterSize; } return _parameterLevel;
break; }
case 'skin': { return _parameterSkin; } case 'size':
break; {
return _parameterSize;
}
case 'skin':
{
return _parameterSkin;
}
} }
return ''; return '';
} }
List getParameterAvailableValues(String parameterCode) { List getParameterAvailableValues(String parameterCode) {
switch(parameterCode) { switch (parameterCode) {
case 'level': { return _availableLevelValues; } case 'level':
break; {
case 'size': { return _availableSizeValues; } return _availableLevelValues;
break; }
case 'skin': { return _availableSkinValues; }
break; case 'size':
{
return _availableSizeValues;
}
case 'skin':
{
return _availableSkinValues;
}
} }
return []; return [];
} }
setParameterValue(String parameterCode, String parameterValue) async { setParameterValue(String parameterCode, String parameterValue) async {
switch(parameterCode) { switch (parameterCode) {
case 'level': { updateParameterLevel(parameterValue); } case 'level':
break; {
case 'size': { updateParameterSize(parameterValue); } updateParameterLevel(parameterValue);
break; }
case 'skin': { updateParameterSkin(parameterValue); } break;
break; case 'size':
{
updateParameterSize(parameterValue);
}
break;
case 'skin':
{
updateParameterSkin(parameterValue);
}
break;
} }
final prefs = await SharedPreferences.getInstance(); final prefs = await SharedPreferences.getInstance();
prefs.setString(parameterCode, parameterValue); prefs.setString(parameterCode, parameterValue);
...@@ -133,7 +160,7 @@ class Data extends ChangeNotifier { ...@@ -133,7 +160,7 @@ class Data extends ChangeNotifier {
_cells[row][col].isMarked = false; _cells[row][col].isMarked = false;
if (_cells[row][col].isMined) { if (_cells[row][col].isMined) {
_cells[row][col].isExploded = true; _cells[row][col].isExploded = true;
}; }
notifyListeners(); notifyListeners();
} }
...@@ -148,7 +175,6 @@ class Data extends ChangeNotifier { ...@@ -148,7 +175,6 @@ class Data extends ChangeNotifier {
_assetsPreloaded = assetsPreloaded; _assetsPreloaded = assetsPreloaded;
} }
bool get isBoardMined => _isBoardMined; bool get isBoardMined => _isBoardMined;
void updateIsBoardMined(bool isBoardMined) { void updateIsBoardMined(bool isBoardMined) {
_isBoardMined = isBoardMined; _isBoardMined = isBoardMined;
...@@ -160,7 +186,6 @@ class Data extends ChangeNotifier { ...@@ -160,7 +186,6 @@ class Data extends ChangeNotifier {
_minesCount = minesCount; _minesCount = minesCount;
} }
bool get reportMode => _reportMode; bool get reportMode => _reportMode;
void updateReportMode(bool reportMode) { void updateReportMode(bool reportMode) {
_reportMode = reportMode; _reportMode = reportMode;
...@@ -181,6 +206,7 @@ class Data extends ChangeNotifier { ...@@ -181,6 +206,7 @@ class Data extends ChangeNotifier {
} }
notifyListeners(); notifyListeners();
} }
void resetAnimatedBackground() { void resetAnimatedBackground() {
for (var row = 0; row < _sizeVertical; row++) { for (var row = 0; row < _sizeVertical; row++) {
for (var col = 0; col < _sizeHorizontal; col++) { for (var col = 0; col < _sizeHorizontal; col++) {
......
import 'package:flutter/material.dart'; 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:provider/provider.dart';
import 'package:overlay_support/overlay_support.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 { class Home extends StatefulWidget {
static const String id = 'home'; static const String id = 'home';
...@@ -32,16 +31,10 @@ class _HomeState extends State<Home> { ...@@ -32,16 +31,10 @@ class _HomeState extends State<Home> {
'game_fail', 'game_fail',
'game_win', 'game_win',
]; ];
myProvider.availableLevelValues.forEach( myProvider.availableLevelValues.forEach((level) => gameImages.add('level_' + level));
(level) => gameImages.add('level_' + level) myProvider.availableSizeValues.forEach((size) => gameImages.add('size_' + size));
);
myProvider.availableSizeValues.forEach(
(size) => gameImages.add('size_' + size)
);
gameImages.forEach( gameImages.forEach((image) => assets.add('assets/icons/' + image + '.png'));
(image) => assets.add('assets/icons/' + image + '.png')
);
List skinImages = [ List skinImages = [
'button_mark_mine_off', 'button_mark_mine_off',
...@@ -57,9 +50,7 @@ class _HomeState extends State<Home> { ...@@ -57,9 +50,7 @@ class _HomeState extends State<Home> {
skinImages.add('tile_' + value.toString()); skinImages.add('tile_' + value.toString());
} }
skinImages.forEach( skinImages.forEach((image) => assets.add('assets/skins/default_' + image + '.png'));
(image) => assets.add('assets/skins/default_' + image + '.png')
);
assets.add('assets/skins/default_empty.png'); assets.add('assets/skins/default_empty.png');
...@@ -72,9 +63,7 @@ class _HomeState extends State<Home> { ...@@ -72,9 +63,7 @@ class _HomeState extends State<Home> {
if (!myProvider.assetsPreloaded) { if (!myProvider.assetsPreloaded) {
List assets = getImagesAssets(myProvider); List assets = getImagesAssets(myProvider);
assets.forEach( assets.forEach((asset) => precacheImage(AssetImage(asset), context));
(asset) => precacheImage(AssetImage(asset), context)
);
myProvider.updateAssetsPreloaded(true); myProvider.updateAssetsPreloaded(true);
} }
...@@ -82,19 +71,11 @@ class _HomeState extends State<Home> { ...@@ -82,19 +71,11 @@ class _HomeState extends State<Home> {
if (myProvider.gameIsRunning) { if (myProvider.gameIsRunning) {
menuActions = [ menuActions = [
FlatButton( TextButton(
child: Container( child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
border: Border.all(
color: Colors.blue,
width: 4,
),
),
margin: EdgeInsets.all(8),
child: Image( child: Image(
image: AssetImage('assets/icons/button_back.png'), image: AssetImage('assets/icons/button_back.png'),
fit: BoxFit.fill fit: BoxFit.fill,
), ),
), ),
onPressed: () => toast('Long press to quit game...'), onPressed: () => toast('Long press to quit game...'),
...@@ -110,10 +91,10 @@ class _HomeState extends State<Home> { ...@@ -110,10 +91,10 @@ class _HomeState extends State<Home> {
body: SafeArea( body: SafeArea(
child: Center( child: Center(
child: myProvider.gameIsRunning child: myProvider.gameIsRunning
? Game.buildGameWidget(myProvider) ? Game.buildGameWidget(myProvider)
: Parameters.buildParametersSelector(myProvider) : Parameters.buildParametersSelector(myProvider),
), ),
) ),
); );
} }
} }
import 'dart:async'; import 'dart:async';
import 'dart:math'; import 'dart:math';
import '../provider/data.dart'; import 'package:minehunter/provider/data.dart';
class BoardAnimate { class BoardAnimate {
// Start game animation: blinking tiles // Start game animation: blinking tiles
static List createStartGameAnimationPatterns(Data myProvider) { static List createStartGameAnimationPatterns(Data myProvider) {
List<List> patterns = []; List<List> patterns = [];
...@@ -56,7 +55,8 @@ class BoardAnimate { ...@@ -56,7 +55,8 @@ class BoardAnimate {
for (var col = 0; col < sizeHorizontal; col++) { for (var col = 0; col < sizeHorizontal; col++) {
bool isHilighted = false; bool isHilighted = false;
for (var mineIndex = 0; mineIndex < explodedMines.length; mineIndex++) { 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); isHilighted = isHilighted || ((patternIndex + distance) % 4 < 2);
} }
patternRow.add(isHilighted); patternRow.add(isHilighted);
...@@ -119,7 +119,7 @@ class BoardAnimate { ...@@ -119,7 +119,7 @@ class BoardAnimate {
static void startAnimation(Data myProvider, String animationType) { static void startAnimation(Data myProvider, String animationType) {
List patterns = []; List patterns = [];
switch(animationType) { switch (animationType) {
case 'start': case 'start':
patterns = createStartGameAnimationPatterns(myProvider); patterns = createStartGameAnimationPatterns(myProvider);
break; break;
...@@ -137,9 +137,8 @@ class BoardAnimate { ...@@ -137,9 +137,8 @@ class BoardAnimate {
myProvider.updateAnimationInProgress(true); myProvider.updateAnimationInProgress(true);
Timer _timerAnimateBoard;
const interval = const Duration(milliseconds: 200); const interval = const Duration(milliseconds: 200);
_timerAnimateBoard = new Timer.periodic( Timer.periodic(
interval, interval,
(Timer timer) { (Timer timer) {
if (_patternIndex == 0) { if (_patternIndex == 0) {
......
import '../entities/cell.dart'; import 'package:minehunter/entities/cell.dart';
import '../provider/data.dart'; import 'package:minehunter/provider/data.dart';
class BoardUtils { class BoardUtils {
static printGrid(List cells) { static printGrid(List cells) {
final String IS_MINED = 'X'; final String isMined = 'X';
final String IS_SAFE = '.'; final String isSafe = '.';
final String MINE_FOUND = '#'; final String mineFound = '#';
final String WRONG_MARKED_CELL = '0'; final String wrongMarkedCell = '0';
final String EXPLORED_SAFE_CELL = '.'; final String exploredSafeCell = '.';
final String UNKNOWN_STATE = ' '; final String unkownState = ' ';
print(''); print('');
String line = '--'; String line = '--';
...@@ -22,17 +21,17 @@ class BoardUtils { ...@@ -22,17 +21,17 @@ class BoardUtils {
String currentLine = ''; String currentLine = '';
String solvedLine = ''; String solvedLine = '';
for (var colIndex = 0; colIndex < cells[rowIndex].length; colIndex++) { 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) { if (cells[rowIndex][colIndex].isExplored) {
cellString = EXPLORED_SAFE_CELL; cellString = exploredSafeCell;
} }
if (cells[rowIndex][colIndex].isMarked) { if (cells[rowIndex][colIndex].isMarked) {
if (cells[rowIndex][colIndex].isMined) { if (cells[rowIndex][colIndex].isMined) {
cellString = MINE_FOUND; cellString = mineFound;
} else { } else {
cellString = WRONG_MARKED_CELL; cellString = wrongMarkedCell;
} }
} }
currentLine += cellString; currentLine += cellString;
...@@ -44,7 +43,6 @@ class BoardUtils { ...@@ -44,7 +43,6 @@ class BoardUtils {
} }
static List createEmptyBoard(int sizeHorizontal, int sizeVertical) { static List createEmptyBoard(int sizeHorizontal, int sizeVertical) {
int index = 0;
List cells = []; List cells = [];
for (var rowIndex = 0; rowIndex < sizeVertical; rowIndex++) { for (var rowIndex = 0; rowIndex < sizeVertical; rowIndex++) {
List row = []; List row = [];
...@@ -59,23 +57,27 @@ class BoardUtils { ...@@ -59,23 +57,27 @@ class BoardUtils {
static int getMinesCount(int sizeHorizontal, int sizeVertical, String level) { static int getMinesCount(int sizeHorizontal, int sizeVertical, String level) {
int minesCountRatio = 0; int minesCountRatio = 0;
switch(level) { switch (level) {
case 'easy': { case 'easy':
minesCountRatio = 5; {
} minesCountRatio = 5;
break; }
case 'medium': { break;
minesCountRatio = 10; case 'medium':
} {
break; minesCountRatio = 10;
case 'hard': { }
minesCountRatio = 15; break;
} case 'hard':
break; {
case 'nightmare': { minesCountRatio = 15;
minesCountRatio = 20; }
} break;
break; case 'nightmare':
{
minesCountRatio = 20;
}
break;
} }
int minesCount = ((sizeHorizontal * sizeVertical) * minesCountRatio / 100).round(); int minesCount = ((sizeHorizontal * sizeVertical) * minesCountRatio / 100).round();
...@@ -87,14 +89,14 @@ class BoardUtils { ...@@ -87,14 +89,14 @@ class BoardUtils {
static void createInitialEmptyBoard(Data myProvider) { static void createInitialEmptyBoard(Data myProvider) {
myProvider.updateIsBoardMined(false); 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) { static List createBoard(Data myProvider, int forbiddenRow, int forbiddenCol) {
List cells = myProvider.cells; List cells = myProvider.cells;
int sizeHorizontal = myProvider.sizeHorizontal; int sizeHorizontal = myProvider.sizeHorizontal;
int sizeVertical = myProvider.sizeVertical; int sizeVertical = myProvider.sizeVertical;
String level = myProvider.parameterLevel;
// Shuffle cells to put random mines, expect on currently selected one // Shuffle cells to put random mines, expect on currently selected one
List allowedCells = []; List allowedCells = [];
...@@ -156,13 +158,9 @@ class BoardUtils { ...@@ -156,13 +158,9 @@ class BoardUtils {
for (var deltaCol = -1; deltaCol <= 1; deltaCol++) { for (var deltaCol = -1; deltaCol <= 1; deltaCol++) {
int candidateRow = row + deltaRow; int candidateRow = row + deltaRow;
int candidateCol = col + deltaCol; int candidateCol = col + deltaCol;
if ( if ((candidateRow >= 0 && candidateRow < sizeVertical) &&
(candidateRow >= 0 && candidateRow < sizeVertical) (candidateCol >= 0 && candidateCol < sizeHorizontal) &&
&& !cells[candidateRow][candidateCol].isExplored) {
(candidateCol >= 0 && candidateCol < sizeHorizontal)
&&
!cells[candidateRow][candidateCol].isExplored
) {
safeCellsCoordinates.add([candidateRow, candidateCol]); safeCellsCoordinates.add([candidateRow, candidateCol]);
} }
} }
...@@ -179,13 +177,9 @@ class BoardUtils { ...@@ -179,13 +177,9 @@ class BoardUtils {
int minesCountAround = 0; int minesCountAround = 0;
for (var deltaRow = -1; deltaRow <= 1; deltaRow++) { for (var deltaRow = -1; deltaRow <= 1; deltaRow++) {
for (var deltaCol = -1; deltaCol <= 1; deltaCol++) { for (var deltaCol = -1; deltaCol <= 1; deltaCol++) {
if ( if ((row + deltaRow >= 0 && row + deltaRow < sizeVertical) &&
(row + deltaRow >= 0 && row + deltaRow < sizeVertical) (col + deltaCol >= 0 && col + deltaCol < sizeHorizontal) &&
&& (cells[row + deltaRow][col + deltaCol].isMined)) {
(col + deltaCol >= 0 && col + deltaCol < sizeHorizontal)
&&
(cells[row + deltaRow][col + deltaCol].isMined)
) {
minesCountAround++; minesCountAround++;
} }
} }
...@@ -217,12 +211,10 @@ class BoardUtils { ...@@ -217,12 +211,10 @@ class BoardUtils {
for (var row = 0; row < sizeVertical; row++) { for (var row = 0; row < sizeVertical; row++) {
for (var col = 0; col < sizeHorizontal; col++) { for (var col = 0; col < sizeHorizontal; col++) {
if ( if (
// Mine not already found // Mine not already found
(cells[row][col].isMined == true && cells[row][col].isMarked == false) (cells[row][col].isMined == true && cells[row][col].isMarked == false) ||
|| // Safe cell marked as mined
// Safe cell marked as mined (cells[row][col].isMined == false && cells[row][col].isMarked == true)) {
(cells[row][col].isMined == false && cells[row][col].isMarked == true)
) {
return false; return false;
} }
} }
......
import '../provider/data.dart'; import 'package:minehunter/provider/data.dart';
import '../utils/board_animate.dart'; import 'package:minehunter/utils/board_animate.dart';
import '../utils/board_utils.dart'; import 'package:minehunter/utils/board_utils.dart';
class GameUtils { class GameUtils {
static void resetGame(Data myProvider) { static void resetGame(Data myProvider) {
myProvider.updateGameIsRunning(false); myProvider.updateGameIsRunning(false);
} }
static void startGame(Data myProvider) { static void startNewGame(Data myProvider) {
print('Starting game: ' + myProvider.parameterSize + ' - ' + myProvider.parameterLevel); print('Starting game: ' + myProvider.parameterSize + ' - ' + myProvider.parameterLevel);
myProvider.updateParameterSize(myProvider.parameterSize); 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); myProvider.updateGameIsRunning(true);
BoardUtils.createInitialEmptyBoard(myProvider); BoardUtils.createInitialEmptyBoard(myProvider);
BoardAnimate.startAnimation(myProvider, 'start'); BoardAnimate.startAnimation(myProvider, 'start');
} }
} }
// 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() {
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment