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

Merge branch '22-fix-clean-some-code' into 'master'

Resolve "Fix/clean some code"

Closes #22

See merge request !20
parents fb2dea17 5c888881
No related branches found
No related tags found
1 merge request!20Resolve "Fix/clean some code"
Pipeline #3150 canceled
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
app.versionName=0.0.19
app.versionCode=19
app.versionName=0.0.20
app.versionCode=20
Fix / improve code, improve display
Corrections et amélioration de code, améliorations d'affichage
import 'package:colors/provider/data.dart';
import 'package:colors/utils/board_utils.dart';
import 'package:flutter/material.dart';
import '../provider/data.dart';
import '../utils/board_utils.dart';
class Cell {
int value;
Cell(
@required this.value,
this.value,
);
Widget widget(Data myProvider, int row, int col) {
......@@ -34,10 +33,10 @@ class Cell {
fontSize: blackPointFontSize,
fontWeight: FontWeight.w800,
),
textAlign: TextAlign.center
textAlign: TextAlign.center,
),
),
]
],
);
}
......@@ -60,14 +59,15 @@ class Cell {
child: GestureDetector(
child: Image(
image: AssetImage(imageAsset),
fit: BoxFit.fill
fit: BoxFit.fill,
),
onTap: () {
if (!myProvider.animationInProgress && myProvider.getFirstCellValue() != this.value) {
if (!myProvider.animationInProgress &&
myProvider.getFirstCellValue() != this.value) {
BoardUtils.fillBoardFromFirstCell(myProvider, this.value);
}
},
)
),
);
}
......@@ -75,5 +75,4 @@ class Cell {
int cellValue = this.value;
return 'assets/skins/' + myProvider.parameterSkin + '_' + cellValue.toString() + '.png';
}
}
import 'package:colors/provider/data.dart';
import 'package:flutter/material.dart';
import '../provider/data.dart';
class Board {
static Container buildGameBoard(Data myProvider) {
return Container(
margin: EdgeInsets.all(4),
......@@ -24,18 +22,17 @@ class Board {
defaultColumnWidth: IntrinsicColumnWidth(),
children: [
for (var row = 0; row < boardSize; row++)
TableRow(children: [
TableRow(
children: [
for (var col = 0; col < boardSize; col++)
Column(children: [
cells[row][col].widget(
myProvider,
row,
col
)
]),
]),
]
Column(
children: [
cells[row][col].widget(myProvider, row, col),
],
),
],
),
],
);
}
}
import 'dart:math';
import 'package:colors/entities/cell.dart';
import 'package:colors/layout/board.dart';
import 'package:colors/provider/data.dart';
import 'package:colors/utils/game_utils.dart';
import 'package:flutter/material.dart';
import '../entities/cell.dart';
import '../layout/board.dart';
import '../provider/data.dart';
import '../utils/game_utils.dart';
class Game {
static Container buildGameWidget(Data myProvider) {
bool gameIsFinished = myProvider.isGameFinished();
......@@ -35,7 +31,8 @@ class Game {
}
static Widget buildTopIndicatorWidget(Data myProvider) {
String progressIndicator = myProvider.progress.toString() + '/' + myProvider.progressTotal.toString();
String progressIndicator =
myProvider.progress.toString() + '/' + myProvider.progressTotal.toString();
if (myProvider.movesCount > 0) {
progressIndicator += ' (+' + myProvider.progressDelta.toString() + ')';
......@@ -68,7 +65,7 @@ class Game {
color: maxMovesCountColor,
),
),
]
],
),
Column(
children: [
......@@ -80,7 +77,7 @@ class Game {
color: Colors.green,
),
),
]
],
),
],
),
......@@ -89,38 +86,31 @@ class Game {
}
static Container buildSelectColorBar(Data myProvider) {
List cells = myProvider.cells;
int maxValue = myProvider.colorsCount;
return Container(
margin: EdgeInsets.all(2),
padding: EdgeInsets.all(2),
child: Table(
defaultColumnWidth: IntrinsicColumnWidth(),
children: [
TableRow(
children: [
for (
int value = 1;
value <= maxValue;
value++
)
for (int value = 1; value <= maxValue; value++)
Column(
children: [
Cell(value).widgetFillBoardWithColor(myProvider)
]
Cell(value).widgetFillBoardWithColor(myProvider),
],
),
]
],
),
]
],
),
);
}
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'),
......@@ -141,26 +131,30 @@ class Game {
Image decorationImage = Image(
image: AssetImage(decorationImageAssetName),
fit: BoxFit.fill
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: [ buildRestartGameButton(myProvider) ]),
Column(children: [ decorationImage ]),
Column(
children: [decorationImage],
),
Column(
children: [buildRestartGameButton(myProvider)],
),
Column(
children: [decorationImage],
),
],
),
],
),
]
)
);
}
}
import 'package:colors/provider/data.dart';
import 'package:colors/utils/game_utils.dart';
import 'package:flutter/material.dart';
import '../provider/data.dart';
import '../utils/game_utils.dart';
class Parameters {
static double separatorHeight = 2.0;
static double blockMargin = 8.0;
static double blockPadding = 3.0;
static Color buttonBackgroundColor = Colors.white;
static Color buttonBorderColorActive = Colors.blue;
static Color buttonBorderColorInactive = Colors.white;
static double buttonBorderWidth = 8.0;
static double buttonBorderRadius = 6.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(Parameters.buildParameterSelector(myProvider, parameters[index]));
lines.add(SizedBox(height: Parameters.separatorHeight));
}
return Container(
padding: EdgeInsets.all(2),
margin: EdgeInsets.all(2),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(height: Parameters.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),
Parameters.buildParameterSelector(myProvider, 'colors'),
SizedBox(height: 5),
Parameters.buildParameterSelector(myProvider, 'skin'),
SizedBox(height: 5),
Parameters.buildStartGameButton(myProvider),
children: lines,
),
),
SizedBox(height: Parameters.separatorHeight),
Container(
child: Parameters.buildStartGameButton(myProvider),
),
],
),
);
......@@ -33,15 +50,14 @@ class Parameters {
children: [
Image(
image: AssetImage('assets/icons/game_win.png'),
fit: BoxFit.fill
fit: BoxFit.fill,
),
]
],
);
return Container(
margin: EdgeInsets.all(2),
padding: EdgeInsets.all(2),
margin: EdgeInsets.all(Parameters.blockMargin),
padding: EdgeInsets.all(Parameters.blockPadding),
child: Table(
defaultColumnWidth: IntrinsicColumnWidth(),
children: [
......@@ -50,7 +66,7 @@ class Parameters {
decorationImage,
Column(
children: [
FlatButton(
TextButton(
child: Container(
child: Image(
image: AssetImage('assets/icons/button_start.png'),
......@@ -59,13 +75,13 @@ class Parameters {
),
onPressed: () => GameUtils.startGame(myProvider),
),
]
],
),
decorationImage,
],
),
]
)
],
),
);
}
......@@ -73,7 +89,7 @@ class Parameters {
List availableValues = myProvider.getParameterAvailableValues(parameterCode);
if (availableValues.length == 1) {
return SizedBox(height: 1);
return SizedBox(height: 0.0);
}
return Table(
......@@ -85,7 +101,7 @@ class Parameters {
Column(
children: [
_buildParameterButton(myProvider, parameterCode, availableValues[index])
]
],
),
],
),
......@@ -93,7 +109,8 @@ class Parameters {
);
}
static TextButton _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);
......@@ -101,13 +118,16 @@ class Parameters {
return TextButton(
child: Container(
padding: EdgeInsets.all(2),
margin: EdgeInsets.all(Parameters.buttonMargin),
padding: EdgeInsets.all(Parameters.buttonPadding),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
color: Parameters.buttonBackgroundColor,
borderRadius: BorderRadius.circular(Parameters.buttonBorderRadius),
border: Border.all(
color: isActive ? Colors.blue : Colors.white,
width: 10,
color: isActive
? Parameters.buttonBorderColorActive
: Parameters.buttonBorderColorInactive,
width: Parameters.buttonBorderWidth,
),
),
child: Image(
......@@ -118,5 +138,4 @@ class Parameters {
onPressed: () => myProvider.setParameterValue(parameterCode, parameterValue),
);
}
}
import 'package:colors/provider/data.dart';
import 'package:colors/screens/home.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.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])
......@@ -17,7 +16,8 @@ class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (BuildContext context) => Data(),
child: Consumer<Data>(builder: (context, data, child) {
child: Consumer<Data>(
builder: (context, data, child) {
return OverlaySupport(
child: MaterialApp(
debugShowCheckedModeBanner: false,
......@@ -31,7 +31,8 @@ class MyApp extends StatelessWidget {
},
),
);
}),
},
),
);
}
}
......@@ -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', 'colors', 'skin'];
List get availableParameters => _availableParameters;
// Configuration available values
List _availableLevelValues = ['easy', 'medium', 'hard', 'nightmare'];
......@@ -44,63 +47,93 @@ class Data extends ChangeNotifier {
int _progressTotal = 0;
int _progressDelta = 0;
void updateParameterLevel(String parameterLevel) {
_parameterLevel = parameterLevel;
notifyListeners();
}
void updateParameterSize(String parameterSize) {
_parameterSize = parameterSize;
updateBoardSize(getBoardSizeFromParameter(parameterSize));
notifyListeners();
}
void updateParameterColors(String parameterColors) {
_parameterColors = parameterColors;
updateColorsCount(getColorsCountFromParameter(parameterColors));
notifyListeners();
}
void updateParameterSkin(String parameterSkin) {
_parameterSkin = parameterSkin;
notifyListeners();
}
getParameterValue(String parameterCode) {
String getParameterValue(String parameterCode) {
switch (parameterCode) {
case 'level': { return _parameterLevel; }
break;
case 'size': { return _parameterSize; }
break;
case 'colors': { return _parameterColors; }
break;
case 'skin': { return _parameterSkin; }
break;
case 'level':
{
return _parameterLevel;
}
case 'size':
{
return _parameterSize;
}
case 'colors':
{
return _parameterColors;
}
case 'skin':
{
return _parameterSkin;
}
}
return '';
}
List getParameterAvailableValues(String parameterCode) {
switch (parameterCode) {
case 'level': { return _availableLevelValues; }
break;
case 'size': { return _availableSizeValues; }
break;
case 'colors': { return _availableColorsValues; }
break;
case 'skin': { return _availableSkinValues; }
break;
case 'level':
{
return _availableLevelValues;
}
case 'size':
{
return _availableSizeValues;
}
case 'colors':
{
return _availableColorsValues;
}
case 'skin':
{
return _availableSkinValues;
}
}
return [];
}
setParameterValue(String parameterCode, String parameterValue) async {
void setParameterValue(String parameterCode, String parameterValue) async {
switch (parameterCode) {
case 'level': { updateParameterLevel(parameterValue); }
case 'level':
{
updateParameterLevel(parameterValue);
}
break;
case 'size': { updateParameterSize(parameterValue); }
case 'size':
{
updateParameterSize(parameterValue);
}
break;
case 'colors': { updateParameterColors(parameterValue); }
case 'colors':
{
updateParameterColors(parameterValue);
}
break;
case 'skin': { updateParameterSkin(parameterValue); }
case 'skin':
{
updateParameterSkin(parameterValue);
}
break;
}
final prefs = await SharedPreferences.getInstance();
......@@ -117,42 +150,66 @@ class Data extends ChangeNotifier {
int getBoardSizeFromParameter(String parameterSize) {
switch (parameterSize) {
case 'small': { return 6; }
break;
case 'medium': { return 10; }
break;
case 'large': { return 14; }
break;
case 'extra': { return 20; }
break;
case 'small':
{
return 6;
}
case 'medium':
{
return 10;
}
case 'large':
{
return 14;
}
case 'extra':
{
return 20;
}
}
return getBoardSizeFromParameter(_parameterSizeDefault);
}
int getColorsCountFromParameter(String parameterColors) {
switch (parameterColors) {
case '5': { return 5; }
break;
case '6': { return 6; }
break;
case '7': { return 7; }
break;
case '8': { return 8; }
break;
case '5':
{
return 5;
}
case '6':
{
return 6;
}
case '7':
{
return 7;
}
case '8':
{
return 8;
}
}
return getColorsCountFromParameter(_parameterColorsDefault);
}
int getMovesCountLimitDeltaFromLevelParameter(String parameterLevel) {
switch (parameterLevel) {
case 'easy': { return 5; }
break;
case 'medium': { return 3; }
break;
case 'hard': { return 1; }
break;
case 'nightmare': { return -1; }
break;
case 'easy':
{
return 5;
}
case 'medium':
{
return 3;
}
case 'hard':
{
return 1;
}
case 'nightmare':
{
return -1;
}
}
return getMovesCountLimitDeltaFromLevelParameter(_parameterLevelDefault);
}
......@@ -188,6 +245,7 @@ class Data extends ChangeNotifier {
_movesCount = movesCount;
notifyListeners();
}
void incrementMovesCount() {
updateMovesCount(movesCount + 1);
}
......@@ -204,10 +262,12 @@ class Data extends ChangeNotifier {
_progress = progress;
notifyListeners();
}
void updateProgressTotal(int progressTotal) {
_progressTotal = progressTotal;
notifyListeners();
}
void updateProgressDelta(int progressDelta) {
_progressDelta = progressDelta;
notifyListeners();
......@@ -243,5 +303,4 @@ class Data extends ChangeNotifier {
_progress = 0;
notifyListeners();
}
}
import 'package:colors/layout/game.dart';
import 'package:colors/layout/parameters.dart';
import 'package:colors/provider/data.dart';
import 'package:colors/utils/game_utils.dart';
import 'package:flutter/material.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';
import 'package:provider/provider.dart';
class Home extends StatefulWidget {
static const String id = 'home';
......@@ -31,7 +30,7 @@ class _HomeState extends State<Home> {
if (myProvider.gameIsRunning) {
menuActions = [
FlatButton(
TextButton(
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
......@@ -43,7 +42,7 @@ class _HomeState extends State<Home> {
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...'),
......@@ -60,9 +59,9 @@ class _HomeState extends State<Home> {
child: Center(
child: myProvider.gameIsRunning
? Game.buildGameWidget(myProvider)
: Parameters.buildParametersSelector(myProvider)
: Parameters.buildParametersSelector(myProvider),
),
),
)
);
}
}
import 'dart:math';
import 'dart:async';
import '../entities/cell.dart';
import '../provider/data.dart';
import 'package:colors/entities/cell.dart';
import 'package:colors/provider/data.dart';
class BoardUtils {
static printGrid(List cells) {
String stringValues = '012345678';
print('');
......@@ -42,7 +41,9 @@ class BoardUtils {
myProvider.updateCells(grid);
myProvider.updateMaxMovesCount(computeMaxMovesCountLimit(myProvider));
int initProgress = BoardUtils.getSiblingFillableCells(myProvider, 0, 0, [[0, 0]]).length;
int initProgress = BoardUtils.getSiblingFillableCells(myProvider, 0, 0, [
[0, 0]
]).length;
myProvider.updateProgress(initProgress);
}
......@@ -51,32 +52,38 @@ class BoardUtils {
int colorsCount = myProvider.colorsCount;
int baseMaxMovesCount = (30 * (boardSize * colorsCount) / (17 * 6)).round();
int deltaFromLevel = myProvider.getMovesCountLimitDeltaFromLevelParameter(myProvider.parameterLevel);
int deltaFromLevel =
myProvider.getMovesCountLimitDeltaFromLevelParameter(myProvider.parameterLevel);
return baseMaxMovesCount + deltaFromLevel;
}
static fillBoardFromFirstCell(Data myProvider, int value) {
List cellsToFill = BoardUtils.getSiblingFillableCells(myProvider, 0, 0, [[0, 0]]);
List cellsToFill = BoardUtils.getSiblingFillableCells(myProvider, 0, 0, [
[0, 0]
]);
int progressBeforeMove = cellsToFill.length;
// Sort cells from the closest to the furthest, relatively to the top left corner
cellsToFill.sort((a, b) => (pow(a[0], 2) + pow(a[1], 2)).compareTo(pow(b[0], 2) + pow(b[1], 2)));
cellsToFill
.sort((a, b) => (pow(a[0], 2) + pow(a[1], 2)).compareTo(pow(b[0], 2) + pow(b[1], 2)));
Timer _timerAnimateBoard;
const interval = const Duration(milliseconds: 10);
int cellIndex = 0;
myProvider.updateAnimationInProgress(true);
_timerAnimateBoard = new Timer.periodic(
Timer.periodic(
interval,
(Timer timer) {
if (cellIndex < cellsToFill.length) {
myProvider.updateCellValue(cellsToFill[cellIndex][1], cellsToFill[cellIndex][0], value);
myProvider.updateCellValue(
cellsToFill[cellIndex][1], cellsToFill[cellIndex][0], value);
cellIndex++;
} else {
timer.cancel();
int progressAfterMove = BoardUtils.getSiblingFillableCells(myProvider, 0, 0, [[0, 0]]).length;
int progressAfterMove = BoardUtils.getSiblingFillableCells(myProvider, 0, 0, [
[0, 0]
]).length;
int progressDelta = progressAfterMove - progressBeforeMove;
myProvider.updateProgressDelta(progressDelta);
myProvider.updateProgress(progressAfterMove);
......@@ -107,25 +114,20 @@ class BoardUtils {
int candidateRow = row + deltaRow;
int candidateCol = col + deltaCol;
if (
(candidateRow >= 0 && candidateRow < boardSize)
&&
(candidateCol >= 0 && candidateCol < boardSize)
) {
if ((candidateRow >= 0 && candidateRow < boardSize) &&
(candidateCol >= 0 && candidateCol < boardSize)) {
if (cells[candidateRow][candidateCol].value == referenceValue) {
bool alreadyFound = false;
for (var index = 0; index < siblingCells.length; index++) {
if (
(siblingCells[index][0] == candidateRow)
&&
(siblingCells[index][1] == candidateCol)
) {
if ((siblingCells[index][0] == candidateRow) &&
(siblingCells[index][1] == candidateCol)) {
alreadyFound = true;
}
}
if (!alreadyFound) {
siblingCells.add([candidateRow, candidateCol]);
siblingCells = getSiblingFillableCells(myProvider, candidateRow, candidateCol, siblingCells);
siblingCells = getSiblingFillableCells(
myProvider, candidateRow, candidateCol, siblingCells);
}
}
}
......@@ -155,5 +157,4 @@ class BoardUtils {
return true;
}
}
import '../provider/data.dart';
import '../utils/board_utils.dart';
import 'package:colors/provider/data.dart';
import 'package:colors/utils/board_utils.dart';
class GameUtils {
static Future<void> resetGame(Data myProvider) async {
myProvider.updateGameIsRunning(false);
}
......@@ -17,5 +16,4 @@ class GameUtils {
myProvider.updateGameIsRunning(true);
}
}
name: calculus
description: calculus application
name: colors
description: colors application
publish_to: 'none'
version: 1.0.0+1
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment