RobottinoAzioni.java (17762B)
1 // Dichiaro che questa classa farà parte del package RobottinoAzioni, che verrà poi importato dalle classi Robottino e Grafica. 2 package RobottinoAzioni; 3 4 // Anche qui impoerto i package necessari. 5 import java.util.Scanner; 6 import java.util.Vector; 7 import RobottinoUtils.*; 8 9 public class RobottinoAzioni { 10 11 // Creo gli oggetti statici che riempiranno il vettore pdrA: 12 // pdrA è un vettore multidimensionale che a sua volta contiene vettori 13 // (il primo si chiama pdrB, i successivi non avranno nome) che coontengono 14 // 4 istanze di PartiDelRobot, cioè i 4 arti del robot. 15 // Poi creo un vettore che conterrà i nomi dei robot. 16 // Creo il vettore principale... 17 public static Vector pdrA = new Vector(1); 18 19 // ...e il "sottovettore" come istanze della classe Vector 20 public static Vector pdrB = new Vector(4); 21 22 // Creo le quattro istanze di PartidelRobot utilizzando l'apposito costruttore 23 // passo a tutte una stringa e un valore boleano che determina lo stato 24 // (alzato/a se true, abbassato/a se false). 25 public static PartiDelRobot leftArm = new PartiDelRobot(false, "il braccio sinistro alzato"); 26 public static PartiDelRobot rightArm = new PartiDelRobot(false, "il braccio destro alzato"); 27 public static PartiDelRobot leftLeg = new PartiDelRobot(false, "la gamba sinistra alzata"); 28 public static PartiDelRobot rightLeg = new PartiDelRobot(false, "la gamba destra alzata"); 29 30 // Il vettore nomeRobot per i nomi 31 // il vettore può contenere stringhe, poichè non sono tipi primitivi ma oggetti della classe String 32 public static Vector nomeRobot = new Vector(1); 33 34 // La variabile robotIndex serve a tenere in memoria su quale robot si sta operando: 35 // in seguito verrà usata quando l'utente deciderà di creare più di un robot 36 // e poi di dare comandi a uno o all'altro/i. 37 int robotIndex = 0; 38 39 // Dichiarazione del metodo Azioni. 40 public String Azioni(String comando, Vector nomeRobot, Vector pdrA) { 41 42 // Crea un'istanza della classe Scanner per 43 // ricevere gli input nel caso in cui debba essere dato il nome 44 // al robottino o scelto un robottino da una lista. 45 Scanner sc2 = new Scanner(System.in); 46 47 // La variabile contatore memorizza il numero di variabili "PartiDelRobot.statoParte" 48 // che hanno valore true, ossia il numero di arti alzati di un robottino 49 // in modo da poter scegliere la frase giusta da dare come output 50 // al posto dell'immagine del robottino con tali arti alzati. 51 int contatore = 0; 52 53 // Questo array ha il compito di memorizzare le stringhe corrispondenti agli alzati 54 // per motivi simili a quelli della variabile "contatore". 55 String stat[] = {"", "", "", ""}; 56 57 // La stringa Return verrà successivamente modificata e restituita in alcuni casi. 58 String Return = "Errore - si consiglia di picchiare il programmatore"; 59 60 // Per far si che il programma non distingua tra lettere maiuscole o minuscole per quanto riguardo gli input 61 // è stato usato il metodo "equalsIgnoreCase" della classe String. 62 // I quattro casi successivi cambiano il valore della varibalie "statoParte" relativa all'arto 63 // Che deve mouversi (quindi cambiare la sua posizione). 64 if (comando.equalsIgnoreCase("leftarmmove")) 65 ((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(0)).statoParte = 66 !((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(0)).statoParte; 67 68 else if (comando.equalsIgnoreCase("rightarmmove")) 69 ((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(1)).statoParte = 70 !((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(1)).statoParte; 71 72 else if (comando.equalsIgnoreCase("leftlegmove")) 73 ((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(2)).statoParte = 74 !((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(2)).statoParte; 75 76 else if (comando.equalsIgnoreCase("rightlegmove")) 77 ((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(3)).statoParte = 78 !((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(3)).statoParte; 79 80 // I casi successivi modificano il valore della varibile analogamente ai 4 precedenti. 81 else if (comando.equalsIgnoreCase("leftarmon")) 82 ((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(0)).statoParte = true; 83 84 else if (comando.equalsIgnoreCase("rightarmon")) 85 ((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(1)).statoParte = true; 86 87 else if (comando.equalsIgnoreCase("leftlegon")) 88 ((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(2)).statoParte = true; 89 90 else if (comando.equalsIgnoreCase("rightlegon")) 91 ((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(3)).statoParte = true; 92 93 else if (comando.equalsIgnoreCase("leftarmoff")) 94 ((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(0)).statoParte = false; 95 96 else if (comando.equalsIgnoreCase("rightarmoff")) 97 ((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(1)).statoParte = false; 98 99 else if (comando.equalsIgnoreCase("leftlegoff")) 100 ((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(2)).statoParte = false; 101 102 else if (comando.equalsIgnoreCase("rightlegoff")) 103 ((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(3)).statoParte = false; 104 105 // Il caso successi si verica quando il comando è "exploud". 106 else if (comando.equalsIgnoreCase("exploud")) { 107 108 // Scrive sullo schermo la seguente frase, che comprende il nome del robottino che non è ancora stato fatto eliminare 109 System.out.println 110 ("Che atroce! Hai fatto esplodere il robottino " + nomeRobot.elementAt(this.robotIndex) + "! Aspetta che te ne faccio un altro"); 111 System.out.println ("..."); 112 113 // Con un ciclo for rendo false tutte le variabili "statoParte" per far sì che il robottino sia come nuovo. 114 for (int i = 0; i < 4; i++) { 115 ((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(i)).statoParte = false; 116 } 117 118 // E azzero anche il nome del robot 119 this.nomeRobot.setElementAt("", this.robotIndex); 120 121 return "Fatto, puoi continuare a giocare"; 122 } 123 124 // Caso per il comando "bier". 125 // La reazione a questo comando è un semplice output quasi totalmente scorrelato al robottino 126 // se non per il fatto che appare il nome del robottino attuale. 127 else if (comando.equalsIgnoreCase("bier")) { 128 System.out.println ("Il robottino " + nomeRobot.elementAt(this.robotIndex) + "sta trangugiando una birra..."); 129 System.out.println ("Buurrrrrrrrp!"); 130 return "La birra analcolica fa schifo!"; 131 } 132 133 // Per il comando "rename", rinomina. 134 else if (comando.equalsIgnoreCase("rename")) { 135 136 System.out.println ("Con questo comando quoi cambiare il nome del robottino " + nomeRobot.elementAt(this.robotIndex)); 137 System.out.println ("Digita il nuovo nome e premi INVIO per coninuare"); 138 139 // Cambia il nome del robottino attuale con quello dell'input. 140 this.nomeRobot.setElementAt(sc2.nextLine(), this.robotIndex); 141 142 // Se il nome non è vuoto, aggiunge un carattere di spazio per migliorare la visualizzazione nelle frasi di output. 143 if (!(((String)nomeRobot.elementAt(this.robotIndex)).equalsIgnoreCase(""))) 144 this.nomeRobot.setElementAt(this.nomeRobot.elementAt(this.robotIndex) + " ", this.robotIndex); 145 146 // Semplice output con il nuovo nome. 147 return "Ora il robottino si chiama " + nomeRobot.elementAt(this.robotIndex); 148 } 149 150 // Per il comando "porky". 151 // Ancora meno che per "bier". 152 else if (comando.equalsIgnoreCase("porky")) { 153 System.out.println ("Porky è un grande"); 154 System.out.println ("Per maggiori informazioni visita il sito"); 155 return "http://kakati.forumfree.net/"; 156 } 157 158 // Il comando "xxx" ha funzioni analoghe a bier. 159 else if (comando.equalsIgnoreCase("xxx")) { 160 System.out.println ("Il robottino " + nomeRobot.elementAt(this.robotIndex) + "ha incontrato una bella robottina..."); 161 return "*Censura*"; 162 } 163 164 // "dance" setta tutte le variabili "statoParte" a false... 165 else if (comando.equalsIgnoreCase("dance")) { 166 167 System.out.println ("Immagini che il robottino " + nomeRobot.elementAt(this.robotIndex) + " stia ballando..."); 168 System.out.println ("Il robottino ha smesso di ballare"); 169 170 //...con questo ciclo for 171 for (int i = 0; i < 4; i++) { 172 ((PartiDelRobot)((Vector)this.pdrA.elementAt(this.robotIndex)).elementAt(i)).statoParte = false; 173 } 174 175 return "Il robottino " + nomeRobot.elementAt(this.robotIndex) + "si è fermato ed è tornato nella posizione originale"; 176 177 // Per il comando "newrobot", che crea un nuovo robottino. 178 } 179 else if (comando.equalsIgnoreCase("newrobot")) { 180 181 // Aggiunge un elemento a "pdrA" con il metodo "addElement", della classe Vector. 182 // È stata necessaria la dicitura this. per modificare realmente il vettore. 183 // Se non lo avessi fatto non sarebbe successo, in quanto i metodi operano 184 // su i valori e non sulle variabili/oggetti. 185 this.pdrA.addElement(pdrB); 186 187 // Aggiungo le 4 parti del robot. 188 // Forse avete già notato (ma quì sono più evidenti) alcuni cast che ho fatto: 189 // sono per far si che il compilatore capisca che il metodo viene invocato da un oggetto 190 // della classe vector, che senza cast considererebbe della classe Object. 191 ((Vector)(this.pdrA.elementAt(pdrA.size()-1))).addElement (leftArm); 192 ((Vector)(this.pdrA.elementAt(pdrA.size()-1))).addElement (rightArm); 193 ((Vector)(this.pdrA.elementAt(pdrA.size()-1))).addElement (leftLeg); 194 ((Vector)(this.pdrA.elementAt(pdrA.size()-1))).addElement (rightLeg); 195 196 // Semplice output con richiesta di nome per il nuovo robottino. 197 System.out.println ("È stato creato un nuovo robot. Vuoi dare un nome al nuovo robot?"); 198 System.out.println ("Inserisci il nuovo nome e premi INVIO oppure lascia vuoto e premi INVIO"); 199 200 String newName = sc2.nextLine(); 201 202 if (!(((String)nomeRobot.elementAt(this.robotIndex)).equalsIgnoreCase(""))) 203 this.nomeRobot.setElementAt(this.nomeRobot.elementAt(this.robotIndex) + " ", this.robotIndex); 204 205 this.nomeRobot.addElement(newName); 206 207 return "È stato creato il robottino " + newName; 208 } 209 210 // Il comando "deleterobot", per eliminare un robot. 211 else if (comando.equalsIgnoreCase("deleterobot")) { 212 213 // Se c'è più di un robot esegue l'eliminazione. 214 if (pdrA.size()>1) { 215 System.out.println ("Quale robottino vuoi eliminare?"); 216 System.out.println (""); 217 218 // Con un ciclo for scrive i nomi di tutti i robot preceduti da un numero in sequenza. 219 // Il numero è il corrispondente del loro indice di vettore. 220 for (int i = 0; i<this.pdrA.size(); i++) { 221 System.out.println (i + ". " + this.nomeRobot.elementAt(i)); 222 } 223 224 // Dà le istruzioni all'utente affinché capisca come eliminare un robot. 225 System.out.println (""); 226 System.out.println("Scegliere il robottino da eliminare digitando il numero corrispondente e premendo INVIO"); 227 System.out.println("Digitare un qualunque altro numero e premere INVIO per annullare"); 228 229 // Riceve in input il numero e ne assegna il valore alla variabile "num". 230 int num = sc2.nextInt(); 231 232 // Elimina gli elementi corrispondenti al robottino (nome e robot) dai 233 // rispettivi vettori con il metodo "removeElementAt" della classe Vector. 234 if (num<this.pdrA.size()) { 235 this.pdrA.removeElementAt(num); 236 this.nomeRobot.removeElementAt(num); 237 return "È stato eliminato il robottino numero " + num; 238 } 239 240 // Se il numero ricevuto in input è superiore all'indice dei robot 241 // non elimina alcun robot. 242 else return "Operazione annullata"; 243 } 244 245 // Se c'è solo un robot non esegue l'eliminazione. 246 else return "Hai solo un robottino, non puoi eliminarlo!"; 247 } 248 249 // Il comando "changerobot" per cambiare il robot a cui dare le istruzioni 250 else if (comando.equalsIgnoreCase("changerobot")) { 251 252 // L'esecuzione è simile a quella per il comando "deleterobot", con la differenza che il robot non viene eliminato 253 // ma viene semplicemente cambiato il valore della variabile "robotIndex". 254 if (pdrA.size()>1) { 255 System.out.println ("A quale robottino vuoi dare i comandi?"); 256 System.out.println (""); 257 for (int i = 0; i<this.pdrA.size(); i++) { 258 System.out.println (i + ". " + this.nomeRobot.elementAt(i)); 259 } 260 System.out.println (""); 261 System.out.println ("Digita il numero corrispondente alla tua scelta e premi INVIO"); 262 int newIndex = sc2.nextInt(); 263 264 // Prima di cambiare valore alla variabile di indice verifica che il numero sia valido. 265 if (newIndex<this.pdrA.size()) { 266 this.robotIndex = newIndex; 267 return "È stato selezionato il robottino numero " + this.robotIndex + ": " + this.nomeRobot.elementAt 268 (this.robotIndex); 269 } 270 271 // Se non lo è non esegue l'assegnamento. 272 else return "Numero non valido"; 273 } 274 else { 275 return "Hai solo un robottino, non puoi cambiarlo con un altro!"; 276 } 277 } 278 279 // Il comando "robotlist" visualizza una lista dei robot presenti. 280 else if (comando.equalsIgnoreCase("robotlist")) { 281 for (int i = 0; i<this.pdrA.size(); i++) { 282 System.out.println (i + ". " + this.nomeRobot.elementAt(i)); 283 } 284 return ""; 285 } 286 287 // Il comando "l", per la legenda, visualizza la lista dei comandi con relativa descrizione. 288 else if (comando.equalsIgnoreCase("l")) { 289 System.out.println ("Legenda comandi"); 290 System.out.println (""); 291 System.out.println ("Comandi relativi agli arti"); 292 System.out.println (""); 293 System.out.println ("LeftArmMove: cambia la posizione corrente del braccio sinistro del robot"); 294 System.out.println ("RightArmMove: cambia la posizione corrente del braccio destro del robot"); 295 System.out.println ("LeftLegMove: cambia la posizione corrente della gamba sinistra del robot"); 296 System.out.println ("RightLegMove: cambia la posizione corrente della gamba destra del robot"); 297 System.out.println ("LeftArmOn: se il braccio sinistro non è alzato, lo alza, altrimenti la posizione resta invariata"); 298 System.out.println ("RightArmOn: se il braccio destro non è alzato, lo alza, altrimenti la posizione resta invariata"); 299 System.out.println ("LeftLegOn: se la gamba sinistra non è alzata, la alza, altrimenti la posizione resta invariata"); 300 System.out.println ("RightLegOn: se la gamba destra non è alzata, la alza, altrimenti la posizione resta invariata"); 301 System.out.println ("LeftArmOff: se il braccio sinistro non è abbassato, lo abbassa, altrimenti la posizione resta invariata"); 302 System.out.println ("RightArmOff: se il braccio destro non è abbassato, lo abbassa, altrimenti la posizione resta invariata"); 303 System.out.println ("LeftLegOff: se la gamba sinistra non è abbassata, la abbassa, altrimenti la posizione resta invariata"); 304 System.out.println ("RightLegOff: se la gamba destra non è abbassata, la abbassa, altrimenti la posizione resta invariata"); 305 System.out.println (""); 306 System.out.println ("Altri comandi:"); 307 System.out.println (""); 308 System.out.println ("NewRobot: aggiunge un nuovo robot"); 309 System.out.println ("ChangeRobot: cambia il robot attuale"); 310 System.out.println ("RobotList: visualizza la lista dei robot"); 311 System.out.println ("Rename: rinomina il robottino"); 312 System.out.println (""); 313 System.out.println ("Comandi a sorpresa:"); 314 System.out.println (""); 315 System.out.println ("Exploud"); 316 System.out.println ("Bier"); 317 System.out.println ("Porky"); 318 System.out.println ("xxx"); 319 System.out.println ("dance"); 320 System.out.println (""); 321 System.out.println ("Exit: esci dal programma"); 322 323 return ""; 324 325 } 326 327 // Se il comando è exit, non viene eseguita nessuna operazione (tranne restituire una stringa vuota) 328 // Perché il ciclo do-while nel metodo main, appena verificherà la condizione che il comando è 329 // uguale a "exit", terminerà da solo l'esecuzione del programma. 330 else if (comando.equalsIgnoreCase("exit")) return ""; 331 332 // Se l'input non è tra i comandi prestabiliti, visualizza la seguente scritta sullo schermo. 333 else 334 System.out.println ("Comando non riconosciuto - digitare l per una legenda dei comandi disponibili"); 335 System.out.println (""); 336 337 // Quì di seguito viene chiarito l'utilizzo di "contatore" e "sta[]". 338 // Per ogni varibile "statoParte" che ha valore true, contatore viene incrementato 339 // e l'elemento successivo dell'array "stat[]" assume il valore della stringa corrispondente. 340 for (int i = 0, j = 0; i < 4; i++) { 341 if (((PartiDelRobot)((Vector)pdrA.elementAt(this.robotIndex)).elementAt(i)).statoParte) { 342 contatore += 1; 343 stat[j++] = ((PartiDelRobot)((Vector)pdrA.elementAt(this.robotIndex)).elementAt(i)).stringaParte; 344 } 345 } 346 347 // La restituzione finale delle frasi, con uno switch che a seconda del valore di contatore 348 // restituisce una frase o l'altra. 349 switch (contatore) { 350 case 0: 351 Return = "Comunque il robottino " + nomeRobot.elementAt(this.robotIndex) + "non sta facendo niente"; 352 break; 353 case 1: 354 Return = "Immagini che il robottino " + nomeRobot.elementAt(this.robotIndex) + "abbia " + stat[0] + "."; 355 break; 356 case 2: 357 Return = "Immagini che il robottino " + nomeRobot.elementAt(this.robotIndex) + "abbia " + stat[0] + " e " + stat[1] + "."; 358 break; 359 case 3: 360 Return = "Immagini che il robottino " + nomeRobot.elementAt(this.robotIndex) + "abbia " + stat[0] + ", " + stat[1] + " e " + stat[2] + "."; 361 break; 362 case 4: 363 Return = "Immagini che il robottino " + nomeRobot.elementAt(this.robotIndex) + "abbia " + stat[0] + ", " + stat[1] + ", " + stat[2] + " e " + stat[3] + "."; 364 break; 365 } 366 return Return; 367 } 368 //Fine del metodo Azioni 369 }