Tak na szybko odnośnie wyglądu (piszę w oparciu o to, co jest na jsfiddle) - duży postęp, wygląda 100 razy lepiej niż na początku. Nie jest to może interface na miarę Facebooka, ale daje radę, poza tym należy docenić duże ulepszenie w stosunku do tego, co było wcześniej.
W temacie rozrastania się kodu - rzeczywiście, 1/3 albo więcej kodu to są deklaracje zmiennych. Wprawdzie nie jest to złe ani błędne, ale możnaby to było poprawić. Na chwilę obecną przychodzą mi do głowy dwa rozwiązania, które możesz zastosować.
- stworzyć osobny plik JS, w którym będziesz trzymać jedynie deklaracje zmiennych. Wprawdzie ilość kodu się nie zmieni, ale będziesz miał oddzieloną część z deklaracjami od części, gdzie się dzieją "prawdziwe" rzeczy. Na pewno zwiększy to czytelność kodu (uwaga - na jsfiddle się chyba nie da tego tak zrobić, ale na GH albo u siebie lokalnie już powinno pójść).
- Teraz znowu będę mieszał - najpierw sugerowałem zamianę luźnych i niepowiązanych ze sobą zmiennych na obiekty, a teraz wyskakuję z czymś nowym. Dlatego tego punktu nie traktuj jako sugestii do wdrożenia, ale raczej jako coś, co kiedyś będzie mogło Ci się przydać. W każdym razie - nie namawiam do zmieniania niczego w kodzie, a jedynie pokazuję ciekawostkę. O ile zapis obiektowy jest czytelniejszy i podczas pracy nie ma z nim za wiele problemów, to rzeczywiście deklarowanie tych wszystkich wartości jest lekko uciążliwe. Dlatego, zamiast obiektów, można zastosować tablice. W tym momencie przypisanie wartości podczas deklaracji zmiennej wyglądałby trochę inaczej.
Kopiuj
var madrit = {}
madrit.name = "Madrit"
madrit.woodPriceMin = 30;
madrit.woodPriceMax = 37;
madrit.woodPriceHolder = document.getElementById("woodPrice");
madrit.ironPriceMin = 37;
madrit.ironPriceMax = 45;
ZAMIENIA SIĘ NA:
var madrit = ["Madrit", 30, 37, Id, 37, 45]
Przy czym jest to taka pozorna oszczędność, bo poza tym, że sama deklaracja wartości jest znacznie krótsza, właściwie niczego nie zyskujesz. Oszczędność w dalszej części są znikome. Wprawdzie zamiast pisać madrid.woodPriceMin
napiszesz madrid[1]
więc niby kilka znaków mniej, ale za to tracisz totalnie plus opisowych nazw zmiennych. W obecnej postaci patrząc na nazwę zmiennej od razu wiesz, za co ona odpowiada. Po zastosowaniu tablic raczej bez sprawdzania w komentarzach albo innych źródłach, nikt nie będzie miał pojęcia, co się kryje pod hasłem madrid[5]
- dlatego potraktuj to raczej jako ciekawostkę, jakiś nowy temat, o istnieniu którego się dowiedziałeś ;)
"Zacząłem wywoływać funkcje z poziomu html." - żebyśmy się rozumieli: dodawanie obsługi zdarzeń przez addEventListener
nie jest żadnym błędem. Zdania są podzielone - niektórzy uważają oba rozwiązania za równorzędne, inni skłaniają się ku jednej z nich (częściej do listenera). Mi chodziło wcześniej o to, że (przynajmniej obecnie - w fazie poprawek i testowania) zapis "na sztywno" w HTML jest czytelniejszy, od razu widać patrząc na deklarację elementu, jaka akcja jest do niego przypisana. Sam osobiście wolę ten sposób zapisu, ale wcale nie oznacza to, że wcześniej miałeś źle ;)
Porada - obecnie jak wpisze się w pole coś, co nie jest liczbą, to wyskakuje komunikat "u dont have money or enought space in warehouse". Możesz (jak się uporasz z pozostałymi kwestiami) dodać sprawdzenie i jeśli będzie wpisane coś, co nie jest liczbą - powinien się pojawić stosowny komunikat. Albo jeszcze lepiej - dodaj obsługę zdarzenia onkeyup (chyba tego - niedawno do jakiejś aplikacji dodawałem funkcjonalność, która zamieniała kropki na przecinki i tak coś mi świta, że chyba nie działało to poprawnie dla onkeydown, ale właśnie up) dla tego pola tekstowego i jeśli wprowadzony znak jest inny niż cyfra, to go kasuj :)
"Przy zmianie wartości zmiennej od razu pod nią aktualizuje wyświetlanie jej w dokumencie." - nie rozumiem o co Ci chodzi. Czy możesz napisać to jaśniej - o jaką zmienną chodzi, gdzie ją wyświetlasz i czemu to ma służyć?
"funkcja gameOver, raz działa i wyświetla wynik - raz niekoniecznie" - abstrahując od tego, z czego ten błąd może wynikać, czy jesteś w stanie zaobserwować, kiedy ona nie działa? Może podczas pierwsze, drugiej albo kolejnej gry? Czy zauważyłeś jakieś inne okoliczności/czynniki, które mogą mieć z tym jakiś związek?
"Chciałem całą gre wrzucić w start() albo coś takiego" - rozwiń myśl.
"stworzeniu dwóch buttonów "start game" i "reset". Do pierwszego wrzucić całą logike gry a do drugiego funckje resetujące np. gameOver()?". Nie do końca rozumiem, co chcesz zrobić. Jeśli chodzi o odpalenie gry po wciśnięciu start - jest to do ogarnięcia, ale pytanie - po co takie coś robić? Skro gra nie jest na czas, to można przyjąć, że załadowanie strony jest tożsame z wciśnięciem przycisku "start". Ewentualnie bym może wprowadził konieczność podania imienia przed rozpoczęciem gry i dopiero po jego podaniu umożliwiłbym granie. Możesz nawet całą grę ukryć i jedyne co będzie widoczne to będzie pole do podania imienia. Po jego podaniu byś przełączył - tzn. chowamy pytanie o imię, ale za to pokazujemy grę. Niedawno wyjaśniałem komuś jak można pokazywać/chować elementy (miał 2 div'y i przełączał się między nimi - idealne rozwiązanie dla Ciebie, jeden div do imienia, a drugi z grą) - Skrypt który podmienia cały kontener za pomocą dwóch przycisków. Co do guzika reset - powinien on po prostu "zerować" stan gry, czyli w Twoim przypadku przenosić do rundy zero, przywracać kasę do wartości startowej oraz zerować stany magazynowe.
"czy idę w dobrą stronę czy wróciłem do punktu wyjścia." moim zdaniem idziesz w bardzo dobrym kierunku. Jeśli masz jeszcze gdzieś swoją pierwszą wersję, w której miałeś każdą funkcję kilak razy powtórzoną dla poszczególnych wariantów miast/surowców, gdzie był chaos i pełno luźnych zmiennych, to porównaj ją z wersją obecną, a sam zrozumiesz, że teraz jest OK. Super załapałeś, o co chodzi z funkcjami i ich parametrami. W sumie (aczkolwiek przyznaję się bez bicia, że bardzo dokładnie nie analizowałem tego, co napisałeś) to mam jeszcze dwie sugestie w tym zakresie:
- chodzi mi o poniższą funkcję
Kopiuj
function updateOwnedMaterial(which){
switch (which) {
case wood:
document.getElementById("ownedWood").innerHTML = wood.owned
break
case iron:
document.getElementById("ownedIron").innerHTML = iron.owned
a jakby do tych zmiennych wood. iron
itp. dodać jeszcze jedno pole (nazwij je jak uważasz, ja je nazwałem kaszanka ;) ) Na początku skryptu byśmy zrobili przypisanie wartości w postaci
Kopiuj
wood.kaszanka = document.getElementById("ownedWood").innerHTML;
iron.kaszanka = document.getElementById("ownedIron").innerHTML
i tak dla wszystkich surowców, a następnie zmienilibyśmy podaną powyżej funkcję tak, aby się mieściła w 2 liniach i miała postać
Kopiuj
function updateOwnedMaterial(which){
which.kaszanka = which.owned;
Wydaje mi się, że to powinno działać, ale jakoś jestem dość mocno zamulony, za chwilę idę spać, więc być może piszę totalne głupoty, a jutro będzie mi z tego powodu wstyd. W każdym razie - możesz pokombinować, są szanse, że się uda :P
I ostatnia uwaga, tym razem dotyczy funkcji makeZero. Obecnie ona wygląda tak:
Kopiuj
function makeZero (){
wood.price = 0
woodPrice.innerHTML = 0
iron.price = 0
ironPrice.innerHTML = 0
A co jakby ją rozbić na dwie, żeby całość wyglądała mniej-więcej tak:
Kopiuj
function wyczysc(which, which2) {
which.price = 0;
which2.innerHTML = 0;
}
function makeZero (){
wyzcysc(wood, woodPrice);
wyczysc(iron, ironPrice);
Haskell