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