From 25838572ab91f5dbe53089e53c9dbf6bb5647d1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr> Date: Thu, 31 Oct 2024 10:06:35 +0100 Subject: [PATCH] Improve manage snake size --- .../metadata/android/en-US/changelogs/21.txt | 1 + .../metadata/android/fr-FR/changelogs/21.txt | 1 + lib/cubit/activity/activity_cubit.dart | 9 +++-- lib/models/activity/activity.dart | 11 ++++-- lib/models/activity/snake.dart | 9 +++-- lib/ui/game/game_top.dart | 34 ++++++++++++------- lib/ui/widgets/game/controller_bar.dart | 21 ++++++++---- pubspec.yaml | 2 +- 8 files changed, 61 insertions(+), 27 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/21.txt create mode 100644 fastlane/metadata/android/fr-FR/changelogs/21.txt diff --git a/fastlane/metadata/android/en-US/changelogs/21.txt b/fastlane/metadata/android/en-US/changelogs/21.txt new file mode 100644 index 0000000..8d16f79 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/21.txt @@ -0,0 +1 @@ +Improve snake length management. diff --git a/fastlane/metadata/android/fr-FR/changelogs/21.txt b/fastlane/metadata/android/fr-FR/changelogs/21.txt new file mode 100644 index 0000000..969352b --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/21.txt @@ -0,0 +1 @@ +Amélioration de la gestion de la longueur du serpent. diff --git a/lib/cubit/activity/activity_cubit.dart b/lib/cubit/activity/activity_cubit.dart index 3868df3..b9e3cd4 100644 --- a/lib/cubit/activity/activity_cubit.dart +++ b/lib/cubit/activity/activity_cubit.dart @@ -107,8 +107,13 @@ class ActivityCubit extends HydratedCubit<ActivityState> { refresh(); } - void moveSnake([bool enlarge = false]) { - state.currentActivity.moveSnake(enlarge); + void moveSnake() { + state.currentActivity.moveSnake(); + refresh(); + } + + void updateSnakeSize(int delta) { + state.currentActivity.updateSnakeSize(delta); refresh(); } diff --git a/lib/models/activity/activity.dart b/lib/models/activity/activity.dart index 31b9cce..51260bd 100644 --- a/lib/models/activity/activity.dart +++ b/lib/models/activity/activity.dart @@ -168,7 +168,14 @@ class Activity { return true; } - void moveSnake([bool enlarge = false]) { + void updateSnakeSize(int delta) { + snake.size += delta; + if (snake.size < 3) { + snake.size = 3; + } + } + + void moveSnake() { if (!canMove()) { printlog('boom'); isFinished = true; @@ -182,7 +189,7 @@ class Activity { snake.cells.add(head); // Drop tail - if (!enlarge) { + while (snake.cells.length > snake.size) { snake.cells.removeAt(0); } diff --git a/lib/models/activity/snake.dart b/lib/models/activity/snake.dart index 169be63..b901d06 100644 --- a/lib/models/activity/snake.dart +++ b/lib/models/activity/snake.dart @@ -8,15 +8,18 @@ enum SnakeDirection { top, left, bottom, right } class Snake { // Snake's cells: last in list is head SnakeCells cells; + int size; SnakeDirection direction; Snake({ required this.cells, + required this.size, required this.direction, }); factory Snake.create(ActivitySettings activitySettings) { - // Default init snake size: 3 + // Default init snake size + const int initialLength = 3; // ~ center cell: final int middleColumn = activitySettings.boardSize ~/ 2; @@ -24,12 +27,11 @@ class Snake { SnakeCells cells = [ CellLocation.go(middleRow, middleColumn), - CellLocation.go(middleRow, middleColumn), - CellLocation.go(middleRow, middleColumn), ]; return Snake( cells: cells, + size: initialLength, direction: SnakeDirection.right, ); } @@ -44,6 +46,7 @@ class Snake { Map<String, dynamic>? toJson() { return <String, dynamic>{ 'cells': cells, + 'size': size, 'direction': direction.toString(), }; } diff --git a/lib/ui/game/game_top.dart b/lib/ui/game/game_top.dart index abd99b8..19fa80e 100644 --- a/lib/ui/game/game_top.dart +++ b/lib/ui/game/game_top.dart @@ -1,27 +1,37 @@ import 'package:flutter/material.dart'; +import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; + +import 'package:snake/cubit/activity/activity_cubit.dart'; +import 'package:snake/models/activity/activity.dart'; class GameTopWidget extends StatelessWidget { const GameTopWidget({super.key}); @override Widget build(BuildContext context) { - return Table( - children: const [ - TableRow( + return BlocBuilder<ActivityCubit, ActivityState>( + builder: (BuildContext context, ActivityState activityState) { + final Activity currentActivity = activityState.currentActivity; + + return Table( children: [ - Column( - children: [ - Text('xxx'), - ], - ), - Column( + TableRow( children: [ - Text('xxx'), + Column( + children: [ + Text('size: ${currentActivity.snake.size}'), + ], + ), + Column( + children: [ + Text('xxx'), + ], + ), ], ), ], - ), - ], + ); + }, ); } } diff --git a/lib/ui/widgets/game/controller_bar.dart b/lib/ui/widgets/game/controller_bar.dart index 640d61a..d07a7c4 100644 --- a/lib/ui/widgets/game/controller_bar.dart +++ b/lib/ui/widgets/game/controller_bar.dart @@ -14,26 +14,33 @@ class ControllerBar extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ - StyledButton( + StyledButton.text( + caption: '<', color: Colors.orange, onPressed: () { BlocProvider.of<ActivityCubit>(context).turnLeft(); }, - child: Text('<'), ), - StyledButton( + StyledButton.text( + caption: '-', + color: Colors.green, + onPressed: () { + BlocProvider.of<ActivityCubit>(context).updateSnakeSize(-1); + }, + ), + StyledButton.text( + caption: '+', color: Colors.red, onPressed: () { - BlocProvider.of<ActivityCubit>(context).moveSnake(true); + BlocProvider.of<ActivityCubit>(context).updateSnakeSize(1); }, - child: Text('+'), ), - StyledButton( + StyledButton.text( + caption: '>', color: Colors.orange, onPressed: () { BlocProvider.of<ActivityCubit>(context).turnRight(); }, - child: Text('>'), ), ], ); diff --git a/pubspec.yaml b/pubspec.yaml index 47427eb..06d5e35 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: snake game publish_to: "none" -version: 0.5.0+20 +version: 0.5.1+21 environment: sdk: "^3.0.0" -- GitLab