Cinek1552 utworzono 1 października 2009 utworzono 1 października 2009 Witam wszystkich. Disiaj na informatyce gościu kazał nam zrobić w javascript "grę" w oczko, 21. Zrobione mam wszystko, czyli losowanie kart, podstawienie wartości za każdą kartę, ale mam właśnie problem z sumowaniem wartości kart po kolejnym dobraniu karty. Oto download źródłowy. Prosiłbym o jak najszybszą pomoc. [code]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict// "http://www.w3c.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <HTML xmlns-"http://www.w3c.org/1999/xhtml" xml:lang="pl"> <HEAD> <meta http-equiv="content-type" content="text/html; charset="iso-8859-2"> <script LANGUAGE="JavaScript"> var karty=new Array(6) karty[0]="9" karty[1]="10" karty[2]="Walet" karty[3]="Dama" karty[4]="Król" karty[5]="As" function losuj(){ var los,punkt,liczba,wartosc1,wartosc2,wartosc3,wartosc4,wartosc5,wartosc6,a,b; // Losowanie liczb los = Math.round(Math.random()*(karty.length-1)); liczba=los; // Podstawianie karty po wylosowaniu liczby if (liczba == 0){ document.gra.tekst.value = "9"; var punkt = 0; document.gra.wartosc.value=0; wartosc1=0; } if (liczba == 1){ document.gra.tekst.value = "10"; var punkt = 10; document.gra.wartosc.value=10; wartosc2=10; } if (liczba == 2){ document.gra.tekst.value = "Walet"; var punkt = 2; document.gra.wartosc.value=2; wartosc3=2; } if (liczba == 3){ document.gra.tekst.value = "Dama"; var punkt = 3; document.gra.wartosc.value=3; wartosc4=3; } if (liczba == 4){ document.gra.tekst.value = "Król"; var punkt = 4; document.gra.wartosc.value=4; wartosc5=4; } if (liczba == 5){ document.gra.tekst.value = "As"; var punkt = 11; document.gra.wartosc.value=11; wartosc6=11; } document.gra.suma.value=wartosc1+wartosc2+wartosc3+wartosc4+wartosc5+wartosc6; } </script> </HEAD> <BODY> <form name="gra"> <center> <br><br><br><br><br><br><br><br><br><br><br><br> <INPUT TYPE="button" value=" Kliknij by wylosować kartę " NAME="zagraj" onclick="losuj()"> <br> <INPUT TYPE="text" NAME="tekst" SIZE="40"> <br><br><br><br><br> <INPUT TYPE="button" value="Wartość karty:" NAME="Twoja" > <br> <INPUT TYPE="text" NAME="wartosc"> <br><br> <INPUT TYPE="button" value="Suma wylosowanych kart:" NAME="sumaaaa" > <br> <INPUT TYPE="text" NAME="suma"> <br><br><br> <INPUT TYPE="reset" value="Wyczyść wszystkie pola"> </center> </form> </BODY> </HTML>[/code] [color="#FF0000"]//przenoszę //MarekM25[/color]
rafalluz komentarz 2 października 2009 komentarz 2 października 2009 Korekcje: [code]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict// "http://www.w3c.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <HTML xmlns-"http://www.w3c.org/1999/xhtml" xml:lang="pl"> <HEAD> <meta http-equiv="content-type" content="text/html; charset="iso-8859-2"> <script LANGUAGE="JavaScript"> var suma = 0; var karty=new Array(6) karty[0]="9" karty[1]="10" karty[2]="Walet" karty[3]="Dama" karty[4]="Król" karty[5]="As" var punkty=new Array(6) punkty[0]=0 punkty[1]=10 punkty[2]=2 punkty[3]=3 punkty[4]=4 punkty[5]=11 function zeruj() { suma = 0; } function losuj(){ var punkt,liczba,wartosc; // Losowanie liczb liczba = Math.floor(Math.random()*karty.length); // Podstawianie karty po wylosowaniu liczby document.gra.tekst.value = karty[liczba]; var punkt = punkty[liczba]; document.gra.wartosc.value=punkt; suma+= punkt; document.gra.suma.value=suma; } </script> </HEAD> <BODY> <form name="gra"> <center> <br><br><br><br><br><br><br><br><br><br><br><br> <INPUT TYPE="button" value=" Kliknij by wylosować kartę " NAME="zagraj" onclick="losuj()"> <br> <INPUT TYPE="text" NAME="tekst" SIZE="40"> <br><br><br><br><br> <INPUT TYPE="button" value="Wartość karty:" NAME="Twoja" > <br> <INPUT TYPE="text" NAME="wartosc"> <br><br> <INPUT TYPE="button" value="Suma wylosowanych kart:" NAME="sumaaaa" > <br> <INPUT TYPE="text" NAME="suma"> <br><br><br> <INPUT TYPE="reset" value="Wyczyść wszystkie pola" onclick="zeruj()"> </center> </form> </BODY> </HTML>[/code] -Stablicowałem zarówno punkty, jak i nazwy. Ty miałeś stablicowane tylko nazwy, do tego ich nie używałeś (co mnie dziwi). -Niepotrzebnie robiłeś te ify, skoro można stablicować wyniki i napisać kod tylko raz, niezależnie od wylosowanej wartości. -Twój błąd polegał na uzywaniu nieprzypisanych wartości. Gdy wylosujesz 0, przypisujesz tylko wartosc1, reszta zostaje nieprzypisana. Mógłbyś na starcie przypisać je zerami, ale po co, skoro taka solucja, jaką proponuję, jest lepsza na każdym froncie? -Jako bonus dodałem zerowanie przy naciśnięciu przycisku "Wyczyść wszystkie pola" BTW. Nie mam 100% pewności, ale zmieniłem linijkę losującą na: [code]los = Math.floor(Math.random()*karty.length));[/code] ponieważ daje równe szanse wylosowania każdej z kart. W aktualnej chyba 9 i As mają mniejsze szanse niż reszta. 1
Cinek1552 komentarz 2 października 2009 Autor komentarz 2 października 2009 (edytowane) Dzięki wielkie! Właśnie, czego użyć by z tablicy zwracało mi wszystko po =, a nie dane z nawiasów? Z Javą w takich rzeczach, można powiedzieć, pierwszy raz się bawię i nie jestem obecnie do niej przekonany, wolę C++. Za co także zamieniłeś te ify? Wolałbym dokładnie wiedzieć by później móc jakoś rozwiązać coś jeśli będę miał podobny problem. Jeszcze tylko tam dodam sobie przy ilu jest wygrana i tym podobne, komunikat, no i gotowe.
rafalluz komentarz 2 października 2009 komentarz 2 października 2009 [quote]Właśnie, czego użyć by z tablicy zwracało mi wszystko po =, a nie dane z nawiasów?[/quote] Nie rozumiem pytania. Możesz trochę jaśniej? [quote]Za co także zamieniłeś te ify? Wolałbym dokładnie wiedzieć by później móc jakoś rozwiązać coś jeśli będę miał podobny problem.[/quote] Ify zastąpiłem przypisaniami z tablicy, ponieważ to drugie rozwiązanie lepiej się skaluje: 1)Wyobraź sobie 50 takich ifów. Bardzo żmudne, podatne na pomyłki (np. gdzieś przypadkiem przeoczysz jakąś wartość do zmiany i już masz błąd) i niepotrzebnie dużo kodu. 2)Jakbyś chciał dodać jakąś własność do wszystkich kart, powiedzmy np. nazwę wyświetlanego obrazka, to musiałbyś to samo wklepać do każdego ifa. Ponownie, żmudne i podatne na błędy. Tak to tylko tworzysz tablicę, dopisujesz wyświetlanie w jednym miejscu i jazda.
Cinek1552 komentarz 2 października 2009 Autor komentarz 2 października 2009 [quote]Ty miałeś stablicowane tylko nazwy, do tego ich nie używałeś[/quote] W którym miejscu jest to zwracane w tym kodzie co Ty poprawiłeś? [code]document.gra.tekst.value = karty[liczba];[/code] Tutaj?
luq komentarz 2 października 2009 komentarz 2 października 2009 Nieco poprawione [code] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns-"http://www.w3c.org/1999/xhtml" xml:lang="pl"> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-2"/> <script type="text/javascript"> var aCards = [ '9', '10', 'Walet', 'Dama', 'Król', 'As' ]; var aNumber = [ 0, 10, 2, 3, 4, 11 ]; var number; var card; var sum = 0; function randCard(){ var index = Math.floor( Math.random() * aCards.length ); number = aNumber[ index ]; card = aCards[ index ]; sum += number; document.gra.card.value = card; document.gra.number.value = number; document.gra.all.value = sum; } function clearSum(){ sum = 0; } </script> </head> <body> <form name="gra" method="post"> Aktualna karta: <input name="card" type="text" /> <button onclick="randCard(); return false;">Losuj</button><br /> Wartość karty: <input name="number" type="text" /><br /> Suma wylosowanych kart: <input name="all" type="text" /><br /> <input type="reset" onclick="clearSum(); " value="Wyczyść" /> </form> </body> </html> [/code] 1. W xHTMLu wszystkie znaczniki piszę się małymi literami. 2. Prawidłowo osadza się javascript w ten sposób: [code] <script type="text/javascript"> // ... </script> [/code] 3. O wiele lepsza konstrukcją do tworzenia obiektu Array jest dosłowna reprezentacja: [code] var aFoo = [ 'a', 'b', 'c' ]; [/code] Poza tym: [quote]Z Javą w takich rzeczach ...[/quote] [img]http://b5.s3.quickshareit.com/javaaintjavascriptbcfc2.jpg[/img] Możesz również wyrzucić całego JS`a z HTML`a, ale to już zadanie domowe 1
Cinek1552 komentarz 3 października 2009 Autor komentarz 3 października 2009 (edytowane) Dzięki luq. Co do obrazka, ta, przejęzyczyłem się, ale wiadomo o co chodziło. Luq, jeszcze jedno. Powiedz mi na jakiej zasadzie to sumuje? Widzę, że do sumowania masz tylko ta linijkę (Pomijając podstawianie 0 za sumę) [code]sum += number;[/code] Tu właśnie nie rozumiem jakim cudem to mi sumuje każdą liczbę i zapamiętuje wcześniej wcześniejszą liczbę która była w poprzednim wylosowaniu karty. [quote]Możesz również wyrzucić całego JS`a z HTML`a, ale to już zadanie domowe[/quote] A tam, nie ma sensu wrzucania kody JS'a do osobnego pliku.
luq komentarz 3 października 2009 komentarz 3 października 2009 [quote name='Cinek1552' date='03 październik 2009 - 13:32 ' timestamp='1254569551' post='873138'] Tu właśnie nie rozumiem jakim cudem to mi sumuje każdą liczbę i zapamiętuje wcześniej wcześniejszą liczbę która była w poprzednim wylosowaniu karty. [/quote] To konstrukcja językowa. Skrócona wersja [code]sum = sum + number;[/code] No i poza tym, zmienna sum jest zmienną globalną. [quote] A tam, nie ma sensu wrzucania kody JS'a do osobnego pliku. [/quote] Nie o to mi chodziło. Miałem na myśli wyrzucenie zdarzeń z HTML`a, np: [code] <button onclick="randCard(); return false;">Losuj</button><br /> [/code] Mozna zrobić tak [code] // js document.getElementById( 'bnt' ).onclick = function(){ randCard(); return false; } // html <button id="bnt">Losuj</button> [/code] Dzięki temu JS nie miesza się w ogóle z HTMLem
Cinek1552 komentarz 3 października 2009 Autor komentarz 3 października 2009 No, też prawda. Robiłem tak we wcześniejszych zadaniach, ale szczerze mówiąc zbędny bajer. Chodzi tylko o to by działało.
Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!
Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.