368
Rozdział 8.
Planowanie metody fire
Rozmyślamy o metodzie fire
Metoda
ILUH
odpowiada za przekształcenie współrzędnych pola wytypowanych przez
gracza na trafienie lub pudło. Wiemy już, że to obiekt
YLHZ
będzie się zajmował
wyświetlaniem strzałów zarówno tych trafionych, jak i chybionych, jednak to
właśnie metoda
ILUH
będzie dysponowała logiką niezbędną do określenia,
czy strzał we wskazane pole będzie celny, czy okaże się pudłem.
Ustalenie, że okręt został trafiony, jest bardzo proste; dysponując
współrzędnymi pola wskazanego przez użytkownika, musisz wykonać
kolejne kroki.
Q
Sprawdzić każdy okręt i określić, czy zajmuje on podane pole planszy.
Q
Jeśli zajmuje, oznacza to, że mamy trafienie i należy wpisać wartość
”hit”
w odpowiednie pole tablicy
KLWV
(i jednocześnie poinformować widok
o trafieniu). Oprócz tego trzeba zwrócić
WUXH
jako wartość wynikową metody,
informując tym samym o trafieniu.
Q
Jeśli żaden z okrętów nie zajmuje podanego pola planszy, oznacza to, że strzał okazał
się niecelny. Musimy zatem poinformować o tym widok i zakończyć działanie metody,
Model
ships: informacje
RORNDOL]DFMLRNUĐWyZ
RUD]WUDILHQLDFK
shipsSunk: liczba
]DWRSLRQ\FKRNUĐWyZ
numShips: liczba
RNUĐWyZELRUċF\FK
XG]LDâZJU]H
fire:PHWRGDVâXİċFDGRRGGDZDQLD
VWU]DâXLRNUHĤODQLDF]\MHVWWR
VWU]DâFHOQ\F]\WHİQLH
shipLengthOLF]EDNRPyUHN
VLDWNL]DMPRZDQ\FKSU]H]
NDİG\RNUĐW
boardSizeZLHONRĤþ
VLDWNLWZRU]ċFHMSODQV]Đ
zwracając wartość
IDOVH
.
Dodatkowo metoda
ILUH
powinna także określać, czy okręt został jedynie trafiony, czy już jest zatopiony.
Tym problemem zajmiemy się nieco później, kiedy już poradzimy sobie z resztą logiki metody
ILUH
.
Przygotowywanie metody fire
Spróbujmy przygotować podstawowy szkielet metody
ILUH
. Jej argumentem będą współrzędne pola wskazane
przez gracza, natomiast metoda przeanalizuje każdy z okrętów, by upewnić się, czy został trafiony, czy nie.
Nie napiszemy jeszcze kodu wykrywającego trafienia, a jedynie przygotujemy główną strukturę kodu.
var model = {
boardSize: 7,
numShips: 3,
shipLength: 3,
shipsSunk: 0,
ships: [{ locations: [”06”, ”16”, ”26”], hits: [””, ””, ””] },
{ locations: [”24”, ”34”, ”44”], hits: [””, ””, ””] },
{ locations: [”10”, ”11”, ”12”], hits: [””, ””, ””] }],
fire: function(guess) {
for (var i = 0; i < this.numShips; i++) {
var ship = this.ships[i];
}
}
};
Nie zapomnij dodać
tutaj przecinka!
Metoda pobiera współrzędne
podane przez użytkownika.
Następnie w pętli przeglądamy
każdy element tablicy ships,
analizując kolejno każdy
z zapisanych w niej okrętów.
Kiedy już obraliśmy obiekt okrętu, musimy sprawdzić, czy pole wybrane
przez użytkownika jest jednym z pól zajmowanych przez okręt.
jesteś tutaj
369
Łączenie wszystkiego w całość
Poszukujemy trafień
A zatem teraz, podczas każdej iteracji pętli musimy sprawdzić, czy przekazane
współrzędne odpowiadają któremuś z pól zajmowanych przez okręt.
for (var i = 0; i < this.numShips; i++) {
var ship = this.ships[i];
var locations = ship.locations;
var index = locations.indexOf(guess);
if (index >= 0) {
// Mamy trafienie!
}
}
for (var i = 0; i < this.numShips; i++) {
var ship = this.ships[i];
locations = ship.locations;
}
Teraz potrzebujemy kodu, który sprawdzi,
czy współrzędne podane przez użytkownika
znajdują się w tablicy locations danego okrętu.
Sprawdzamy kolejno
każdy z okrętów.
Pobraliśmy tablicę pól zajmowanych przez
dany okręt. Pamiętaj, że jest to właściwość
obiektu okrętu zawierająca tablicę.
Zwróć uwagę, że metoda indexOf tablicy jest bardzo
podobna do metody indexOf łańcuchów znaków.
Wymaga ona przekazania wartości i zwraca indeks
tej wartości w tablicy (bądź wartość –1, jeśli
wartości nie udało się znaleźć).
Jeśli zatem zwrócony indeks będzie większy lub równy 0, oznacza to,
że współrzędne pola wytypowanego przez użytkownika są zapisane
w tablicy locations, a więc okręt został trafiony.
A zatem, korzystając z metody
LQGH[2I
, kod wykrywający trafienia możemy
zapisać w następujący sposób.
Nasza aktualna sytuacja wygląda następująco: mamy łańcuch znaków,
JXHVV
, którego
poszukujemy w tablicy
ORFDWLRQV
. Jeśli łańcuch ten będzie odpowiadał jednemu z pól
zapisanych w tej tablicy, będzie to oznaczało, że graczowi udało się trafić nasz okręt.
guess = ”16”;
locations = [”06”, ”16”, ”26”];
Moglibyśmy napisać jeszcze jedną pętlę, przeglądającą tablicę
ORFDWLRQV
i porównującą zapisane w niej wartości ze zmienną
JXHVV
— gdyby któraś z nich
była równa tej zmiennej, oznaczałoby to, że okręt został trafiony.
Jednak zamiast kolejnej pętli możemy zrobić to samo w znacznie prostszy sposób.
Musimy dowiedzieć się, czy wartość
w zmiennej guess jest jedną
z wartości zapisanych w tablicy
pól zajmowanych przez okręt.
var index = locations.indexOf(guess);
Metoda indexOf przegląda tablicę, poszukując w niej
wartości odpowiadającej podanemu argumentowi, a jeśli
taką znajdzie, zwraca jej indeks; jeśli wartości nie uda
się znaleźć, metoda zwraca wartość –1.
Zastosowanie metody
LQGH[2I
nie jest w żadnym stopniu bardziej wydajne od samodzielnego
napisania pętli, jednak sprawia, że nasz kod będzie bardziej przejrzysty i znacząco krótszy.
Uważamy także, że zastosowanie tej metody sprawiło, iż zrozumienie przeznaczenia kodu
jest łatwiejsze niż w przypadku użycia pętli: łatwiej zorientować się, czego szukamy w tablicy.
Właśnie zdobyłeś kolejne narzędzie do swojego programistycznego przybornika.
Get Programowanie w JavaScript Rusz głową! now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.