Commit a5cc57fe authored by theray1's avatar theray1
Browse files

clean code + compléxités

parent 7da5a378
......@@ -18,6 +18,7 @@ public class Bot extends Joueur{
}
//O(1)
public Case jouerGlouton(){
Case returnCase = partie.getPlateau().getPilePriorite().meilleurCoup();
......
......@@ -17,6 +17,7 @@ public class Case{
private int valeur;
//O(1)
public Case(int i, int j) {
this.ligne = i;
this.colonne = j;
......@@ -27,6 +28,7 @@ public class Case{
this.precedent = null;
}
//O(1)
public Case(int i, int j, PetiteRegion pregion) {
this.ligne = i;
this.colonne = j;
......@@ -42,6 +44,7 @@ public class Case{
* Colorie une case selon les règles de jeu Brave
* @param couleur la couleur avec laquelle on veut colorier la case
*/
//O(1)
public void colorierBrave(Couleur couleur) {
this.setCouleur(couleur);
}
......@@ -50,16 +53,12 @@ public class Case{
* Colorie une case selon les règles de jeu Téméraire
* @param couleur la couleur avec laquelle on veut colorier la case
*/
//O(1)
public void colorierTemeraire(Couleur couleur) {
this.setCouleur(couleur);
this.getPregion().incrementerNbCasesColoriees();
if(this.getPregion().getNbColoriees() == 9){
this.getPregion().updateAcquise();
this.getPregion().updateColoriee();
}
}
......
......@@ -19,6 +19,7 @@ public class Joueur {
* Permet à un joueur de choisir une case à jouer
* @return La case choisi par le joueur
*/
//O(1)
public Case jouer(){
Scanner input = new Scanner(System.in);
System.out.println("Ligne de la case recherchée ? ");
......@@ -45,6 +46,7 @@ public class Joueur {
* Permet à un joueur de choisir une case à évaluer
* @return La case choisi par le joueur
*/
//O(n)
public Case evaluer(){
Scanner input = new Scanner(System.in);
System.out.println("Ligne de la case recherchée ? ");
......
......@@ -18,6 +18,7 @@ public class Menu {
/**
* Permet à l'utilisateur de choisir les paramètres d'une partie à créer
*/
//O(1)
public void choisirParametres(){
Scanner console = new Scanner(System.in);
......@@ -117,6 +118,7 @@ public class Menu {
* Crée une partie à partir des options sélectionnées dans choisirParametres()
* @return la partie créée
*/
//O(n)
public Partie creerPartie(){
Partie partie = new Partie();
partie.setRegle(this.regleId == 0? new Brave(): new Temeraire());
......@@ -138,10 +140,17 @@ public class Menu {
if(this.regleId == 1){
partie.getPlateau().initalisationQuadtreeDepuisMatrice();
partie.getPlateau().getArbrePlateau().getRoot().updateColoriee();
partie.getPlateau().getArbrePlateau().getRoot().updateAcquise();
for(int i = 0; i < partie.getPlateau().getLongueur(); i=i+3){
for(int j = 0; j < partie.getPlateau().getLongueur(); j=j+3){
partie.getPlateau().getMatrice()[i][j].getPregion().updateAcquise();
partie.getPlateau().getMatrice()[i][j].getPregion().updateColoriee();
}
}
}
partie.setPeutEvaluer(this.peutEvaluer);
partie.setScoreAffiche(this.scoreAffiche);
return partie;
......
......@@ -26,6 +26,7 @@ public class Partie {
/**
* Lance le premier tour d'une partie
*/
//O(n)
public void demarrerPartie() {
//TODO : implementer
this.setScore(0);
......@@ -54,6 +55,7 @@ public class Partie {
/**
* Effectue un tour
*/
//O(n)
public void tour(Joueur joueur){
System.out.println("Au tour de : " + joueur.couleur);
......@@ -104,6 +106,7 @@ public class Partie {
* Vérifie la condition de victoire de la partie
* @return Vrai si la partie est fini (toutes les cases sont coloriées) faux sinon
*/
//O(1)
private boolean estFini() {
return this.getPlateau().getLongueur()*this.getPlateau().getLongueur() == this.getPlateau().getNbCasesColoriees();
}
......@@ -111,9 +114,11 @@ public class Partie {
/**
* Fini la partie et détermine la vainqueur
*/
//O(1)
public void finirPartie() {
//TODO : implementer
int score = calculScore();
int score = CalculeScore();
System.out.println(this.score);
System.out.println(score > 0? "Bleu gagne" : score < 0? "Rouge gagne" : "Draw!");
}
......@@ -122,10 +127,12 @@ public class Partie {
* Calcule le score du plateau actuel
* @return le score actuel
*/
public int calculScore() {
//O(n)
public int CalculeScore() {
int score;
score = this.getPlateau().calculeScore();
score = this.getPlateau().CalculeScore();
setScore(score);
return score;
......@@ -137,6 +144,7 @@ public class Partie {
* @param joueur le joueur qui souhaite évaluer la case caseJouee
* @return le score si joueur joue caseJouee
*/
//O(n)
public int evaluerCase(Case caseJouee, Joueur joueur){
switch(this.regle.regleId()){
case 0 :
......@@ -153,6 +161,7 @@ public class Partie {
* @param c la case à jouer
* @param joueur le joueur dont c'est le tour
*/
//O(n)
public void jouerCase(Case c, Joueur joueur){
switch (this.regle.regleId()) {
case 0 :
......
......@@ -10,7 +10,8 @@ public class PetiteRegion extends Region{
//6 7 8
//3 4 5
//0 1 2
//O(1)
public PetiteRegion(Case basGauche, Case hautDroite, Case[][] cases) {
super(basGauche, hautDroite);
// TODO Auto-generated constructor stub
......@@ -34,6 +35,7 @@ public class PetiteRegion extends Region{
/**
* Mets à jour l'attribut acquise de cette petite région ainsi que des autres régions à modifier en conséquences
*/
//O(1)
@Override
public void updateAcquise(){
boolean nouveauStatusAcquise = true;
......@@ -62,8 +64,11 @@ public class PetiteRegion extends Region{
/**
* Mets à jour l'attribut coloriee de cette petite région ainsi que des autres régions à modifier en conséquences
*/
//O(1)
@Override
public void updateColoriee() {
System.out.println("UPDATE COLORIEE");
int i = 0;
boolean caseNonColorieeTrouvee = false;
......@@ -84,6 +89,7 @@ public class PetiteRegion extends Region{
/**
* Rend cette petite région ainsi que toutes les cases qu'elle contient acquises
*/
//O(1)
@Override
public void acquerir(){
this.setAcquise(true);
......@@ -96,6 +102,7 @@ public class PetiteRegion extends Region{
* Colorie chacune des cases contenues dans cette petite région et mets à jour l'attribut coloriee de cette petite région ainsi que des autres régions à modifier en conséquences
* @param couleur la couleur avec laquelle on veut colorier les cases de cette petite région
*/
//O(log n)
@Override
public void colorierRegion(Couleur couleur) {
for(int i = 0; i < 9; i++){
......@@ -111,6 +118,7 @@ public class PetiteRegion extends Region{
* @return La variation de score entraînée par le coloriage de cette petite région avec la couleur passée en paramètre
* @param couleur la couleur avec laquelle on veut colorier les cases de cette petite région
*/
//O(1)
public int colorierRegionEvaluation(Couleur couleur) {
int modifScore = 0;
Couleur adversaire = (couleur==Couleur.B? Couleur.R: Couleur.B);
......@@ -140,6 +148,7 @@ public class PetiteRegion extends Region{
* Calcule le score de cette petite région
* @return le score actuel pour cette petite région, sous la forme d'un tableau de deux éléments, le premier étant le nombre de cases bleues et le deuxième le nombre de cases rouges
*/
//O(1)
@Override
public int[] calculScore(){
int[] returnArray = new int[2];
......@@ -163,6 +172,7 @@ public class PetiteRegion extends Region{
}
@Override
//O(1)
public Case meilleurCoup() {
if(getNbColoriees()%2 == 0){
for(Case c : cases){
......
......@@ -17,6 +17,7 @@ public class Pile {
}
}
//O(1) Pour le glouton brave
public Case meilleurCoup(){
int i = valeurs.length-1;
......@@ -37,6 +38,7 @@ public class Pile {
return returnCase;
}
//O(1)
public void enlever(Case c){
int val = c.getValeur() > 0? c.getValeur() : 0;
......@@ -83,6 +85,7 @@ public class Pile {
//afficherPile();
}
//O(1) pour le glouton brave
public void modifierValeur(Case c, int i) {
enlever(c);
......
......@@ -18,11 +18,8 @@ public class Plateau{
private Pile pilePriorite;
private Partie partie;
Plateau(int longueur, String cases){
//TODO : implémenter la création de la matrice depuis un fichier
}
//constructeur : un plateau non subdivisé
//O(n)
public Plateau (int longueur, Partie partie){
this.longueur = longueur;
this.partie = partie;
......@@ -56,6 +53,7 @@ public class Plateau{
this.arbrePlateau = null;
}
//O(n)
public Plateau(Partie partie, String path) {
this.partie = partie;
this.nbCasesColoriees = 0;
......@@ -64,12 +62,12 @@ public class Plateau{
RemplirPlateau(path);
}
// /home/theray1/Documents/file.txt
/**
* Initialise le plateau de jeu depuis le plateau donné en entrée
*
*/
//O(n)
public void RemplirPlateau(String path) {
File file = new File(path);
Scanner scanner = null;
......@@ -108,6 +106,7 @@ public class Plateau{
this.partie.setScore(this.partie.getScore()-1);
break;
}
System.out.println("Case : " + this.matrice[i][j].ligne + "; " + this.matrice[i][j].colonne + "; couleur : " + this.matrice[i][j].getCouleur() + "; input file : " + c);
}
scanner.next();
......@@ -126,7 +125,7 @@ public class Plateau{
Couleur couleur = matrice[i][j].getCouleur();
pilePriorite.ajouter(this.matrice[i][j]);
if (couleur == Couleur.R) {
this.partie.setScore(this.partie.getScore() - 1);
......@@ -192,6 +191,7 @@ public class Plateau{
* @param scoreActuel le scoreActuel de la partie
* @return le score si joueur joue la case c
*/
//0(1)
public int EvalCaseBrave(Case c, Joueur joueur, int scoreActuel){
Couleur couleur = joueur.couleur;
Couleur adversaire = (couleur==Couleur.B? Couleur.R: Couleur.B);
......@@ -229,6 +229,7 @@ public class Plateau{
* @param scoreActuel le scoreActuel de la partie
* @return le score si joueur joue la case c
*/
//O(n)
public int EvalCaseTemeraire(Case c, Joueur joueur, int scoreActuel) {
Couleur couleur = joueur.couleur;
Couleur adversaire = (couleur==Couleur.B? Couleur.R: Couleur.B);
......@@ -289,6 +290,7 @@ public class Plateau{
* @param couleur la couleur du joueur qui déclenche l'appel aux règles 4 et 5
* @return le score si joueur joue la case c
*/
//O(n)
private int RemplirRegionEvaluation(Region reg, Couleur couleur) {
Region regsup = reg.getRegionSuperieure();
......@@ -376,6 +378,7 @@ public class Plateau{
/**
* Crée un arbre pour les règles Téméraire et lance son initialisation
*/
//O(n)
public void initalisationQuadtreeDepuisMatrice() {
this.setArbrePlateau(new Quadtree());
......@@ -394,6 +397,7 @@ public class Plateau{
* 3 4 5
* 0 1 2
*/
//O(1)
public Case[] voisins(Case c){
Case[] casesVoisines = new Case[9];
......@@ -437,6 +441,7 @@ public class Plateau{
* @param c la case blanche à colorier
* @param joueur le joueur qui colorie la case c
*/
//O(1)
public void colorierCaseBrave(Case c, Joueur joueur){
Case[] voisins = this.voisins(c);
Case[] casesInfluencees;
......@@ -460,6 +465,7 @@ public class Plateau{
* @param c la case blanche à colorier
* @param joueur le joueur qui colorie la case c
*/
//O(n)
public void colorierCaseTemeraire(Case c, Joueur joueur){
Case[] voisins = this.voisins(c);
......@@ -468,9 +474,20 @@ public class Plateau{
if(c.getCouleur() == Couleur.A){
colorierTemeraire(c, joueur.couleur);
if(c.getPregion().getNbColoriees() == 9){
c.getPregion().updateAcquise();
c.getPregion().updateColoriee();
}
for (Case x : voisins){
if (x.caseColoriee() && !x.equals(c) && !x.estAcquise()){
if (!x.caseColoriee() && !x.equals(c) && !x.estAcquise()){
colorierTemeraire(x, joueur.couleur);
if(c.getPregion().getNbColoriees() == 9){
c.getPregion().updateAcquise();
c.getPregion().updateColoriee();
}
}
}
}
......@@ -491,6 +508,7 @@ public class Plateau{
* @param c la case à colorier
* @param couleur la couleur avec laquelle on souhaite colorier la case c (Bleu ou Rouge)
*/
//O(1)
public void colorierBrave(Case c, Couleur couleur) {
//Modif nb cases coloriees
......@@ -533,6 +551,7 @@ public class Plateau{
* @param c la case à colorier
* @param couleur la couleur avec laquelle on souhaite colorier la case c
*/
//O(1)
public void colorierTemeraire(Case c, Couleur couleur) {
if(c.getCouleur() == Couleur.A){
this.nbCasesColoriees++;
......@@ -549,6 +568,8 @@ public class Plateau{
}
c.colorierTemeraire(couleur);
}
......@@ -557,9 +578,16 @@ public class Plateau{
* @param reg la région sur laquelle on veut tester les règles 4 et 5
* @param couleur la couleur du joueur dont le coup a entraîné l'application des règles 4 et 5
*/
//O(n)
private void RemplirRegion(Region reg, Couleur couleur) {
System.out.println("longueur : " + reg.getLongueur());
Region regsup = reg.getRegionSuperieure();
System.out.println("longueur sup : " + regsup.getLongueur() + " est coloriée? : " + regsup.estColoriee());
if(regsup != null && regsup.estColoriee()) {
int compteurRegionsAcquises = 0;
......@@ -585,6 +613,7 @@ public class Plateau{
/**
* Affiche le plateau du jeu dans le terminal
*/
//O(n)
public void afficherPlateau() {
for(int i = 0; i < this.matrice.length; i++) {
if(i%3 == 0){
......@@ -615,7 +644,8 @@ public class Plateau{
/**
* @return le score actuel du jeu
*/
public int calculeScore() {
//O(n)
public int CalculeScore() {
//TODO : METHODE OBLIGATOIRE
int b = 0;
int r = 0;
......
......@@ -14,6 +14,7 @@ public class Quadtree {
* Lance l'initialisation du quadtree et le relie aux cases du plateau
* @param cases l'ensemble des cases du jeu
*/
//O(n)
public void intialiserDepuisMatrice(Case[][] cases) {
if(cases.length == 3){
this.root = new PetiteRegion(cases[0][0], cases[2][2], cases);
......@@ -24,7 +25,7 @@ public class Quadtree {
this.root.initialiserDepuisMatrice(cases, cases.length, 0, 0, null);
}
//O(1) pour brave
public Case meilleurCoup() {
return this.root.meilleurCoup();
}
......@@ -33,6 +34,7 @@ public class Quadtree {
/**
* Rend une région acquise, et de mettre à jour le statut des régions à modifier en conséquences
*/
//O(log n)
public void acquerir(Region r) {
// TODO Auto-generated method stub
r.acquerir();
......
......@@ -35,57 +35,7 @@ public class Region {
this.coloriee = false;
}
public boolean estFeuille() {
return this.v1 == null
& this.v2 == null
& this.v3 == null
& this.v4 == null;
}
public Case rechercheCase(int iCaseRecherchee, int jCaseRecherchee) {
//TODO : recherche d'une case du plateau dans le quadtree
if(this.estFeuille()) {
if (this.contient(iCaseRecherchee,jCaseRecherchee)) {
PetiteRegion pregion = (PetiteRegion) this;
Case[] cases = pregion.getCases();
int indice = 3*(iCaseRecherchee-pregion.getBasGauche().ligne) + jCaseRecherchee-pregion.getBasGauche().colonne;
return cases[indice];
}
} else {
if(!(v1==null)){
if(v1.contient(iCaseRecherchee,jCaseRecherchee)) {
return v1.rechercheCase(iCaseRecherchee,jCaseRecherchee);
}
}
if(!(v2==null)){
if(v2.contient(iCaseRecherchee,jCaseRecherchee)) {
return v2.rechercheCase(iCaseRecherchee,jCaseRecherchee);
}
}
if(!(v3==null)){
if(v3.contient(iCaseRecherchee,jCaseRecherchee)) {
return v3.rechercheCase(iCaseRecherchee,jCaseRecherchee);
}
}
if(!(v4==null)){
if(v4.contient(iCaseRecherchee,jCaseRecherchee)) {
return v4.rechercheCase(iCaseRecherchee,jCaseRecherchee);
}
}
}
//code supposedly unreachable
return null;
}
//O(log n)
public void acquerir(){
this.setAcquise(true);
this.getV1().acquerir();
......@@ -94,6 +44,7 @@ public class Region {
this.getV4().acquerir();
}
//O(log n)
protected void updateAcquise() {
this.setAcquise(this.getV1().estAcquise()
&& this.getV2().estAcquise()
......@@ -104,6 +55,7 @@ public class Region {
}
}
//O(log n)
public void updateColoriee() {
this.setColoriee(this.getV1().estColoriee()
&& this.getV2().estColoriee()
......@@ -114,6 +66,7 @@ public class Region {
}
}
//O(n)
public void initialiserDepuisMatrice(Case[][] cases, int longueur, int iBasGauche, int jBasGauche, Region regsup) {
if(this instanceof PetiteRegion){
......@@ -156,6 +109,7 @@ public class Region {
}
//Toujours appelé dans des parties avec la règle téméraire, donc pas besoin de spécifier le nom
//O(n)
public void colorierRegion(Couleur couleur) {
this.getV1().colorierRegion(couleur);
this.getV2().colorierRegion(couleur);
......@@ -163,6 +117,7 @@ public class Region {
this.getV4().colorierRegion(couleur);
}
//O(n)
public int colorierRegionEvaluation(Couleur couleur) {
int modifScore = 0;
......@@ -181,6 +136,7 @@ public class Region {
return modifScore;
}
//O(n)
public int[] calculScore() {
int[] scorev1 = this.getV1().calculScore();
int[] scorev2 = this.getV2().calculScore();
......@@ -190,6 +146,8 @@ public class Region {
return new int[]{scorev1[0] + scorev2[0] + scorev3[0] + scorev4[0], scorev1[1] + scorev2[1] + scorev3[1] + scorev4[1]};
}
//O(logn)
public Case meilleurCoup() {
// On pourrait croire que meilleurCase peut etre nul. Cependant, Le nombre de cases coloriées augmente toujours de 1 à chaque tour, et l'ordinateur joue toujours en deuxième
// Ainsi il y'a toujours une petite région au moins dans laquelle il y'a un nombre pair de cases coloriées lorsque l'ordinateur joue.
......@@ -242,6 +200,7 @@ public class Region {
return this.hautDroite;
}
//O(1)
public boolean contient(int iCaseRecherchee, int jCaseRecherchee) {
// TODO Auto-generated method stub
return (iCaseRecherchee >= this.basGauche.ligne
......@@ -307,6 +266,7 @@ public class Region {
this.regionSuperieure = regionSuperieure;
}
//O(log n)
public int getNbColoriees(){
return this.v1.getNbColoriees()
+ this.v2.getNbColoriees()
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment