JavaScript - Używanie zmiennych o różnych nazwach do wykonywania tych samych instrukcji.

0

Witam.

Tworzę ostatnio skrypciki w javascripcie i chciałbym nieco zoptymalizować je, a zwłaszcza zmniejszyć ich wagę.

Mam taki kod:

                    if (wynikskora!=0) {
                        kosztstring=kosztstring+wynikskora+' Skóra<br/>'
                    }
                    if (wynikzelazo!=0) {
                        kosztstring=kosztstring+wynikzelazo+' Żelazo<br/>'
                    }    
                    if (wynikkrysztal!=0) {
                        kosztstring=kosztstring+wynikkrysztal+' Kryształ<br/>'
                    }    
                    if (wynikwoda!=0) {
                        kosztstring=kosztstring+wynikwoda+' Pradawna Woda<br/>'
                    }    
                    if (wynikogien!=0) {
                        kosztstring=kosztstring+wynikogien+' Pradawny Ogień<br/>'
                    }        
                    if (wynikziemia!=0) {
                        kosztstring=kosztstring+wynikziemia+' Pradawna Ziemia<br/>'
                    }        
                    if (wyniklod!=0) {
                        kosztstring=kosztstring+wyniklod+' Pradawny Lód<br/>'
                    }

Jak widać - jest to praktycznie taka sama instrukcja z tym, że jest zmieniona jedna zmienna. W jaki sposób najprościej zapisać to w pętli, żeby zmniejszyć wielkość skryptu? Jest jakaś funkcja czy cokolwiek, co pozwoli mi np. w nawiasie podać zmienne, które mają być podstawiane w dane miejsce?

Jeśli to coś prostego, łatwego do znalezienia/nauczenia/pamiętania, to przepraszam za pytanie. Po prostu nie mogłem tego odpowiednio sformułować, żeby wpisać w google i znaleźć odpowiedź.

Ps. Daję link do strony, jakby ktoś chciał/potrzebował przejrzeć całość:
http://goblin.coust.cba.pl/trening.html

1

W zasadzie nie za bardzo jest co z tym zrobić przez to, że doklejany string ciągle się zmienia. Możesz to zrobić w pętli, ale to nic nie zmieni w ilości kodu, a nawet chyba pogorszy sytuację, bo musiał byś mieć dodatkowo tablicę stringów do doklejania i zapętlić wtedy coś w stylu

funkcja(wyniklod,napis['lod'])
{
if(wyniklod != 0) kosztstring += wyniklod + napis['lod'];
}

Możesz co najwyżej maksymalnie to zminimalizować

if (wynikskora != 0) kosztstring += wynikskora+' Skóra<br/>';
if (wynikzelazo!= 0) kosztstring += wynikzelazo+' Żelazo<br/>';

Można jeszcze bardziej kombinować, ale co byś nie zrobił, niestety musisz gdzieś wpisać te stringi.

1

mozesz zrobic mape tlumaczaca liczby na nazwy/stringi nazwe ja mapNumberToString

mapNumberToString[1] = zelazo
mapNumberToString[2] = metal
...

wyniki trzymaj w tablicy np
wyniki = [2,3,4,6,0,0,0] // zelazo, metal...

pozniej robisz petle po wynikach
czyli

//petla
if (wynik [index] != 0 ) {
  kosztstring += wynik[index] + mapNumberToString[index]
}
//koniec petli

to wszystko w pseudokodzie, ale chyba idea jasna ;)

i juz nie masz jawnie w kodzie 7 ifow z prawie ta sama trescia

w Twoiim kodzie funkcja wylicz() jest straszna...

0

Mauris, fasadin, dzięki za odpowiedzi.

fasadin, twoja propozycja jest chyba najlepsza i coś podobnego planowałem zrobić, żeby ukrócić trochę tą funkcję wylicz(). Bo zawartość tej funkcji to po prostu masakra :D Ale działa i skrypt jest (jeszcze) na tyle "mały", że nie widać żadnych opóźnień. Założenie takie, że skrypt wylicza koszt i przy okazji czas treningu stworów z poziomu x do poziomu y. Gdzieś musiałem zapisać informacje jaki jest koszt na poszczególne poziomy, a on się zmienia i do 10, 20, 30, 40, 50, 100, 150, 200, 250, 300 i powyżej 300 są różne koszty. I tak mi świtało coś, żeby to ładnie skrócić pętlą jeszcze bardziej niż obecnie wpisując wartości i koszty w tablicę. Stworów jest 16, kosztów jest jednak trochę więcej, bo z około 40 się naliczy. Jeszcze pomyślę nad sposobem skrócenia i na pewno to jakoś zrobię.

Wracając do przykładu podanego wyżej.

Chodzi ci o to, żeby po wyliczeniu kosztów wrzucić je w tablice? W sensie:

wyniki = [wynikskora, wynikzelazo, wynikkrysztal,(itd)]
stringi = [" Skóra<br/>", " Żelazo<br/>", " Kryształ<br/>",(itd)]

A potem pętlą odwoływać się do tablic?

for (numerpetli=1; x<=wyniki.length; numerpetli++) {
  if (wyniki[numerpetli] != 0) kosztstring += wyniki[numerpetli] + stringi[numerpetli];
}

Dobrze zrozumiałem?

1

tez tak mozna jak napisales, mi chodzilo o uzycie mapy zeby w przyszlosci jak bedziesz chcial cos zmienic to dane byly juz ze soba w fajny sposob powiazany http://pl.wikipedia.org/wiki/Tablica_asocjacyjna

