SAe/SAe2.1/commentente/SAé/Controleur.java

296 lines
13 KiB
Java
Raw Normal View History

2023-05-19 17:13:41 +02:00
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.event.*;
public class Controleur extends JFrame implements KeyListener {
private Case[][] tableauCase; //Création d'un tableau pour stocker les cases du plateau de jeu
private VuePlateau plateau; //Création d'une variable vue du plateau de jeu
private int xHeros; //Création d'une variable coordonées x du héros
private int yHeros; //Création d'une variable coordonées Y du héros
private int points; //Création d'une variable points
public Controleur() {
//Initialisation des coordonnées du héros et des points
this.xHeros = 1;
this.yHeros = 1;
this.points = 0;
//Création du tableau de cases et de vues de cases
this.tableauCase = new Case[3][3];
VueCase[][] tabCase = new VueCase[3][3];
//Parcours du tableau de cases
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == this.xHeros && j == this.yHeros) {
//Création d'une instance de la classe Heros pour le héros
this.tableauCase[i][j] = new Heros(i, j);
//Création d'une vue de case pour le héros
tabCase[i][j] = new VueCase(tableauCase[i][j]);
this.add(tabCase[i][j]);
} else {
//Création d'une instance de la classe Case pour les autres cases
Case c = new Case(i, j, "temp");
//Génération d'une case aléatoire
this.tableauCase[i][j] = c.newRandomCase(i, j);
//Création d'une vue de case pour la case aléatoire
tabCase[i][j] = new VueCase(tableauCase[i][j]);
this.add(tabCase[i][j]);
}
}
}
//Création de la vue du plateau en utilisant le tableau de vues de cases
this.setLayout(new GridLayout(4,4));
this.plateau = new VuePlateau(tabCase);
this.add(this.plateau);
//Mise à jour de la vue du plateau avec les cases du tableau
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
this.plateau.update(this.tableauCase[i][j], i, j);
}
}
//Ajout du contrôleur en tant que KeyListener pour gérer les événements clavier
this.addKeyListener(this);
}
private void rencontre(int xNew, int yNew) {
int tempX = xHeros;
int tempY = yHeros;
int tempZ;
VueCase[][] tabCase = new VueCase[3][3];
if (!this.tableauCase[xHeros][yHeros].rencontrer(this.tableauCase[xNew][yNew])) { //Vérifie si le héros peut rencontrer la case aux nouvelles coordonnées
if (this.tableauCase[xHeros][yHeros].getArme().getValue() > 0) { //Vérifie si le héros a une arme et si sa valeur est supérieure à 0
if (this.tableauCase[xHeros][yHeros].getArme().getValue() > this.tableauCase[xNew][yNew].getPv()) { // Vérifie si la valeur de l'arme du héros est supérieure aux points de vie de la case
tempZ=this.tableauCase[xNew][yNew].getPv(); //Réduit la valeur de l'arme du héros de la valeur des points de vie de la case
this.tableauCase[xHeros][yHeros].setArme(this.tableauCase[xHeros][yHeros].getArme().getValue()-tempZ);
this.tableauCase[xNew][yNew] = new Or(this.tableauCase[xNew][yNew].getPv() ,xNew ,yNew ); //Remplace la case par une case "Or" avec la valeur des points de vie
//Met à jour la vue du plateau
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
tabCase[i][j] = new VueCase(tableauCase[i][j]);
tabCase[i][j].setLocation(i * 200, j * 200);
tabCase[i][j].setSize(200, 200);
this.add(tabCase[i][j]);
this.plateau.update(this.tableauCase[i][j], i, j);
}
}
} else {
this.tableauCase[xNew][yNew].setPv(this.tableauCase[xNew][yNew].getPv() - this.tableauCase[xHeros][yHeros].getArme().getValue()); //Réduit les points de vie de la case par la valeur de l'arme du héros
this.tableauCase[xHeros][yHeros].setArme(0);
//Met à jour la vue du plateau
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
this.plateau.update(this.tableauCase[i][j], i, j);
tabCase[i][j] = new VueCase(tableauCase[i][j]);
tabCase[i][j].setLocation(i * 200, j * 200);
tabCase[i][j].setSize(200, 200);
this.add(tabCase[i][j]);
}
}
}
}
} else {
if (this.tableauCase[xNew][yNew].type.equals("or")) { //Vérifie si la case aux nouvelles coordonnées est de type "or"
this.points += this.tableauCase[xNew][yNew].getValue(); //Ajoute la valeur de la case aux points du héros et met à jour la vue du plateau
this.plateau.upPoint(this.tableauCase[xNew][yNew].getValue());
this.tableauCase[xNew][yNew] = this.tableauCase[xHeros][yHeros]; //Remplace la case par le héros
this.tableauCase[xHeros][yHeros] = new Case(xHeros, yHeros, "temp").newRandomCase(xHeros, yHeros); //Génère une nouvelle case aléatoire à l'ancienne position du héros
//Met à jour la vue du plateau
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
this.plateau.update(this.tableauCase[i][j], i, j);
tabCase[i][j] = new VueCase(tableauCase[i][j]);
tabCase[i][j].setLocation(i * 200, j * 200);
tabCase[i][j].setSize(200, 200);
this.add(tabCase[i][j]);
}
}
//On met à jour les coordonnées du héros
xHeros = xNew;
yHeros = yNew;
}
if (this.tableauCase[xNew][yNew].type.equals("arme")) { //Vérifie si la case aux nouvelles coordonnées est de type "arme"
if (this.tableauCase[xHeros][yHeros].getArme().getValue() < this.tableauCase[xNew][yNew].getValue()) { //Vérifie si la valeur de l'arme du héros est inférieure à la valeur de l'arme de la case
this.tableauCase[xHeros][yHeros].setArme(this.tableauCase[xNew][yNew].getValue()); //Si c'est le cas, le héros récupère l'arme de la case
this.points += this.tableauCase[xNew][yNew].getValue(); //Ajoute la valeur de la case aux points du héros et met à jour la vue du plateau
this.plateau.upPoint(this.tableauCase[xNew][yNew].getValue());
this.tableauCase[xNew][yNew] = this.tableauCase[xHeros][yHeros]; //Remplace la case par le héros
this.tableauCase[xHeros][yHeros] = new Case(xHeros, yHeros, "temp").newRandomCase(xHeros, yHeros);
//Met à jour la vue du plateau
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
this.plateau.update(this.tableauCase[i][j], i, j);
tabCase[i][j] = new VueCase(tableauCase[i][j]);
tabCase[i][j].setLocation(i * 200, j * 200);
tabCase[i][j].setSize(200, 200);
this.add(tabCase[i][j]);
}
}
//Met à jour les coordonnées du héros
xHeros = xNew;
yHeros = yNew;
} else {
this.points += this.tableauCase[xNew][yNew].getValue(); //Ajoute la valeur de la case aux points du héros et met à jour la vue du plateau
this.plateau.upPoint(this.tableauCase[xNew][yNew].getValue());
this.tableauCase[xNew][yNew] = this.tableauCase[xHeros][yHeros]; //Remplace la case par le héros
this.tableauCase[xHeros][yHeros] = new Case(xHeros, yHeros, "temp").newRandomCase(xHeros, yHeros); //Génère une nouvelle case aléatoire à l'ancienne position du héros
//Met à jour la vue du plateau
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
this.plateau.update(this.tableauCase[i][j], i, j);
tabCase[i][j] = new VueCase(tableauCase[i][j]);
tabCase[i][j].setLocation(i * 200, j * 200);
tabCase[i][j].setSize(200, 200);
this.add(tabCase[i][j]);
}
}
//On met à jour les coordonnées du héros
xHeros = xNew;
yHeros = yNew;
}
}
if (this.tableauCase[xNew][yNew].type.equals("potion")) { //Vérifie si la case aux nouvelles coordonnées est de type "potion"
this.points += this.tableauCase[xNew][yNew].getValue(); //Ajoute la valeur de la case aux points du héros et met à jour la vue du plateau
this.plateau.upPoint(this.tableauCase[xNew][yNew].getValue());
this.tableauCase[xNew][yNew] = this.tableauCase[xHeros][yHeros]; //Remplace la case par le héros
this.tableauCase[xHeros][yHeros] = new Case(xHeros, yHeros, "temp").newRandomCase(xHeros, yHeros); //Génère une nouvelle case aléatoire à l'ancienne position du héros
//On met à jour la vue du plateau
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
this.plateau.update(this.tableauCase[i][j], i, j);
tabCase[i][j] = new VueCase(tableauCase[i][j]);
tabCase[i][j].setLocation(i * 200, j * 200);
tabCase[i][j].setSize(200, 200);
this.add(tabCase[i][j]);
}
}
//On met à jour les coordonnées du héros
xHeros = xNew;
yHeros = yNew;
}
if (this.tableauCase[xNew][yNew].type.equals("monstre")) { //Vérifie si la case aux nouvelles coordonnées est de type "monstre"
this.tableauCase[xHeros][yHeros].setPv(this.tableauCase[xHeros][yHeros].getPv()-this.tableauCase[xNew][yNew].getPv()); //Réduit les points de vie du héros par la valeur des points de vie du monstre
if (this.tableauCase[xHeros][yHeros].getPv() <= 0) { //Si les points de vie du héros sont inférieurs ou égaux à 0, affiche un message de Game Over et termine le jeu
System.out.println("GameOver, votre score final est de : " + this.points);
this.dispose();
} else {
this.points += this.tableauCase[xNew][yNew].getPv(); //Ajoute la valeur de la case aux points du héros et met à jour la vue du plateau
this.plateau.upPoint(this.tableauCase[xNew][yNew].getPv());
this.tableauCase[xNew][yNew] = this.tableauCase[xHeros][yHeros]; //Remplace la case par le héros
this.tableauCase[xHeros][yHeros] = new Case(xHeros, yHeros, "temp").newRandomCase(xHeros, yHeros); //Génère une nouvelle case aléatoire à l'ancienne position du héros
//On met à jour la vue du plateau
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
this.plateau.update(this.tableauCase[i][j], i, j);
tabCase[i][j] = new VueCase(tableauCase[i][j]);
tabCase[i][j].setLocation(i * 200, j * 200);
tabCase[i][j].setSize(200, 200);
this.add(tabCase[i][j]);
}
}
//On met à jour les coordonnées du héros
xHeros = xNew;
yHeros = yNew;
}
}
}
}
@Override
public void keyTyped(KeyEvent e) { //Cette méthode est appelée lorsqu'une touche est tapée (enfoncée puis relâchée) sur le clavier
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
//On récupère les coordonnées actuelles du héros
int tempX = xHeros;
int tempY = yHeros;
if (e.getKeyCode() == KeyEvent.VK_RIGHT) { //Si la touche enfoncée est la flèche du bas
tempX = xHeros;
tempY = yHeros;
if (tempY + 1 > 2) { //Vérifie si le déplacement vers le bas est possible
System.out.println("Impossible d'aller plus à droite.");
} else {
this.rencontre(tempX, tempY + 1); //Appelle la méthode "rencontre" pour gérer la rencontre avec la case en bas
//On met à jour l'affichage du plateau
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
this.plateau.update(this.tableauCase[i][j], i, j);
}
}
}
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) { //Si la touche enfoncée est la flèche du haut
tempX = xHeros;
tempY = yHeros;
if (tempY - 1 < 0) { //Vérifie si le déplacement vers le haut est possible
System.out.println("Impossible d'aller plus à gauche.");
} else {
this.rencontre(tempX, tempY - 1); //Appelle la méthode "rencontre" pour gérer la rencontre avec la case en haut
//On met à jour l'affichage du plateau
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
this.plateau.update(this.tableauCase[i][j], i, j);
}
}
}
}
if (e.getKeyCode() == KeyEvent.VK_UP) { //Si la touche enfoncée est la flèche à gauche
tempX = xHeros;
tempY = yHeros;
if (tempX - 1 < 0) { //Vérifie si le déplacement vers la gauche est possible
System.out.println("Impossible d'aller plus haut.");
} else {
this.rencontre(tempX - 1, tempY); //Appelle la méthode "rencontre" pour gérer la rencontre avec la case à gauche
//On met à jour l'affichage du plat
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
this.plateau.update(this.tableauCase[i][j], i, j);
}
}
}
}
if (e.getKeyCode() == KeyEvent.VK_DOWN) { //Si la touche enfoncée est la flèche à droite
tempX = xHeros;
tempY = yHeros;
if (tempX + 1 > 2) { //Vérifie si le déplacement vers la droite est possible
System.out.println("Impossible d'aller plus bas.");
} else {
this.rencontre(tempX + 1, tempY); //Appelle la méthode "rencontre" pour gérer la rencontre avec la case à droite
//On met à jour l'affichage du plat
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
this.plateau.update(this.tableauCase[i][j], i, j);
}
}
}
}
}
}