001import java.util.Stack; 002import java.util.HashMap; 003/** 004 * Classe en relation étroite avec Game Engine, prenant dans son corps toutes les lignes de codes relatives au joueur. 005 * 006 * @author Gabriel Leroux 007 * @version 23/03/2020 008 */ 009public class Player 010{ 011 private Room aCurrentRoom; 012 private Stack <Room> aStackRoom; 013 private UserInterface aGui; 014 private String aNom; 015 private ItemList aListe; 016 private Audio aSon; 017 private int aArgent=100; 018 private int aNbDeplacement; 019 020 // ===== constructeurs ===== 021 /** 022 * Constructeur naturel d'objets de la classe Player 023 * @param pNom c'est le nom du joueur 024 * @param pCurrentRoom la pièce courante 025 */ 026 public Player( final String pNom, final Room pCurrentRoom ) 027 { 028 this.aCurrentRoom=pCurrentRoom; 029 this.aNom=pNom; 030 this.aStackRoom= new Stack <Room>(); 031 this.aSon = new Audio(); 032 aListe=new ItemList(); 033 this.aNbDeplacement=30; 034 } // Player(.) 035 /** 036 * Constructeur de gui 037 * @param pUserInterface interface utilisateur 038 */ 039 public void setGUI( final UserInterface pUserInterface ) 040 { 041 this.aGui = pUserInterface; 042 this.printWelcome(); 043 } 044 045 /** 046 * Accesseur de aCurrentRoom 047 * @return la Room courante 048 */ 049 public Room getCurrentRoom(){ 050 return this.aCurrentRoom; 051 } 052 053 /** 054 * Accesseur qui retourne le nom du joueur 055 * @return le nom du joueur 056 */ 057 public String getNom(){ 058 return this.aNom; 059 } 060 /** 061 * Accesseur de aListe 062 * @return la Hashmap 063 */ 064 public ItemList getListe(){ 065 return this.aListe; 066 } 067 068 /** 069 * Modificateur de aArgent 070 * @param pInt argent à enlever ou ajouter s'il gagne ou perd contre R2D2 071 * 072 */ 073 public void setArgent(final int pInt){ 074 075 this.aArgent=this.aArgent+pInt; 076 077 078 } 079 /** 080 * Procédure de bienvenue affichant ce qui doit être affiché au démarrage du jeu i.e du texte et fais appel 081 * à printLocationInfo(). Cette procédure lance aussi la musique du jeu. 082 */ 083 private void printWelcome(){ 084 085 this.aGui.println("Joueur : "+this.getNom()); 086 this.aGui.println("Bienvenue dans le Gaby's Game !"); 087 this.aGui.println("Je vous souhaite bonne fortune, et que la chance vous sourit ! "); 088 this.aGui.println(" "); 089 this.aGui.println("Tapez 'help' si vous avez besoin d'aide."); 090 this.aGui.println(" "); 091 printLocationInfo(); 092 //lance la musique 093 this.aSon.run("imperial_march.wav"); 094 } 095 096 /** 097 * Procédure permettant d'afficher la description de la Room courante 098 * ainsi que ses sorties en faisant appel à la foction getLongDescription(). 099 * cette procédure indique aussi le nombre d'argent restant au joueur ainsi que 100 * le récapitulatif de ce qu'il possède dans son inventaire. 101 */ 102 public void printLocationInfo(){ 103 this.aGui.println(this.aCurrentRoom.getLongDescription()+ " \n Il vous reste "+this.aArgent+" roubles. \n Votre inventaire : " +this.aListe.returnListItem()+ this.aListe.returnPoidsTot()+"\n Il vous reste "+aNbDeplacement+" déplacements."); 104 if ( this.aCurrentRoom.getImageName() != null ) 105 this.aGui.showImage( this.aCurrentRoom.getImageName() ); 106 107 } 108 109 /** 110 * Affiche la méthode look qui affiche une description de la pièce courante 111 */ 112 public void look(){ 113 printLocationInfo(); 114 //this.aSon.stop(); 115 } 116 /** 117 * méthode permettant de "tirer" 118 * @param pNom, le nom de l'item de type Beamer 119 */ 120 public void seTeleporter(final String pNom){ 121 122 this.changerLaRoom(aListe.getBeamer(pNom).getCharger(),true); 123 124 this.aListe.suppItem(pNom); 125 this.printLocationInfo(); 126 } 127 /** 128 * Changer la Room et compter le nombre de deplacement 129 * @param pRoom change la room courante 130 * @param pBool boolean permettant de savoir s'il faut reinitilaiser la Stack, comme par exemple quand la porte est trap 131 */ 132 public void changerLaRoom(final Room pRoom,final boolean pBool){ 133 this.aStackRoom.push(this.aCurrentRoom); // bien mettre avant sinon aucun sens 134 this.aCurrentRoom=pRoom; 135 this.compteDep(); 136 137 if (pBool==true){ 138 this.aStackRoom =new Stack <Room>(); 139 } 140 } 141 /** 142 * méthode servant à décompter les deplacements du joueur 143 */ 144 public void compteDep(){ 145 this.aNbDeplacement-=1; 146 if (this.aNbDeplacement<=0){ 147 this.aGui.println("Vous avez atteint la limite de déplacement maximum pour finir le jeu."); 148 this.aGui.println( "Thank you for playing. Good bye." ); 149 this.aGui.enable( false ); 150 } 151 } 152 /** 153 * méthode permettant de se rediriger vers la précédente room visitée par le joueur. 154 */ 155 public void back(){ 156 if (this.aStackRoom.empty()==true){ 157 this.aGui.println( "Vous n'avez pas encore bougé, ou voulez vous donc retourner ?!" ); 158 return;} 159 this.aCurrentRoom=this.aStackRoom.pop(); 160 this.compteDep(); 161 this.printLocationInfo(); 162 163 } 164 165 /** 166 * méthode permettant de prendre les objets de la room 167 * @param pNom représentant le nom d'un item 168 */ 169 public void prendre(final String pNom){ 170 try { 171 if(this.aCurrentRoom.retourneItem(pNom).getPrix()<=this.aArgent){ 172 this.aListe.addItem(pNom,this.aCurrentRoom.retourneItem(pNom)); 173 this.aCurrentRoom.suppItem(pNom); 174 this.aArgent=this.aArgent-this.aListe.getItem(pNom).getPrix();} 175 else{this.aGui.println("Vous n'avez pas assez de rouble pour prendre cet item."); 176 } 177 } 178 catch(java.lang.NullPointerException gaby){ this.aGui.println("Je ne vois pas de quel objet vous voulez parler.");} 179 } 180 181 /** 182 * méthode permettant de déposer un objet 183 * @param pNom représentant le nom d'un item 184 */ 185 public void deposer(final String pNom){ 186 try{ 187 188 this.aCurrentRoom.addItem(this.aListe.getItem(pNom)); 189 this.aArgent=this.aArgent+this.aListe.getItem(pNom).getPrix(); 190 this.aListe.suppItem(pNom); 191 } 192 catch(java.lang.NullPointerException gaby){ this.aGui.println("Je ne vois pas de quel objet vous voulez parler.");} 193 } 194 /** 195 * méthode permettant d'ouvrir les objets et d'augmenter le nombrede rouble que le joueur possède 196 * @param pString représentant le nom d'un item 197 */ 198 public void ouvrir(final String pString){ 199 if (pString.equals("bourse")){ 200 this.aGui.println("Magnifique ! La bourse contient 10 roubles. Cette bourse est la chance de votre vie."); 201 this.aArgent+=20; 202 this.aListe.suppItem(pString); 203 } 204 else if (pString.equals("Moyenne_bourse")){ 205 this.aGui.println("Magnifique ! La bourse contient 80 roubles. Cette bourse est la chance de votre vie."); 206 this.aArgent+=80; 207 this.aListe.suppItem(pString); 208 } 209 else if (pString.equals("Grosse_bourse")){ 210 this.aGui.println("Magnifique ! La bourse contient 100 roubles. Cette bourse est la chance de votre vie."); 211 this.aArgent+=100; 212 this.aListe.suppItem(pString); 213 } 214 else{ 215 this.aGui.println("Cet objet n'a pas la possibilité d'être ouvert."); 216 } 217 } 218 219 // ===== Methodes ===== 220} // Player