From 09adc10a76c8ba989986f7a0d524e7d87f684fe6 Mon Sep 17 00:00:00 2001 From: "arthur.valin" Date: Mon, 13 Mar 2023 09:58:24 +0100 Subject: [PATCH 1/7] Starting implementation of the bowling game algorithm --- .../bowlin_project/lib/config/app_router.dart | 7 ++ .../lib/model/AbstractRound.dart | 74 +++++++++++++++++++ .../bowlin_project/lib/model/GameDetail.dart | 4 +- .../bowlin_project/lib/model/GamePlayer.dart | 30 ++++++++ .../bowlin_project/lib/model/IManager.dart | 9 +++ .../bowlin_project/lib/model/LastRound.dart | 48 ++++++++++++ Sources/bowlin_project/lib/model/Round.dart | 62 +++++++++------- .../lib/model/StubManager/StubData.dart | 52 ++++++------- Sources/bowlin_project/pubspec.lock | 3 +- 9 files changed, 232 insertions(+), 57 deletions(-) create mode 100644 Sources/bowlin_project/lib/model/AbstractRound.dart create mode 100644 Sources/bowlin_project/lib/model/GamePlayer.dart create mode 100644 Sources/bowlin_project/lib/model/LastRound.dart diff --git a/Sources/bowlin_project/lib/config/app_router.dart b/Sources/bowlin_project/lib/config/app_router.dart index a443419..08f332e 100644 --- a/Sources/bowlin_project/lib/config/app_router.dart +++ b/Sources/bowlin_project/lib/config/app_router.dart @@ -1,3 +1,4 @@ +import 'package:bowl_in/widgets/button_new_party.dart'; import 'package:flutter/cupertino.dart'; import 'package:go_router/go_router.dart'; @@ -40,6 +41,12 @@ final GoRouter router = GoRouter( return InGameScreen(); }, ), + GoRoute( + path: 'scoreboard', + builder: (BuildContext context, GoRouterState state) { + return FinalScoreBoard(); + }, + ), ], ), ], diff --git a/Sources/bowlin_project/lib/model/AbstractRound.dart b/Sources/bowlin_project/lib/model/AbstractRound.dart new file mode 100644 index 0000000..f91756c --- /dev/null +++ b/Sources/bowlin_project/lib/model/AbstractRound.dart @@ -0,0 +1,74 @@ +import 'Player.dart'; + +abstract class AbstractRound { + int? _firstThrow; + int? _secondThrow; + int? _points; + Player _player; + + AbstractRound? _previousRound; + + // Constructor + AbstractRound(this._firstThrow, this._secondThrow, this._points, this._player); + + // Getters and setters + int? get firstThrow => _firstThrow; + + set firstThrow(int? value) { + _firstThrow = value; + } + + int? get secondThrow => _secondThrow; + + set secondThrow(int? value) { + _secondThrow = value; + } + + int? get points => _points; + + set points(int? value) { + _points = value; + } + + Player get player => _player; + + set player(Player value) { + _player = value; + } + + AbstractRound? get previousRound => _previousRound; + + set previousRound(AbstractRound? value) { + _previousRound = value; + } + + bool computeNext(int val); + void computePoints(); + + bool isStrike() { + return firstThrow==10; + } + + bool isSpare(){ + return firstThrow!=10 && (firstThrow ?? 0)+(secondThrow ?? 0)==10; + } + + bool isSpareOrStrike() { + return (firstThrow ?? 0)+(secondThrow ?? 0)==10; + } + + void subscribe(AbstractRound nextRound){ + nextRound.previousRound=this; + } + + void update(int val){ + points = (points ?? 0) + val; + previousRound?.update(val); + } + + void unsubscribe(){ + previousRound?.unsubscribe(); + previousRound=null; + } + +} diff --git a/Sources/bowlin_project/lib/model/GameDetail.dart b/Sources/bowlin_project/lib/model/GameDetail.dart index 41134e8..afee8e4 100644 --- a/Sources/bowlin_project/lib/model/GameDetail.dart +++ b/Sources/bowlin_project/lib/model/GameDetail.dart @@ -85,7 +85,7 @@ class GameDetail { if (player.id == id) { for (var element in rounds) { if (element.player == player) { - pointPlayer += element.points; + pointPlayer += element.points ?? 0; } } return pointPlayer; @@ -98,7 +98,7 @@ class GameDetail { Map rank = {}; for (var player in players) { - rank.addAll({player.id: this.getPointByPlayerId(player.id)}); + rank.addAll({player.id: getPointByPlayerId(player.id)}); } var sortedByKeyMap = Map.fromEntries( rank.entries.toList()..sort((e1, e2) => e2.value.compareTo(e1.value))); diff --git a/Sources/bowlin_project/lib/model/GamePlayer.dart b/Sources/bowlin_project/lib/model/GamePlayer.dart new file mode 100644 index 0000000..7ca30de --- /dev/null +++ b/Sources/bowlin_project/lib/model/GamePlayer.dart @@ -0,0 +1,30 @@ +import 'package:flutter/cupertino.dart'; + +import 'GameDetail.dart'; +import 'package:go_router/go_router.dart'; + +class GamePlayer{ + + final GameDetail game; + int currentRoundIndex = 0; + final BuildContext context; + + GamePlayer(this.game, this.context); + + void onNext(bool isRoundFinished){ + if(isRoundFinished){ + currentRoundIndex++; + } + if(currentRoundIndex>game.rounds.length){ + context.go("/scoreboard"); + }else{ + context.go("/in-game", extra: game.rounds[currentRoundIndex]); + } + } + + void onSpareOrStrike(){ + if(currentRoundIndex>=game.rounds.length-game.players.length){ + game.rounds[currentRoundIndex].subscribe(game.rounds[currentRoundIndex+game.players.length]); + } + } +} \ No newline at end of file diff --git a/Sources/bowlin_project/lib/model/IManager.dart b/Sources/bowlin_project/lib/model/IManager.dart index f30f996..0ef1191 100644 --- a/Sources/bowlin_project/lib/model/IManager.dart +++ b/Sources/bowlin_project/lib/model/IManager.dart @@ -1,3 +1,5 @@ +import 'package:bowl_in/model/GamePlayer.dart'; + import 'User.dart'; import 'Game.dart'; import 'IUserManager.dart'; @@ -7,6 +9,7 @@ import 'Game.dart'; abstract class IManager { late User _userCurrent; late Game _gameCurrent; + late GamePlayer _gamePlayer; late IUserManager _userMgr; late IGameManager _gameMgr; @@ -17,6 +20,12 @@ abstract class IManager { _userCurrent = user; } + GamePlayer get gamePlayer => _gamePlayer; + + set gamePlayer(GamePlayer value) { + _gamePlayer = value; + } + Game get gameCurrent => _gameCurrent; IUserManager get userMgr => _userMgr; IGameManager get gameMgr => _gameMgr; diff --git a/Sources/bowlin_project/lib/model/LastRound.dart b/Sources/bowlin_project/lib/model/LastRound.dart new file mode 100644 index 0000000..018aae7 --- /dev/null +++ b/Sources/bowlin_project/lib/model/LastRound.dart @@ -0,0 +1,48 @@ +import 'package:bowl_in/model/AbstractRound.dart'; + +import 'Player.dart'; + +class LastRound extends AbstractRound{ + int? _thirdThrow; + + LastRound(super.firstThrow, super.secondThrow, super.points, super.player, this._thirdThrow); + + int? get thirdThrow => _thirdThrow; + + set thirdThrow(int? value) { + _thirdThrow = value; + } + + @override + bool computeNext(int val) { + if(firstThrow==null){ + firstThrow=val; + if(previousRound?.isSpare() ?? false){ + previousRound?.update(val); + } + return false; + }else if(secondThrow!=null){ + secondThrow=val; + return false; + + }else if((firstThrow??0)+(secondThrow??0)>=10){ + thirdThrow=val; + return false; + + } + computePoints(); + return true; + } + + @override + void computePoints() { + points = (firstThrow??0)+(secondThrow??0)+(thirdThrow??0); + + if(previousRound?.isStrike()??false){ + update(points??0); + } + unsubscribe(); + } + + +} diff --git a/Sources/bowlin_project/lib/model/Round.dart b/Sources/bowlin_project/lib/model/Round.dart index 3e21c60..1ef4406 100644 --- a/Sources/bowlin_project/lib/model/Round.dart +++ b/Sources/bowlin_project/lib/model/Round.dart @@ -1,36 +1,42 @@ -import 'Player.dart'; - -class Round { - int _firstThrow; - int? _secondThrow; - int _points; - Player _player; - - // Constructor - Round(this._firstThrow, this._secondThrow, this._points, this._player); - - // Getters and setters - int get firstThrow => _firstThrow; - - set firstThrow(int value) { - _firstThrow = value; +import 'package:bowl_in/model/AbstractRound.dart'; +import 'GamePlayer.dart'; + +class Round extends AbstractRound{ + + GamePlayer gamePlayer; + + Round(super.firstThrow, super.secondThrow, super.points, super.player, this.gamePlayer); + + @override + bool computeNext(int val) { + if(firstThrow==null){ + firstThrow=val; + if(previousRound?.isSpare() ?? false){ + previousRound?.update(val); + unsubscribe(); + } + return false; //Le round n'est pas fini + }else if(firstThrow==10){ + secondThrow=val; + return false; //Le round n'est pas fini + } + computePoints(); + return true; //Le round est fini } - int? get secondThrow => _secondThrow; + @override + void computePoints() { + points = (firstThrow ?? 0)+(secondThrow ?? 0); - set secondThrow(int? value) { - _secondThrow = value; - } - - int get points => _points; + if(previousRound?.isStrike() ?? false){ + previousRound?.update(points ?? 0); + } - set points(int value) { - _points = value; + if(isSpareOrStrike()){ + gamePlayer.onSpareOrStrike(); + } + unsubscribe(); } - Player get player => _player; - set player(Player value) { - _player = value; - } } diff --git a/Sources/bowlin_project/lib/model/StubManager/StubData.dart b/Sources/bowlin_project/lib/model/StubManager/StubData.dart index f5c2c70..2029842 100644 --- a/Sources/bowlin_project/lib/model/StubManager/StubData.dart +++ b/Sources/bowlin_project/lib/model/StubManager/StubData.dart @@ -142,32 +142,32 @@ class StubData extends IManager { List _rounds = []; void _initRounds() { - rounds.add(Round(4, 5, 9, players[1])); - rounds.add(Round(4, 1, 5, players[8])); - rounds.add(Round(4, 5, 9, players[7])); - rounds.add(Round(4, 1, 5, players[1])); - rounds.add(Round(4, 5, 9, players[7])); - rounds.add(Round(1, 5, 6, players[8])); - rounds.add(Round(4, 1, 5, players[7])); - rounds.add(Round(1, 5, 6, players[8])); - rounds.add(Round(4, 5, 9, players[7])); - rounds.add(Round(9, 0, 9, players[8])); - rounds.add(Round(4, 5, 9, players[7])); - rounds.add(Round(4, 5, 9, players[8])); - rounds.add(Round(4, 2, 6, players[0])); - rounds.add(Round(3, 5, 8, players[1])); - rounds.add(Round(4, 5, 9, players[2])); - rounds.add(Round(4, 5, 9, players[4])); - rounds.add(Round(1, 5, 6, players[6])); - rounds.add(Round(4, 5, 9, players[8])); - rounds.add(Round(4, 2, 6, players[7])); - rounds.add(Round(3, 5, 8, players[8])); - rounds.add(Round(4, 5, 9, players[7])); - rounds.add(Round(4, 5, 9, players[8])); - rounds.add(Round(1, 5, 6, players[7])); - rounds.add(Round(4, 5, 9, players[8])); - rounds.add(Round(4, 5, 9, players[7])); - rounds.add(Round(4, 1, 5, players[8])); + rounds.add(Round(4, 5, 9, players[1], gamePlayer)); + rounds.add(Round(4, 1, 5, players[8], gamePlayer)); + rounds.add(Round(4, 5, 9, players[7], gamePlayer)); + rounds.add(Round(4, 1, 5, players[1], gamePlayer)); + rounds.add(Round(4, 5, 9, players[7], gamePlayer)); + rounds.add(Round(1, 5, 6, players[8], gamePlayer)); + rounds.add(Round(4, 1, 5, players[7], gamePlayer)); + rounds.add(Round(1, 5, 6, players[8], gamePlayer)); + rounds.add(Round(4, 5, 9, players[7], gamePlayer)); + rounds.add(Round(9, 0, 9, players[8], gamePlayer)); + rounds.add(Round(4, 5, 9, players[7], gamePlayer)); + rounds.add(Round(4, 5, 9, players[8], gamePlayer)); + rounds.add(Round(4, 2, 6, players[0], gamePlayer)); + rounds.add(Round(3, 5, 8, players[1], gamePlayer)); + rounds.add(Round(4, 5, 9, players[2], gamePlayer)); + rounds.add(Round(4, 5, 9, players[4], gamePlayer)); + rounds.add(Round(1, 5, 6, players[6], gamePlayer)); + rounds.add(Round(4, 5, 9, players[8], gamePlayer)); + rounds.add(Round(4, 2, 6, players[7], gamePlayer)); + rounds.add(Round(3, 5, 8, players[8], gamePlayer)); + rounds.add(Round(4, 5, 9, players[7], gamePlayer)); + rounds.add(Round(4, 5, 9, players[8], gamePlayer)); + rounds.add(Round(1, 5, 6, players[7], gamePlayer)); + rounds.add(Round(4, 5, 9, players[8], gamePlayer)); + rounds.add(Round(4, 5, 9, players[7], gamePlayer)); + rounds.add(Round(4, 1, 5, players[8], gamePlayer)); } List get rounds => _rounds; diff --git a/Sources/bowlin_project/pubspec.lock b/Sources/bowlin_project/pubspec.lock index 67e2bc8..ee6d354 100644 --- a/Sources/bowlin_project/pubspec.lock +++ b/Sources/bowlin_project/pubspec.lock @@ -196,7 +196,8 @@ packages: dependency: "direct main" description: name: intl - url: "https://pub.dartlang.org" + sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6 + url: "https://pub.dev" source: hosted version: "0.18.0" js: -- 2.36.3 From 25d036cc636b9a4a3ed34e6b7e7483f22283c3d6 Mon Sep 17 00:00:00 2001 From: "arthur.valin" Date: Mon, 13 Mar 2023 14:25:13 +0100 Subject: [PATCH 2/7] Starting implementation of the bowling game algorithm --- .../bowlin_project/lib/model/AbstractRound.dart | 4 ++-- Sources/bowlin_project/lib/model/GameDetail.dart | 16 +++++----------- Sources/bowlin_project/lib/model/LastRound.dart | 2 +- Sources/bowlin_project/lib/model/Round.dart | 4 ++-- .../lib/model/StubManager/StubData.dart | 10 ++++------ 5 files changed, 14 insertions(+), 22 deletions(-) diff --git a/Sources/bowlin_project/lib/model/AbstractRound.dart b/Sources/bowlin_project/lib/model/AbstractRound.dart index f91756c..1fb357c 100644 --- a/Sources/bowlin_project/lib/model/AbstractRound.dart +++ b/Sources/bowlin_project/lib/model/AbstractRound.dart @@ -66,8 +66,8 @@ abstract class AbstractRound { previousRound?.update(val); } - void unsubscribe(){ - previousRound?.unsubscribe(); + void unsubscribePreviousRound(){ + previousRound?.unsubscribePreviousRound(); previousRound=null; } diff --git a/Sources/bowlin_project/lib/model/GameDetail.dart b/Sources/bowlin_project/lib/model/GameDetail.dart index afee8e4..7676fda 100644 --- a/Sources/bowlin_project/lib/model/GameDetail.dart +++ b/Sources/bowlin_project/lib/model/GameDetail.dart @@ -1,3 +1,5 @@ +import 'package:bowl_in/model/AbstractRound.dart'; + import 'Player.dart'; import 'Round.dart'; @@ -7,9 +9,8 @@ class GameDetail { int _winner; int _nbPoints; bool _isFinished; - Round? _currentRound; int _host; - List _rounds = []; + List _rounds = []; List _players = []; // Constructor @@ -19,7 +20,6 @@ class GameDetail { this._winner, this._nbPoints, this._isFinished, - this._currentRound, this._host, this._rounds, this._players); @@ -55,21 +55,15 @@ class GameDetail { _isFinished = value; } - Round? get currentRound => _currentRound; - - set currentRound(Round? value) { - _currentRound = value; - } - int get host => _host; set host(int value) { _host = value; } - List get rounds => _rounds; + List get rounds => _rounds; - set rounds(List value) { + set rounds(List value) { _rounds = value; } diff --git a/Sources/bowlin_project/lib/model/LastRound.dart b/Sources/bowlin_project/lib/model/LastRound.dart index 018aae7..2500198 100644 --- a/Sources/bowlin_project/lib/model/LastRound.dart +++ b/Sources/bowlin_project/lib/model/LastRound.dart @@ -41,7 +41,7 @@ class LastRound extends AbstractRound{ if(previousRound?.isStrike()??false){ update(points??0); } - unsubscribe(); + unsubscribePreviousRound(); } diff --git a/Sources/bowlin_project/lib/model/Round.dart b/Sources/bowlin_project/lib/model/Round.dart index 1ef4406..529d4bf 100644 --- a/Sources/bowlin_project/lib/model/Round.dart +++ b/Sources/bowlin_project/lib/model/Round.dart @@ -13,7 +13,7 @@ class Round extends AbstractRound{ firstThrow=val; if(previousRound?.isSpare() ?? false){ previousRound?.update(val); - unsubscribe(); + unsubscribePreviousRound(); } return false; //Le round n'est pas fini }else if(firstThrow==10){ @@ -35,7 +35,7 @@ class Round extends AbstractRound{ if(isSpareOrStrike()){ gamePlayer.onSpareOrStrike(); } - unsubscribe(); + unsubscribePreviousRound(); } diff --git a/Sources/bowlin_project/lib/model/StubManager/StubData.dart b/Sources/bowlin_project/lib/model/StubManager/StubData.dart index 2029842..2e8db7e 100644 --- a/Sources/bowlin_project/lib/model/StubManager/StubData.dart +++ b/Sources/bowlin_project/lib/model/StubManager/StubData.dart @@ -128,13 +128,11 @@ class StubData extends IManager { List _gameDetails = []; void _initGameDetails() { - gameDetails.add(GameDetail(1, DateTime.now(), players[7].id, 123, true, - null, players[7].id, rounds, [players[0], players[1]])); - gameDetails.add(GameDetail(2, DateTime.now(), players[0].id, 113, true, - null, players[7].id, rounds, [players[0], players[1], players[7]])); - gameDetails.add(GameDetail(3, DateTime.now(), players[7].id, 93, true, null, + gameDetails.add(GameDetail(1, DateTime.now(), players[7].id, 123, true, players[7].id, rounds, [players[0], players[1]])); + gameDetails.add(GameDetail(2, DateTime.now(), players[0].id, 113, true, players[7].id, rounds, [players[0], players[1], players[7]])); + gameDetails.add(GameDetail(3, DateTime.now(), players[7].id, 93, true, players[7].id, [], [players[0], players[7]])); - gameDetails.add(GameDetail(4, DateTime.now(), players[7].id, 93, true, null, + gameDetails.add(GameDetail(4, DateTime.now(), players[7].id, 93, true, players[7].id, [], [players[1], players[7]])); } -- 2.36.3 From a2257a8711feb68c1749ed1b1713a02d59fde740 Mon Sep 17 00:00:00 2001 From: Lucas Delanier Date: Thu, 16 Mar 2023 20:48:47 +0100 Subject: [PATCH 3/7] change screen call with parameter to reconize witch screen to display --- .../lib/views/ingame_screen2.dart | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 Sources/bowlin_project/lib/views/ingame_screen2.dart diff --git a/Sources/bowlin_project/lib/views/ingame_screen2.dart b/Sources/bowlin_project/lib/views/ingame_screen2.dart new file mode 100644 index 0000000..c94fb45 --- /dev/null +++ b/Sources/bowlin_project/lib/views/ingame_screen2.dart @@ -0,0 +1,91 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +import '../model/Round.dart'; +import '../widgets/button_new_party.dart'; +import '../widgets/ingame_widgets.dart'; +import '../widgets/scores_list_widget.dart'; + +class InGameScreen extends StatefulWidget { + final Round currentRound; + const InGameScreen({Key? key, required this.currentRound}) : super(key: key); + + @override + State createState() => _InGameScreenState(); +} + +class _InGameScreenState extends State { + late Widget widgetHolder; + + void initState() { + if (widget.currentRound.firstThrow == null) + widgetHolder = InGameCardThrow(numberThrow: 1); + else if (widget.currentRound.secondThrow == null) { + widgetHolder = InGameCardThrow(numberThrow: 2); + } else { + widgetHolder = InGameCardThrow(numberThrow: 3); + } + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Container( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height, + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xff19BDE0), + Color(0xff4A17DC), + ], + )), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + height: 120, + ), + widgetHolder, + Spacer(), + ElevatedButton( + onPressed: () { + setState(() { + widgetHolder = InGameCardThrow( + numberThrow: 2, + ); + }); + }, + child: Text( + "PLAY", + style: GoogleFonts.roboto( + fontWeight: FontWeight.bold, + fontSize: 40, + color: Color(0xff1ABAE0)), + ), + style: ElevatedButton.styleFrom( + side: BorderSide( + width: 7, + color: Color(0xff1ABAE0), + ), + onPrimary: Colors.transparent, + primary: Colors.transparent, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(55), + ), + minimumSize: Size(200, 80), + ), + ), + Spacer(), + ], + ) + ], + ); + } +} -- 2.36.3 From 86d6f5afb553313c593981a372bc2008384edfca Mon Sep 17 00:00:00 2001 From: "arthur.valin" Date: Sat, 18 Mar 2023 13:25:52 +0100 Subject: [PATCH 4/7] Implementing bowling game algorithm --- .../bowlin_project/lib/config/app_router.dart | 6 + .../lib/model/AbstractRound.dart | 12 +- .../bowlin_project/lib/model/GameDetail.dart | 24 +- .../bowlin_project/lib/model/GamePlayer.dart | 29 +- .../bowlin_project/lib/model/IManager.dart | 12 +- .../bowlin_project/lib/model/LastRound.dart | 20 +- Sources/bowlin_project/lib/model/Round.dart | 20 +- .../lib/model/StubManager/StubData.dart | 167 ++++-- .../lib/views/ingame_screen.dart | 15 +- .../lib/views/ingame_screen2.dart | 47 +- .../lib/widgets/ingame_widgets.dart | 31 +- Sources/bowlin_project/test/model_test.dart | 552 +++++++++--------- 12 files changed, 548 insertions(+), 387 deletions(-) diff --git a/Sources/bowlin_project/lib/config/app_router.dart b/Sources/bowlin_project/lib/config/app_router.dart index 08f332e..7a8e49b 100644 --- a/Sources/bowlin_project/lib/config/app_router.dart +++ b/Sources/bowlin_project/lib/config/app_router.dart @@ -1,3 +1,6 @@ +import 'package:bowl_in/model/AbstractRound.dart'; +import 'package:bowl_in/model/Round.dart'; +import 'package:bowl_in/views/ingame_screen2.dart'; import 'package:bowl_in/widgets/button_new_party.dart'; import 'package:flutter/cupertino.dart'; import 'package:go_router/go_router.dart'; @@ -38,6 +41,9 @@ final GoRouter router = GoRouter( GoRoute( path: 'in-game', builder: (BuildContext context, GoRouterState state) { + if(state.extra is AbstractRound) { + return InGameScreen2(currentRound: state.extra as AbstractRound); + } return InGameScreen(); }, ), diff --git a/Sources/bowlin_project/lib/model/AbstractRound.dart b/Sources/bowlin_project/lib/model/AbstractRound.dart index 1fb357c..e21073c 100644 --- a/Sources/bowlin_project/lib/model/AbstractRound.dart +++ b/Sources/bowlin_project/lib/model/AbstractRound.dart @@ -4,12 +4,13 @@ abstract class AbstractRound { int? _firstThrow; int? _secondThrow; int? _points; + int _number; Player _player; AbstractRound? _previousRound; // Constructor - AbstractRound(this._firstThrow, this._secondThrow, this._points, this._player); + AbstractRound(this._firstThrow, this._secondThrow, this._points, this._player, this._number); // Getters and setters int? get firstThrow => _firstThrow; @@ -30,6 +31,13 @@ abstract class AbstractRound { _points = value; } + + int get number => _number; + + set number(int value) { + _number = value; + } + Player get player => _player; set player(Player value) { @@ -44,6 +52,7 @@ abstract class AbstractRound { bool computeNext(int val); void computePoints(); + bool shotIsStrike(); bool isStrike() { return firstThrow==10; @@ -57,6 +66,7 @@ abstract class AbstractRound { return (firstThrow ?? 0)+(secondThrow ?? 0)==10; } + void subscribe(AbstractRound nextRound){ nextRound.previousRound=this; } diff --git a/Sources/bowlin_project/lib/model/GameDetail.dart b/Sources/bowlin_project/lib/model/GameDetail.dart index 7676fda..c5b5f14 100644 --- a/Sources/bowlin_project/lib/model/GameDetail.dart +++ b/Sources/bowlin_project/lib/model/GameDetail.dart @@ -1,4 +1,7 @@ import 'package:bowl_in/model/AbstractRound.dart'; +import 'package:bowl_in/model/Game.dart'; +import 'package:bowl_in/model/GamePlayer.dart'; +import 'package:bowl_in/model/LastRound.dart'; import 'Player.dart'; import 'Round.dart'; @@ -6,7 +9,7 @@ import 'Round.dart'; class GameDetail { int _id; DateTime _time; - int _winner; + int? _winner; int _nbPoints; bool _isFinished; int _host; @@ -21,8 +24,19 @@ class GameDetail { this._nbPoints, this._isFinished, this._host, - this._rounds, - this._players); + this._players){ + + for(int i=1; i<=9; i++){ + players.forEach((element) { + this.rounds.add(Round(null, null, 0, element, i)); + }); + } + + players.forEach((element) { + this.rounds.add(LastRound(null, null, 0, element, 10, null)); + }); + + } // Getters and setters int get id => _id; @@ -37,9 +51,9 @@ class GameDetail { _time = value; } - int get winner => _winner; + int? get winner => _winner; - set winner(int value) { + set winner(int? value) { _winner = value; } diff --git a/Sources/bowlin_project/lib/model/GamePlayer.dart b/Sources/bowlin_project/lib/model/GamePlayer.dart index 7ca30de..826440e 100644 --- a/Sources/bowlin_project/lib/model/GamePlayer.dart +++ b/Sources/bowlin_project/lib/model/GamePlayer.dart @@ -3,27 +3,42 @@ import 'package:flutter/cupertino.dart'; import 'GameDetail.dart'; import 'package:go_router/go_router.dart'; +import 'Round.dart'; + class GamePlayer{ - final GameDetail game; + late GameDetail _game; int currentRoundIndex = 0; - final BuildContext context; - GamePlayer(this.game, this.context); + GameDetail get game => _game; + + set game(GameDetail value) { + currentRoundIndex = 0; + _game = value; + } - void onNext(bool isRoundFinished){ + void onNext(bool isRoundFinished, BuildContext context){ if(isRoundFinished){ + print("++"); currentRoundIndex++; } - if(currentRoundIndex>game.rounds.length){ + if(currentRoundIndex>=game.rounds.length){ + print("FINISHED"); context.go("/scoreboard"); }else{ - context.go("/in-game", extra: game.rounds[currentRoundIndex]); + print("IN GAME : " + currentRoundIndex.toString()); + if(game.rounds[currentRoundIndex] is Round){ + print("ROUND"); + }else{ + print("LAST ROUND"); + } + context.pushReplacement("/in-game", extra: game.rounds[currentRoundIndex]); } } void onSpareOrStrike(){ - if(currentRoundIndex>=game.rounds.length-game.players.length){ + if(currentRoundIndex _gameCurrent; + GameDetail get gameCurrent => _gameCurrent; + + set gameCurrent(GameDetail value) { + _gameCurrent = value; + } + IUserManager get userMgr => _userMgr; IGameManager get gameMgr => _gameMgr; } diff --git a/Sources/bowlin_project/lib/model/LastRound.dart b/Sources/bowlin_project/lib/model/LastRound.dart index 2500198..9b50ec4 100644 --- a/Sources/bowlin_project/lib/model/LastRound.dart +++ b/Sources/bowlin_project/lib/model/LastRound.dart @@ -5,7 +5,7 @@ import 'Player.dart'; class LastRound extends AbstractRound{ int? _thirdThrow; - LastRound(super.firstThrow, super.secondThrow, super.points, super.player, this._thirdThrow); + LastRound(super.firstThrow, super.secondThrow, super.points, super.player, super.number, this._thirdThrow); int? get thirdThrow => _thirdThrow; @@ -21,14 +21,11 @@ class LastRound extends AbstractRound{ previousRound?.update(val); } return false; - }else if(secondThrow!=null){ + }else if(secondThrow==null){ secondThrow=val; - return false; - + return ((firstThrow??0)+(secondThrow??0)<10); }else if((firstThrow??0)+(secondThrow??0)>=10){ thirdThrow=val; - return false; - } computePoints(); return true; @@ -44,5 +41,14 @@ class LastRound extends AbstractRound{ unsubscribePreviousRound(); } - + @override + bool shotIsStrike(){ + if(firstThrow==null){ + return true; + }else if(secondThrow==null){ + return firstThrow==10; + }else{ + return secondThrow==10; + } + } } diff --git a/Sources/bowlin_project/lib/model/Round.dart b/Sources/bowlin_project/lib/model/Round.dart index 529d4bf..5959532 100644 --- a/Sources/bowlin_project/lib/model/Round.dart +++ b/Sources/bowlin_project/lib/model/Round.dart @@ -3,9 +3,7 @@ import 'GamePlayer.dart'; class Round extends AbstractRound{ - GamePlayer gamePlayer; - - Round(super.firstThrow, super.secondThrow, super.points, super.player, this.gamePlayer); + Round(super.firstThrow, super.secondThrow, super.points, super.player, super.number); @override bool computeNext(int val) { @@ -15,13 +13,12 @@ class Round extends AbstractRound{ previousRound?.update(val); unsubscribePreviousRound(); } - return false; //Le round n'est pas fini - }else if(firstThrow==10){ + return val==10; + }else if(firstThrow!=10 && secondThrow!=null){ secondThrow=val; - return false; //Le round n'est pas fini } computePoints(); - return true; //Le round est fini + return true; } @override @@ -31,12 +28,13 @@ class Round extends AbstractRound{ if(previousRound?.isStrike() ?? false){ previousRound?.update(points ?? 0); } - - if(isSpareOrStrike()){ - gamePlayer.onSpareOrStrike(); - } unsubscribePreviousRound(); } + @override + bool shotIsStrike(){ + return firstThrow==null; + } + } diff --git a/Sources/bowlin_project/lib/model/StubManager/StubData.dart b/Sources/bowlin_project/lib/model/StubManager/StubData.dart index 2e8db7e..5727214 100644 --- a/Sources/bowlin_project/lib/model/StubManager/StubData.dart +++ b/Sources/bowlin_project/lib/model/StubManager/StubData.dart @@ -24,7 +24,7 @@ class StubData extends IManager { _initGameDetails(); _initGame(); userCurrent = players[8] as User; - userCurrent.games = games; + userCurrent.games = []; } IUserManager get userMgr => _userMgr; @@ -50,7 +50,16 @@ class StubData extends IManager { Achievement("Win a game") ], [], - Stat(10, 2, 12, 130, 7, 6, 700, 58.33, 30.2)), + Stat( + 10, + 2, + 12, + 130, + 7, + 6, + 700, + 58.33, + 30.2)), User( 9, "Dave", @@ -73,7 +82,16 @@ class StubData extends IManager { Achievement("Win a game") ], [], - Stat(10, 2, 12, 110, 7, 6, 700, 58.33, 30.2)), + Stat( + 10, + 2, + 12, + 110, + 7, + 6, + 700, + 58.33, + 30.2)), User( 22, "Louison", @@ -85,7 +103,16 @@ class StubData extends IManager { Achievement("Win a game") ], [], - Stat(10, 2, 12, 150, 7, 6, 700, 58.33, 30.2)), + Stat( + 10, + 2, + 12, + 150, + 7, + 6, + 700, + 58.33, + 30.2)), User( 23, "Owen", @@ -97,7 +124,16 @@ class StubData extends IManager { Achievement("Win a game") ], [], - Stat(10, 2, 12, 10, 7, 6, 700, 58.33, 30.2)), + Stat( + 10, + 2, + 12, + 10, + 7, + 6, + 700, + 58.33, + 30.2)), User( 24, "LULU", @@ -109,7 +145,16 @@ class StubData extends IManager { Achievement("Win a game") ], [], - Stat(10, 2, 12, 40, 7, 6, 700, 58.33, 30.2)), + Stat( + 10, + 2, + 12, + 40, + 7, + 6, + 700, + 58.33, + 30.2)), User( 25, "Raphael", @@ -121,66 +166,88 @@ class StubData extends IManager { Achievement("Win a game") ], [], - Stat(10, 2, 12, 76, 7, 6, 700, 58.33, 30.2)), + Stat( + 10, + 2, + 12, + 76, + 7, + 6, + 700, + 58.33, + 30.2)), ], - Stat(2, 7, 9, 80, 4, 3, 250, 27.77, 10.55)) + Stat( + 2, + 7, + 9, + 80, + 4, + 3, + 250, + 27.77, + 10.55)) ]; List _gameDetails = []; + void _initGameDetails() { - gameDetails.add(GameDetail(1, DateTime.now(), players[7].id, 123, true, players[7].id, rounds, [players[0], players[1]])); - gameDetails.add(GameDetail(2, DateTime.now(), players[0].id, 113, true, players[7].id, rounds, [players[0], players[1], players[7]])); - gameDetails.add(GameDetail(3, DateTime.now(), players[7].id, 93, true, - players[7].id, [], [players[0], players[7]])); - gameDetails.add(GameDetail(4, DateTime.now(), players[7].id, 93, true, - players[7].id, [], [players[1], players[7]])); + // gameDetails.add(GameDetail(1, DateTime.now(), players[7].id, 123, true, players[7].id, rounds, [players[0], players[1]])); + // gameDetails.add(GameDetail(2, DateTime.now(), players[0].id, 113, true, players[7].id, rounds, [players[0], players[1], players[7]])); + // gameDetails.add(GameDetail(3, DateTime.now(), players[7].id, 93, true, + // players[7].id, [], [players[0], players[7]])); + // gameDetails.add(GameDetail(4, DateTime.now(), players[7].id, 93, true, + // players[7].id, [], [players[1], players[7]])); } List get gameDetails => _gameDetails; List _rounds = []; + void _initRounds() { - rounds.add(Round(4, 5, 9, players[1], gamePlayer)); - rounds.add(Round(4, 1, 5, players[8], gamePlayer)); - rounds.add(Round(4, 5, 9, players[7], gamePlayer)); - rounds.add(Round(4, 1, 5, players[1], gamePlayer)); - rounds.add(Round(4, 5, 9, players[7], gamePlayer)); - rounds.add(Round(1, 5, 6, players[8], gamePlayer)); - rounds.add(Round(4, 1, 5, players[7], gamePlayer)); - rounds.add(Round(1, 5, 6, players[8], gamePlayer)); - rounds.add(Round(4, 5, 9, players[7], gamePlayer)); - rounds.add(Round(9, 0, 9, players[8], gamePlayer)); - rounds.add(Round(4, 5, 9, players[7], gamePlayer)); - rounds.add(Round(4, 5, 9, players[8], gamePlayer)); - rounds.add(Round(4, 2, 6, players[0], gamePlayer)); - rounds.add(Round(3, 5, 8, players[1], gamePlayer)); - rounds.add(Round(4, 5, 9, players[2], gamePlayer)); - rounds.add(Round(4, 5, 9, players[4], gamePlayer)); - rounds.add(Round(1, 5, 6, players[6], gamePlayer)); - rounds.add(Round(4, 5, 9, players[8], gamePlayer)); - rounds.add(Round(4, 2, 6, players[7], gamePlayer)); - rounds.add(Round(3, 5, 8, players[8], gamePlayer)); - rounds.add(Round(4, 5, 9, players[7], gamePlayer)); - rounds.add(Round(4, 5, 9, players[8], gamePlayer)); - rounds.add(Round(1, 5, 6, players[7], gamePlayer)); - rounds.add(Round(4, 5, 9, players[8], gamePlayer)); - rounds.add(Round(4, 5, 9, players[7], gamePlayer)); - rounds.add(Round(4, 1, 5, players[8], gamePlayer)); + rounds.add(Round(4, 5, 9, players[1], 1)); + rounds.add(Round(4, 1, 5, players[8], 1)); + rounds.add(Round(4, 5, 9, players[7], 1)); + rounds.add(Round(4, 1, 5, players[1], 1)); + rounds.add(Round(4, 5, 9, players[7], 1)); + rounds.add(Round(1, 5, 6, players[8], 1)); + rounds.add(Round(4, 1, 5, players[7], 1)); + rounds.add(Round(1, 5, 6, players[8], 1)); + rounds.add(Round(4, 5, 9, players[7], 1)); + rounds.add(Round(9, 0, 9, players[8], 1)); + rounds.add(Round(4, 5, 9, players[7], 1)); + rounds.add(Round(4, 5, 9, players[8], 1)); + rounds.add(Round(4, 2, 6, players[0], 1)); + rounds.add(Round(3, 5, 8, players[1], 1)); + rounds.add(Round(4, 5, 9, players[2], 1)); + rounds.add(Round(4, 5, 9, players[4], 1)); + rounds.add(Round(1, 5, 6, players[6], 1)); + rounds.add(Round(4, 5, 9, players[8], 1)); + rounds.add(Round(4, 2, 6, players[7], 1)); + rounds.add(Round(3, 5, 8, players[8], 1)); + rounds.add(Round(4, 5, 9, players[7], 1)); + rounds.add(Round(4, 5, 9, players[8], 1)); + rounds.add(Round(1, 5, 6, players[7], 1)); + rounds.add(Round(4, 5, 9, players[8], 1)); + rounds.add(Round(4, 5, 9, players[7], 1)); + rounds.add(Round(4, 1, 5, players[8], 1)); } List get rounds => _rounds; List _games = []; + void _initGame() { - games.add(Game( - gameDetails[0].id, - DateTime.now().subtract(Duration(days: 14)), - 123, - true, - [players[0].id, players[1].id])); - games.add(Game(gameDetails[1].id, DateTime.now(), 101, true, - [players[1].id, players[0].id])); + // games.add(Game( + // gameDetails[0].id, + // DateTime.now().subtract(Duration(days: 14)), + // 123, + // true, + // [players[0].id, players[1].id])); + // games.add(Game(gameDetails[1].id, DateTime.now(), 101, true, + // [players[1].id, players[0].id])); + // } + // + // List get games => _games; } - - List get games => _games; } diff --git a/Sources/bowlin_project/lib/views/ingame_screen.dart b/Sources/bowlin_project/lib/views/ingame_screen.dart index 80a7e2c..68558a4 100644 --- a/Sources/bowlin_project/lib/views/ingame_screen.dart +++ b/Sources/bowlin_project/lib/views/ingame_screen.dart @@ -1,5 +1,9 @@ +import 'package:bowl_in/main.dart'; +import 'package:bowl_in/model/GameDetail.dart'; +import 'package:bowl_in/model/GamePlayer.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import '../widgets/button_new_party.dart'; @@ -48,11 +52,12 @@ class _InGameScreenState extends State { Spacer(), ElevatedButton( onPressed: () { - setState(() { - widgetHolder = InGameCardThrow( - numberThrow: 2, - ); - }); + GameDetail gd = GameDetail(1, DateTime.now(), null, 123, false, + MyApp.controller.userCurrent.id, [MyApp.controller.userCurrent, MyApp.controller.userMgr.getUserById(2)]); + + MyApp.controller.gamePlayer.game = gd; + MyApp.controller.gameCurrent = gd; + MyApp.controller.gamePlayer.onNext(false, context); }, child: Text( "PLAY", diff --git a/Sources/bowlin_project/lib/views/ingame_screen2.dart b/Sources/bowlin_project/lib/views/ingame_screen2.dart index c94fb45..f84ca59 100644 --- a/Sources/bowlin_project/lib/views/ingame_screen2.dart +++ b/Sources/bowlin_project/lib/views/ingame_screen2.dart @@ -1,3 +1,5 @@ +import 'package:bowl_in/main.dart'; +import 'package:bowl_in/model/AbstractRound.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; @@ -7,30 +9,42 @@ import '../widgets/button_new_party.dart'; import '../widgets/ingame_widgets.dart'; import '../widgets/scores_list_widget.dart'; -class InGameScreen extends StatefulWidget { - final Round currentRound; - const InGameScreen({Key? key, required this.currentRound}) : super(key: key); +class InGameScreen2 extends StatefulWidget { + final AbstractRound currentRound; + const InGameScreen2({Key? key, required this.currentRound}) : super(key: key); @override - State createState() => _InGameScreenState(); + State createState() => _InGameScreen2State(); } -class _InGameScreenState extends State { - late Widget widgetHolder; +class _InGameScreen2State extends State { + late InGameCardThrow widgetHolder; + int selectedValue = 0; + void setSelectedValue(int val){ + selectedValue=val; + } + void initState() { + if (widget.currentRound.firstThrow == null) - widgetHolder = InGameCardThrow(numberThrow: 1); + widgetHolder = InGameCardThrow(numberThrow: 1, currentRound: + widget.currentRound, setSelectedValue: setSelectedValue); else if (widget.currentRound.secondThrow == null) { - widgetHolder = InGameCardThrow(numberThrow: 2); + widgetHolder = InGameCardThrow(numberThrow: 2 + , currentRound: + widget.currentRound, setSelectedValue: setSelectedValue); } else { - widgetHolder = InGameCardThrow(numberThrow: 3); + widgetHolder = InGameCardThrow(numberThrow: 3, currentRound: + widget.currentRound, setSelectedValue: setSelectedValue); } + super.initState(); } @override Widget build(BuildContext context) { + return Stack( children: [ Container( @@ -56,11 +70,15 @@ class _InGameScreenState extends State { Spacer(), ElevatedButton( onPressed: () { - setState(() { - widgetHolder = InGameCardThrow( - numberThrow: 2, - ); - }); + bool isFinished = widget.currentRound.computeNext( + selectedValue + ); + + if(widget.currentRound.isSpareOrStrike()){ + MyApp.controller.gamePlayer.onSpareOrStrike(); + } + + MyApp.controller.gamePlayer.onNext(isFinished, context); }, child: Text( "PLAY", @@ -81,6 +99,7 @@ class _InGameScreenState extends State { ), minimumSize: Size(200, 80), ), + ), Spacer(), ], diff --git a/Sources/bowlin_project/lib/widgets/ingame_widgets.dart b/Sources/bowlin_project/lib/widgets/ingame_widgets.dart index fb1dd3e..4101af1 100644 --- a/Sources/bowlin_project/lib/widgets/ingame_widgets.dart +++ b/Sources/bowlin_project/lib/widgets/ingame_widgets.dart @@ -6,6 +6,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; +import '../model/AbstractRound.dart'; + class FinalScoreBoard extends StatefulWidget { const FinalScoreBoard({Key? key}) : super(key: key); @@ -346,14 +348,17 @@ class _UserInGameState extends State { class InGameCardThrow extends StatefulWidget { final int numberThrow; - const InGameCardThrow({Key? key, required this.numberThrow}) - : super(key: key); + final AbstractRound currentRound; + final Function(int) setSelectedValue; + const InGameCardThrow({Key? key, required this.numberThrow, required this.currentRound, required this.setSelectedValue}): super(key: key); @override State createState() => _InGameCardThrowState(); } class _InGameCardThrowState extends State { + GlobalKey<_NumberPadState> _numberPadKey = GlobalKey(); + @override Widget build(BuildContext context) { return Container( @@ -388,7 +393,9 @@ class _InGameCardThrowState extends State { fontWeight: FontWeight.w400, decoration: TextDecoration.none)), TextSpan( - text: '1 - 1st', + text: widget.currentRound.number.toString() + " - " + + widget.numberThrow.toString()+ + (widget.numberThrow==1 ? "st" : widget.numberThrow==2? "nd" : "rd"),//'1 - 1st', style: GoogleFonts.roboto( fontSize: 18, color: CupertinoColors.black, @@ -410,12 +417,14 @@ class _InGameCardThrowState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Round_picture( - pseudo: "Lucas", - image: "assets/images/image_user_red.png"), + pseudo: widget.currentRound.player.name, + image: widget.currentRound.player.image), ], )), NumberPad( numberThrow: widget.numberThrow, + setSelectedValue: widget.setSelectedValue, + currentRound: widget.currentRound ), ], ), @@ -528,24 +537,26 @@ class SpareButton extends StatelessWidget { class NumberPad extends StatefulWidget { final int numberThrow; - const NumberPad({Key? key, required this.numberThrow}) : super(key: key); + final AbstractRound currentRound; + final Function(int) setSelectedValue; + const NumberPad({Key? key, required this.numberThrow, required this.setSelectedValue, required this.currentRound}) : super(key: key); @override State createState() => _NumberPadState(); } class _NumberPadState extends State { - int NumSelected = 100; + int NumSelected = 0; void updateId(int newNum) { - print(newNum); setState(() { NumSelected = newNum; + widget.setSelectedValue(newNum); }); } void initState() { - NumSelected = 100; + NumSelected = 0; super.initState(); } @@ -649,7 +660,7 @@ class _NumberPadState extends State { ], ), ), - widget.numberThrow == 1 + widget.currentRound.shotIsStrike() ? StrikeButton( currentSelected: NumSelected, onSonChanged: (int newId) { diff --git a/Sources/bowlin_project/test/model_test.dart b/Sources/bowlin_project/test/model_test.dart index ce46375..9a495de 100644 --- a/Sources/bowlin_project/test/model_test.dart +++ b/Sources/bowlin_project/test/model_test.dart @@ -1,274 +1,278 @@ -import '../lib/model/Player.dart'; -import '../lib/model/Guest.dart'; -import '../lib/model/User.dart'; -import '../lib/model/Stat.dart'; -import '../lib/model/Round.dart'; -import '../lib/model/GameDetail.dart'; -import '../lib/model/StubManager/StubData.dart'; -import '../lib/model/IManager.dart'; -import 'dart:math'; -import '../lib/model/Achievement.dart'; - -void main() { - List stats = []; - Random random = Random(); - - for (int i = 0; i < 10; i++) { - Stat stat = Stat( - random.nextInt(50) + 1, // valeur aléatoire entre 1 et 50 - random.nextInt(20) + 1, // valeur aléatoire entre 1 et 20 - random.nextInt(30) + 1, // valeur aléatoire entre 1 et 30 - random.nextInt(1000) + 1, // valeur aléatoire entre 1 et 1000 - random.nextInt(10) + 1, // valeur aléatoire entre 1 et 10 - random.nextInt(5) + 1, // valeur aléatoire entre 1 et 5 - random.nextInt(5000) + 1000, // valeur aléatoire entre 1000 et 6000 - random.nextInt(300) + 1, // valeur aléatoire entre 1 et 300 - random.nextDouble() * 10 // valeur aléatoire entre 0 et 10 - ); - stats.add(stat); - } - - print("Stats:"); - for (var stat in stats) { - print( - "\tVictoires: ${stat.nbVictory}, Défaites: ${stat.nbDefeat}, Parties jouées: ${stat.nbGames}, Meilleur score: ${stat.highscore}, Nombre de strikes: ${stat.nbStrikes}, Nom de spares: ${stat.nbStrikes}, Moyenne score: ${stat.avgScore}, Moyenne score par round: ${stat.avgPinsPerRound}"); - } - - User ami = User( - 5, - "Lucas", - "https://fastly.picsum.photos/id/288/2000/2000.jpg?hmac=AUboE-jzAzofYj_O3w_EqtZU3JHzcg7HR1IQd1Ce7lY", - "Lucas.delanier@etu.uca.fr", - [], - [], - stats[1]); - - List players = [ - Player(1, "Rami", - "https://fastly.picsum.photos/id/1060/2000/2000.jpg?hmac=_RrU8GpkCDUlVKfgyWE-GcX-GS5TKNyUzdFbJAGXHV4"), - Player(2, "Emre", - "https://fastly.picsum.photos/id/670/2000/2000.jpg?hmac=zWqTr_vDEab3dBtp7JZgJP8TRCPNanJ4tYwDDd-jGYA"), - Guest(3, "Bot1", - "https://fastly.picsum.photos/id/820/2000/2000.jpg?hmac=Ctxx2feJNZnG1S7UPx_YrWcEw89tKb7fR8i1W-VTOz4"), - Guest(4, "Bot2", - "https://fastly.picsum.photos/id/288/2000/2000.jpg?hmac=AUboE-jzAzofYj_O3w_EqtZU3JHzcg7HR1IQd1Ce7lY"), - ami, - User( - 6, - "Louison", - "https://fastly.picsum.photos/id/1029/2000/2000.jpg?hmac=_K3pMobVk00dfNR7rsj1NLnEBB5Gf88SvGPbbjoH-Uc", - "louison.parant@etu.uca.fr", - [ - Achievement("5 games"), - Achievement("2 strikes in a row"), - Achievement("Win a game") - ], - [ami], - stats[0]) - ]; - - print("Players :"); - // afficahge de toutes les informations de tous les joueurs - for (var player in players) { - displayPlayer(player,1); - } - - //GameDetail - - List games = [ - GameDetail( - 1, DateTime.now(), players[0].id, 290, true, null, players[0].id, [ - Round(10, null, 10, players[0]), - Round(5, 2, 7, players[1]), - Round(5, 1, 12, players[0]), - Round(5, 2, 7, players[1]), - ], [ - players[0], - players[1] - ]), - GameDetail(2, DateTime.now().subtract(Duration(days: 2)), - players[1].id, 250, true, null, players[1].id, [ - Round(7, null, 7, players[1]), - Round(3, 3, 9, players[0]), - Round(5, 2, 7, players[1]), - Round(5, 1, 12, players[0]) - ], [ - players[0], - players[1] - ]), - GameDetail(3, DateTime.now().subtract(Duration(days: 4)), - players[2].id, 210, false, null, players[2].id, [ - Round(8, 2, 10, players[2]), - Round(6, 2, 8, players[1]), - Round(4, 2, 6, players[2]), - Round(2, 2, 4, players[1]) - ], [ - players[1], - players[2] - ]), - GameDetail( - 4, - DateTime.now().subtract(Duration(days: 7)), - players[3].id, - 120, - true, - Round(12, null, 12, players[3]), - players[3].id, [ - Round(12, null, 12, players[3]), - Round(7, 3, 10, players[2]), - Round(6, 2, 8, players[1]), - Round(5, 1, 12, players[0]) - ], [ - players[0], - players[1], - players[2], - players[3] - ]), - GameDetail(5, DateTime.now().subtract(Duration(days: 10)), - players[4].id, 280, true, null, players[4].id, [ - Round(9, 1, 10, players[4]), - Round(7, 3, 10, players[2]), - Round(8, 2, 10, players[3]), - Round(5, 2, 7, players[1]) - ], [ - players[1], - players[2], - players[3], - players[4] - ]), - GameDetail(6, DateTime.now().subtract(Duration(days: 12)), - players[1].id, 240, true, null, players[1].id, [ - Round(7, null, 7, players[1]), - Round(5, 2, 7, players[2]), - Round(6, 2, 8, players[1]), - Round(5, 1, 12, players[0]) - ], [ - players[0], - players[1], - players[2], - players[4] - ]), - GameDetail(7, DateTime.now().subtract(Duration(days: 15)), - players[2].id, 200, true, null, players[2].id, [ - Round(8, 2, 10, players[2]), - Round(4, 2, 6, players[1]), - Round(7, 3, 10, players[3]), - Round(5, 2, 7, players[0]) - ], [ - players[0], - players[1], - players[2], - players[3] - ]) - ]; - - print("GameDetail :"); - for (var game in games) { - displayGameDetail(game,1); - print("\t-----------------------------------------"); - } - - print("StubManager:"); - IManager mgr = new StubData(); - - print("\tGameManager:"); - - print("\tgetGameById function with id: 2"); - GameDetail gd = mgr.gameMgr.getGameById(2); - displayGameDetail(gd,2); - - print("\tgetGamesByPlayerId function with id: 2"); - List gds = mgr.gameMgr.getGamesByPlayerId(8); - for (var game in gds) - { - displayGameDetail(game,2); - } - - print("\tgetGamesByPlayer function:"); - var player = mgr.userMgr.getUserById(8); - List gdsPlayer = mgr.gameMgr.getGamesByPlayer(player); - for (var game in gdsPlayer) - { - displayGameDetail(game,2); - } - - print("\tgetGamesByPlayers:"); - var player2 = mgr.userMgr.getUserById(2); - List playersTest = [player,player2]; - List gdsPlayers = mgr.gameMgr.getGamesByPlayers(playersTest); - for (var game in gdsPlayers) - { - displayGameDetail(game,2); - } - - print("\tgetPlayersByIdGame:"); - var playersIntoGame = mgr.gameMgr.getPlayersByIdGame(2); - for (var player in playersIntoGame) - { - displayPlayer(player,2); - } - - print("\tgetRankByIdGame:"); - var ranksPlayers = mgr.gameMgr.getRankByIdGame(2); - ranksPlayers.forEach((id, rank) { - displayPlayer(mgr.userMgr.getUserById(id),2); - print('\t\tRank $rank'); - }); -} - -void displayGameDetail(GameDetail gd, int numTabs) -{ - String tabs = '\t' * numTabs; - print(tabs+"Game ID: ${gd.id}"); - print(tabs+"Time: ${gd.time}"); - print(tabs+"Winner: ${gd.winner}"); - print(tabs+"Number of Points: ${gd.nbPoints}"); - print(tabs+"Is Finished: ${gd.isFinished}"); - print(tabs+"Current Round: ${gd.currentRound}"); - print(tabs+"Host: ${gd.host}"); - print(tabs+"Rank: ${gd.getRank()}"); - print(tabs+"Rounds:"); - for (var round in gd.rounds) { - displayRound(round, numTabs+1); - } - print(tabs+"Players:"); - for (var player in gd.players) { - displayPlayer(player, numTabs+1); - } -} - -void displayRound(Round round, int numTabs) -{ - String tabs = '\t' * numTabs; - print(tabs+"Round Score: ${round.firstThrow}"); - print(tabs+"Round Bonus: ${round.secondThrow}"); - print(tabs+"Round Total: ${round.points}"); - print(tabs+"Round Player: ${round.player.name}"); -} - -void displayPlayer(Player player, int numTabs) -{ - String tabs = '\t' * numTabs; - if (player is Guest) { - print(tabs+"ID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: Guest"); - } else if (player is User) { - print(tabs+"ID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: User"); - print(tabs+"Achievements:"); - for (var achievement in player.achievements) { - displayAchievement(achievement, numTabs+1); - } - print(tabs+"Amis:"); - for (var amis in player.friends) { - print("\t\tNom: ${amis.name}, Mail: ${amis.mail}"); - } - print(tabs+"Victoires: ${player.stat.nbVictory}, Défaites: ${player.stat.nbDefeat}, Parties jouées: ${player.stat.nbGames}, Meilleur score: ${player.stat.highscore}, Nombre de strikes: ${player.stat.nbStrikes}, Nom de spares: ${player.stat.nbStrikes}, Moyenne score: ${player.stat.avgScore}, Moyenne score par round: ${player.stat.avgPinsPerRound}"); - } else { - print(tabs+"ID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: Player"); - } -} - -void displayAchievement(Achievement achievement, int numTabs) -{ - String tabs = '\t' * numTabs; - print(tabs+"Nom: ${achievement.name}"); -} \ No newline at end of file +// import 'package:bowl_in/model/GamePlayer.dart'; +// +// import '../lib/model/Player.dart'; +// import '../lib/model/Guest.dart'; +// import '../lib/model/User.dart'; +// import '../lib/model/Stat.dart'; +// import '../lib/model/Round.dart'; +// import '../lib/model/GameDetail.dart'; +// import '../lib/model/StubManager/StubData.dart'; +// import '../lib/model/IManager.dart'; +// import 'dart:math'; +// import '../lib/model/Achievement.dart'; +// +// void main() { +// List stats = []; +// Random random = Random(); +// +// for (int i = 0; i < 10; i++) { +// Stat stat = Stat( +// random.nextInt(50) + 1, // valeur aléatoire entre 1 et 50 +// random.nextInt(20) + 1, // valeur aléatoire entre 1 et 20 +// random.nextInt(30) + 1, // valeur aléatoire entre 1 et 30 +// random.nextInt(1000) + 1, // valeur aléatoire entre 1 et 1000 +// random.nextInt(10) + 1, // valeur aléatoire entre 1 et 10 +// random.nextInt(5) + 1, // valeur aléatoire entre 1 et 5 +// random.nextInt(5000) + 1000, // valeur aléatoire entre 1000 et 6000 +// random.nextInt(300) + 1, // valeur aléatoire entre 1 et 300 +// random.nextDouble() * 10 // valeur aléatoire entre 0 et 10 +// ); +// stats.add(stat); +// } +// +// print("Stats:"); +// for (var stat in stats) { +// print( +// "\tVictoires: ${stat.nbVictory}, Défaites: ${stat.nbDefeat}, Parties jouées: ${stat.nbGames}, Meilleur score: ${stat.highscore}, Nombre de strikes: ${stat.nbStrikes}, Nom de spares: ${stat.nbStrikes}, Moyenne score: ${stat.avgScore}, Moyenne score par round: ${stat.avgPinsPerRound}"); +// } +// +// User ami = User( +// 5, +// "Lucas", +// "https://fastly.picsum.photos/id/288/2000/2000.jpg?hmac=AUboE-jzAzofYj_O3w_EqtZU3JHzcg7HR1IQd1Ce7lY", +// "Lucas.delanier@etu.uca.fr", +// [], +// [], +// stats[1]); +// +// List players = [ +// Player(1, "Rami", +// "https://fastly.picsum.photos/id/1060/2000/2000.jpg?hmac=_RrU8GpkCDUlVKfgyWE-GcX-GS5TKNyUzdFbJAGXHV4"), +// Player(2, "Emre", +// "https://fastly.picsum.photos/id/670/2000/2000.jpg?hmac=zWqTr_vDEab3dBtp7JZgJP8TRCPNanJ4tYwDDd-jGYA"), +// Guest(3, "Bot1", +// "https://fastly.picsum.photos/id/820/2000/2000.jpg?hmac=Ctxx2feJNZnG1S7UPx_YrWcEw89tKb7fR8i1W-VTOz4"), +// Guest(4, "Bot2", +// "https://fastly.picsum.photos/id/288/2000/2000.jpg?hmac=AUboE-jzAzofYj_O3w_EqtZU3JHzcg7HR1IQd1Ce7lY"), +// ami, +// User( +// 6, +// "Louison", +// "https://fastly.picsum.photos/id/1029/2000/2000.jpg?hmac=_K3pMobVk00dfNR7rsj1NLnEBB5Gf88SvGPbbjoH-Uc", +// "louison.parant@etu.uca.fr", +// [ +// Achievement("5 games"), +// Achievement("2 strikes in a row"), +// Achievement("Win a game") +// ], +// [ami], +// stats[0]) +// ]; +// +// print("Players :"); +// // afficahge de toutes les informations de tous les joueurs +// for (var player in players) { +// displayPlayer(player,1); +// } +// +// //GameDetail +// +// +// List games = []; +// games.add(GameDetail( +// 1, DateTime.now(), players[0].id, 290, true, null, players[0].id) +// , [ +// Round(10, null, 10, players[0], ), +// Round(5, 2, 7, players[1]), +// Round(5, 1, 12, players[0]), +// Round(5, 2, 7, players[1]), +// ], [ +// players[0], +// players[1] +// ]), +// GameDetail(2, DateTime.now().subtract(Duration(days: 2)), +// players[1].id, 250, true, null, players[1].id, [ +// Round(7, null, 7, players[1]), +// Round(3, 3, 9, players[0]), +// Round(5, 2, 7, players[1]), +// Round(5, 1, 12, players[0]) +// ], [ +// players[0], +// players[1] +// ]), +// GameDetail(3, DateTime.now().subtract(Duration(days: 4)), +// players[2].id, 210, false, null, players[2].id, [ +// Round(8, 2, 10, players[2]), +// Round(6, 2, 8, players[1]), +// Round(4, 2, 6, players[2]), +// Round(2, 2, 4, players[1]) +// ], [ +// players[1], +// players[2] +// ]), +// GameDetail( +// 4, +// DateTime.now().subtract(Duration(days: 7)), +// players[3].id, +// 120, +// true, +// Round(12, null, 12, players[3]), +// players[3].id, [ +// Round(12, null, 12, players[3]), +// Round(7, 3, 10, players[2]), +// Round(6, 2, 8, players[1]), +// Round(5, 1, 12, players[0]) +// ], [ +// players[0], +// players[1], +// players[2], +// players[3] +// ]), +// GameDetail(5, DateTime.now().subtract(Duration(days: 10)), +// players[4].id, 280, true, null, players[4].id, [ +// Round(9, 1, 10, players[4]), +// Round(7, 3, 10, players[2]), +// Round(8, 2, 10, players[3]), +// Round(5, 2, 7, players[1]) +// ], [ +// players[1], +// players[2], +// players[3], +// players[4] +// ]), +// GameDetail(6, DateTime.now().subtract(Duration(days: 12)), +// players[1].id, 240, true, null, players[1].id, [ +// Round(7, null, 7, players[1]), +// Round(5, 2, 7, players[2]), +// Round(6, 2, 8, players[1]), +// Round(5, 1, 12, players[0]) +// ], [ +// players[0], +// players[1], +// players[2], +// players[4] +// ]), +// GameDetail(7, DateTime.now().subtract(Duration(days: 15)), +// players[2].id, 200, true, null, players[2].id, [ +// Round(8, 2, 10, players[2]), +// Round(4, 2, 6, players[1]), +// Round(7, 3, 10, players[3]), +// Round(5, 2, 7, players[0]) +// ], [ +// players[0], +// players[1], +// players[2], +// players[3] +// ]) +// ]; +// +// print("GameDetail :"); +// for (var game in games) { +// displayGameDetail(game,1); +// print("\t-----------------------------------------"); +// } +// +// print("StubManager:"); +// IManager mgr = new StubData(); +// +// print("\tGameManager:"); +// +// print("\tgetGameById function with id: 2"); +// GameDetail gd = mgr.gameMgr.getGameById(2); +// displayGameDetail(gd,2); +// +// print("\tgetGamesByPlayerId function with id: 2"); +// List gds = mgr.gameMgr.getGamesByPlayerId(8); +// for (var game in gds) +// { +// displayGameDetail(game,2); +// } +// +// print("\tgetGamesByPlayer function:"); +// var player = mgr.userMgr.getUserById(8); +// List gdsPlayer = mgr.gameMgr.getGamesByPlayer(player); +// for (var game in gdsPlayer) +// { +// displayGameDetail(game,2); +// } +// +// print("\tgetGamesByPlayers:"); +// var player2 = mgr.userMgr.getUserById(2); +// List playersTest = [player,player2]; +// List gdsPlayers = mgr.gameMgr.getGamesByPlayers(playersTest); +// for (var game in gdsPlayers) +// { +// displayGameDetail(game,2); +// } +// +// print("\tgetPlayersByIdGame:"); +// var playersIntoGame = mgr.gameMgr.getPlayersByIdGame(2); +// for (var player in playersIntoGame) +// { +// displayPlayer(player,2); +// } +// +// print("\tgetRankByIdGame:"); +// var ranksPlayers = mgr.gameMgr.getRankByIdGame(2); +// ranksPlayers.forEach((id, rank) { +// displayPlayer(mgr.userMgr.getUserById(id),2); +// print('\t\tRank $rank'); +// }); +// } +// +// void displayGameDetail(GameDetail gd, int numTabs) +// { +// String tabs = '\t' * numTabs; +// print(tabs+"Game ID: ${gd.id}"); +// print(tabs+"Time: ${gd.time}"); +// print(tabs+"Winner: ${gd.winner}"); +// print(tabs+"Number of Points: ${gd.nbPoints}"); +// print(tabs+"Is Finished: ${gd.isFinished}"); +// print(tabs+"Current Round: ${gd.currentRound}"); +// print(tabs+"Host: ${gd.host}"); +// print(tabs+"Rank: ${gd.getRank()}"); +// print(tabs+"Rounds:"); +// for (var round in gd.rounds) { +// displayRound(round, numTabs+1); +// } +// print(tabs+"Players:"); +// for (var player in gd.players) { +// displayPlayer(player, numTabs+1); +// } +// } +// +// void displayRound(Round round, int numTabs) +// { +// String tabs = '\t' * numTabs; +// print(tabs+"Round Score: ${round.firstThrow}"); +// print(tabs+"Round Bonus: ${round.secondThrow}"); +// print(tabs+"Round Total: ${round.points}"); +// print(tabs+"Round Player: ${round.player.name}"); +// } +// +// void displayPlayer(Player player, int numTabs) +// { +// String tabs = '\t' * numTabs; +// if (player is Guest) { +// print(tabs+"ID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: Guest"); +// } else if (player is User) { +// print(tabs+"ID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: User"); +// print(tabs+"Achievements:"); +// for (var achievement in player.achievements) { +// displayAchievement(achievement, numTabs+1); +// } +// print(tabs+"Amis:"); +// for (var amis in player.friends) { +// print("\t\tNom: ${amis.name}, Mail: ${amis.mail}"); +// } +// print(tabs+"Victoires: ${player.stat.nbVictory}, Défaites: ${player.stat.nbDefeat}, Parties jouées: ${player.stat.nbGames}, Meilleur score: ${player.stat.highscore}, Nombre de strikes: ${player.stat.nbStrikes}, Nom de spares: ${player.stat.nbStrikes}, Moyenne score: ${player.stat.avgScore}, Moyenne score par round: ${player.stat.avgPinsPerRound}"); +// } else { +// print(tabs+"ID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: Player"); +// } +// } +// +// void displayAchievement(Achievement achievement, int numTabs) +// { +// String tabs = '\t' * numTabs; +// print(tabs+"Nom: ${achievement.name}"); +// } \ No newline at end of file -- 2.36.3 From ea391fc0e83124453b5179a68b38a44a63ed9f54 Mon Sep 17 00:00:00 2001 From: Lucas Delanier Date: Sat, 18 Mar 2023 14:00:35 +0100 Subject: [PATCH 5/7] make buttons selectable following scoe of the previous throw :zap: --- .../bowlin_project/lib/model/GamePlayer.dart | 27 ++++---- .../lib/views/ingame_screen2.dart | 38 ++++++------ .../lib/widgets/ingame_widgets.dart | 61 ++++++++++++++----- 3 files changed, 79 insertions(+), 47 deletions(-) diff --git a/Sources/bowlin_project/lib/model/GamePlayer.dart b/Sources/bowlin_project/lib/model/GamePlayer.dart index 826440e..03b5489 100644 --- a/Sources/bowlin_project/lib/model/GamePlayer.dart +++ b/Sources/bowlin_project/lib/model/GamePlayer.dart @@ -5,8 +5,7 @@ import 'package:go_router/go_router.dart'; import 'Round.dart'; -class GamePlayer{ - +class GamePlayer { late GameDetail _game; int currentRoundIndex = 0; @@ -17,29 +16,31 @@ class GamePlayer{ _game = value; } - void onNext(bool isRoundFinished, BuildContext context){ - if(isRoundFinished){ + void onNext(bool isRoundFinished, BuildContext context) { + if (isRoundFinished) { print("++"); currentRoundIndex++; } - if(currentRoundIndex>=game.rounds.length){ + if (currentRoundIndex >= game.rounds.length) { print("FINISHED"); context.go("/scoreboard"); - }else{ + } else { print("IN GAME : " + currentRoundIndex.toString()); - if(game.rounds[currentRoundIndex] is Round){ + if (game.rounds[currentRoundIndex] is Round) { print("ROUND"); - }else{ + } else { print("LAST ROUND"); } - context.pushReplacement("/in-game", extra: game.rounds[currentRoundIndex]); + context.pushReplacement("/in-game", + extra: game.rounds[currentRoundIndex]); } } - void onSpareOrStrike(){ - if(currentRoundIndex { late InGameCardThrow widgetHolder; int selectedValue = 0; - void setSelectedValue(int val){ - selectedValue=val; + void setSelectedValue(int val) { + selectedValue = val; } - void initState() { - - if (widget.currentRound.firstThrow == null) - widgetHolder = InGameCardThrow(numberThrow: 1, currentRound: - widget.currentRound, setSelectedValue: setSelectedValue); - else if (widget.currentRound.secondThrow == null) { - widgetHolder = InGameCardThrow(numberThrow: 2 - , currentRound: - widget.currentRound, setSelectedValue: setSelectedValue); + if (widget.currentRound.firstThrow == null) { + widgetHolder = InGameCardThrow( + numberThrow: 1, + currentRound: widget.currentRound, + setSelectedValue: setSelectedValue); + } else if (widget.currentRound.secondThrow == null) { + widgetHolder = InGameCardThrow( + numberThrow: 2, + currentRound: widget.currentRound, + setSelectedValue: setSelectedValue); } else { - widgetHolder = InGameCardThrow(numberThrow: 3, currentRound: - widget.currentRound, setSelectedValue: setSelectedValue); + widgetHolder = InGameCardThrow( + numberThrow: 3, + currentRound: widget.currentRound, + setSelectedValue: setSelectedValue); } super.initState(); @@ -44,7 +47,6 @@ class _InGameScreen2State extends State { @override Widget build(BuildContext context) { - return Stack( children: [ Container( @@ -70,11 +72,10 @@ class _InGameScreen2State extends State { Spacer(), ElevatedButton( onPressed: () { - bool isFinished = widget.currentRound.computeNext( - selectedValue - ); + bool isFinished = + widget.currentRound.computeNext(selectedValue); - if(widget.currentRound.isSpareOrStrike()){ + if (widget.currentRound.isSpareOrStrike()) { MyApp.controller.gamePlayer.onSpareOrStrike(); } @@ -99,7 +100,6 @@ class _InGameScreen2State extends State { ), minimumSize: Size(200, 80), ), - ), Spacer(), ], diff --git a/Sources/bowlin_project/lib/widgets/ingame_widgets.dart b/Sources/bowlin_project/lib/widgets/ingame_widgets.dart index 4101af1..17b8b25 100644 --- a/Sources/bowlin_project/lib/widgets/ingame_widgets.dart +++ b/Sources/bowlin_project/lib/widgets/ingame_widgets.dart @@ -350,7 +350,12 @@ class InGameCardThrow extends StatefulWidget { final int numberThrow; final AbstractRound currentRound; final Function(int) setSelectedValue; - const InGameCardThrow({Key? key, required this.numberThrow, required this.currentRound, required this.setSelectedValue}): super(key: key); + const InGameCardThrow( + {Key? key, + required this.numberThrow, + required this.currentRound, + required this.setSelectedValue}) + : super(key: key); @override State createState() => _InGameCardThrowState(); @@ -358,6 +363,19 @@ class InGameCardThrow extends StatefulWidget { class _InGameCardThrowState extends State { GlobalKey<_NumberPadState> _numberPadKey = GlobalKey(); + late var maxValue; + + void initState() { + if (widget.currentRound.firstThrow == null) { + maxValue = 10; + } else if (widget.currentRound.secondThrow == null) { + maxValue = 10 - (widget.currentRound.firstThrow ?? 0); + } else { + maxValue = 10; + } + + super.initState(); + } @override Widget build(BuildContext context) { @@ -393,9 +411,14 @@ class _InGameCardThrowState extends State { fontWeight: FontWeight.w400, decoration: TextDecoration.none)), TextSpan( - text: widget.currentRound.number.toString() + " - " + - widget.numberThrow.toString()+ - (widget.numberThrow==1 ? "st" : widget.numberThrow==2? "nd" : "rd"),//'1 - 1st', + text: widget.currentRound.number.toString() + + " - " + + widget.numberThrow.toString() + + (widget.numberThrow == 1 + ? "st" + : widget.numberThrow == 2 + ? "nd" + : "rd"), //'1 - 1st', style: GoogleFonts.roboto( fontSize: 18, color: CupertinoColors.black, @@ -424,7 +447,8 @@ class _InGameCardThrowState extends State { NumberPad( numberThrow: widget.numberThrow, setSelectedValue: widget.setSelectedValue, - currentRound: widget.currentRound + currentRound: widget.currentRound, + maxValue: maxValue, ), ], ), @@ -539,7 +563,14 @@ class NumberPad extends StatefulWidget { final int numberThrow; final AbstractRound currentRound; final Function(int) setSelectedValue; - const NumberPad({Key? key, required this.numberThrow, required this.setSelectedValue, required this.currentRound}) : super(key: key); + final int maxValue; + const NumberPad( + {Key? key, + required this.numberThrow, + required this.setSelectedValue, + required this.currentRound, + required this.maxValue}) + : super(key: key); @override State createState() => _NumberPadState(); @@ -576,7 +607,7 @@ class _NumberPadState extends State { Number( currentSelected: NumSelected, num: 1, - isSelectable: 1, + isSelectable: widget.maxValue > 1 ? 1 : 0, onSonChanged: (int newId) { updateId(newId); }, @@ -584,7 +615,7 @@ class _NumberPadState extends State { Number( currentSelected: NumSelected, num: 2, - isSelectable: 1, + isSelectable: widget.maxValue > 2 ? 1 : 0, onSonChanged: (int newId) { updateId(newId); }, @@ -592,7 +623,7 @@ class _NumberPadState extends State { Number( currentSelected: NumSelected, num: 3, - isSelectable: 1, + isSelectable: widget.maxValue > 3 ? 1 : 0, onSonChanged: (int newId) { updateId(newId); }, @@ -605,7 +636,7 @@ class _NumberPadState extends State { Number( currentSelected: NumSelected, num: 4, - isSelectable: 1, + isSelectable: widget.maxValue > 4 ? 1 : 0, onSonChanged: (int newId) { updateId(newId); }, @@ -613,7 +644,7 @@ class _NumberPadState extends State { Number( currentSelected: NumSelected, num: 5, - isSelectable: 1, + isSelectable: widget.maxValue > 5 ? 1 : 0, onSonChanged: (int newId) { updateId(newId); }, @@ -621,7 +652,7 @@ class _NumberPadState extends State { Number( currentSelected: NumSelected, num: 6, - isSelectable: 1, + isSelectable: widget.maxValue > 6 ? 1 : 0, onSonChanged: (int newId) { updateId(newId); }, @@ -634,7 +665,7 @@ class _NumberPadState extends State { Number( currentSelected: NumSelected, num: 7, - isSelectable: 1, + isSelectable: widget.maxValue > 7 ? 1 : 0, onSonChanged: (int newId) { updateId(newId); }, @@ -642,7 +673,7 @@ class _NumberPadState extends State { Number( currentSelected: NumSelected, num: 8, - isSelectable: 0, + isSelectable: widget.maxValue > 8 ? 1 : 0, onSonChanged: (int newId) { updateId(newId); }, @@ -650,7 +681,7 @@ class _NumberPadState extends State { Number( currentSelected: NumSelected, num: 9, - isSelectable: 0, + isSelectable: widget.maxValue > 9 ? 1 : 0, onSonChanged: (int newId) { updateId(newId); }, -- 2.36.3 From 47a1e3cf11a1adda24b5cae2c2c4453b9649c444 Mon Sep 17 00:00:00 2001 From: Lucas Delanier Date: Sat, 18 Mar 2023 14:31:51 +0100 Subject: [PATCH 6/7] final scoreboard works well :tada: --- .../bowlin_project/lib/config/app_router.dart | 5 +- .../bowlin_project/lib/model/GameDetail.dart | 24 +- .../bowlin_project/lib/model/GamePlayer.dart | 2 +- .../lib/model/IGameManager.dart | 2 +- .../lib/model/StubManager/GameManager.dart | 2 +- .../lib/widgets/button_new_party.dart | 4 +- .../lib/widgets/ingame_widgets.dart | 244 ++++++++++++------ 7 files changed, 175 insertions(+), 108 deletions(-) diff --git a/Sources/bowlin_project/lib/config/app_router.dart b/Sources/bowlin_project/lib/config/app_router.dart index 7a8e49b..9106c04 100644 --- a/Sources/bowlin_project/lib/config/app_router.dart +++ b/Sources/bowlin_project/lib/config/app_router.dart @@ -1,4 +1,5 @@ import 'package:bowl_in/model/AbstractRound.dart'; +import 'package:bowl_in/model/GameDetail.dart'; import 'package:bowl_in/model/Round.dart'; import 'package:bowl_in/views/ingame_screen2.dart'; import 'package:bowl_in/widgets/button_new_party.dart'; @@ -41,7 +42,7 @@ final GoRouter router = GoRouter( GoRoute( path: 'in-game', builder: (BuildContext context, GoRouterState state) { - if(state.extra is AbstractRound) { + if (state.extra is AbstractRound) { return InGameScreen2(currentRound: state.extra as AbstractRound); } return InGameScreen(); @@ -50,7 +51,7 @@ final GoRouter router = GoRouter( GoRoute( path: 'scoreboard', builder: (BuildContext context, GoRouterState state) { - return FinalScoreBoard(); + return FinalScoreBoard(gameDeatil: state.extra as GameDetail); }, ), ], diff --git a/Sources/bowlin_project/lib/model/GameDetail.dart b/Sources/bowlin_project/lib/model/GameDetail.dart index c5b5f14..a4d1c45 100644 --- a/Sources/bowlin_project/lib/model/GameDetail.dart +++ b/Sources/bowlin_project/lib/model/GameDetail.dart @@ -17,16 +17,9 @@ class GameDetail { List _players = []; // Constructor - GameDetail( - this._id, - this._time, - this._winner, - this._nbPoints, - this._isFinished, - this._host, - this._players){ - - for(int i=1; i<=9; i++){ + GameDetail(this._id, this._time, this._winner, this._nbPoints, + this._isFinished, this._host, this._players) { + for (int i = 1; i <= 9; i++) { players.forEach((element) { this.rounds.add(Round(null, null, 0, element, i)); }); @@ -35,7 +28,6 @@ class GameDetail { players.forEach((element) { this.rounds.add(LastRound(null, null, 0, element, 10, null)); }); - } // Getters and setters @@ -102,14 +94,14 @@ class GameDetail { throw Exception("Player not in the game."); } - Map getRank() { - Map rank = {}; + Map getRank() { + Map rank = {}; for (var player in players) { - rank.addAll({player.id: getPointByPlayerId(player.id)}); + rank.addAll({player: getPointByPlayerId(player.id)}); } - var sortedByKeyMap = Map.fromEntries( + var sortedByValueMap = Map.fromEntries( rank.entries.toList()..sort((e1, e2) => e2.value.compareTo(e1.value))); - return sortedByKeyMap; + return sortedByValueMap; } } diff --git a/Sources/bowlin_project/lib/model/GamePlayer.dart b/Sources/bowlin_project/lib/model/GamePlayer.dart index 03b5489..43f64c7 100644 --- a/Sources/bowlin_project/lib/model/GamePlayer.dart +++ b/Sources/bowlin_project/lib/model/GamePlayer.dart @@ -23,7 +23,7 @@ class GamePlayer { } if (currentRoundIndex >= game.rounds.length) { print("FINISHED"); - context.go("/scoreboard"); + context.go("/scoreboard", extra: game); } else { print("IN GAME : " + currentRoundIndex.toString()); if (game.rounds[currentRoundIndex] is Round) { diff --git a/Sources/bowlin_project/lib/model/IGameManager.dart b/Sources/bowlin_project/lib/model/IGameManager.dart index e761719..0d5f434 100644 --- a/Sources/bowlin_project/lib/model/IGameManager.dart +++ b/Sources/bowlin_project/lib/model/IGameManager.dart @@ -9,5 +9,5 @@ abstract class IGameManager { List getGamesByPlayer(Player user); List getGamesByPlayers(List users); List getPlayersByIdGame(int id); - Map getRankByIdGame(int id); + Map getRankByIdGame(int id); } diff --git a/Sources/bowlin_project/lib/model/StubManager/GameManager.dart b/Sources/bowlin_project/lib/model/StubManager/GameManager.dart index 2a0efff..cbff266 100644 --- a/Sources/bowlin_project/lib/model/StubManager/GameManager.dart +++ b/Sources/bowlin_project/lib/model/StubManager/GameManager.dart @@ -73,7 +73,7 @@ class GameManager extends IGameManager { throw Exception("Game not found."); } - Map getRankByIdGame(int id) { + Map getRankByIdGame(int id) { for (var game in parent.gameDetails) { if (game.id == id) { return game.getRank(); diff --git a/Sources/bowlin_project/lib/widgets/button_new_party.dart b/Sources/bowlin_project/lib/widgets/button_new_party.dart index ef5f5a5..81a6fb4 100644 --- a/Sources/bowlin_project/lib/widgets/button_new_party.dart +++ b/Sources/bowlin_project/lib/widgets/button_new_party.dart @@ -164,7 +164,7 @@ class ScoreBoardModal extends StatelessWidget { child: Stack( alignment: Alignment.topCenter, children: [ - Positioned( + /*Positioned( child: PodiumGameOverWidget( isfirst: 2, pseudo: 'Lucas', @@ -189,7 +189,7 @@ class ScoreBoardModal extends StatelessWidget { ), top: 70, right: 30, - ) + )*/ ], ), )), diff --git a/Sources/bowlin_project/lib/widgets/ingame_widgets.dart b/Sources/bowlin_project/lib/widgets/ingame_widgets.dart index 17b8b25..4624b16 100644 --- a/Sources/bowlin_project/lib/widgets/ingame_widgets.dart +++ b/Sources/bowlin_project/lib/widgets/ingame_widgets.dart @@ -4,118 +4,193 @@ import 'package:bowl_in/widgets/profil_listpodium_widget.dart'; import 'package:bowl_in/widgets/scores_list_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import '../model/AbstractRound.dart'; +import '../model/GameDetail.dart'; +import '../model/Player.dart'; class FinalScoreBoard extends StatefulWidget { - const FinalScoreBoard({Key? key}) : super(key: key); + final GameDetail gameDeatil; + const FinalScoreBoard({Key? key, required this.gameDeatil}) : super(key: key); @override State createState() => _FinalScoreBoardState(); } class _FinalScoreBoardState extends State { + late Map rank; + late List pseudoList; + late List scoreList; + @override + void initState() { + rank = widget.gameDeatil.getRank(); + pseudoList = rank.keys.toList(); + scoreList = rank.values.toList(); + super.initState(); + } + @override Widget build(BuildContext context) { - return Container( - margin: EdgeInsets.fromLTRB(30, 0, 30, 35), - width: double.infinity, - height: 470, - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/images/ingame_cardgame.png"), - fit: BoxFit.fill), - boxShadow: [ - BoxShadow( - color: CupertinoColors.black.withOpacity(0.15), - blurRadius: 10.0, - spreadRadius: 5.0, - ), - ]), - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - Padding( - padding: EdgeInsets.fromLTRB(15, 5, 15, 50), - child: RichText( - text: TextSpan( - style: DefaultTextStyle.of(context).style, - children: [ - TextSpan( - text: 'GAME OVER', - style: GoogleFonts.roboto( - fontSize: 15, - color: CupertinoColors.black, - fontWeight: FontWeight.w900, - decoration: TextDecoration.none)), - ], - ), - )), - Expanded( - child: Stack( - alignment: Alignment.topCenter, - children: [ - Positioned( - child: PodiumGameOverWidget( - isfirst: 2, - pseudo: 'Lucas', - score: 123, - ), - top: 70, - left: 30, - ), - Positioned( - child: PodiumGameOverWidget( - isfirst: 1, - pseudo: 'Momo', - score: 160, - ), - top: 10, - ), - Positioned( - child: PodiumGameOverWidget( - isfirst: 3, - pseudo: 'popo', - score: 110, - ), - top: 70, - right: 30, - ) + return Stack( + children: [ + Container( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height, + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xff19BDE0), + Color(0xff4A17DC), ], )), - Container( - width: double.infinity, - height: 100, - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/images/congrats_background.png"), - fit: BoxFit.cover), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + height: 120, ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0, 0, 0, 10), - child: Align( + Container( + margin: EdgeInsets.fromLTRB(30, 0, 30, 35), + width: double.infinity, + height: 470, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/images/ingame_cardgame.png"), + fit: BoxFit.fill), + boxShadow: [ + BoxShadow( + color: CupertinoColors.black.withOpacity(0.15), + blurRadius: 10.0, + spreadRadius: 5.0, + ), + ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.fromLTRB(15, 5, 15, 50), + child: RichText( + text: TextSpan( + style: DefaultTextStyle.of(context).style, + children: [ + TextSpan( + text: 'GAME OVER', + style: GoogleFonts.roboto( + fontSize: 15, + color: CupertinoColors.black, + fontWeight: FontWeight.w900, + decoration: TextDecoration.none)), + ], + ), + )), + Expanded( + child: Stack( + alignment: Alignment.topCenter, + children: [ + rank.length > 1 + ? Positioned( + child: PodiumGameOverWidget( + isfirst: 2, + player: pseudoList[1], + score: scoreList[1], + ), + top: 70, + left: 30, + ) + : Container(), + rank.length > 0 + ? Positioned( + child: PodiumGameOverWidget( + isfirst: 1, + player: pseudoList[0], + score: scoreList[0], + ), + top: 10, + ) + : Container(), + rank.length > 2 + ? Positioned( + child: PodiumGameOverWidget( + isfirst: 3, + player: pseudoList[2], + score: scoreList[2], + ), + top: 70, + right: 30, + ) + : Container() + ], + )), + Container( + width: double.infinity, + height: 100, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage( + "assets/images/congrats_background.png"), + fit: BoxFit.cover), + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0, 0, 0, 10), + child: Align( + child: Text( + "Play again", + style: GoogleFonts.roboto( + decoration: TextDecoration.none, + color: Colors.grey, + fontWeight: FontWeight.bold, + fontSize: 20), + ), + ), + ) + ])), + Spacer(), + ElevatedButton( + onPressed: () { + context.go("/"); + }, child: Text( - "Play again", + "LEAVE", style: GoogleFonts.roboto( - decoration: TextDecoration.none, - color: Colors.grey, fontWeight: FontWeight.bold, - fontSize: 20), + fontSize: 40, + color: Color(0xff1ABAE0)), + ), + style: ElevatedButton.styleFrom( + side: BorderSide( + width: 7, + color: Color(0xff1ABAE0), + ), + onPrimary: Colors.transparent, + primary: Colors.transparent, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(55), + ), + minimumSize: Size(200, 80), ), ), - ) - ])); + Spacer(), + ], + ) + ], + ); } } class PodiumGameOverWidget extends StatelessWidget { final int isfirst; - final String pseudo; + final Player player; final int score; const PodiumGameOverWidget( {Key? key, required this.isfirst, - required this.pseudo, + required this.player, required this.score}) : super(key: key); @@ -131,8 +206,7 @@ class PodiumGameOverWidget extends StatelessWidget { height: this.isfirst == 1 ? 65 : 50, decoration: BoxDecoration( image: DecorationImage( - image: AssetImage("assets/images/image_user_red.png"), - fit: BoxFit.cover), + image: AssetImage(player.image), fit: BoxFit.cover), borderRadius: BorderRadius.all(Radius.circular(70)), ), ), @@ -151,7 +225,7 @@ class PodiumGameOverWidget extends StatelessWidget { Padding( padding: EdgeInsets.fromLTRB(0, 3, 0, 0), child: Text( - this.pseudo, + this.player.name, style: GoogleFonts.roboto( color: Colors.black, fontWeight: FontWeight.bold, -- 2.36.3 From f28812bc97233fcdfebce207e5aa47364c9cd090 Mon Sep 17 00:00:00 2001 From: "arthur.valin" Date: Sat, 18 Mar 2023 16:59:23 +0100 Subject: [PATCH 7/7] Correcting bugs when computing points --- .../lib/model/AbstractRound.dart | 1 + .../bowlin_project/lib/model/GameDetail.dart | 29 +++++++------------ .../bowlin_project/lib/model/GamePlayer.dart | 1 + .../bowlin_project/lib/model/LastRound.dart | 6 +++- Sources/bowlin_project/lib/model/Round.dart | 10 +++++-- .../lib/widgets/ingame_widgets.dart | 8 +++-- 6 files changed, 30 insertions(+), 25 deletions(-) diff --git a/Sources/bowlin_project/lib/model/AbstractRound.dart b/Sources/bowlin_project/lib/model/AbstractRound.dart index e21073c..fa8d612 100644 --- a/Sources/bowlin_project/lib/model/AbstractRound.dart +++ b/Sources/bowlin_project/lib/model/AbstractRound.dart @@ -73,6 +73,7 @@ abstract class AbstractRound { void update(int val){ points = (points ?? 0) + val; + print("ROUND " + number.toString() + " - " + player.id.toString() + "Update points : " + points.toString()); previousRound?.update(val); } diff --git a/Sources/bowlin_project/lib/model/GameDetail.dart b/Sources/bowlin_project/lib/model/GameDetail.dart index a4d1c45..988fc41 100644 --- a/Sources/bowlin_project/lib/model/GameDetail.dart +++ b/Sources/bowlin_project/lib/model/GameDetail.dart @@ -15,6 +15,7 @@ class GameDetail { int _host; List _rounds = []; List _players = []; + final Map _points = {}; // Constructor GameDetail(this._id, this._time, this._winner, this._nbPoints, @@ -79,29 +80,21 @@ class GameDetail { _players = value; } - int getPointByPlayerId(int id) { - int pointPlayer = 0; - for (var player in players) { - if (player.id == id) { - for (var element in rounds) { - if (element.player == player) { - pointPlayer += element.points ?? 0; - } - } - return pointPlayer; - } + + Map get points => _points; + + void computeScores(){ + print("====COMPUTE POINTS===="); + for(var element in rounds){ + print(element.points); + points[element.player] = (points[element.player] ?? 0) + (element.points ?? 0); + print(element.player.name + " : " + points[element.player].toString()); } - throw Exception("Player not in the game."); } Map getRank() { - Map rank = {}; - - for (var player in players) { - rank.addAll({player: getPointByPlayerId(player.id)}); - } var sortedByValueMap = Map.fromEntries( - rank.entries.toList()..sort((e1, e2) => e2.value.compareTo(e1.value))); + points.entries.toList()..sort((e1, e2) => e2.value.compareTo(e1.value))); return sortedByValueMap; } } diff --git a/Sources/bowlin_project/lib/model/GamePlayer.dart b/Sources/bowlin_project/lib/model/GamePlayer.dart index 43f64c7..efab5d1 100644 --- a/Sources/bowlin_project/lib/model/GamePlayer.dart +++ b/Sources/bowlin_project/lib/model/GamePlayer.dart @@ -23,6 +23,7 @@ class GamePlayer { } if (currentRoundIndex >= game.rounds.length) { print("FINISHED"); + game.computeScores(); context.go("/scoreboard", extra: game); } else { print("IN GAME : " + currentRoundIndex.toString()); diff --git a/Sources/bowlin_project/lib/model/LastRound.dart b/Sources/bowlin_project/lib/model/LastRound.dart index 9b50ec4..c7bebd4 100644 --- a/Sources/bowlin_project/lib/model/LastRound.dart +++ b/Sources/bowlin_project/lib/model/LastRound.dart @@ -23,7 +23,11 @@ class LastRound extends AbstractRound{ return false; }else if(secondThrow==null){ secondThrow=val; - return ((firstThrow??0)+(secondThrow??0)<10); + if ((firstThrow??0)+(secondThrow??0)<10){ + computePoints(); + return true ; + } + return false; }else if((firstThrow??0)+(secondThrow??0)>=10){ thirdThrow=val; } diff --git a/Sources/bowlin_project/lib/model/Round.dart b/Sources/bowlin_project/lib/model/Round.dart index 5959532..ee1128b 100644 --- a/Sources/bowlin_project/lib/model/Round.dart +++ b/Sources/bowlin_project/lib/model/Round.dart @@ -13,8 +13,12 @@ class Round extends AbstractRound{ previousRound?.update(val); unsubscribePreviousRound(); } - return val==10; - }else if(firstThrow!=10 && secondThrow!=null){ + if(val==10){ + computePoints(); + return true; + } + return false; + }else if(firstThrow!=10 && secondThrow==null){ secondThrow=val; } computePoints(); @@ -24,7 +28,7 @@ class Round extends AbstractRound{ @override void computePoints() { points = (firstThrow ?? 0)+(secondThrow ?? 0); - + print("ROUND " + number.toString() + " - " + player.id.toString() + "Compute points : " + points.toString()); if(previousRound?.isStrike() ?? false){ previousRound?.update(points ?? 0); } diff --git a/Sources/bowlin_project/lib/widgets/ingame_widgets.dart b/Sources/bowlin_project/lib/widgets/ingame_widgets.dart index 4624b16..ed10c6c 100644 --- a/Sources/bowlin_project/lib/widgets/ingame_widgets.dart +++ b/Sources/bowlin_project/lib/widgets/ingame_widgets.dart @@ -600,15 +600,16 @@ class StrikeButton extends StatelessWidget { class SpareButton extends StatelessWidget { final int currentSelected; final IntCallback onSonChanged; + final int valueToReturn; const SpareButton( - {Key? key, required this.onSonChanged, required this.currentSelected}) + {Key? key, required this.onSonChanged, required this.currentSelected, required this.valueToReturn}) : super(key: key); @override Widget build(BuildContext context) { return GestureDetector( onTap: () { - onSonChanged(10); + onSonChanged(valueToReturn); }, child: Container( width: double.infinity, @@ -622,7 +623,7 @@ class SpareButton extends StatelessWidget { "SPARE !", style: GoogleFonts.roboto( color: - currentSelected == 10 ? Colors.pink : CupertinoColors.black, + currentSelected == valueToReturn ? Colors.pink : CupertinoColors.black, decoration: TextDecoration.none, fontWeight: FontWeight.w900, fontStyle: FontStyle.italic, @@ -777,6 +778,7 @@ class _NumberPadState extends State { onSonChanged: (int newId) { updateId(newId); }, + valueToReturn: widget.maxValue, ) ], ); -- 2.36.3