diff --git a/Sources/bowlin_project/lib/model/AbstractRound.dart b/Sources/bowlin_project/lib/model/AbstractRound.dart index e21073c..81c1e62 100644 --- a/Sources/bowlin_project/lib/model/AbstractRound.dart +++ b/Sources/bowlin_project/lib/model/AbstractRound.dart @@ -66,6 +66,9 @@ abstract class AbstractRound { return (firstThrow ?? 0)+(secondThrow ?? 0)==10; } + int getNbStrike(); + int getNbSpares(); + int getPinsKnockedDown(); 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 35de3f7..4b159e9 100644 --- a/Sources/bowlin_project/lib/model/GameDetail.dart +++ b/Sources/bowlin_project/lib/model/GameDetail.dart @@ -10,7 +10,7 @@ import 'User.dart'; class GameDetail { int _id; DateTime _time; - int? _winner; + Player? _winner; int _nbPoints; bool _isFinished; int _host; @@ -45,9 +45,9 @@ class GameDetail { _time = value; } - int? get winner => _winner; + Player? get winner => _winner; - set winner(int? value) { + set winner(Player? value) { _winner = value; } @@ -88,17 +88,22 @@ class GameDetail { for(var p in players){ if(p is User){ p.games.add(Game(this.id, this.time, points[p] ?? 0, true, players)); + p.stat.updateStats(this, p); } } } + void computeWinner(){ + print(getRank().entries.first.key.name); + this.winner = getRank().entries.first.key; + } + 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()); } + computeWinner(); addGameToUsers(); } diff --git a/Sources/bowlin_project/lib/model/LastRound.dart b/Sources/bowlin_project/lib/model/LastRound.dart index c7bebd4..3c90d7c 100644 --- a/Sources/bowlin_project/lib/model/LastRound.dart +++ b/Sources/bowlin_project/lib/model/LastRound.dart @@ -55,4 +55,44 @@ class LastRound extends AbstractRound{ return secondThrow==10; } } + + @override + int getNbSpares() { + int nb = 0; + if(firstThrow!=10){ + if((firstThrow??0)+(secondThrow??0)==10){ + nb+=1; + } + }else{ + if((thirdThrow??0)+(secondThrow??0)==10) { + nb+=1; + } + } + return nb; + } + + @override + int getNbStrike() { + int nb = 0; + if(firstThrow==10){ + nb+=1; + if(secondThrow==10){ + nb+=1; + if(thirdThrow==10) { + nb+=1; + } + } + }else{ + if(thirdThrow==10) { + nb+=1; + } + } + return nb; + } + + @override + int getPinsKnockedDown() { + return (firstThrow??0)+(secondThrow??0)+(thirdThrow??0); + } + } diff --git a/Sources/bowlin_project/lib/model/Round.dart b/Sources/bowlin_project/lib/model/Round.dart index 4f79629..f9c81d1 100644 --- a/Sources/bowlin_project/lib/model/Round.dart +++ b/Sources/bowlin_project/lib/model/Round.dart @@ -39,5 +39,27 @@ class Round extends AbstractRound{ return firstThrow==null; } + @override + int getNbSpares() { + if(isSpare()){ + return 1; + } + return 0; + } + + @override + int getNbStrike() { + if(isStrike()){ + return 1; + } + return 0; + } + + @override + int getPinsKnockedDown() { + return (firstThrow ?? 0)+(secondThrow ?? 0); + } + + } diff --git a/Sources/bowlin_project/lib/model/Stat.dart b/Sources/bowlin_project/lib/model/Stat.dart index f16097b..2c874c4 100644 --- a/Sources/bowlin_project/lib/model/Stat.dart +++ b/Sources/bowlin_project/lib/model/Stat.dart @@ -1,3 +1,8 @@ +import 'package:bowl_in/model/GameDetail.dart'; +import 'package:bowl_in/model/Player.dart'; + +import 'User.dart'; + class Stat { int _nbVictory; int _nbDefeat; @@ -76,4 +81,22 @@ class Stat { set avgPinsPerRound(double value) { _avgPinsPerRound = value; } + + void updateStats(GameDetail gd, Player p){ + nbGames +=1; + if(gd.winner == p){ + nbVictory +=1; + } + double totalpins = 0; + for(var r in gd.rounds){ + + if(p == r.player){ + nbStrikes += r.getNbStrike(); + nbSpares += r.getNbSpares(); + totalpins = totalpins + r.getPinsKnockedDown(); + } + } + avgPinsPerRound = ((avgPinsPerRound * (nbGames-1)) + (totalpins/10))/nbGames; + + } } diff --git a/Sources/bowlin_project/lib/model/StubManager/StubData.dart b/Sources/bowlin_project/lib/model/StubManager/StubData.dart index c0dd698..a4a2ef5 100644 --- a/Sources/bowlin_project/lib/model/StubManager/StubData.dart +++ b/Sources/bowlin_project/lib/model/StubManager/StubData.dart @@ -52,15 +52,15 @@ class StubData extends IManager { ], [], Stat( - 10, - 2, - 12, - 130, - 7, - 6, - 700, - 58.33, - 30.2)), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0)), User( 9, "Dave", @@ -84,15 +84,15 @@ class StubData extends IManager { ], [], Stat( - 10, - 2, - 12, - 110, - 7, - 6, - 700, - 58.33, - 30.2)), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0)), User( 22, "Louison", @@ -179,15 +179,15 @@ class StubData extends IManager { 30.2)), ], Stat( - 2, - 7, - 9, - 80, - 4, - 3, - 250, - 27.77, - 10.55)) + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0)) ]; List _gameDetails = []; diff --git a/Sources/bowlin_project/lib/views/analysis_screen.dart b/Sources/bowlin_project/lib/views/analysis_screen.dart index 1fdea2f..303ef90 100644 --- a/Sources/bowlin_project/lib/views/analysis_screen.dart +++ b/Sources/bowlin_project/lib/views/analysis_screen.dart @@ -86,11 +86,14 @@ class _AnalysisScreenState extends State { children: [ StatsCard( title: "Number of victory", - val: MyApp.controller.userCurrent.stat.nbVictory - .toDouble()), + val: MyApp.controller.userCurrent.stat.nbVictory.toDouble(), + precision: 0, + ), StatsCard( title: "Average pins per round", - val: MyApp.controller.userCurrent.stat.avgPinsPerRound), + val: MyApp.controller.userCurrent.stat.avgPinsPerRound, + precision: 2, + ), ], )) ]), diff --git a/Sources/bowlin_project/lib/widgets/analysis_card.dart b/Sources/bowlin_project/lib/widgets/analysis_card.dart index 58105da..f9bd586 100644 --- a/Sources/bowlin_project/lib/widgets/analysis_card.dart +++ b/Sources/bowlin_project/lib/widgets/analysis_card.dart @@ -101,8 +101,9 @@ class GameCard extends StatelessWidget { class StatsCard extends StatelessWidget { final String title; final double val; + final int precision; - const StatsCard({Key? key, required this.title, required this.val}) + const StatsCard({Key? key, required this.title, required this.val, required this.precision}) : super(key: key); @override @@ -137,7 +138,7 @@ class StatsCard extends StatelessWidget { ), Spacer(), Text( - this.val.toString(), + this.val.toStringAsFixed(precision), style: GoogleFonts.roboto( fontWeight: FontWeight.w900, fontSize: 28,