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