tu nie chodzi o to czy chodzi szybko czy wolno tylko czy to da sie utrzymywac. Za miesiac wrocisz do tego i spedzisz caly dzien na rozmyslaniu o co tu chodzi i dlaczego ta funkcja ma 10 ekranow dlugosci

0

Chodzi o to, żeby wszystkie wartości i stringi były w jednym miejscu, najlepiej na początku, a potem w dalszej części programu będę się jedynie do nich odwoływał, żeby nie robić syfu i nie szukać zmiennych gdzieś w 58763279 znakowym kodzie?

Skróciłem całość z około stulinijkowego babola na takie cudo:

                    wyniki = [wynikzloto, wynikzarlo, wynikskora, wynikzelazo, wynikkrysztal, wynikwoda, wynikogien, wynikziemia, wyniklod, wynikksiezyc, wynikrubin, wynikmithril, wynikhematyt, wynikbazalt, wynikrtec, wynikadamant, wynikdiament, wynikskalen, wynikotchlan, wynikglebinowa, wynikserce, wynikwzmocniona, wynikprzedza, wyniksurowka, wynikstal, wynikkrystyt, wynikzimnego, wynikkwarc, wynikpopiol, wynikszklo, wyniksztabkaciezkiego, wyniksrebro, wynikiskra, wynikszaroblask, wyniksztabkaadamantu, wynikwihajster, wynikgrog]
                    
                    stringi = ['Złoto', 'Żarło', 'Skóra', 'Żelazo', 'Kryształ', 'Pradawna Woda', 'Pradawny Ogień', 'Pradawna Ziemia', 'Pradawny Lód', 'Kamień Księżycowy', 'Rubin', 'Ruda Mithrilu', 'Kamień Hematytu', 'Ciężki Bazalt', 'Rtęć', 'Ruda Adamantu', 'Diament', 'Skaleń', 'Skała Otchłani', 'Skała Głębinowa', 'Serce Ziemi', 'Wzmocniona Skóra', 'Przędza Goblinów', 'Sztabka Surówki', 'Sztabka Stali', 'Krystyt', 'Sztabka Zimnego Żelaza', 'Lodowaty Kwarc', 'Kamień Popiołu', 'Szkło Pryzmatyczne', 'Sztabka Ciężkiego Żelaza', 'Sztabka Szczerego Srebra', 'Iskry Many', 'Sztabka Szaroblasku', 'Sztabka Adamantu', 'Wihajster do kręcenia', 'Wybuchowy grog']
                    
                    kosztstring='Koszt jednej jednostki wynosi:<br/>';        
                    
                    for (petelka=0; petelka<wyniki.length; petelka++) {
                        if (wyniki[petelka]!=0) {
                            kosztstring+=wyniki[petelka]+' '+stringi[petelka]+'<br/>';
                        }    
                    }

...

                    if (ilosc>1){
                        
                    kosztiloscstring='Koszt wszystkich jednostek wynosi:<br/>'    
                        
                        for (petelka=0; petelka<wyniki.length; petelka++) {
                            if (wyniki[petelka]!=0) {
                                kosztiloscstring+=wyniki[petelka]*ilosc+' '+stringi[petelka]+'<br/>';
                            }
                        }    
                        
                        document.getElementById("kosztilosc").innerHTML=kosztiloscstring;
                        
                    }
0

@CoUsT

widze dwie opcje

te wszystkie ify z jednostkami zamienic na rownanie matematyczne. Koszt jednostek zmienia sie tak samo z tego co widze (mowie o konkretnej) wiec zamiast miec tyle ifow miec "proste obliczenie". Czyli w zaleznosci od index rownanie ma inne wyliczenia

druga

Ja bym to zrobil tak. Utworzyl obiekty z tych klas jednostek By mialy wlasciwosci takie jak

  • level
  • tablice kosztow (tu myslalem o obiekcie koszt, ktory bylby tworzony na zasadzie jakies abstrakcyjnej fabryki, aleeee...)
  • podaj tablice kosztow

tworzylbym obiekt wraz z levelem

var ork = new Ork (level)

na podstawie levelu obliczal bym tablice kosztow. rownanie tak jak w pierwszym lub jak nie da sie/nie potrafisz to ta wielgachna skladnia ifow.

co Ci to daje? Ze funkcja wylicz bedzie miala tylko cos takiego

"utworz obiekty potworow"
"wypisywanie pojedynczych potworow"
"sumowanie wynikow ze wszystkich otworzonych potworow"
"wypisywanie wszystkich potworow"

chociaz funkcja wylicz NIE powinna nic wyswietlac. Wyswietlanie powinienes zrobic gdzies indziej by funkcja wylicz nie miala dwoch "logik". Kod musi byc przejrzysty.

0

Niestety koszt nie zmienia się równomiernie. Tutaj jest pewna stronka z rozpiską kosztów treningu:
http://www.seeker.kr/do/dict/gk/?:Creature

Na przykład stwór Rycerz Śmierci ma coś takiego:

user image

Więc niestety nie mogę podać kosztów w pewnym wzorze, tylko muszę to dosyć mocno rozpisać.

W drugim chodzi o coś takiego jak rekordy w Pascalu? Na przykład jest "stwor[1]" i do tego coś takiego:

stwor[1].zlotodo10=1234
stwor[1].zarlodo10=123
itd
stwor[1].zarlodo20=2345
stwor[1].zarlodo20=234

I potem to samo ze "stwor[2]" i tak dalej do końca?

Bo dane muszę rozbić na:

  • typy stworów
  • poziomy
  • typy surowców

1 użytkowników online, w tym zalogowanych: 0, gości: 1