Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Primera Prueba #2

Open
wants to merge 20 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 39 additions & 47 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@

### Desarrollo Dirigido por Pruebas + DIP + DI

Para este taller se va a trabajar sobre el juego del ahorcado.

El sistema actual de puntuación del juego comienza en 100 puntos y va
descontando 10 puntos cada vez que se propone una letra incorrecta.

Expand All @@ -18,11 +16,17 @@ puntuación, los cuales se describen a continuación:
* Se penaliza con 10 puntos con cada letra incorrecta.
* El puntaje minimo es 0.

![image](https://github.com/Knight072/DependencyInjectionHangman/assets/116401447/c5e5545b-4cb3-494f-beda-375a2fb82247)


* BonusScore:
* El juego inicia en 0 puntos.
* Se bonifica con 10 puntos cada letra correcta.
* Se penaliza con 5 puntos cada letra incorrecta.
* El puntaje mínimo es 0

![image](https://github.com/Knight072/DependencyInjectionHangman/assets/116401447/594577d2-6bb4-4e7a-b519-24178e03b57a)


* PowerBonusScore:
* El juego inicia en 0 puntos.
Expand All @@ -32,81 +36,69 @@ puntuación, los cuales se describen a continuación:
* Si con las reglas anteriores sobrepasa 500 puntos, el puntaje es
500.

Lo anterior, se traduce en el siguiente modelo, donde se aplica el
principio de inversión de dependencias:

![imagen](img/model.png)
![image](https://github.com/Knight072/DependencyInjectionHangman/assets/116401447/c65fdd78-3d07-44bc-ab59-835b53e403ad)

### Parte I

1. Haga un fork del proyecto (no lo descargue directamente!).

![image](https://github.com/Knight072/DependencyInjectionHangman/assets/116401447/920d4dbb-2a91-45fd-b4b4-f0a270cc64e2)


2. A partir del código existente, implemente sólo los cascarones del
modelo antes indicado.

3. Haga la especificación de los métodos calculateScore (de las tres
4. Haga la especificación de los métodos calculateScore (de las tres
variantes de GameScore), a partir de las especificaciones
generales dadas anteriormente. Recuerde tener en cuenta: @pre,
@pos, @param, @throws.

4. Haga commit de lo realizado hasta ahora. Desde la terminal:
5. Haga commit de lo realizado hasta ahora. Desde la terminal:

```sh
git add .
git commit -m "especificación métodos"
```

![image](https://github.com/Knight072/DependencyInjectionHangman/assets/116401447/0382f902-0645-48bd-907e-25f32c352681)

5. Actualice el archivo `pom.xml` e incluya las dependencias para la ultima versión de JUnit.

6. Teniendo en cuenta dichas especificaciones, en la clase donde se
implementarán las pruebas (GameScoreTest), en los
comentarios iniciales, especifique las clases de equivalencia para
las tres variantes de GameScore, e identifique
condiciones de frontera.
6. Actualice el archivo `pom.xml` e incluya las dependencias para la ultima versión de JUnit.

7. Para cada clase de equivalencia y condición de frontera, implemente
una prueba utilizando JUnit.
![image](https://github.com/Knight072/DependencyInjectionHangman/assets/116401447/1d874d1e-f054-4a9a-b9c0-f501f15e0e85)

8. Haga commit de lo realizado hasta ahora. Desde la terminal:

```sh
git add .
git commit -m "implementación pruebas"
```
7. Para cada clase de equivalencia y condición de frontera, implemente
una prueba utilizando JUnit.

9. Realice la implementación de los 'cascarones' realizados anteriormente.
Asegúrese que todas las pruebas unitarias creadas en los puntos anteriores
se ejecutan satisfactoriamente.
![image](https://github.com/Knight072/DependencyInjectionHangman/assets/116401447/0aa0fe64-d8f1-4682-a07d-75d74bb11063)

10. Al finalizar haga un nuevo commit:
![image](https://github.com/Knight072/DependencyInjectionHangman/assets/116401447/a173b6d6-7ef0-439c-8152-8dd791d0b83e)

```sh
git add .
git commit -m "implementación del modelo"
```
![image](https://github.com/Knight072/DependencyInjectionHangman/assets/116401447/9fbc8015-5b58-4f8f-bd3b-b8056e3e0893)

11. Para sincronizar el avance en el respositorio y NO PERDER el trabajo, use
el comando de GIT para enviar los cambios:
![image](https://github.com/Knight072/DependencyInjectionHangman/assets/116401447/eccba811-ee60-4067-9376-f006255a7aa7)

```sh
git push origin main
```

### Parte II

Actualmente se utiliza el patrón FactoryMethod
que desacopla la creación de los objetos para diseñar un juego
de ahorcado (revisar setup.factoryMethod, el
constructor de la clase GUI y HangmanFactoryMethod).

1. Utilizando el HangmanFactoryMethod (MétodoFabrica) incluya el
OriginalScore a la configuración.
En la siguiente imagen se muestra dentro de la clase HangmanDefaultFactoryMethod que esta configurado con originalScore como el modo de juego actual.

![image](https://github.com/Knight072/DependencyInjectionHangman/assets/116401447/c0741799-e887-4fe6-a56c-c5a11cf3dc21)

Se puede ver que al momento de correr el juego este inicia el juego en 100 y después de haber fallado una vez queda el puntaje en 90

![image](https://github.com/Knight072/DependencyInjectionHangman/assets/116401447/196fef5b-21e3-424e-b82b-b0c428a50149)

Ahora vamos a configurar el juego como bonusScore

![image](https://github.com/Knight072/DependencyInjectionHangman/assets/116401447/f4d43f20-53a7-486a-a125-db9e9ce5345f)

Después de jugar un rato vemos que el puntaje se redujo 5 puntos por cada palabra incorrecta e incremento 10 por cada acierto.

![image](https://github.com/Knight072/DependencyInjectionHangman/assets/116401447/18fc6ebc-a023-4bef-91bf-da1cce07039d)


* Mediante la configuración de la Inyección de
Dependencias se pueda cambiar el comportamiento del mismo, por
ejemplo:
* Utilizar el esquema OriginalScore.
* Utilizar el esquema BonusScore.
* Utilizar el idioma francés.
* Utilizar el diccionario francés.
* etc...
7 changes: 6 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,12 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/co/edu/escuelaing/hangman/GUI.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public class GUI {
public static final String CREDITS_KEY = "creditsscreen";
public static final String GAME_KEY = "gamescreen";
public static final String GAME_OVER_KEY = "gameoverscreen";
private final GameScore gameScore;

private Language language;
private HangmanDictionary dictionary;
Expand All @@ -49,6 +50,7 @@ public GUI(HangmanFactoryMethod factoryMethod) {
this.language = factoryMethod.createLanguage();
this.dictionary = factoryMethod.createDictionary();
this.hangmanPanel = factoryMethod.createHangmanPanel();
this.gameScore = factoryMethod.createGameScore();
}

/* Example of second constructor
Expand Down Expand Up @@ -84,7 +86,7 @@ private void setup() {
mainFrameController
);

GameModel gameModel = new GameModel(dictionary);
GameModel gameModel = new GameModel(dictionary, gameScore);
gameController = new GameController(
new GamePanel(gameModel.getCharacterSet(), hangmanPanel, language),
gameModel,
Expand Down
30 changes: 30 additions & 0 deletions src/main/java/co/edu/escuelaing/hangman/model/BonusScore.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package co.edu.escuelaing.hangman.model;

import org.springframework.stereotype.Component;

@Component("bonusScore")
public class BonusScore implements GameScore{
private int initialScore = 0;
private int incorrect = 0;
private int correct = 0;
@Override
public int calculateScore(int correctCount, int incorrectCount)
{
if(incorrect >= incorrectCount){
if(correctCount == 0){correct = 0; initialScore = 0;};
if(correctCount - correct == 1){
initialScore += 10;
}
else if(correctCount != 0){
initialScore += 10 * correctCount;
}
correct = correctCount;
}
else{
initialScore -= 5;
incorrect = incorrectCount;
if(initialScore < 0){ initialScore = 0;}
}
return initialScore;
}
}
29 changes: 18 additions & 11 deletions src/main/java/co/edu/escuelaing/hangman/model/GameModel.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
package co.edu.escuelaing.hangman.model;

import co.edu.escuelaing.hangman.model.dictionary.HangmanDictionary;
import org.springframework.beans.factory.annotation.Autowired;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
Expand All @@ -23,10 +24,11 @@


public class GameModel {
private final GameScore gameScore;
private int incorrectCount;
private int correctCount;
private LocalDateTime dateTime;
private int gameScore;
private int gameScorePoints;
private int[] lettersUsed;


Expand All @@ -36,14 +38,16 @@ public class GameModel {
private String randomWord;
private char[] randomWordCharArray;

public GameModel(HangmanDictionary dictionary) {
//this.dictionary = new EnglishDictionaryDataSource();

@Autowired
public GameModel(HangmanDictionary dictionary, GameScore gameScore) {
this.dictionary = dictionary;
this.gameScore = gameScore;
randomWord = selectRandomWord();
randomWordCharArray = randomWord.toCharArray();
incorrectCount = 0;
correctCount = 0;
gameScore = 100;
gameScorePoints = gameScore.calculateScore(correctCount, incorrectCount);

}

Expand All @@ -54,7 +58,7 @@ public void reset() {
randomWordCharArray = randomWord.toCharArray();
incorrectCount = 0;
correctCount = 0;
gameScore = 100;
gameScorePoints = gameScore.calculateScore(correctCount, incorrectCount);
}

//setDateTime
Expand All @@ -76,12 +80,11 @@ public ArrayList<Integer> makeGuess(String guess) {
}
if (positions.size() == 0) {
incorrectCount++;
gameScore -= 10;
} else {
correctCount += positions.size();
}
gameScorePoints = gameScore.calculateScore(correctCount, incorrectCount);
return positions;

}

//getDateTime
Expand All @@ -94,15 +97,19 @@ public String getDateTime() {
//getScore
//purpose: returns current score value
public int getScore() {
return gameScore;
return gameScorePoints;
}

//setScore
//purpose: sets score value to points
public void setScore(int score) {
this.gameScore = score;
this.gameScorePoints = score;
}

public void changeWord(String newWord){randomWord = newWord;randomWordCharArray = randomWord.toCharArray();}

public String getRandomWord(){return randomWord;}

//name: selectRandomWord()
//purpose: selects random word from dictionary
private String selectRandomWord() {
Expand All @@ -126,13 +133,13 @@ public int getCorrectCount() {
//method: getGameScore
//purpose: return current score
public int getGameScore() {
return gameScore;
return gameScorePoints;
}

//method: setGameScore
//purpose: set current game score
public void setGameScore(int gameScore) {
this.gameScore = gameScore;
this.gameScorePoints = gameScore;
}

//method: getWordLength
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/co/edu/escuelaing/hangman/model/GameScore.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package co.edu.escuelaing.hangman.model;

public interface GameScore {
public int calculateScore(int correctCount, int incorrectCount);
}
11 changes: 11 additions & 0 deletions src/main/java/co/edu/escuelaing/hangman/model/OriginalScore.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package co.edu.escuelaing.hangman.model;

import org.springframework.stereotype.Component;

@Component("originalScore")
public class OriginalScore implements GameScore{
@Override
public int calculateScore(int correctCount, int incorrectCount) {
return 100 - 10 * incorrectCount;
}
}
24 changes: 24 additions & 0 deletions src/main/java/co/edu/escuelaing/hangman/model/PowerBonusScore.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package co.edu.escuelaing.hangman.model;

import org.springframework.stereotype.Component;

@Component("powerBonusScore")
public class PowerBonusScore implements GameScore{
private int initialScore;
private int incorrect = 0;
@Override
public int calculateScore(int correctCount, int incorrectCount) {
if(correctCount == 0){initialScore = 0;};
if(incorrect >= incorrectCount){
if(correctCount != 0){ initialScore += (int) Math.pow(5,correctCount);};

}
else{
initialScore -= 8;
incorrect = incorrectCount;
if(initialScore < 0){ initialScore = 0;}
}
if(initialScore > 500) initialScore = 500;
return initialScore;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package co.edu.escuelaing.hangman.setup.factoryMethod;


import co.edu.escuelaing.hangman.model.GameScore;
import co.edu.escuelaing.hangman.model.Language;
import co.edu.escuelaing.hangman.model.dictionary.HangmanDictionary;
import co.edu.escuelaing.hangman.view.HangmanPanel;
Expand All @@ -8,18 +10,21 @@

@Component
public class HangmanDefaultFactoryMethod implements HangmanFactoryMethod {
private final GameScore gameScore;
private Language language;
private HangmanDictionary dictionary;
private HangmanPanel hangmanPanel;

public HangmanDefaultFactoryMethod(
@Qualifier("englishLanguage") Language language,
@Qualifier("englishDictionary") HangmanDictionary dictionary,
@Qualifier("hangmanStickmanPanel") HangmanPanel hangmanPanel
@Qualifier("spanishLanguage") Language language,
@Qualifier("spanishDictionary") HangmanDictionary dictionary,
@Qualifier("hangmanStickmanPanel") HangmanPanel hangmanPanel,
@Qualifier("bonusScore") GameScore gameScore
) {
this.language = language;
this.dictionary = dictionary;
this.hangmanPanel = hangmanPanel;
this.gameScore = gameScore;
}

public Language createLanguage() {
Expand All @@ -33,4 +38,8 @@ public HangmanDictionary createDictionary() {
public HangmanPanel createHangmanPanel() {
return hangmanPanel;
}

public GameScore createGameScore() {
return gameScore;
}
}
Loading