[JS] Zliczanie wartości z kliknięć


(Piotrek Płatek) #1

Witam,

Mam do wykonania skrypt w JS, który będzie działał w nastepujący sposób:

1.Utworzę na stronie przyciski/pola wypełnione różnymi obrazkami (konkretnie karty jak do gry), każdy z nich będzie miał inną wartość przekazywaną dalej

  1. funkcja akceptująca klikanie na wartości od najmniejszej do największej

W jaki sposób najlepiej to wykonać ? Nie chodzi mi o podanie kodu, tylko sposobu, żeby to i tak przekazywać, tu użyć takeij pętli. chodzi mi o to, żebym wiedział czego konkretniej szukać i móc sie tego uczyć.

Mam nadzieje, ze ktoś pomoże. Dzieki


(Ryan) #2

Najłatwiej wykonać to w sposób następujący:

  • zmienna globalna przechowująca ostatnio klikniętą wartość

  • zdarzenie onClick na kartach (każda karta wywołuje funkcję z inną wartością, zależną od karty)

Funkcja obsługująca zdarzenie sprawdzi, czy ostatnio klinięta wartość jest równa obecnie klikniętej minus jeden i jeśli tak, zaktualizuje globalną zmienną. Jeśli nie (jak mniemam) zakończy test. Kod zmieści się w kilku (dosłownie) liniach.


(Piotrek Płatek) #3

ehhh, wciąż walczę z kodzikiem,

mam tablicę z obrazkami i chce im przypisywać wartość za pomocą switch z argumentem indeksem w tablicy ( w ten sposób, że na przykład indeks numer 1, 14, 27, 40 to karta 2. w jaki jednak sposób pobrać numer indeksu ?

pokazuje kodzik:

var karty = new Array (

'',

.

.

.

''

);

var i=0;

while (i<3) {

	var losowa = Math.floor(Math.random() * 51 + 1);

	document.write (karty[losowa].);

	i++;

	    }

var karta=0;

switch (karty['']) { //tu jest właśnie problem

	case 1, 14, 27, 40 :

	karta= 2;

                        }

[/code]

proszę i jakieś wskazówki, pozdrawiam, Piotrek


([alex]) #4

var karty = new Array (0,0,0);

var i=0;

while (i<3) {

var losowa = Math.floor(Math.random() * 51 + 1);

karty_=losowa;_

document.write (' '+losowa+'.bmp

i++;

}

var karta=0;

switch (karty[karta]) { //tu jest właśnie problem

case 1, 14, 27, 40 :

karta= 2;

}


(Piotrek Płatek) #5

([alex]) #6
case 1|| 14|| 27|| 40 : [/code]

Zamień na:

[code]case 1: case 14: case 27: case 40:
ponieważ to co napisałeś jest równoznaczne do:

case 1: [/code]


Lub zrób to po ludzku zamiast całego switch'a:

[code=php]karta=(karty[karta]-1)%13+2; 


(Piotrek Płatek) #7

wiem, że muszę dodać jakoś akcję, aby dopiero po kliknięciu sprawdzało switchem ale nie wiem zbytnio jak


([alex]) #8

function KlikNaKarte(img,numer)

{

}

...

...

document.write (' '+losowa+'.bmp


(Piotrek Płatek) #9

a jeśli będą oddzielone przecinkami to nie bedzie dobrze ? bo wiesz, wszystkie te cztery karty przyjmują te sama wartośc


([alex]) #10

Oczywiście że nie będzie.

Powtarzam, zrób to po ludzku zamiast całego switch'a:

    karta=(karty[karta]-1)%13+2; [/code]

To robi dokładnie to samo co próbujesz zrobić w switch'u.


(Piotrek Płatek) #11

kurcze, problemów ciąg dalszy, nadal z tym porównywaniem kart.

ma być, tak, że jesli klikam na nie najmniejszą kartę to wyskakuje mi komunikat wybierz najmnijsza. wartosc aktualnie mam przypisywaną do zmiennej karta i jest dobrze. ale jak porownac do tych pozostalych ? bo w tablicy karty[] to mam numery plików, a nie ich "wartości". to co dałeś [alex] wygląda na naprawdę ciekawe, ale jakos nie moge się z tym uporac.

proooszę o pomoc....


([alex]) #12

Skoro nie zrozumiałeś co napisałem to zostaje ci jedyna droga - kolejny giga switch().

Jak zrozumiesz to wystarczy jedna linijka.


(Piotrek Płatek) #13

([alex]) #14

Nadal nie zrozumiałeś tego równania co ci podałem:

nr=(karta-1)%13+1; // numer karty

nr=(karta-1)%13+2; // następny numer karta

jeżeli dajesz (karta-2) to może ci z tego zrobić (-1) dalej coś się wyliczy ale na pewno nie to co potrzebujesz.

Absolutnie nie rozumiem poco ci tablica: karta[]

//Wyszukiwanie najmniejszej karty

var nr=0;

for (var i=0;i((karty_-1)%13)) nr=i;_

// minimalna karta to karta[nr] z tym że mogą być np wszystkie trzy to 5-ki

// a przy twoim sposobie na losowanie to mogą być nawet trzy asy pik.

Powtarzam sugestie, wytłumacz co chcesz zrobić a nie jak to chcesz zrobić.


(Piotrek Płatek) #15
function KlikNaKarte(img,kliknieta){




 for (var i=0;i((karty[i]-1)%13)) nr=i;

 var wartosc=0;

 wartosc=(kliknieta - 1) % 13 + 2;

 alert ("numer obrazka: "+kliknieta+"wartosc: "+wartosc+"najmniejsza to: "+karta[nr]+"karta: "+karta);

if (karta[nr] != wartosc){

alert("wybierz najmniejszą kartę");

}

else {

$('karteczka'+kliknieta).fade(); //return false; //efekt zaniknięcia

delete karta[nr];

//alert("karta: "+karta);

}

}

dobra, pomijajac kwiestie wyliczenia wartości kart (z czym sobie poradze) to nie moge osiagnac efektu, aby po kliknieciu na najmniejszą karte i kliknieciu na ktoras z pozostalych kart wyliczalo mi mniejsza z tych dwóch pozostalych.

update: heh, poradziłem sobie z tym odnawianie, a z obliczaniem wartości kart to tylko as jest problematyczny


([alex]) #16

Wywal z tablicy karta lub z jej kopii te które już kliknięto.

delete karata[nr] nie robi tego.


(Piotrek Płatek) #17

usuwa wartość dla tego indeksu, ale pozostawia puste pole :confused: nawet jesli ustawie zeby pozniej zapisalo to jakas maksymalnie duza liczba to i tak uznaje, że jest to najmniejsza :confused:


([alex]) #18

Wstaw nie maksymalnie duża tylko 65.


(Piotrek Płatek) #19

siemanko, heeh, w końcu poradziłem sobie z tym wszystkim, teraz elegancko działa :smiley: zrezygnowałem z wyszukiwania najmniejszych wartości na rzecz posortowania tablicy karta z wartościami od najmniejszej i banalnie porównuję to z obecnie klikniętą kartą

var f=0;

//Akcja po kliknięciu

 function KlikNaKarte(img,kliknieta){

 var wartosc=(kliknieta - 1) % 13 + 1;

if (wartosc <=karta[f]){

		   $('karteczka'+kliknieta).fade(); 

			f++

}

else {

alert("Wybierz najmniejszą kartę");

}

}

dzieki alex za wszystkie rady :wink: pozdrówki !