Implementing bowling game algorithm
continuous-integration/drone/push Build is failing Details

Arthur_BowlingAlgo
Arthur VALIN 2 years ago
parent a2257a8711
commit 86d6f5afb5

@ -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:bowl_in/widgets/button_new_party.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
@ -38,6 +41,9 @@ final GoRouter router = GoRouter(
GoRoute( GoRoute(
path: 'in-game', path: 'in-game',
builder: (BuildContext context, GoRouterState state) { builder: (BuildContext context, GoRouterState state) {
if(state.extra is AbstractRound) {
return InGameScreen2(currentRound: state.extra as AbstractRound);
}
return InGameScreen(); return InGameScreen();
}, },
), ),

@ -4,12 +4,13 @@ abstract class AbstractRound {
int? _firstThrow; int? _firstThrow;
int? _secondThrow; int? _secondThrow;
int? _points; int? _points;
int _number;
Player _player; Player _player;
AbstractRound? _previousRound; AbstractRound? _previousRound;
// Constructor // Constructor
AbstractRound(this._firstThrow, this._secondThrow, this._points, this._player); AbstractRound(this._firstThrow, this._secondThrow, this._points, this._player, this._number);
// Getters and setters // Getters and setters
int? get firstThrow => _firstThrow; int? get firstThrow => _firstThrow;
@ -30,6 +31,13 @@ abstract class AbstractRound {
_points = value; _points = value;
} }
int get number => _number;
set number(int value) {
_number = value;
}
Player get player => _player; Player get player => _player;
set player(Player value) { set player(Player value) {
@ -44,6 +52,7 @@ abstract class AbstractRound {
bool computeNext(int val); bool computeNext(int val);
void computePoints(); void computePoints();
bool shotIsStrike();
bool isStrike() { bool isStrike() {
return firstThrow==10; return firstThrow==10;
@ -57,6 +66,7 @@ abstract class AbstractRound {
return (firstThrow ?? 0)+(secondThrow ?? 0)==10; return (firstThrow ?? 0)+(secondThrow ?? 0)==10;
} }
void subscribe(AbstractRound nextRound){ void subscribe(AbstractRound nextRound){
nextRound.previousRound=this; nextRound.previousRound=this;
} }

@ -1,4 +1,7 @@
import 'package:bowl_in/model/AbstractRound.dart'; 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 'Player.dart';
import 'Round.dart'; import 'Round.dart';
@ -6,7 +9,7 @@ import 'Round.dart';
class GameDetail { class GameDetail {
int _id; int _id;
DateTime _time; DateTime _time;
int _winner; int? _winner;
int _nbPoints; int _nbPoints;
bool _isFinished; bool _isFinished;
int _host; int _host;
@ -21,8 +24,19 @@ class GameDetail {
this._nbPoints, this._nbPoints,
this._isFinished, this._isFinished,
this._host, 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 // Getters and setters
int get id => _id; int get id => _id;
@ -37,9 +51,9 @@ class GameDetail {
_time = value; _time = value;
} }
int get winner => _winner; int? get winner => _winner;
set winner(int value) { set winner(int? value) {
_winner = value; _winner = value;
} }

@ -3,27 +3,42 @@ import 'package:flutter/cupertino.dart';
import 'GameDetail.dart'; import 'GameDetail.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'Round.dart';
class GamePlayer{ class GamePlayer{
final GameDetail game; late GameDetail _game;
int currentRoundIndex = 0; 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){ if(isRoundFinished){
print("++");
currentRoundIndex++; currentRoundIndex++;
} }
if(currentRoundIndex>game.rounds.length){ if(currentRoundIndex>=game.rounds.length){
print("FINISHED");
context.go("/scoreboard"); context.go("/scoreboard");
}else{ }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(){ void onSpareOrStrike(){
if(currentRoundIndex>=game.rounds.length-game.players.length){ if(currentRoundIndex<game.rounds.length-game.players.length){
print("ON SPAREORSTRIKE");
game.rounds[currentRoundIndex].subscribe(game.rounds[currentRoundIndex+game.players.length]); game.rounds[currentRoundIndex].subscribe(game.rounds[currentRoundIndex+game.players.length]);
} }
} }

@ -1,3 +1,4 @@
import 'package:bowl_in/model/GameDetail.dart';
import 'package:bowl_in/model/GamePlayer.dart'; import 'package:bowl_in/model/GamePlayer.dart';
import 'User.dart'; import 'User.dart';
@ -8,8 +9,8 @@ import 'Game.dart';
abstract class IManager { abstract class IManager {
late User _userCurrent; late User _userCurrent;
late Game _gameCurrent; late GameDetail _gameCurrent;
late GamePlayer _gamePlayer; late GamePlayer _gamePlayer = GamePlayer();
late IUserManager _userMgr; late IUserManager _userMgr;
late IGameManager _gameMgr; late IGameManager _gameMgr;
@ -26,7 +27,12 @@ abstract class IManager {
_gamePlayer = value; _gamePlayer = value;
} }
Game get gameCurrent => _gameCurrent; GameDetail get gameCurrent => _gameCurrent;
set gameCurrent(GameDetail value) {
_gameCurrent = value;
}
IUserManager get userMgr => _userMgr; IUserManager get userMgr => _userMgr;
IGameManager get gameMgr => _gameMgr; IGameManager get gameMgr => _gameMgr;
} }

@ -5,7 +5,7 @@ import 'Player.dart';
class LastRound extends AbstractRound{ class LastRound extends AbstractRound{
int? _thirdThrow; 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; int? get thirdThrow => _thirdThrow;
@ -21,14 +21,11 @@ class LastRound extends AbstractRound{
previousRound?.update(val); previousRound?.update(val);
} }
return false; return false;
}else if(secondThrow!=null){ }else if(secondThrow==null){
secondThrow=val; secondThrow=val;
return false; return ((firstThrow??0)+(secondThrow??0)<10);
}else if((firstThrow??0)+(secondThrow??0)>=10){ }else if((firstThrow??0)+(secondThrow??0)>=10){
thirdThrow=val; thirdThrow=val;
return false;
} }
computePoints(); computePoints();
return true; return true;
@ -44,5 +41,14 @@ class LastRound extends AbstractRound{
unsubscribePreviousRound(); unsubscribePreviousRound();
} }
@override
bool shotIsStrike(){
if(firstThrow==null){
return true;
}else if(secondThrow==null){
return firstThrow==10;
}else{
return secondThrow==10;
}
}
} }

@ -3,9 +3,7 @@ import 'GamePlayer.dart';
class Round extends AbstractRound{ class Round extends AbstractRound{
GamePlayer gamePlayer; Round(super.firstThrow, super.secondThrow, super.points, super.player, super.number);
Round(super.firstThrow, super.secondThrow, super.points, super.player, this.gamePlayer);
@override @override
bool computeNext(int val) { bool computeNext(int val) {
@ -15,13 +13,12 @@ class Round extends AbstractRound{
previousRound?.update(val); previousRound?.update(val);
unsubscribePreviousRound(); unsubscribePreviousRound();
} }
return false; //Le round n'est pas fini return val==10;
}else if(firstThrow==10){ }else if(firstThrow!=10 && secondThrow!=null){
secondThrow=val; secondThrow=val;
return false; //Le round n'est pas fini
} }
computePoints(); computePoints();
return true; //Le round est fini return true;
} }
@override @override
@ -31,12 +28,13 @@ class Round extends AbstractRound{
if(previousRound?.isStrike() ?? false){ if(previousRound?.isStrike() ?? false){
previousRound?.update(points ?? 0); previousRound?.update(points ?? 0);
} }
if(isSpareOrStrike()){
gamePlayer.onSpareOrStrike();
}
unsubscribePreviousRound(); unsubscribePreviousRound();
} }
@override
bool shotIsStrike(){
return firstThrow==null;
}
} }

