From 86d6f5afb553313c593981a372bc2008384edfca Mon Sep 17 00:00:00 2001 From: "arthur.valin" Date: Sat, 18 Mar 2023 13:25:52 +0100 Subject: [PATCH] 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