From 7bc1bb498fc22587b1482a7f4131ca97492b3899 Mon Sep 17 00:00:00 2001 From: Jossua Date: Wed, 8 Oct 2025 16:21:59 +0200 Subject: [PATCH] feat(controllers/game): add score, chrono & finished game method --- .../Controllers/Game.java | 104 +++++++++++++++--- 1 file changed, 91 insertions(+), 13 deletions(-) diff --git a/TD3_DEV51_Qualite_Algo/src/main/java/fr/iutfbleau/TD3_DEV51_Qualite_Algo/Controllers/Game.java b/TD3_DEV51_Qualite_Algo/src/main/java/fr/iutfbleau/TD3_DEV51_Qualite_Algo/Controllers/Game.java index 4e626b0..c701271 100644 --- a/TD3_DEV51_Qualite_Algo/src/main/java/fr/iutfbleau/TD3_DEV51_Qualite_Algo/Controllers/Game.java +++ b/TD3_DEV51_Qualite_Algo/src/main/java/fr/iutfbleau/TD3_DEV51_Qualite_Algo/Controllers/Game.java @@ -1,44 +1,122 @@ package Controllers; import Models.Word; +import Views.HangedManView; public class Game { private Word word; - private int errors; - private final int maxErrors = 6; + private HangedManView hangedManView; + private int errors; + private int maxErrors = 9; + private String wrongLetters; + private long startTime; + private long endTime; + private final int maxTime = 120000; // 2 minutes + + // Constructor public Game(Word word) { this.word = word; + this.hangedManView = hangedManView; this.errors = 0; + this.wrongLetters = ""; + this.startTime = System.currentTimeMillis(); + this.endTime = 0; } - /* Verify error number */ + // Getters - Errors public int getErrors() { return this.errors; } - /* Put error max */ - public int getMaxErrors() { - return this.maxErrors; + + // Getters - Wrong Letters + public String getWrongLetters() { + return this.wrongLetters; } - /* Vue call method VerifyLetter, check status letter false/True */ + // Determine if the game is lost + private boolean isLost() { + return errors >= maxErrors; + } + + // Determine if the game is won + public boolean isWon() { + int score = calculateScore(); + if (word.IsComplete() && score > 0) { + return true; + } + return false; + } + + // From view, verify if the letter is correct & finish the game if necessary (lost or won) public boolean playLetter(char c) { boolean correct = word.VerifyLetter(c); if (!correct) { errors++; + hangedManView.setState(errors); + + wrongLetters += c + " "; + hangedManView.setWrongLetters(wrongLetters); + + if (isLost()) { + finishedGame(); + } + } else { + hangedManView.setCorrectLetters(word.getHiddenWord()); + + if (word.IsComplete()) { + finishedGame(); + } } return correct; } - /* All letter is completed : Won */ - public boolean isWon() { - return word.IsComplete(); + // Finish the game + private boolean finishedGame() { + this.endTime = System.currentTimeMillis(); + + if (isLost()) { + return false; + } + + boolean isWon = isWon(); + return isWon; } - /* Lost if maxErrors is greater than or egal to errors */ - public boolean isLost() { - return errors >= maxErrors; + // For view, return the remaining time + public long getRemainingTime() { + long elapsed = (System.currentTimeMillis() - startTime) / 1000; + long remaining = (maxTime / 1000) - elapsed; + + if (remaining < 0) { + remaining = 0; + finishedGame(); + } + + return Math.max(remaining, 0); + } + + // Get elapsed time for calculateScore + private long calculateTime() { + long elapsedTime = (endTime - startTime) / 1000; + return elapsedTime; + } + + // Calculate Score + public int calculateScore() { + long time = calculateTime(); + int baseScore = 1000; + + int errorPenalty = errors * 50; + int timePenalty = (int) time * 2; + + int score = baseScore - errorPenalty - timePenalty; + if (score < 0) { + score = 0; + } + + return score; } } \ No newline at end of file