Commit 9fc19c5c authored by Colin DAMON's avatar Colin DAMON
Browse files

Merge branch '63-puissance-4' into 'master'

Resolve "Puissance 4"

Closes #63

See merge request !47
parents 691c6692 a2cf6e42
......@@ -18,3 +18,4 @@ include:
- local: "/java-h2g2/.gitlab-ci.yml"
- local: "/factory-patterns/.gitlab-ci.yml"
- local: "/exceptions/.gitlab-ci.yml"
- local: "/puissance-4/.gitlab-ci.yml"
......@@ -41,3 +41,4 @@ Ce dépôt Git a pour but de partager les différents ateliers pouvant être ré
| [Back from GDCR avec Maxime, Séraphin, Anthony et Colin](https://www.youtube.com/watch?v=CHfUGdnSX6I) | Discussion | |
| [Factory patterns](/factory-patterns) | Code&coffee | Facile |
| [Exceptions](/exceptions) | Code&coffee | Facile |
| [Puissance 4](/puissance-4) | Kata | Moyenne |
......@@ -4,14 +4,14 @@ class GildedRose {
private static final String SULFURAS_NAME = "Sulfuras, Hand of Ragnaros";
private static final String BACKSTAGE_PASSES_NAME = "Backstage passes to a TAFKAL80ETC concert";
private static final String AGED_BRIE_NAME = "Aged Brie";
Item[] items;
private Item[] items;
public GildedRose(Item[] items) {
this.items = items;
this.setItems(items);
}
public void updateQuality() {
for (Item item : items) {
for (Item item : getItems()) {
if (SULFURAS_NAME.equals(item.name)) {
continue;
}
......@@ -71,4 +71,12 @@ class GildedRose {
item.quality = item.quality - 1;
}
}
public Item[] getItems() {
return items;
}
public void setItems(Item[] items) {
this.items = items;
}
}
package com.gildedrose;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.*;
import java.util.Arrays;
import org.junit.jupiter.api.Test;
class GildedRoseTest {
@Test
void shouldUpdateForOneDay() {
GildedRose rose = new GildedRose(ItemsProvider.get());
rose.updateQuality();
assertThat(rose.items).extracting(item -> item.sellIn).containsExactly(9, 1, 4, 0, -1, 14, 9, 4);
assertThat(rose.items).extracting(item -> item.quality).containsExactly(19, 1, 6, 80, 80, 21, 50, 50);
}
@Test
void shouldUpdateForTwoDays() {
GildedRose rose = new GildedRose(ItemsProvider.get());
rose.updateQuality();
rose.updateQuality();
assertThat(rose.items).extracting(item -> item.sellIn).containsExactly(8, 0, 3, 0, -1, 13, 8, 3);
assertThat(rose.items).extracting(item -> item.quality).containsExactly(18, 2, 5, 80, 80, 22, 50, 50);
}
@Test
void shouldBehaveLikeGoldenMaster() {
GildedRose rose = new GildedRose(ItemsProvider.get());
......@@ -37,10 +16,10 @@ class GildedRoseTest {
rose.updateQuality();
golden.updateQuality();
assertThat(rose.items)
assertThat(rose.getItems())
.extracting(item -> item.sellIn)
.containsExactly(Arrays.stream(golden.items).map(item -> item.sellIn).toArray(Integer[]::new));
assertThat(rose.items)
assertThat(rose.getItems())
.extracting(item -> item.quality)
.containsExactly(Arrays.stream(golden.items).map(item -> item.quality).toArray(Integer[]::new));
}
......
package-puissance-4:
variables:
PROJECT_FOLDER: "puissance-4"
extends: .java
only:
refs:
- master
- merge_requests
changes:
- ".gitlab-common-ci.yml"
- "puissance-4/**/*"
# Puissance IV
Refactoring, en live, d'un code de puissance 4 fait en première année d'études
- **Auteurs** : Colin DAMON & Cyril DUPONT
- **Date** : 22/12/2020
- **Langage** : Java
- **Niveau** : Moyen
- **Replay** : TODO
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<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>puissance-4</artifactId>
<name>Puissance4</name>
<developers>
<developer>
<email>cdamon@ippon.fr</email>
<name>Colin DAMON</name>
</developer>
<developer>
<email>cdupont@ippon.fr</email>
<name>Cyril DUPONT</name>
</developer>
</developers>
<dependencies>
<dependency>
<groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId>
<version>3.0.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
package fr.ippon.kata.puissance4;
public enum Joueur {
JOUEUR_1('X'),
JOUEUR_2('O');
private final char pion;
private Joueur(char pion) {
this.pion = pion;
}
public char getPion() {
return pion;
}
}
package fr.ippon.kata.puissance4;
import static fr.ippon.kata.puissance4.Joueur.*;
import java.util.Scanner;
public class Puissance4 {
private static final Integer N = 20;
private Character grille[][];
private Puissance4() {
grille = new Character[N][N];
for (int i = 0; i <= 12; i++) {
for (int j = 0; j <= 13; j++) {
grille[i][j] = '$';
}
}
for (int i = 3; i <= 9; i++) {
for (int j = 3; j <= 10; j++) {
grille[i][j] = '*';
}
}
}
public static int menu() {
int choix;
Scanner sc = new Scanner(System.in);
System.out.println("\n\t\t\t***************************\n\t\t\t***\tPuissance 4\t***\n\t\t\t***************************");
System.out.println("\n\n[1] Un joueur\n");
System.out.println("[2] Deux joueurs\n");
System.out.println("[3] Regle du jeu");
do {
choix = sc.nextInt();
} while (choix < 1 || choix > 3);
return choix;
}
public void afficherGrille() {
afficherEntete();
for (int ligne = 3; ligne <= 9; ligne++) {
for (int colonne = 3; colonne <= 10; colonne++) {
System.out.print("| ");
System.out.print(grille[ligne][colonne]);
}
System.out.println("|");
}
System.out.println(" ------------------------");
}
private void afficherEntete() {
System.out.println("\n ");
for (int k = 1; k <= 8; k++) {
System.out.print("[" + k + "]");
}
System.out.println("\n");
}
public boolean jouer(Joueur joueur) {
int colonne = colonneJouee();
int ligne = getLigne(colonne);
grille[ligne][colonne] = joueur.getPion();
afficherGrille();
return estGagne(ligne, colonne);
}
private static int colonneJouee() {
int choix;
Scanner sc = new Scanner(System.in);
do {
choix = sc.nextInt();
if (choix > 8 || choix < 1) {
System.out.println("Choix incorrect, entrez un nombre entre 1 et 8");
}
} while (choix > 8 || choix < 1);
return choix + 2;
}
private int getLigne(int colonne) {
int ligne = 9;
while (ligneJouee(colonne, ligne)) {
ligne = ligne - 1;
}
return ligne;
}
private boolean ligneJouee(int colonne, int ligne) {
return grille[ligne][colonne] == JOUEUR_1.getPion() || grille[ligne][colonne] == JOUEUR_2.getPion();
}
public boolean jouerIA() {
int i = 0, j = 0, x = 0, y = 0, choix = 0;
if (choix == 0) {
for (i = 3; i <= 9; i++) {
for (j = 3; j <= 10; j++) {
if (choix == 0) {
if (grille[i][j] == '*' && (grille[i + 1][j] == 'X' || grille[i + 1][j] == 'O' || grille[i + 1][j] == '$')) {
if (
(grille[i + 1][j] == 'O' && grille[i + 1][j] == grille[i + 2][j] && grille[i + 2][j] == grille[i + 3][j]) ||
(
grille[i + 1][j - 1] == 'O' &&
grille[i + 1][j - 1] == grille[i + 2][j - 2] &&
grille[i + 2][j - 2] == grille[i + 3][j - 3]
) ||
(grille[i][j - 1] == 'O' && grille[i][j - 1] == grille[i][j - 2] && grille[i][j - 2] == grille[i][j - 3]) ||
(
grille[i - 1][j - 1] == 'O' &&
grille[i - 1][j - 1] == grille[i - 2][j - 2] &&
grille[i - 2][j - 2] == grille[i - 3][j - 3]
) ||
(
grille[i - 1][j + 1] == 'O' &&
grille[i - 1][j + 1] == grille[i - 2][j + 2] &&
grille[i - 2][j + 2] == grille[i - 3][j + 3]
) ||
(grille[i][j + 1] == 'O' && grille[i][j + 1] == grille[i][j + 2] && grille[i][j + 2] == grille[i][j + 3]) ||
(
grille[i + 1][j + 1] == 'O' &&
grille[i + 1][j + 1] == grille[i + 2][j + 2] &&
grille[i + 2][j + 2] == grille[i + 3][j + 3]
) /* new */
||
(
grille[i + 1][j + 1] == 'O' &&
grille[i - 1][j - 1] == grille[i + 1][j + 1] &&
grille[i - 1][j - 1] == grille[i - 2][j - 2]
) ||
(
grille[i - 1][j - 1] == 'O' &&
grille[i + 1][j + 1] == grille[i - 1][j - 1] &&
grille[i + 1][j + 1] == grille[i + 2][j + 2]
) ||
(
grille[i - 1][j - 1] == 'O' &&
grille[i + 1][j + 1] == grille[i - 1][j - 1] &&
grille[i + 1][j + 1] == grille[i + 2][j + 2]
) ||
(
grille[i - 1][j + 1] == 'O' &&
grille[i - 1][j - 1] == grille[i - 1][j + 1] &&
grille[i - 1][j - 1] == grille[i - 2][j - 2]
) ||
(grille[i][j - 1] == 'O' && grille[i][j + 1] == grille[i][j - 1] && grille[i][j] == grille[i][j + 2]) ||
(grille[i][j + 1] == 'O' && grille[i][j - 1] == grille[i][j + 1] && grille[i][j - 1] == grille[i][j - 2])
) {
grille[i][j] = 'O';
choix = 1;
x = i;
y = j;
}
}
}
}
}
}
if (choix == 0) {
for (i = 3; i <= 9; i++) {
for (j = 3; j <= 10; j++) {
if (choix == 0) {
if (grille[i][j] == '*' && (grille[i + 1][j] == 'X' || grille[i + 1][j] == 'O' || grille[i + 1][j] == '$')) {
if (
(grille[i + 1][j] == 'X' && grille[i + 1][j] == grille[i + 2][j] && grille[i + 2][j] == grille[i + 3][j]) ||
(
grille[i + 1][j - 1] == 'X' &&
grille[i + 1][j - 1] == grille[i + 2][j - 2] &&
grille[i + 2][j - 2] == grille[i + 3][j - 3]
) ||
(grille[i][j - 1] == 'X' && grille[i][j - 1] == grille[i][j - 2] && grille[i][j - 2] == grille[i][j - 3]) ||
(
grille[i - 1][j - 1] == 'X' &&
grille[i - 1][j - 1] == grille[i - 2][j - 2] &&
grille[i - 2][j - 2] == grille[i - 3][j - 3]
) ||
(
grille[i - 1][j + 1] == 'X' &&
grille[i - 1][j + 1] == grille[i - 2][j + 2] &&
grille[i - 2][j + 2] == grille[i - 3][j + 3]
) ||
(grille[i][j + 1] == 'X' && grille[i][j + 1] == grille[i][j + 2] && grille[i][j + 2] == grille[i][j + 3]) ||
(
grille[i + 1][j + 1] == 'X' &&
grille[i + 1][j + 1] == grille[i + 2][j + 2] &&
grille[i + 2][j + 2] == grille[i + 3][j + 3]
) ||
(
grille[i + 1][j + 1] == 'X' &&
grille[i - 1][j - 1] == grille[i + 1][j + 1] &&
grille[i - 1][j - 1] == grille[i - 2][j - 2]
) ||
(
grille[i - 1][j - 1] == 'X' &&
grille[i + 1][j + 1] == grille[i - 1][j - 1] &&
grille[i + 1][j + 1] == grille[i + 2][j + 2]
) ||
(
grille[i - 1][j - 1] == 'X' &&
grille[i + 1][j + 1] == grille[i - 1][j - 1] &&
grille[i + 1][j + 1] == grille[i + 2][j + 2]
) ||
(
grille[i - 1][j + 1] == 'X' &&
grille[i - 1][j - 1] == grille[i - 1][j + 1] &&
grille[i - 1][j - 1] == grille[i - 2][j - 2]
) ||
(grille[i][j - 1] == 'X' && grille[i][j + 1] == grille[i][j - 1] && grille[i][j] == grille[i][j + 2]) ||
(grille[i][j + 1] == 'X' && grille[i][j - 1] == grille[i][j + 1] && grille[i][j - 1] == grille[i][j - 2])
) {
grille[i][j] = 'O';
choix = 1;
x = i;
y = j;
}
}
}
}
}
}
if (choix == 0) {
for (i = 3; i <= 9; i++) {
for (j = 3; j <= 10; j++) {
if (choix == 0) {
if (grille[i][j] == '*' && (grille[i + 1][j] == 'X' || grille[i + 1][j] == 'O' || grille[i + 1][j] == '$')) {
if (
(grille[i + 1][j] == 'O' && grille[i + 1][j] == grille[i + 2][j]) ||
(grille[i + 1][j - 1] == 'O' && grille[i + 1][j - 1] == grille[i + 2][j - 2]) ||
(grille[i][j - 1] == 'O' && grille[i][j - 1] == grille[i][j - 2]) ||
(grille[i - 1][j - 1] == 'O' && grille[i - 1][j - 1] == grille[i - 2][j - 2]) ||
(grille[i - 1][j + 1] == 'O' && grille[i - 1][j + 1] == grille[i - 2][j + 2]) ||
(grille[i][j + 1] == 'O' && grille[i][j + 1] == grille[i][j + 2]) ||
(grille[i + 1][j + 1] == 'O' && grille[i + 1][j + 1] == grille[i + 2][j + 2]) ||
(grille[i + 1][j + 1] == 'O' && grille[i - 1][j - 1] == grille[i + 1][j + 1]) ||
(grille[i - 1][j - 1] == 'O' && grille[i + 1][j + 1] == grille[i - 1][j - 1]) ||
(grille[i - 1][j - 1] == 'O' && grille[i + 1][j + 1] == grille[i - 1][j - 1]) ||
(grille[i - 1][j + 1] == 'O' && grille[i - 1][j - 1] == grille[i - 1][j + 1]) ||
(grille[i][j - 1] == 'O' && grille[i][j + 1] == grille[i][j - 1]) ||
(grille[i][j + 1] == 'O' && grille[i][j - 1] == grille[i][j + 1])
) {
grille[i][j] = 'O';
choix = 1;
x = i;
y = j;
}
}
}
}
}
}
if (choix == 0) {
for (i = 3; i <= 9; i++) {
for (j = 3; j <= 10; j++) {
if (choix == 0) {
if (grille[i][j] == '*' && (grille[i + 1][j] == 'X' || grille[i + 1][j] == 'O' || grille[i + 1][j] == '$')) {
if (
grille[i + 1][j] == 'O' ||
grille[i + 1][j - 1] == 'O' ||
grille[i][j - 1] == 'O' ||
grille[i - 1][j - 1] == 'O' ||
grille[i - 1][j + 1] == 'O' ||
grille[i][j + 1] == 'O' ||
grille[i + 1][j + 1] == 'O'
) {
grille[i][j] = 'O';
choix = 1;
x = i;
y = j;
}
}
}
}
}
}
if (choix == 0) {
x = 9;
if (grille[x][7] == 'X') {
y = 8;
grille[x][y] = 'O';
} else {
y = 7;
grille[x][y] = 'O';
}
}
boolean gagne = estGagne(x, y);
afficherGrille();
return gagne;
}
public boolean estGagne(int i, int j) {
if (
(grille[i][j] == grille[i + 1][j] && grille[i + 1][j] == grille[i + 2][j] && grille[i + 2][j] == grille[i + 3][j]) ||
(
grille[i][j] == grille[i + 1][j - 1] && grille[i + 1][j - 1] == grille[i + 2][j - 2] && grille[i + 2][j - 2] == grille[i + 3][j - 3]
) ||
(grille[i][j] == grille[i][j - 1] && grille[i][j - 1] == grille[i][j - 2] && grille[i][j - 2] == grille[i][j - 3]) ||
(
grille[i][j] == grille[i - 1][j - 1] && grille[i - 1][j - 1] == grille[i - 2][j - 2] && grille[i - 2][j - 2] == grille[i - 3][j - 3]
) ||
(
grille[i][j] == grille[i - 1][j + 1] && grille[i - 1][j + 1] == grille[i - 2][j + 2] && grille[i - 2][j + 2] == grille[i - 3][j + 3]
) ||
(grille[i][j] == grille[i][j + 1] && grille[i][j + 1] == grille[i][j + 2] && grille[i][j + 2] == grille[i][j + 3]) ||
(
grille[i][j] == grille[i + 1][j + 1] && grille[i + 1][j + 1] == grille[i + 2][j + 2] && grille[i + 2][j + 2] == grille[i + 3][j + 3]
) ||
(grille[i][j] == grille[i + 1][j + 1] && grille[i][j] == grille[i - 1][j - 1] && grille[i - 1][j - 1] == grille[i - 2][j - 2]) ||
(grille[i][j] == grille[i - 1][j - 1] && grille[i][j] == grille[i + 1][j + 1] && grille[i + 1][j + 1] == grille[i + 2][j + 2]) ||
(grille[i][j] == grille[i - 1][j - 1] && grille[i][j] == grille[i + 1][j + 1] && grille[i + 1][j + 1] == grille[i + 2][j + 2]) ||
(grille[i][j] == grille[i - 1][j + 1] && grille[i][j] == grille[i - 1][j - 1] && grille[i - 1][j - 1] == grille[i - 2][j - 2]) ||
(grille[i][j] == grille[i][j - 1] && grille[i][j] == grille[i][j + 1] && grille[i][j] == grille[i][j + 2]) ||
(grille[i][j] == grille[i][j + 1] && grille[i][j] == grille[i][j - 1] && grille[i][j - 1] == grille[i][j - 2])
) return true;
return false;
}
public static Integer afficherRegle() {
int retour;
Scanner sc = new Scanner(System.in);
System.out.println(
"\tLe but du jeu est d'aligner 4 pions sur une grille comptant 7 rangées et 8 colonnes. Chaque joueur dispose de 28 pions d'une certain forme (par convention X ou O). Tour à tour les deux joueurs placent un pion dans la colonne de leur choix. Le vainqueur est le joueur qui réalise le premier un alignement (horizontal, vertical ou diagonal) d'au moins quatre pions de sa meme forme. Si alors que toutes les cases de la grille de jeu sont remplies aucun des deux joueurs n'a réalisé un tel alignement, la partie est déclarée nulle.\n"
);
do {
System.out.println("[1] Retour");
retour = sc.nextInt();
} while (retour > 1 || retour < 1);
return retour;
}
public static void main(String[] args) {
int choixMenu, exit;
String prenom1;
String prenom2;
Scanner sc = new Scanner(System.in);
choixMenu = menu();
if (choixMenu == 3) {
exit = afficherRegle();
if (exit == 1) choixMenu = menu();
}
boolean gagner;
if (choixMenu == 2) {
Puissance4 game = new Puissance4();
System.out.println("\tEntrez le prenom d'un des deux joueurs\n");
prenom1 = sc.nextLine();
System.out.println("\tEntrez le prenom d'un des deux joueurs\n");
prenom2 = sc.nextLine();
System.out.println("\t " + prenom1 + " vs " + prenom2 + "\n");
do {
game.afficherGrille();
gagner = game.jouer(JOUEUR_1);
if (gagner) System.out.println(prenom1 + " a gagné !");
if (!gagner) {
gagner = game.jouer(JOUEUR_2);
if (gagner) System.out.println(prenom2 + " a gagné !");
}
} while (!gagner);
}
if (choixMenu == 1) {
Puissance4 game = new Puissance4();
System.out.println("\tEntrez le prenom d'un des deux joueurs\n");