Commit 1c54461c authored by Julie CONTE's avatar Julie CONTE

Ugly trivia resolution

parent f25fba88
......@@ -7,3 +7,4 @@ include:
- local: "/roman-numerals/.gitlab-ci.yml"
- local: "/string-calculator/.gitlab-ci.yml"
- local: "/gilded-rose/.gitlab-ci.yml"
- local: "/ugly-trivia/.gitlab-ci.yml"
......@@ -22,3 +22,4 @@ Ce dépôt Git a pour but de partager les différents ateliers pouvant être ré
4. [C'est une bonne situation ça techlead ? (débat)](https://www.youtube.com/watch?v=9tOoXfOE12o)
5. [Pagination Seven](/pagination-seven)
6. [GildedRose](/gilded-rose)
7. [UglyTrivia](/ugly-trivia)
......@@ -8,4 +8,4 @@ Dans le cadre d'un programme de mentoring interne (BlackBelt) Julie a fait une r
- **Date** : 19/09/2020
- **Langage** : Java
- **Niveau** : Moyen
- **Replay** :
- **Replay** : [REVUE KATA : Ugly Trivia avec Julie, Emmanuelle, Alexis & Colin](https://www.youtube.com/watch?v=IeAa8chmngI)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.adaptionsoft.games</groupId>
<artifactId>uglytrivia</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<parent>
<version>1.0.0</version>
<groupId>fr.ippon.kata</groupId>
<artifactId>java-parent</artifactId>
<relativePath>../java-parent</relativePath>
</parent>
<version>1.0.0-SNAPSHOT</version>
<artifactId>ugly-trivia</artifactId>
<name>UglyTrivia</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-booter</artifactId>
<version>3.0.0-M3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<developers>
<developer>
<email>jconte@ippon.fr</email>
<name>Julie CONTE</name>
</developer>
<developer>
<email>cdamon@ippon.fr</email>
<name>Colin DAMON</name>
</developer>
</developers>
</project>
package com.adaptionsoft.games.trivia.runner;
import java.util.Random;
import com.adaptionsoft.games.uglytrivia.Game;
public class GameRunner {
private static boolean notAWinner;
public static void main(String[] args) {
Game aGame = new Game();
aGame.add("Chet");
aGame.add("Pat");
aGame.add("Sue");
Random rand = new Random();
do {
aGame.roll(rand.nextInt(5) + 1);
if (rand.nextInt(9) == 7) {
notAWinner = aGame.wrongAnswer();
} else {
notAWinner = aGame.wasCorrectlyAnswered();
}
} while (notAWinner);
}
}
package com.adaptionsoft.games.uglytrivia;
public class Answer {
private final Notifications notifications;
private final AnswerRandomSimulator answerRandom;
public Answer(Notifications notifications, AnswerRandomSimulator answerRandom) {
this.notifications = notifications;
this.answerRandom = answerRandom;
}
public Player answer(Player player) {
if (!answerRandom.isRight()) {
return wrongAnswer(player);
}
return goodAnswer(player);
}
private Player goodAnswer(Player player) {
if (!player.isInPenaltyBox()) {
notifications.correctAnswer();
player = player.addCoin();
notifications.actualGoldCoins(player.getName(), player.getPurse());
}
return player;
}
private Player wrongAnswer(Player player) {
notifications.incorrectlyAnswered();
notifications.sendInPenaltyBox(player.getName());
return player.inPenaltyBox();
}
}
package com.adaptionsoft.games.uglytrivia;
import java.util.Random;
class AnswerRandomSimulator {
private final Random rand;
AnswerRandomSimulator(Random rand) {
this.rand = rand;
}
boolean isRight() {
return !(rand.nextInt(9) == 7);
}
}
package com.adaptionsoft.games.uglytrivia;
class Board {
private final int limitBoardSize;
Board(int limitBoardSize) {
this.limitBoardSize = limitBoardSize;
}
boolean isBeyondLimitBoard(int position) {
return position >= limitBoardSize;
}
int getLimit() {
return limitBoardSize;
}
}
package com.adaptionsoft.games.uglytrivia;
import java.util.Arrays;
import java.util.List;
enum Category {
POP("Pop", List.of(0,4,8)),
SCIENCE("Science", List.of(1,5,9)),
SPORTS("Sports", List.of(2,6,10)),
ROCK("Rock", List.of());
private final String category;
private final List<Integer> positions;
Category(String category, List<Integer> positions) {
this.category = category;
this.positions = positions;
}
static Category fromPosition(int position) {
return Arrays.stream(Category.values()).filter(category -> category.positions.contains(position)).findFirst().orElse(Category.ROCK);
}
String getCategory() {
return category;
}
}
package com.adaptionsoft.games.uglytrivia;
import java.io.PrintStream;
class ConsolePrinter {
private final PrintStream print;
public ConsolePrinter(PrintStream print) {
this.print = print;
}
void sendMessage(String message) {
print.println(message);
}
}
package com.adaptionsoft.games.uglytrivia;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
class Deck {
Map<Category, LinkedList<Question>> deck;
Deck(int limitDeckSize) {
deck = new HashMap<>();
deck.put(Category.POP, new LinkedList<>());
deck.put(Category.SCIENCE, new LinkedList<>());
deck.put(Category.SPORTS, new LinkedList<>());
deck.put(Category.ROCK, new LinkedList<>());
for (int i = 0; i < limitDeckSize; i++) {
deck.get(Category.POP).addLast(new Question(Category.POP, i));
deck.get(Category.SCIENCE).addLast(new Question(Category.SCIENCE, i));
deck.get(Category.SPORTS).addLast(new Question(Category.SPORTS, i));
deck.get(Category.ROCK).addLast(new Question(Category.ROCK, i));
}
}
String removeFirstQuestion(Category category) {
return deck.get(category).removeFirst().getMessage();
}
}
package com.adaptionsoft.games.uglytrivia;
import java.util.Random;
class Dice {
private final Random rand;
public Dice(Random rand) {
this.rand = rand;
}
public int roll() {
return rand.nextInt(5) + 1;
}
}
package com.adaptionsoft.games.uglytrivia;
import java.util.ArrayList;
import java.util.LinkedList;
public class Game {
ArrayList players = new ArrayList();
int[] places = new int[6];
int[] purses = new int[6];
boolean[] inPenaltyBox = new boolean[6];
LinkedList popQuestions = new LinkedList();
LinkedList scienceQuestions = new LinkedList();
LinkedList sportsQuestions = new LinkedList();
LinkedList rockQuestions = new LinkedList();
int currentPlayer = 0;
boolean isGettingOutOfPenaltyBox;
public Game(){
for (int i = 0; i < 50; i++) {
popQuestions.addLast("Pop Question " + i);
scienceQuestions.addLast(("Science Question " + i));
sportsQuestions.addLast(("Sports Question " + i));
rockQuestions.addLast(createRockQuestion(i));
}
class Game {
static final int MAX_PLAYER_PLAYABLE = 6;
static final int MAX_GOLD_COINS = 6;
static final int MIN_PLAYER_PLAYABLE = 2;
static final int LIMIT_DECK_SIZE = 50;
private final Turn turn;
private final Answer answer;
private final Notifications notifications;
private final Deck deck;
private Players players;
Game(Turn turn, Answer answer, Notifications notifications) {
this.notifications = notifications;
this.turn = turn;
this.answer = answer;
players = new Players();
deck = new Deck(LIMIT_DECK_SIZE);
}
boolean isPlayable() {
return minimumPlayer() && limitPlayersNotExceeded();
}
private boolean minimumPlayer() {
return howManyPlayers() >= MIN_PLAYER_PLAYABLE;
}
private boolean limitPlayersNotExceeded() {
return howManyPlayers() < MAX_PLAYER_PLAYABLE;
}
boolean add(String playerName) {
players = players.add(playerName);
notifications.addPlayer(playerName);
notifications.playerPlace(howManyPlayers());
return true;
}
private int howManyPlayers() {
return players.howManyPlayers();
}
boolean playTurn() {
updateCurrentPlayer(turn.tryToPlay(currentPlayer()));
askQuestion();
updateCurrentPlayer(answer.answer(currentPlayer()));
if (didPlayerWin()) {
return true;
}
players = players.nextPlayer();
return false;
}
private boolean didPlayerWin() {
return currentPlayer().getPurse() == MAX_GOLD_COINS;
}
public String createRockQuestion(int index){
return "Rock Question " + index;
}
public boolean isPlayable() {
return (howManyPlayers() >= 2);
}
public boolean add(String playerName) {
players.add(playerName);
places[howManyPlayers()] = 0;
purses[howManyPlayers()] = 0;
inPenaltyBox[howManyPlayers()] = false;
System.out.println(playerName + " was added");
System.out.println("They are player number " + players.size());
return true;
}
public int howManyPlayers() {
return players.size();
}
public void roll(int roll) {
System.out.println(players.get(currentPlayer) + " is the current player");
System.out.println("They have rolled a " + roll);
if (inPenaltyBox[currentPlayer]) {
if (roll % 2 != 0) {
isGettingOutOfPenaltyBox = true;
System.out.println(players.get(currentPlayer) + " is getting out of the penalty box");
places[currentPlayer] = places[currentPlayer] + roll;
if (places[currentPlayer] > 11) places[currentPlayer] = places[currentPlayer] - 12;
System.out.println(players.get(currentPlayer)
+ "'s new location is "
+ places[currentPlayer]);
System.out.println("The category is " + currentCategory());
askQuestion();
} else {
System.out.println(players.get(currentPlayer) + " is not getting out of the penalty box");
isGettingOutOfPenaltyBox = false;
}
} else {
places[currentPlayer] = places[currentPlayer] + roll;
if (places[currentPlayer] > 11) places[currentPlayer] = places[currentPlayer] - 12;
System.out.println(players.get(currentPlayer)
+ "'s new location is "
+ places[currentPlayer]);
System.out.println("The category is " + currentCategory());
askQuestion();
}
}
private void askQuestion() {
if (currentCategory() == "Pop")
System.out.println(popQuestions.removeFirst());
if (currentCategory() == "Science")
System.out.println(scienceQuestions.removeFirst());
if (currentCategory() == "Sports")
System.out.println(sportsQuestions.removeFirst());
if (currentCategory() == "Rock")
System.out.println(rockQuestions.removeFirst());
}
private String currentCategory() {
if (places[currentPlayer] == 0) return "Pop";
if (places[currentPlayer] == 4) return "Pop";
if (places[currentPlayer] == 8) return "Pop";
if (places[currentPlayer] == 1) return "Science";
if (places[currentPlayer] == 5) return "Science";
if (places[currentPlayer] == 9) return "Science";
if (places[currentPlayer] == 2) return "Sports";
if (places[currentPlayer] == 6) return "Sports";
if (places[currentPlayer] == 10) return "Sports";
return "Rock";
}
public boolean wasCorrectlyAnswered() {
if (inPenaltyBox[currentPlayer]){
if (isGettingOutOfPenaltyBox) {
System.out.println("Answer was correct!!!!");
purses[currentPlayer]++;
System.out.println(players.get(currentPlayer)
+ " now has "
+ purses[currentPlayer]
+ " Gold Coins.");
boolean winner = didPlayerWin();
currentPlayer++;
if (currentPlayer == players.size()) currentPlayer = 0;
return winner;
} else {
currentPlayer++;
if (currentPlayer == players.size()) currentPlayer = 0;
return true;
}
} else {
System.out.println("Answer was corrent!!!!");
purses[currentPlayer]++;
System.out.println(players.get(currentPlayer)
+ " now has "
+ purses[currentPlayer]
+ " Gold Coins.");
boolean winner = didPlayerWin();
currentPlayer++;
if (currentPlayer == players.size()) currentPlayer = 0;
return winner;
}
}
public boolean wrongAnswer(){
System.out.println("Question was incorrectly answered");
System.out.println(players.get(currentPlayer)+ " was sent to the penalty box");
inPenaltyBox[currentPlayer] = true;
currentPlayer++;
if (currentPlayer == players.size()) currentPlayer = 0;
return true;
}
private boolean didPlayerWin() {
return !(purses[currentPlayer] == 6);
}
private void updateCurrentPlayer(Player currentPlayer) {
players = players.updateCurrentPlayer(currentPlayer);
}
private void askQuestion() {
notifications.askQuestion(deck.removeFirstQuestion(currentCategory()));
}
private Category currentCategory() {
return Category.fromPosition(currentPlayer().getPosition());
}
private Player currentPlayer() {
return players.getCurrentPlayer();
}
}
package com.adaptionsoft.games.uglytrivia;
class Notifications {
private final ConsolePrinter printer;
public Notifications(ConsolePrinter printer) {
this.printer = printer;
}
void addPlayer(String player) {
printer.sendMessage(player + " was added");
}
void playerPlace(int place) {
printer.sendMessage("They are player number " + place);
}
void currentPlayer(String player) {
printer.sendMessage(player + " is the current player");
}
void roll(int roll) {
printer.sendMessage("They have rolled a " + roll);
}
void notGettingOutOfPenaltyBox(String player) {
printer.sendMessage(player + " is not getting out of the penalty box");
}
void newLocation(String player, int location) {
printer.sendMessage(player + "'s new location is " + location);
}
void currentCategory(String category) {
printer.sendMessage("The category is " + category);
}
void gettingOutOfPenaltyBox(String player) {
printer.sendMessage(player + " is getting out of the penalty box");
}
void correctAnswer() {
printer.sendMessage("Answer was correct!!!!");
}
void actualGoldCoins(String player, int goldCoins) {
printer.sendMessage(player + " now has " + goldCoins + " Gold Coins.");
}
void incorrectlyAnswered() {
printer.sendMessage("Question was incorrectly answered");
}
void sendInPenaltyBox(String player) {
printer.sendMessage(player + " was sent to the penalty box");
}
void askQuestion(String question) {
printer.sendMessage(question);
}
}
package com.adaptionsoft.games.uglytrivia;
import org.apache.maven.surefire.shade.booter.org.apache.commons.lang3.builder.HashCodeBuilder;
import java.util.Optional;
class Player {
private final String name;
private final int position;
private final int purse;
private final boolean inPenaltyBox;