@ -24,7 +24,7 @@ class StubData extends IManager {
_initGameDetails(); _initGameDetails();
_initGame(); _initGame();
userCurrent = players[8] as User; userCurrent = players[8] as User;
userCurrent.games = games; userCurrent.games = [];
} }
IUserManager get userMgr => _userMgr; IUserManager get userMgr => _userMgr;
@ -50,7 +50,16 @@ class StubData extends IManager {
Achievement("Win a game") 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( User(
9, 9,
"Dave", "Dave",
@ -73,7 +82,16 @@ class StubData extends IManager {
Achievement("Win a game") 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( User(
22, 22,
"Louison", "Louison",
@ -85,7 +103,16 @@ class StubData extends IManager {
Achievement("Win a game") 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( User(
23, 23,
"Owen", "Owen",
@ -97,7 +124,16 @@ class StubData extends IManager {
Achievement("Win a game") 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( User(
24, 24,
"LULU", "LULU",
@ -109,7 +145,16 @@ class StubData extends IManager {
Achievement("Win a game") 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( User(
25, 25,
"Raphael", "Raphael",
@ -121,66 +166,88 @@ class StubData extends IManager {
Achievement("Win a game") 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<GameDetail> _gameDetails = []; List<GameDetail> _gameDetails = [];
void _initGameDetails() { void _initGameDetails() {
gameDetails.add(GameDetail(1, DateTime.now(), players[7].id, 123, true, players[7].id, rounds, [players[0], players[1]])); // 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(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, // gameDetails.add(GameDetail(3, DateTime.now(), players[7].id, 93, true,
players[7].id, [], [players[0], players[7]])); // players[7].id, [], [players[0], players[7]]));
gameDetails.add(GameDetail(4, DateTime.now(), players[7].id, 93, true, // gameDetails.add(GameDetail(4, DateTime.now(), players[7].id, 93, true,
players[7].id, [], [players[1], players[7]])); // players[7].id, [], [players[1], players[7]]));
} }
List<GameDetail> get gameDetails => _gameDetails; List<GameDetail> get gameDetails => _gameDetails;
List<Round> _rounds = []; List<Round> _rounds = [];
void _initRounds() { void _initRounds() {
rounds.add(Round(4, 5, 9, players[1], gamePlayer)); rounds.add(Round(4, 5, 9, players[1], 1));
rounds.add(Round(4, 1, 5, players[8], gamePlayer)); rounds.add(Round(4, 1, 5, players[8], 1));
rounds.add(Round(4, 5, 9, players[7], gamePlayer)); rounds.add(Round(4, 5, 9, players[7], 1));
rounds.add(Round(4, 1, 5, players[1], gamePlayer)); rounds.add(Round(4, 1, 5, players[1], 1));
rounds.add(Round(4, 5, 9, players[7], gamePlayer)); rounds.add(Round(4, 5, 9, players[7], 1));
rounds.add(Round(1, 5, 6, players[8], gamePlayer)); rounds.add(Round(1, 5, 6, players[8], 1));
rounds.add(Round(4, 1, 5, players[7], gamePlayer)); rounds.add(Round(4, 1, 5, players[7], 1));
rounds.add(Round(1, 5, 6, players[8], gamePlayer)); rounds.add(Round(1, 5, 6, players[8], 1));
rounds.add(Round(4, 5, 9, players[7], gamePlayer)); rounds.add(Round(4, 5, 9, players[7], 1));
rounds.add(Round(9, 0, 9, players[8], gamePlayer)); rounds.add(Round(9, 0, 9, players[8], 1));
rounds.add(Round(4, 5, 9, players[7], gamePlayer)); rounds.add(Round(4, 5, 9, players[7], 1));
rounds.add(Round(4, 5, 9, players[8], gamePlayer)); rounds.add(Round(4, 5, 9, players[8], 1));
rounds.add(Round(4, 2, 6, players[0], gamePlayer)); rounds.add(Round(4, 2, 6, players[0], 1));
rounds.add(Round(3, 5, 8, players[1], gamePlayer)); rounds.add(Round(3, 5, 8, players[1], 1));
rounds.add(Round(4, 5, 9, players[2], gamePlayer)); rounds.add(Round(4, 5, 9, players[2], 1));
rounds.add(Round(4, 5, 9, players[4], gamePlayer)); rounds.add(Round(4, 5, 9, players[4], 1));
rounds.add(Round(1, 5, 6, players[6], gamePlayer)); rounds.add(Round(1, 5, 6, players[6], 1));
rounds.add(Round(4, 5, 9, players[8], gamePlayer)); rounds.add(Round(4, 5, 9, players[8], 1));
rounds.add(Round(4, 2, 6, players[7], gamePlayer)); rounds.add(Round(4, 2, 6, players[7], 1));
rounds.add(Round(3, 5, 8, players[8], gamePlayer)); rounds.add(Round(3, 5, 8, players[8], 1));
rounds.add(Round(4, 5, 9, players[7], gamePlayer)); rounds.add(Round(4, 5, 9, players[7], 1));
rounds.add(Round(4, 5, 9, players[8], gamePlayer)); rounds.add(Round(4, 5, 9, players[8], 1));
rounds.add(Round(1, 5, 6, players[7], gamePlayer)); rounds.add(Round(1, 5, 6, players[7], 1));
rounds.add(Round(4, 5, 9, players[8], gamePlayer)); rounds.add(Round(4, 5, 9, players[8], 1));
rounds.add(Round(4, 5, 9, players[7], gamePlayer)); rounds.add(Round(4, 5, 9, players[7], 1));
rounds.add(Round(4, 1, 5, players[8], gamePlayer)); rounds.add(Round(4, 1, 5, players[8], 1));
} }
List<Round> get rounds => _rounds; List<Round> get rounds => _rounds;
List<Game> _games = []; List<Game> _games = [];
void _initGame() { void _initGame() {
games.add(Game( // games.add(Game(
gameDetails[0].id, // gameDetails[0].id,
DateTime.now().subtract(Duration(days: 14)), // DateTime.now().subtract(Duration(days: 14)),
123, // 123,
true, // true,
[players[0].id, players[1].id])); // [players[0].id, players[1].id]));
games.add(Game(gameDetails[1].id, DateTime.now(), 101, true, // games.add(Game(gameDetails[1].id, DateTime.now(), 101, true,
[players[1].id, players[0].id])); // [players[1].id, players[0].id]));
// }
//
// List<Game> get games => _games;
} }
List<Game> get games => _games;
} }

@ -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/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import '../widgets/button_new_party.dart'; import '../widgets/button_new_party.dart';
@ -48,11 +52,12 @@ class _InGameScreenState extends State<InGameScreen> {
Spacer(), Spacer(),
ElevatedButton( ElevatedButton(
onPressed: () { onPressed: () {
setState(() { GameDetail gd = GameDetail(1, DateTime.now(), null, 123, false,
widgetHolder = InGameCardThrow( MyApp.controller.userCurrent.id, [MyApp.controller.userCurrent, MyApp.controller.userMgr.getUserById(2)]);
numberThrow: 2,
); MyApp.controller.gamePlayer.game = gd;
}); MyApp.controller.gameCurrent = gd;
MyApp.controller.gamePlayer.onNext(false, context);
}, },
child: Text( child: Text(
"PLAY", "PLAY",

@ -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/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.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/ingame_widgets.dart';
import '../widgets/scores_list_widget.dart'; import '../widgets/scores_list_widget.dart';
class InGameScreen extends StatefulWidget { class InGameScreen2 extends StatefulWidget {
final Round currentRound; final AbstractRound currentRound;
const InGameScreen({Key? key, required this.currentRound}) : super(key: key); const InGameScreen2({Key? key, required this.currentRound}) : super(key: key);
@override @override
State<InGameScreen> createState() => _InGameScreenState(); State<InGameScreen2> createState() => _InGameScreen2State();
} }
class _InGameScreenState extends State<InGameScreen> { class _InGameScreen2State extends State<InGameScreen2> {
late Widget widgetHolder; late InGameCardThrow widgetHolder;
int selectedValue = 0;
void setSelectedValue(int val){
selectedValue=val;
}
void initState() { void initState() {
if (widget.currentRound.firstThrow == null) if (widget.currentRound.firstThrow == null)
widgetHolder = InGameCardThrow(numberThrow: 1); widgetHolder = InGameCardThrow(numberThrow: 1, currentRound:
widget.currentRound, setSelectedValue: setSelectedValue);
else if (widget.currentRound.secondThrow == null) { else if (widget.currentRound.secondThrow == null) {
widgetHolder = InGameCardThrow(numberThrow: 2); widgetHolder = InGameCardThrow(numberThrow: 2
, currentRound:
widget.currentRound, setSelectedValue: setSelectedValue);
} else { } else {
widgetHolder = InGameCardThrow(numberThrow: 3); widgetHolder = InGameCardThrow(numberThrow: 3, currentRound:
widget.currentRound, setSelectedValue: setSelectedValue);
} }
super.initState(); super.initState();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack( return Stack(
children: [ children: [
Container( Container(
@ -56,11 +70,15 @@ class _InGameScreenState extends State<InGameScreen> {
Spacer(), Spacer(),
ElevatedButton( ElevatedButton(
onPressed: () { onPressed: () {
setState(() { bool isFinished = widget.currentRound.computeNext(
widgetHolder = InGameCardThrow( selectedValue
numberThrow: 2,
); );
});
if(widget.currentRound.isSpareOrStrike()){
MyApp.controller.gamePlayer.onSpareOrStrike();
}
MyApp.controller.gamePlayer.onNext(isFinished, context);
}, },
child: Text( child: Text(
"PLAY", "PLAY",
@ -81,6 +99,7 @@ class _InGameScreenState extends State<InGameScreen> {
), ),
minimumSize: Size(200, 80), minimumSize: Size(200, 80),
), ),
), ),
Spacer(), Spacer(),
], ],

@ -6,6 +6,8 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import '../model/AbstractRound.dart';
class FinalScoreBoard extends StatefulWidget { class FinalScoreBoard extends StatefulWidget {
const FinalScoreBoard({Key? key}) : super(key: key); const FinalScoreBoard({Key? key}) : super(key: key);
@ -346,14 +348,17 @@ class _UserInGameState extends State<UserInGame> {
class InGameCardThrow extends StatefulWidget { class InGameCardThrow extends StatefulWidget {
final int numberThrow; final int numberThrow;
const InGameCardThrow({Key? key, required this.numberThrow}) final AbstractRound currentRound;
: super(key: key); final Function(int) setSelectedValue;
const InGameCardThrow({Key? key, required this.numberThrow, required this.currentRound, required this.setSelectedValue}): super(key: key);
@override @override
State<InGameCardThrow> createState() => _InGameCardThrowState(); State<InGameCardThrow> createState() => _InGameCardThrowState();
} }
class _InGameCardThrowState extends State<InGameCardThrow> { class _InGameCardThrowState extends State<InGameCardThrow> {
GlobalKey<_NumberPadState> _numberPadKey = GlobalKey();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
@ -388,7 +393,9 @@ class _InGameCardThrowState extends State<InGameCardThrow> {
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
decoration: TextDecoration.none)), decoration: TextDecoration.none)),
TextSpan( 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( style: GoogleFonts.roboto(
fontSize: 18, fontSize: 18,
color: CupertinoColors.black, color: CupertinoColors.black,
@ -410,12 +417,14 @@ class _InGameCardThrowState extends State<InGameCardThrow> {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Round_picture( Round_picture(
pseudo: "Lucas", pseudo: widget.currentRound.player.name,
image: "assets/images/image_user_red.png"), image: widget.currentRound.player.image),
], ],
)), )),
NumberPad( NumberPad(
numberThrow: widget.numberThrow, numberThrow: widget.numberThrow,
setSelectedValue: widget.setSelectedValue,
currentRound: widget.currentRound
), ),
], ],
), ),
@ -528,24 +537,26 @@ class SpareButton extends StatelessWidget {
class NumberPad extends StatefulWidget { class NumberPad extends StatefulWidget {
final int numberThrow; 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 @override
State<NumberPad> createState() => _NumberPadState(); State<NumberPad> createState() => _NumberPadState();
} }
class _NumberPadState extends State<NumberPad> { class _NumberPadState extends State<NumberPad> {
int NumSelected = 100; int NumSelected = 0;
void updateId(int newNum) { void updateId(int newNum) {
print(newNum);
setState(() { setState(() {
NumSelected = newNum; NumSelected = newNum;
widget.setSelectedValue(newNum);
}); });
} }
void initState() { void initState() {
NumSelected = 100; NumSelected = 0;
super.initState(); super.initState();
} }
@ -649,7 +660,7 @@ class _NumberPadState extends State<NumberPad> {
], ],
), ),
), ),
widget.numberThrow == 1 widget.currentRound.shotIsStrike()
? StrikeButton( ? StrikeButton(
currentSelected: NumSelected, currentSelected: NumSelected,
onSonChanged: (int newId) { onSonChanged: (int newId) {

@ -1,274 +1,278 @@
import '../lib/model/Player.dart'; // import 'package:bowl_in/model/GamePlayer.dart';
import '../lib/model/Guest.dart'; //
import '../lib/model/User.dart'; // import '../lib/model/Player.dart';
import '../lib/model/Stat.dart'; // import '../lib/model/Guest.dart';
import '../lib/model/Round.dart'; // import '../lib/model/User.dart';
import '../lib/model/GameDetail.dart'; // import '../lib/model/Stat.dart';
import '../lib/model/StubManager/StubData.dart'; // import '../lib/model/Round.dart';
import '../lib/model/IManager.dart'; // import '../lib/model/GameDetail.dart';
import 'dart:math'; // import '../lib/model/StubManager/StubData.dart';
import '../lib/model/Achievement.dart'; // import '../lib/model/IManager.dart';
// import 'dart:math';
void main() { // import '../lib/model/Achievement.dart';
List<Stat> stats = []; //
Random random = Random(); // void main() {
// List<Stat> stats = [];
for (int i = 0; i < 10; i++) { // Random random = Random();
Stat stat = Stat( //
random.nextInt(50) + 1, // valeur aléatoire entre 1 et 50 // for (int i = 0; i < 10; i++) {
random.nextInt(20) + 1, // valeur aléatoire entre 1 et 20 // Stat stat = Stat(
random.nextInt(30) + 1, // valeur aléatoire entre 1 et 30 // random.nextInt(50) + 1, // valeur aléatoire entre 1 et 50
random.nextInt(1000) + 1, // valeur aléatoire entre 1 et 1000 // random.nextInt(20) + 1, // valeur aléatoire entre 1 et 20
random.nextInt(10) + 1, // valeur aléatoire entre 1 et 10 // random.nextInt(30) + 1, // valeur aléatoire entre 1 et 30
random.nextInt(5) + 1, // valeur aléatoire entre 1 et 5 // random.nextInt(1000) + 1, // valeur aléatoire entre 1 et 1000
random.nextInt(5000) + 1000, // valeur aléatoire entre 1000 et 6000 // random.nextInt(10) + 1, // valeur aléatoire entre 1 et 10
random.nextInt(300) + 1, // valeur aléatoire entre 1 et 300 // random.nextInt(5) + 1, // valeur aléatoire entre 1 et 5
random.nextDouble() * 10 // valeur aléatoire entre 0 et 10 // random.nextInt(5000) + 1000, // valeur aléatoire entre 1000 et 6000
); // random.nextInt(300) + 1, // valeur aléatoire entre 1 et 300
stats.add(stat); // random.nextDouble() * 10 // valeur aléatoire entre 0 et 10
} // );
// stats.add(stat);
print("Stats:"); // }
for (var stat in stats) { //
print( // print("Stats:");
"\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}"); // 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", // User ami = User(
"https://fastly.picsum.photos/id/288/2000/2000.jpg?hmac=AUboE-jzAzofYj_O3w_EqtZU3JHzcg7HR1IQd1Ce7lY", // 5,
"Lucas.delanier@etu.uca.fr", // "Lucas",
[], // "https://fastly.picsum.photos/id/288/2000/2000.jpg?hmac=AUboE-jzAzofYj_O3w_EqtZU3JHzcg7HR1IQd1Ce7lY",
[], // "Lucas.delanier@etu.uca.fr",
stats[1]); // [],
// [],
List<Player> players = [ // stats[1]);
Player(1, "Rami", //
"https://fastly.picsum.photos/id/1060/2000/2000.jpg?hmac=_RrU8GpkCDUlVKfgyWE-GcX-GS5TKNyUzdFbJAGXHV4"), // List<Player> players = [
Player(2, "Emre", // Player(1, "Rami",
"https://fastly.picsum.photos/id/670/2000/2000.jpg?hmac=zWqTr_vDEab3dBtp7JZgJP8TRCPNanJ4tYwDDd-jGYA"), // "https://fastly.picsum.photos/id/1060/2000/2000.jpg?hmac=_RrU8GpkCDUlVKfgyWE-GcX-GS5TKNyUzdFbJAGXHV4"),
Guest(3, "Bot1", // Player(2, "Emre",
"https://fastly.picsum.photos/id/820/2000/2000.jpg?hmac=Ctxx2feJNZnG1S7UPx_YrWcEw89tKb7fR8i1W-VTOz4"), // "https://fastly.picsum.photos/id/670/2000/2000.jpg?hmac=zWqTr_vDEab3dBtp7JZgJP8TRCPNanJ4tYwDDd-jGYA"),
Guest(4, "Bot2", // Guest(3, "Bot1",
"https://fastly.picsum.photos/id/288/2000/2000.jpg?hmac=AUboE-jzAzofYj_O3w_EqtZU3JHzcg7HR1IQd1Ce7lY"), // "https://fastly.picsum.photos/id/820/2000/2000.jpg?hmac=Ctxx2feJNZnG1S7UPx_YrWcEw89tKb7fR8i1W-VTOz4"),
ami, // Guest(4, "Bot2",
User( // "https://fastly.picsum.photos/id/288/2000/2000.jpg?hmac=AUboE-jzAzofYj_O3w_EqtZU3JHzcg7HR1IQd1Ce7lY"),
6, // ami,
"Louison", // User(
"https://fastly.picsum.photos/id/1029/2000/2000.jpg?hmac=_K3pMobVk00dfNR7rsj1NLnEBB5Gf88SvGPbbjoH-Uc", // 6,
"louison.parant@etu.uca.fr", // "Louison",
[ // "https://fastly.picsum.photos/id/1029/2000/2000.jpg?hmac=_K3pMobVk00dfNR7rsj1NLnEBB5Gf88SvGPbbjoH-Uc",
Achievement("5 games"), // "louison.parant@etu.uca.fr",
Achievement("2 strikes in a row"), // [
Achievement("Win a game") // Achievement("5 games"),
], // Achievement("2 strikes in a row"),
[ami], // Achievement("Win a game")
stats[0]) // ],
]; // [ami],
// stats[0])
print("Players :"); // ];
// afficahge de toutes les informations de tous les joueurs //
for (var player in players) { // print("Players :");
displayPlayer(player,1); // // afficahge de toutes les informations de tous les joueurs
} // for (var player in players) {
// displayPlayer(player,1);
//GameDetail // }
//
List<GameDetail> games = [ // //GameDetail
GameDetail( //
1, DateTime.now(), players[0].id, 290, true, null, players[0].id, [ //
Round(10, null, 10, players[0]), // List<GameDetail> games = [];
Round(5, 2, 7, players[1]), // games.add(GameDetail(
Round(5, 1, 12, players[0]), // 1, DateTime.now(), players[0].id, 290, true, null, players[0].id)
Round(5, 2, 7, players[1]), // , [
], [ // Round(10, null, 10, players[0], ),
players[0], // Round(5, 2, 7, players[1]),
players[1] // Round(5, 1, 12, players[0]),
]), // Round(5, 2, 7, players[1]),
GameDetail(2, DateTime.now().subtract(Duration(days: 2)), // ], [
players[1].id, 250, true, null, players[1].id, [ // players[0],
Round(7, null, 7, players[1]), // players[1]
Round(3, 3, 9, players[0]), // ]),
Round(5, 2, 7, players[1]), // GameDetail(2, DateTime.now().subtract(Duration(days: 2)),
Round(5, 1, 12, players[0]) // players[1].id, 250, true, null, players[1].id, [
], [ // Round(7, null, 7, players[1]),
players[0], // Round(3, 3, 9, players[0]),
players[1] // Round(5, 2, 7, players[1]),
]), // Round(5, 1, 12, players[0])
GameDetail(3, DateTime.now().subtract(Duration(days: 4)), // ], [
players[2].id, 210, false, null, players[2].id, [ // players[0],
Round(8, 2, 10, players[2]), // players[1]
Round(6, 2, 8, players[1]), // ]),
Round(4, 2, 6, players[2]), // GameDetail(3, DateTime.now().subtract(Duration(days: 4)),
Round(2, 2, 4, players[1]) // players[2].id, 210, false, null, players[2].id, [
], [ // Round(8, 2, 10, players[2]),
players[1], // Round(6, 2, 8, players[1]),
players[2] // Round(4, 2, 6, players[2]),
]), // Round(2, 2, 4, players[1])
GameDetail( // ], [
4, // players[1],
DateTime.now().subtract(Duration(days: 7)), // players[2]
players[3].id, // ]),
120, // GameDetail(
true, // 4,
Round(12, null, 12, players[3]), // DateTime.now().subtract(Duration(days: 7)),
players[3].id, [ // players[3].id,
Round(12, null, 12, players[3]), // 120,
Round(7, 3, 10, players[2]), // true,
Round(6, 2, 8, players[1]), // Round(12, null, 12, players[3]),
Round(5, 1, 12, players[0]) // players[3].id, [
], [ // Round(12, null, 12, players[3]),
players[0], // Round(7, 3, 10, players[2]),
players[1], // Round(6, 2, 8, players[1]),
players[2], // Round(5, 1, 12, players[0])
players[3] // ], [
]), // players[0],
GameDetail(5, DateTime.now().subtract(Duration(days: 10)), // players[1],
players[4].id, 280, true, null, players[4].id, [ // players[2],
Round(9, 1, 10, players[4]), // players[3]
Round(7, 3, 10, players[2]), // ]),
Round(8, 2, 10, players[3]), // GameDetail(5, DateTime.now().subtract(Duration(days: 10)),
Round(5, 2, 7, players[1]) // players[4].id, 280, true, null, players[4].id, [
], [ // Round(9, 1, 10, players[4]),
players[1], // Round(7, 3, 10, players[2]),
players[2], // Round(8, 2, 10, players[3]),
players[3], // Round(5, 2, 7, players[1])
players[4] // ], [
]), // players[1],
GameDetail(6, DateTime.now().subtract(Duration(days: 12)), // players[2],
players[1].id, 240, true, null, players[1].id, [ // players[3],
Round(7, null, 7, players[1]), // players[4]
Round(5, 2, 7, players[2]), // ]),
Round(6, 2, 8, players[1]), // GameDetail(6, DateTime.now().subtract(Duration(days: 12)),
Round(5, 1, 12, players[0]) // players[1].id, 240, true, null, players[1].id, [
], [ // Round(7, null, 7, players[1]),
players[0], // Round(5, 2, 7, players[2]),
players[1], // Round(6, 2, 8, players[1]),
players[2], // Round(5, 1, 12, players[0])
players[4] // ], [
]), // players[0],
GameDetail(7, DateTime.now().subtract(Duration(days: 15)), // players[1],
players[2].id, 200, true, null, players[2].id, [ // players[2],
Round(8, 2, 10, players[2]), // players[4]
Round(4, 2, 6, players[1]), // ]),
Round(7, 3, 10, players[3]), // GameDetail(7, DateTime.now().subtract(Duration(days: 15)),
Round(5, 2, 7, players[0]) // players[2].id, 200, true, null, players[2].id, [
], [ // Round(8, 2, 10, players[2]),
players[0], // Round(4, 2, 6, players[1]),
players[1], // Round(7, 3, 10, players[3]),
players[2], // Round(5, 2, 7, players[0])
players[3] // ], [
]) // players[0],
]; // players[1],
// players[2],
print("GameDetail :"); // players[3]
for (var game in games) { // ])
displayGameDetail(game,1); // ];
print("\t-----------------------------------------"); //
} // print("GameDetail :");
// for (var game in games) {
print("StubManager:"); // displayGameDetail(game,1);
IManager mgr = new StubData(); // print("\t-----------------------------------------");
// }
print("\tGameManager:"); //
// print("StubManager:");
print("\tgetGameById function with id: 2"); // IManager mgr = new StubData();
GameDetail gd = mgr.gameMgr.getGameById(2); //
displayGameDetail(gd,2); // print("\tGameManager:");
//
print("\tgetGamesByPlayerId function with id: 2"); // print("\tgetGameById function with id: 2");
List<GameDetail> gds = mgr.gameMgr.getGamesByPlayerId(8); // GameDetail gd = mgr.gameMgr.getGameById(2);
for (var game in gds) // displayGameDetail(gd,2);
{ //
displayGameDetail(game,2); // print("\tgetGamesByPlayerId function with id: 2");
} // List<GameDetail> gds = mgr.gameMgr.getGamesByPlayerId(8);
// for (var game in gds)
print("\tgetGamesByPlayer function:"); // {
var player = mgr.userMgr.getUserById(8); // displayGameDetail(game,2);
List<GameDetail> gdsPlayer = mgr.gameMgr.getGamesByPlayer(player); // }
for (var game in gdsPlayer) //
{ // print("\tgetGamesByPlayer function:");
displayGameDetail(game,2); // var player = mgr.userMgr.getUserById(8);
} // List<GameDetail> gdsPlayer = mgr.gameMgr.getGamesByPlayer(player);
// for (var game in gdsPlayer)
print("\tgetGamesByPlayers:"); // {
var player2 = mgr.userMgr.getUserById(2); // displayGameDetail(game,2);
List<Player> playersTest = [player,player2]; // }
List<GameDetail> gdsPlayers = mgr.gameMgr.getGamesByPlayers(playersTest); //
for (var game in gdsPlayers) // print("\tgetGamesByPlayers:");
{ // var player2 = mgr.userMgr.getUserById(2);
displayGameDetail(game,2); // List<Player> playersTest = [player,player2];
} // List<GameDetail> gdsPlayers = mgr.gameMgr.getGamesByPlayers(playersTest);
// for (var game in gdsPlayers)
print("\tgetPlayersByIdGame:"); // {
var playersIntoGame = mgr.gameMgr.getPlayersByIdGame(2); // displayGameDetail(game,2);
for (var player in playersIntoGame) // }
{ //
displayPlayer(player,2); // print("\tgetPlayersByIdGame:");
} // var playersIntoGame = mgr.gameMgr.getPlayersByIdGame(2);
// for (var player in playersIntoGame)
print("\tgetRankByIdGame:"); // {
var ranksPlayers = mgr.gameMgr.getRankByIdGame(2); // displayPlayer(player,2);
ranksPlayers.forEach((id, rank) { // }
displayPlayer(mgr.userMgr.getUserById(id),2); //
print('\t\tRank $rank'); // print("\tgetRankByIdGame:");
}); // var ranksPlayers = mgr.gameMgr.getRankByIdGame(2);
} // ranksPlayers.forEach((id, rank) {
// displayPlayer(mgr.userMgr.getUserById(id),2);
void displayGameDetail(GameDetail gd, int numTabs) // print('\t\tRank $rank');
{ // });
String tabs = '\t' * numTabs; // }
print(tabs+"Game ID: ${gd.id}"); //
print(tabs+"Time: ${gd.time}"); // void displayGameDetail(GameDetail gd, int numTabs)
print(tabs+"Winner: ${gd.winner}"); // {
print(tabs+"Number of Points: ${gd.nbPoints}"); // String tabs = '\t' * numTabs;
print(tabs+"Is Finished: ${gd.isFinished}"); // print(tabs+"Game ID: ${gd.id}");
print(tabs+"Current Round: ${gd.currentRound}"); // print(tabs+"Time: ${gd.time}");
print(tabs+"Host: ${gd.host}"); // print(tabs+"Winner: ${gd.winner}");
print(tabs+"Rank: ${gd.getRank()}"); // print(tabs+"Number of Points: ${gd.nbPoints}");
print(tabs+"Rounds:"); // print(tabs+"Is Finished: ${gd.isFinished}");
for (var round in gd.rounds) { // print(tabs+"Current Round: ${gd.currentRound}");
displayRound(round, numTabs+1); // print(tabs+"Host: ${gd.host}");
} // print(tabs+"Rank: ${gd.getRank()}");
print(tabs+"Players:"); // print(tabs+"Rounds:");
for (var player in gd.players) { // for (var round in gd.rounds) {
displayPlayer(player, numTabs+1); // displayRound(round, numTabs+1);
} // }
} // print(tabs+"Players:");
// for (var player in gd.players) {
void displayRound(Round round, int numTabs) // displayPlayer(player, numTabs+1);
{ // }
String tabs = '\t' * numTabs; // }
print(tabs+"Round Score: ${round.firstThrow}"); //
print(tabs+"Round Bonus: ${round.secondThrow}"); // void displayRound(Round round, int numTabs)
print(tabs+"Round Total: ${round.points}"); // {
print(tabs+"Round Player: ${round.player.name}"); // String tabs = '\t' * numTabs;
} // print(tabs+"Round Score: ${round.firstThrow}");
// print(tabs+"Round Bonus: ${round.secondThrow}");
void displayPlayer(Player player, int numTabs) // print(tabs+"Round Total: ${round.points}");
{ // print(tabs+"Round Player: ${round.player.name}");
String tabs = '\t' * numTabs; // }
if (player is Guest) { //
print(tabs+"ID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: Guest"); // void displayPlayer(Player player, int numTabs)
} else if (player is User) { // {
print(tabs+"ID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: User"); // String tabs = '\t' * numTabs;
print(tabs+"Achievements:"); // if (player is Guest) {
for (var achievement in player.achievements) { // print(tabs+"ID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: Guest");
displayAchievement(achievement, numTabs+1); // } else if (player is User) {
} // print(tabs+"ID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: User");
print(tabs+"Amis:"); // print(tabs+"Achievements:");
for (var amis in player.friends) { // for (var achievement in player.achievements) {
print("\t\tNom: ${amis.name}, Mail: ${amis.mail}"); // displayAchievement(achievement, numTabs+1);
} // }
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}"); // print(tabs+"Amis:");
} else { // for (var amis in player.friends) {
print(tabs+"ID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: Player"); // 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 {
void displayAchievement(Achievement achievement, int numTabs) // print(tabs+"ID: ${player.id}, Nom: ${player.name}, Image: ${player.image}, Type: Player");
{ // }
String tabs = '\t' * numTabs; // }
print(tabs+"Nom: ${achievement.name}"); //
} // void displayAchievement(Achievement achievement, int numTabs)
// {
// String tabs = '\t' * numTabs;
// print(tabs+"Nom: ${achievement.name}");
// }
Loading…
Cancel
Save