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