Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • android/org.benoitharrault.suguru
1 result
Show changes
Commits on Source (2)
Fix rotate board.
Correction sur rotation de la grille.
......@@ -36,8 +36,6 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
boardAnimated: state.currentActivity.boardAnimated,
// Base data
board: state.currentActivity.board,
boardSizeHorizontal: state.currentActivity.boardSizeHorizontal,
boardSizeVertical: state.currentActivity.boardSizeVertical,
// Game data
boardConflicts: state.currentActivity.boardConflicts,
selectedCell: state.currentActivity.selectedCell,
......@@ -154,8 +152,8 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
}
void setAnimatedBackground(List animatedCellsPattern) {
for (int row = 0; row < state.currentActivity.boardSizeVertical; row++) {
for (int col = 0; col < state.currentActivity.boardSizeHorizontal; col++) {
for (int row = 0; row < state.currentActivity.board.boardSizeVertical; row++) {
for (int col = 0; col < state.currentActivity.board.boardSizeHorizontal; col++) {
state.currentActivity.boardAnimated[row][col] = animatedCellsPattern[row][col];
}
}
......@@ -163,8 +161,8 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
}
void resetAnimatedBackground() {
for (int row = 0; row < state.currentActivity.boardSizeVertical; row++) {
for (int col = 0; col < state.currentActivity.boardSizeHorizontal; col++) {
for (int row = 0; row < state.currentActivity.board.boardSizeVertical; row++) {
for (int col = 0; col < state.currentActivity.board.boardSizeHorizontal; col++) {
state.currentActivity.boardAnimated[row][col] = false;
}
}
......
......@@ -26,8 +26,6 @@ class Activity {
// Base data
required this.board,
required this.boardSizeHorizontal,
required this.boardSizeVertical,
// Game data
this.boardConflicts = const [],
......@@ -49,8 +47,6 @@ class Activity {
// Base data
final Board board;
final int boardSizeHorizontal;
final int boardSizeVertical;
// Game data
ConflictsCount boardConflicts;
......@@ -65,8 +61,6 @@ class Activity {
activitySettings: ActivitySettings.createDefault(appConfig: ApplicationConfig.config),
// Base data
board: Board.createEmpty(),
boardSizeHorizontal: 0,
boardSizeVertical: 0,
// Game data
givenTipsCount: 0,
);
......@@ -90,15 +84,15 @@ class Activity {
return Activity.createEmpty();
}
final String boardSizeAsString = templateParts[0];
final int boardSizeHorizontal = int.parse(boardSizeAsString.split('x')[0]);
final int boardSizeVertical = int.parse(boardSizeAsString.split('x')[1]);
// Build main game board
final Board board = Board.createEmpty();
board.createFromTemplate(template: template);
// Build empty conflicts board
ConflictsCount nonConflictedBoard = [];
for (int row = 0; row < boardSizeVertical; row++) {
for (int row = 0; row < board.boardSizeVertical; row++) {
List<int> line = [];
for (int col = 0; col < boardSizeHorizontal; col++) {
for (int col = 0; col < board.boardSizeHorizontal; col++) {
line.add(0);
}
nonConflictedBoard.add(line);
......@@ -106,18 +100,14 @@ class Activity {
// Build empty animated background
AnimatedBoard notAnimatedBoard = [];
for (int row = 0; row < boardSizeVertical; row++) {
for (int row = 0; row < board.boardSizeVertical; row++) {
List<bool> line = [];
for (int col = 0; col < boardSizeHorizontal; col++) {
for (int col = 0; col < board.boardSizeHorizontal; col++) {
line.add(false);
}
notAnimatedBoard.add(line);
}
// Build main game board
final Board board = Board.createEmpty();
board.createFromTemplate(template: template);
return Activity(
// Settings
activitySettings: newActivitySettings,
......@@ -126,8 +116,6 @@ class Activity {
boardAnimated: notAnimatedBoard,
// Base data
board: board,
boardSizeHorizontal: boardSizeHorizontal,
boardSizeVertical: boardSizeVertical,
// Game data
boardConflicts: nonConflictedBoard,
selectedCell: null,
......@@ -154,23 +142,23 @@ class Activity {
final ConflictsCount conflicts = boardConflicts;
// reset conflict states
for (int row = 0; row < boardSizeVertical; row++) {
for (int col = 0; col < boardSizeHorizontal; col++) {
for (int row = 0; row < board.boardSizeVertical; row++) {
for (int col = 0; col < board.boardSizeHorizontal; col++) {
conflicts[row][col] = 0;
}
}
// check siblings
for (int row = 0; row < boardSizeVertical; row++) {
for (int col = 0; col < boardSizeHorizontal; col++) {
for (int row = 0; row < board.boardSizeVertical; row++) {
for (int col = 0; col < board.boardSizeHorizontal; col++) {
final int value = cells[row][col].value;
if (value != 0) {
for (int deltaRow = -1; deltaRow <= 1; deltaRow++) {
for (int deltaCol = -1; deltaCol <= 1; deltaCol++) {
if (row + deltaRow >= 0 &&
row + deltaRow < boardSizeHorizontal &&
row + deltaRow < board.boardSizeHorizontal &&
col + deltaCol >= 0 &&
col + deltaCol < boardSizeVertical &&
col + deltaCol < board.boardSizeVertical &&
(deltaRow * deltaCol != 0)) {
final int siblingValue = cells[row + deltaRow][col + deltaCol].value;
......@@ -188,8 +176,8 @@ class Activity {
for (String blockId in board.getBlockIds()) {
List<int> values = [];
List<int> duplicateValues = [];
for (int row = 0; row < boardSizeVertical; row++) {
for (int col = 0; col < boardSizeHorizontal; col++) {
for (int row = 0; row < board.boardSizeVertical; row++) {
for (int col = 0; col < board.boardSizeHorizontal; col++) {
if (cells[row][col].blockId == blockId) {
final int value = cells[row][col].value;
if (value != 0) {
......@@ -203,8 +191,8 @@ class Activity {
}
}
for (int duplicateValue in duplicateValues) {
for (int row = 0; row < boardSizeVertical; row++) {
for (int col = 0; col < boardSizeHorizontal; col++) {
for (int row = 0; row < board.boardSizeVertical; row++) {
for (int col = 0; col < board.boardSizeHorizontal; col++) {
if (cells[row][col].blockId == blockId &&
cells[row][col].value == duplicateValue) {
conflicts[row][col]++;
......@@ -289,8 +277,8 @@ class Activity {
List<CellLocation> cellsWithWrongValue = [];
for (int row = 0; row < boardSizeVertical; row++) {
for (int col = 0; col < boardSizeHorizontal; col++) {
for (int row = 0; row < board.boardSizeVertical; row++) {
for (int col = 0; col < board.boardSizeHorizontal; col++) {
if (cells[row][col].value != 0 &&
cells[row][col].value != cellsSolved[row][col].value) {
cellsWithWrongValue.add(CellLocation.go(row, col));
......@@ -304,8 +292,8 @@ class Activity {
List<CellLocation> getCellsWithConflicts() {
List<CellLocation> cellsWithConflict = [];
for (int row = 0; row < boardSizeVertical; row++) {
for (int col = 0; col < boardSizeHorizontal; col++) {
for (int row = 0; row < board.boardSizeVertical; row++) {
for (int col = 0; col < board.boardSizeHorizontal; col++) {
if (boardConflicts[row][col] != 0) {
cellsWithConflict.add(CellLocation.go(row, col));
}
......@@ -327,9 +315,6 @@ class Activity {
printlog(' isStarted: $isStarted');
printlog(' isFinished: $isFinished');
printlog(' animationInProgress: $animationInProgress');
printlog(' Base data');
printlog(' boardSizeHorizontal: $boardSizeHorizontal');
printlog(' boardSizeVertical: $boardSizeVertical');
printlog(' Game data');
printlog(' selectedCell: ${selectedCell?.toString() ?? ''}');
printlog(' showConflicts: $showConflicts');
......@@ -358,8 +343,6 @@ class Activity {
'boardAnimated': boardAnimated,
// Base data
'board': board.toJson(),
'boardSizeHorizontal': boardSizeHorizontal,
'boardSizeVertical': boardSizeVertical,
// Game data
'boardConflicts': boardConflicts,
'selectedCell': selectedCell?.toJson(),
......
......@@ -17,10 +17,24 @@ class Board {
BoardCells cells = const [];
BoardCells solvedCells = const [];
factory Board.createEmpty() {
factory Board.createEmpty([final int width = 0, final int height = 0]) {
final BoardCells cells = [];
for (int rowIndex = 0; rowIndex < height; rowIndex++) {
final List<Cell> row = [];
for (int colIndex = 0; colIndex < width; colIndex++) {
row.add(Cell(
location: CellLocation.go(rowIndex, colIndex),
blockId: '',
value: 0,
isFixed: false,
));
}
cells.add(row);
}
return Board(
cells: [],
solvedCells: [],
cells: cells,
solvedCells: cells,
);
}
......@@ -96,34 +110,12 @@ class Board {
// cells = solvedCells;
}
// Helper to create board from size, with "empty" cells
static BoardCells createEmptyBoard(final int width, final int height) {
final BoardCells cells = [];
for (int rowIndex = 0; rowIndex < height; rowIndex++) {
final List<Cell> row = [];
for (int colIndex = 0; colIndex < width; colIndex++) {
row.add(Cell(
location: CellLocation.go(rowIndex, colIndex),
blockId: '',
value: 0,
isFixed: false,
));
}
cells.add(row);
}
return cells;
}
int get boardSizeVertical => cells.length;
int get boardSizeHorizontal => cells.isNotEmpty ? cells.first.length : 0;
List<CellLocation> getCellLocations([String? blockId]) {
if (cells.isEmpty) {
return [];
}
final List<CellLocation> locations = [];
final int boardSizeVertical = cells.length;
final int boardSizeHorizontal = cells[0].length;
for (int row = 0; row < boardSizeVertical; row++) {
for (int col = 0; col < boardSizeHorizontal; col++) {
if ((blockId == null) || (blockId == get(CellLocation.go(row, col)).blockId)) {
......@@ -136,14 +128,13 @@ class Board {
}
void transformBoard() {
final int boardSizeVertical = cells.length;
final int boardSizeHorizontal = cells[0].length;
const List<String> allowedFlip = ['none', 'horizontal', 'vertical'];
List<String> allowedRotate = ['none', 'left', 'right', 'upsidedown'];
List<String> allowedRotate = [];
// Limit rotation if board is not symetric
if (boardSizeVertical != boardSizeHorizontal) {
// Force "vertical board"
if (boardSizeVertical < boardSizeHorizontal) {
allowedRotate = ['left', 'right'];
} else {
allowedRotate = ['none', 'upsidedown'];
}
......@@ -167,12 +158,14 @@ class Board {
switch (rotate) {
case 'left':
{
transformRotateLeft();
transformRotate();
transformRotate();
transformRotate();
}
break;
case 'right':
{
transformRotateRight();
transformRotate();
}
break;
case 'upsidedown':
......@@ -186,7 +179,6 @@ class Board {
void transformFlipHorizontal() {
final BoardCells transformedBoard = copyCells();
final int boardSizeVertical = cells.length;
for (CellLocation location in getCellLocations()) {
final Cell cell = cells[boardSizeVertical - location.row - 1][location.col];
......@@ -202,14 +194,8 @@ class Board {
}
void transformFlipVertical() {
if (cells.isEmpty) {
return;
}
final BoardCells transformedBoard = copyCells();
final int boardSizeHorizontal = cells[0].length;
for (CellLocation location in getCellLocations()) {
final Cell cell = cells[location.row][boardSizeHorizontal - location.col - 1];
transformedBoard[location.row][location.col] = Cell(
......@@ -223,43 +209,20 @@ class Board {
cells = transformedBoard;
}
void transformRotateLeft() {
final BoardCells transformedBoard = copyCells();
final int boardSizeVertical = cells.length;
void transformRotate() {
final Board transformedBoard = Board.createEmpty(boardSizeVertical, boardSizeHorizontal);
for (CellLocation location in getCellLocations()) {
final Cell cell = cells[location.col][boardSizeVertical - location.row - 1];
transformedBoard[location.row][location.col] = Cell(
location: location,
blockId: cell.blockId,
value: cell.value,
isFixed: false,
);
}
cells = transformedBoard;
}
void transformRotateRight() {
if (cells.isEmpty) {
return;
}
final BoardCells transformedBoard = copyCells();
final int boardSizeHorizontal = cells[0].length;
for (CellLocation location in getCellLocations()) {
final Cell cell = cells[boardSizeHorizontal - location.col - 1][location.row];
transformedBoard[location.row][location.col] = Cell(
location: location,
final Cell cell = get(location);
transformedBoard.cells[location.col][location.row] = Cell(
location: CellLocation.go(location.col, location.row),
blockId: cell.blockId,
value: cell.value,
isFixed: false,
);
}
cells = transformedBoard;
cells = transformedBoard.cells;
}
bool inBoard(CellLocation location) {
......@@ -521,10 +484,6 @@ class Board {
}
bool cellHasSiblingWithSameValue(CellLocation cellLocation, [int? candidateValue]) {
if (cells.isEmpty) {
return false;
}
final int value = candidateValue ?? get(cellLocation).value;
if (value != 0) {
for (int deltaCol in [-1, 0, 1]) {
......
......@@ -158,25 +158,25 @@ class CellWidget extends StatelessWidget {
top: BorderSide(
width: cellBorderWidth,
color: (hasBlockBorderTop ||
(((cell.location.row) % activity.boardSizeVertical) == 0))
(((cell.location.row) % activity.board.boardSizeVertical) == 0))
? cellBorderDarkColor
: cellBorderLightColor),
left: BorderSide(
width: cellBorderWidth,
color: (hasBlockBorderLeft ||
(((cell.location.col) % activity.boardSizeHorizontal) == 0))
(((cell.location.col) % activity.board.boardSizeHorizontal) == 0))
? cellBorderDarkColor
: cellBorderLightColor),
right: BorderSide(
width: cellBorderWidth,
color: (hasBlockBorderRight ||
((((cell.location.col) + 1) % activity.boardSizeHorizontal) == 0))
((((cell.location.col) + 1) % activity.board.boardSizeHorizontal) == 0))
? cellBorderDarkColor
: cellBorderLightColor),
bottom: BorderSide(
width: cellBorderWidth,
color: (hasBlockBorderBottom ||
((((cell.location.row) + 1) % activity.boardSizeVertical) == 0))
((((cell.location.row) + 1) % activity.board.boardSizeVertical) == 0))
? cellBorderDarkColor
: cellBorderLightColor),
);
......
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
......@@ -38,16 +37,18 @@ class GameBoardWidget extends StatelessWidget {
Table(
defaultColumnWidth: const IntrinsicColumnWidth(),
children: [
for (int row = 0; row < currentActivity.boardSizeVertical; row++)
for (int row = 0; row < currentActivity.board.boardSizeVertical; row++)
TableRow(
children: [
for (int col = 0; col < currentActivity.boardSizeHorizontal; col++)
for (int col = 0;
col < currentActivity.board.boardSizeHorizontal;
col++)
Column(
children: [
CellWidget(
cell: currentActivity.board.get(CellLocation.go(row, col)),
hasBlockBorderBottom:
row == currentActivity.boardSizeVertical ||
row == currentActivity.board.boardSizeVertical ||
currentActivity.board
.get(CellLocation.go(row, col))
.blockId !=
......@@ -62,7 +63,7 @@ class GameBoardWidget extends StatelessWidget {
.get(CellLocation.go(row, col - 1))
.blockId,
hasBlockBorderRight:
col == currentActivity.boardSizeVertical ||
col == currentActivity.board.boardSizeVertical ||
currentActivity.board
.get(CellLocation.go(row, col))
.blockId !=
......
......@@ -13,9 +13,9 @@ class BoardAnimate {
for (int patternIndex = 0; patternIndex < patternsCount; patternIndex++) {
AnimatedBoard pattern = [];
for (int row = 0; row < activity.boardSizeVertical; row++) {
for (int row = 0; row < activity.board.boardSizeVertical; row++) {
List<bool> patternRow = [];
for (int col = 0; col < activity.boardSizeHorizontal; col++) {
for (int col = 0; col < activity.board.boardSizeHorizontal; col++) {
patternRow.add(((patternIndex + row + col) % 2 == 0));
}
pattern.add(patternRow);
......@@ -30,13 +30,13 @@ class BoardAnimate {
static AnimatedBoardSequence createWinGameAnimationPatterns(Activity activity) {
AnimatedBoardSequence patterns = [];
int patternsCount = activity.boardSizeHorizontal + activity.boardSizeVertical;
int patternsCount = activity.board.boardSizeHorizontal + activity.board.boardSizeVertical;
for (int patternIndex = 0; patternIndex < patternsCount; patternIndex++) {
AnimatedBoard pattern = [];
for (int row = 0; row < activity.boardSizeVertical; row++) {
for (int row = 0; row < activity.board.boardSizeVertical; row++) {
List<bool> patternRow = [];
for (int col = 0; col < activity.boardSizeHorizontal; col++) {
for (int col = 0; col < activity.board.boardSizeHorizontal; col++) {
patternRow.add(row > (patternIndex - 4));
}
pattern.add(patternRow);
......@@ -51,14 +51,14 @@ class BoardAnimate {
static AnimatedBoardSequence createDefaultAnimationPatterns(Activity activity) {
AnimatedBoardSequence patterns = [];
int boardSideLength = activity.boardSizeHorizontal;
int boardSideLength = activity.board.boardSizeHorizontal;
int patternsCount = boardSideLength;
for (int patternIndex = 0; patternIndex < patternsCount; patternIndex++) {
AnimatedBoard pattern = [];
for (int row = 0; row < activity.boardSizeVertical; row++) {
for (int row = 0; row < activity.board.boardSizeVertical; row++) {
List<bool> patternRow = [];
for (int col = 0; col < activity.boardSizeHorizontal; col++) {
for (int col = 0; col < activity.board.boardSizeHorizontal; col++) {
patternRow.add(((patternIndex + row + col) % 4 == 0));
}
pattern.add(patternRow);
......
......@@ -3,7 +3,7 @@ description: A suguru game application.
publish_to: "none"
version: 0.0.5+5
version: 0.0.6+6
environment:
sdk: "^3.0.0"
......