Abbiamo un bug nel nostro programma. Ci siamo dimenticati rimuovere i colpi che sono andati a segno dalla lista di caselle che compongono la nave da colpire.
Il modo più intuitivo di agire é quello di fare in modo che la nave sia un ArrayList di locazioni. Ogni volta che una cella della nave é individuata viene rimossa. Dunque la nostra nave contiene tutte e sole le celle non ancora scoperte.
ArrayList é una classe container template fornita da Java.
Alcuni dei metodi che mette a disposizione sono:
- add(E elem): aggiunge l'elemento alla lista;
- remove(int index): rimuove l'elemento all'indice passato;
- remove(E elem): rimuove l'elemento passato, se presente in lista;
- contains(E elem): true se c'é un match per l'elemento passato;
- isEmpty(): true se la lista é vuota;
- indexOf(E elem): l'indice dell'elemento, o -1;
- size(): il numero di elementi nella lista;
- get(int index): l'elemento all'indice passato.
package DotCom;
import java.util.ArrayList;
public class Simple {
private ArrayList<Integer> target;
public void setTarget(ArrayList<Integer> target) {
this.target = target;
}
public Result check(int x) {
int index = target.indexOf(x);
if(index == -1) {
return Result.Miss;
}
target.remove(index); // hit or kill!
return target.isEmpty() ? Result.Kill : Result.Hit;
}
}
Il target dei colpi ora é un ArrayList di interi, il metodo setTarget() cambia il suo parametro in input; check() risulta semplificata, in quanto usa i metodi di ArrayList.
I test cambiano di conseguenza, in quanto il bersaglio viene ora passato come ArrayList di interi. Ad esempio il finto main di prova prepara il target in questo modo:
int base = (int) (Math.random() * 5); // [0,4]
ArrayList<Integer> target = new ArrayList<Integer>();
target.add(base);
target.add(base + 1);
target.add(base + 2);
Baco risolto, i test ora corrono senza dare errori.
Nessun commento:
Posta un commento