Implemented bonus popup
This commit is contained in:
@@ -243,10 +243,11 @@ class GameSession extends ChangeNotifier {
|
|||||||
/// It then checks if any player has exceeded 100 points. If so, it sets
|
/// It then checks if any player has exceeded 100 points. If so, it sets
|
||||||
/// isGameFinished to true and calls the _setWinner() method to determine
|
/// isGameFinished to true and calls the _setWinner() method to determine
|
||||||
/// the winner.
|
/// the winner.
|
||||||
Future<void> updatePoints() async {
|
List<int> updatePoints() {
|
||||||
|
List<int> bonusPlayers = [];
|
||||||
_sumPoints();
|
_sumPoints();
|
||||||
if (isPointsLimitEnabled) {
|
if (isPointsLimitEnabled) {
|
||||||
_checkHundredPointsReached();
|
bonusPlayers = _checkHundredPointsReached();
|
||||||
|
|
||||||
for (int i = 0; i < playerScores.length; i++) {
|
for (int i = 0; i < playerScores.length; i++) {
|
||||||
if (playerScores[i] > pointLimit) {
|
if (playerScores[i] > pointLimit) {
|
||||||
@@ -258,6 +259,7 @@ class GameSession extends ChangeNotifier {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
return bonusPlayers;
|
||||||
}
|
}
|
||||||
|
|
||||||
@visibleForTesting
|
@visibleForTesting
|
||||||
@@ -278,15 +280,18 @@ class GameSession extends ChangeNotifier {
|
|||||||
/// Checks if a player has reached 100 points in the current round.
|
/// Checks if a player has reached 100 points in the current round.
|
||||||
/// If so, it updates the [scoreUpdate] List by subtracting 50 points from
|
/// If so, it updates the [scoreUpdate] List by subtracting 50 points from
|
||||||
/// the corresponding round update.
|
/// the corresponding round update.
|
||||||
void _checkHundredPointsReached() {
|
List<int> _checkHundredPointsReached() {
|
||||||
|
List<int> bonusPlayers = [];
|
||||||
for (int i = 0; i < players.length; i++) {
|
for (int i = 0; i < players.length; i++) {
|
||||||
if (playerScores[i] == pointLimit) {
|
if (playerScores[i] == pointLimit) {
|
||||||
|
bonusPlayers.add(i);
|
||||||
print('${players[i]} hat genau 100 Punkte erreicht und bekommt '
|
print('${players[i]} hat genau 100 Punkte erreicht und bekommt '
|
||||||
'deswegen ${(pointLimit / 2).round()} Punkte abgezogen');
|
'deswegen ${(pointLimit / 2).round()} Punkte abgezogen');
|
||||||
roundList[roundNumber - 1].scoreUpdates[i] -= (pointLimit / 2).round();
|
roundList[roundNumber - 1].scoreUpdates[i] -= (pointLimit / 2).round();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_sumPoints();
|
_sumPoints();
|
||||||
|
return bonusPlayers;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Determines the winner of the game session.
|
/// Determines the winner of the game session.
|
||||||
|
|||||||
@@ -287,8 +287,11 @@ class _RoundViewState extends State<RoundView> {
|
|||||||
children: [
|
children: [
|
||||||
CupertinoButton(
|
CupertinoButton(
|
||||||
onPressed: _areRoundInputsValid()
|
onPressed: _areRoundInputsValid()
|
||||||
? () {
|
? () async {
|
||||||
_finishRound();
|
List<int> boni = _finishRound();
|
||||||
|
if (boni.isNotEmpty) {
|
||||||
|
await _showBonusPopup(context, boni);
|
||||||
|
}
|
||||||
LocalStorageService.saveGameSessions();
|
LocalStorageService.saveGameSessions();
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
}
|
}
|
||||||
@@ -298,8 +301,11 @@ class _RoundViewState extends State<RoundView> {
|
|||||||
if (!widget.gameSession.isGameFinished)
|
if (!widget.gameSession.isGameFinished)
|
||||||
CupertinoButton(
|
CupertinoButton(
|
||||||
onPressed: _areRoundInputsValid()
|
onPressed: _areRoundInputsValid()
|
||||||
? () {
|
? () async {
|
||||||
_finishRound();
|
List<int> boni = _finishRound();
|
||||||
|
if (boni.isNotEmpty) {
|
||||||
|
await _showBonusPopup(context, boni);
|
||||||
|
}
|
||||||
LocalStorageService.saveGameSessions();
|
LocalStorageService.saveGameSessions();
|
||||||
if (widget.gameSession.isGameFinished) {
|
if (widget.gameSession.isGameFinished) {
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
@@ -359,7 +365,7 @@ class _RoundViewState extends State<RoundView> {
|
|||||||
/// every player. If the round is the highest round played in this game,
|
/// every player. If the round is the highest round played in this game,
|
||||||
/// it expands the player score lists. At the end it updates the score
|
/// it expands the player score lists. At the end it updates the score
|
||||||
/// array for the game.
|
/// array for the game.
|
||||||
void _finishRound() {
|
List<int> _finishRound() {
|
||||||
print('====================================');
|
print('====================================');
|
||||||
print('Runde ${widget.roundNumber} beendet');
|
print('Runde ${widget.roundNumber} beendet');
|
||||||
// The shown round is smaller than the newest round
|
// The shown round is smaller than the newest round
|
||||||
@@ -381,12 +387,59 @@ class _RoundViewState extends State<RoundView> {
|
|||||||
widget.gameSession.calculateScoredPoints(
|
widget.gameSession.calculateScoredPoints(
|
||||||
widget.roundNumber, roundScores, _caboPlayerIndex);
|
widget.roundNumber, roundScores, _caboPlayerIndex);
|
||||||
}
|
}
|
||||||
widget.gameSession.updatePoints();
|
List<int> bonusPlayers = widget.gameSession.updatePoints();
|
||||||
if (widget.gameSession.isGameFinished == true) {
|
if (widget.gameSession.isGameFinished == true) {
|
||||||
print('Das Spiel ist beendet');
|
print('Das Spiel ist beendet');
|
||||||
} else if (widget.roundNumber == widget.gameSession.roundNumber) {
|
} else if (widget.roundNumber == widget.gameSession.roundNumber) {
|
||||||
widget.gameSession.increaseRound();
|
widget.gameSession.increaseRound();
|
||||||
}
|
}
|
||||||
|
return bonusPlayers;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Shows a popup dialog with the bonus information.
|
||||||
|
Future<bool> _showBonusPopup(
|
||||||
|
BuildContext context, List<int> bonusPlayers) async {
|
||||||
|
print('Bonus Popup wird angezeigt');
|
||||||
|
int pointLimit = widget.gameSession.pointLimit;
|
||||||
|
int bonusPoints = (pointLimit / 2).round();
|
||||||
|
|
||||||
|
String resultText = _getPopupString(pointLimit, bonusPoints, bonusPlayers);
|
||||||
|
|
||||||
|
await showCupertinoDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => CupertinoAlertDialog(
|
||||||
|
title: const Text('Bonus!'),
|
||||||
|
content: Text(resultText),
|
||||||
|
actions: [
|
||||||
|
CupertinoDialogAction(
|
||||||
|
child: const Text('OK'),
|
||||||
|
onPressed: () => Navigator.of(context).pop(true),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Generates the string for the bonus popup.
|
||||||
|
/// It takes the [pointLimit], [bonusPoints] and the list of [bonusPlayers]
|
||||||
|
/// and returns a formatted string.
|
||||||
|
String _getPopupString(
|
||||||
|
int pointLimit, int bonusPoints, List<int> bonusPlayers) {
|
||||||
|
List<String> nameList =
|
||||||
|
bonusPlayers.map((i) => widget.gameSession.players[i]).toList();
|
||||||
|
String resultText = '';
|
||||||
|
if (nameList.length == 1) {
|
||||||
|
resultText =
|
||||||
|
'${nameList.first} hat exakt das Punktelimit von $pointLimit Punkten erreicht und bekommt deshalb $bonusPoints Punkte abgezogen!';
|
||||||
|
} else {
|
||||||
|
resultText = nameList.length == 2
|
||||||
|
? '${nameList[0]} & ${nameList[1]}'
|
||||||
|
: '${nameList.sublist(0, nameList.length - 1).join(', ')} & ${nameList.last}';
|
||||||
|
resultText +=
|
||||||
|
' haben exakt das Punktelimit von $pointLimit Punkten erreicht und bekommen deshalb $bonusPoints Punkte abgezogen!';
|
||||||
|
}
|
||||||
|
return resultText;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ name: cabo_counter
|
|||||||
description: "Mobile app for the card game Cabo"
|
description: "Mobile app for the card game Cabo"
|
||||||
publish_to: 'none'
|
publish_to: 'none'
|
||||||
|
|
||||||
version: 0.4.4+486
|
version: 0.4.4+488
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ^3.5.4
|
sdk: ^3.5.4
|
||||||
|
|||||||
@@ -114,15 +114,15 @@ void main() {
|
|||||||
expect(session.roundList[0].caboPlayerIndex, 0);
|
expect(session.roundList[0].caboPlayerIndex, 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('updatePoints - game not finished', () async {
|
test('updatePoints - game not finished', () {
|
||||||
session.addRoundScoresToList(1, [10, 20, 30], [10, 20, 30], 0);
|
session.addRoundScoresToList(1, [10, 20, 30], [10, 20, 30], 0);
|
||||||
await session.updatePoints();
|
session.updatePoints();
|
||||||
expect(session.isGameFinished, isFalse);
|
expect(session.isGameFinished, isFalse);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('updatePoints - game finished', () async {
|
test('updatePoints - game finished', () {
|
||||||
session.addRoundScoresToList(1, [101, 20, 30], [101, 20, 30], 0);
|
session.addRoundScoresToList(1, [101, 20, 30], [101, 20, 30], 0);
|
||||||
await session.updatePoints();
|
session.updatePoints();
|
||||||
expect(session.isGameFinished, isTrue);
|
expect(session.isGameFinished, isTrue);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -154,9 +154,9 @@ void main() {
|
|||||||
expect(session.playerScores, equals([50, 0, 30]));
|
expect(session.playerScores, equals([50, 0, 30]));
|
||||||
});
|
});
|
||||||
|
|
||||||
test('_setWinner via updatePoints', () async {
|
test('_setWinner via updatePoints', () {
|
||||||
session.addRoundScoresToList(1, [101, 20, 30], [101, 0, 30], 1);
|
session.addRoundScoresToList(1, [101, 20, 30], [101, 0, 30], 1);
|
||||||
await session.updatePoints();
|
session.updatePoints();
|
||||||
expect(session.winner, 'Bob'); // Bob has lowest score (20)
|
expect(session.winner, 'Bob'); // Bob has lowest score (20)
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user