Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Tablica w której pod kolejnymi indeksami przechowujemy identyfikaty kart.
- // Jeśli tablica ma elementy [0,1,2,0,1,2] to znaczy, że karta 0 powtarza się
- // pod indeksami 0 i 3, karta 1 pod indeksami 1 i 4, karta 2 pod indeksami 2 i 5.
- var zawartoscKart;
- // Indeks ostatniej (ostatnia_karta_1) i przedostatniej (ostatnia_karta_2)
- // klikniętej karty. Potrzebny aby sprawdzać, czy obecnie kliknięta karta
- // jest taka sama jak poprzednie dwie.
- var ostatnia_karta_1;
- var ostatnia_karta_2;
- // Tablica wartości logicznych (typu "Boolean"). Pod indeksem 'i' pamiętamy, czy karta
- // numer i (zawartoscKart[i]) została już odsłonięta na stałe (jeśli tak to
- // pamiętamy wartość 'true', w przeciwnym przypadku wartość 'false')
- var znalezioneObrazki;
- /**
- * Funkcja wywoływana na początku gry.
- *
- * @karty - tablica zawierająca rozłożenie obrazków w grze
- */
- function przygotujDaneGry(karty){
- zawartoscKart = karty;
- ostatnia_karta_1 = null;
- ostatnia_karta_2 = null;
- znalezioneObrazki = new Array(karty.length).fill(false);
- screen.clear();
- screen.log("Początek gry!");
- }
- /**
- * Funkcja przyjmuje parametry:
- * @indeks - indeks klikniętej karty
- *
- * dozwolone zwracane wartości:
- * nic - brak akcji po stronie GUI
- * obroc_aktualna_karte - obraza aktualnie klikniętą kartę
- * obroc_aktualna_i_przedostatnia_karte - obraca aktualnie klikniętą kartę oraz przedostatnio odwróconą kartę
- * znaleziona_trojka - jeśli kliknięto znalezioną trójkę pasujących kart
- * koniec - koniec gry
- */
- function uzytkownikKliknalNaKarte(indeks){
- if(uzytkownikKliknalNaTaSamaKarteCoPoprzednio(indeks)===true || uzytkownikKliknalNaJuzZnalezionymObrazku(indeks)===true){
- return "nic"
- }
- else{
- screen.log("uzytkownikKliknalNaKarte " + indeks + ", poprzednio: "+ostatnia_karta_1 + ","+ostatnia_karta_2);
- // Jesli uzytkownik kliknal na karte juz odsłoniętą ("na stałe" lub nie)
- // chcemy zwrócić "nic"
- }
- // Jeśli odwrócona jest tylko jedna lub zero kart (ostatnia_karta_2 jest
- // równa "null" i być może także ostatnia_karta_1 jest równa "null")
- // chcemy zwrócić "obroc_aktualna_karte" i zmienić kolejność zapamiętanych
- // kart (odpowiednio wypełnić zmienne ostatnia_karta_2, ostatnia_karta_1).
- if(ostatnia_karta_2===null){
- if(ostatnia_karta_1===null){
- ostatnia_karta_1=indeks;
- }
- else if(ostatnia_karta_1 !== null){
- ostatnia_karta_2 = ostatnia_karta_1;
- ostatnia_karta_1 = indeks;
- }
- return "obroc_aktualna_karte";
- }
- // Jeśli wszystkie trzy obrazki są takie same powinniśmy zaznaczyć, że są
- // one już znalezione oraz zapamiętać, że żadne karty nie są odwrócone
- // "na chwilę" (ostatnia_karta_2, ostatnia_karta_1 powinny zostać 'null'-ami).
- // Jeśli odwrócono już wszystkie trójki kart, powinniśmy zwrócić "koniec", w
- // przeciwnym przypadku powinniśmy zwrócić 'znaleziona_trojka'.
- if(saTrzyTeSameObrazki(indeks, ostatnia_karta_1, ostatnia_karta_2)){
- zaznaczZnalezioneObrazki(indeks, ostatnia_karta_1, ostatnia_karta_2);
- if(znalezioneObrazki.every(isTrue)===true){
- return "koniec";
- }
- else{
- ostatnia_karta_2= null;
- ostatnia_karta_1= null;
- return "znaleziona_trojka";
- }
- }
- // Wreszcie jeśli trzy ostatnio odwrócone karty nie są takie same, chcemy
- // uaktualnić wartości ostatnia_karta_2, ostatnia_karta_1 i zwrócić
- // "obroc_aktualna_i_przedostatnia_karte"
- ostatnia_karta_2 = ostatnia_karta_1;
- ostatnia_karta_1 = indeks;
- return"obroc_aktualna_i_przedostatnia_karte";
- // TODO Kod poniżej jest błędny, musisz napisać go od nowa (wzoruj się na
- // funkcji 'uzytkownikKliknalNaKarte' w zadaniu 2a).
- }
- function saTrzyTeSameObrazki(indeks1,indeks2,indeks3){
- return zawartoscKart[indeks1] === zawartoscKart[indeks2] && zawartoscKart[indeks2] === zawartoscKart[indeks3];
- }
- function uzytkownikKliknalNaTaSamaKarteCoPoprzednio(indeks){
- return ostatnia_karta_1 === indeks || ostatnia_karta_2 === indeks;
- }
- function uzytkownikKliknalNaJuzZnalezionymObrazku(indeks){
- return znalezioneObrazki[indeks];
- }
- function zaznaczZnalezioneObrazki(indeks,indeks1,indeks2){
- znalezioneObrazki[indeks] = true;
- znalezioneObrazki[indeks1] = true;
- znalezioneObrazki[indeks2] = true;
- }
- function isTrue(checkedItem){
- if(checkedItem===true){
- return true;
- }else{
- return false;
- }
- }
- function StolikDoGry(){
- this.obrazki = [];
- this.karty = [];
- this.dlugoscKolejki=2;
- this.kolejkaObrazkow = new Array();
- this.iloscKlikniec = 0;
- }
- StolikDoGry.prototype.dodajObrazek = function(url){
- this.karty.push(this.obrazki.length);
- this.karty.push(this.obrazki.length);
- this.karty.push(this.obrazki.length);
- this.obrazki.push(url);
- }
- StolikDoGry.prototype.potasuj = function(){
- for (let i=0; i < this.karty.length-1; ++i) {
- let j = losowaLiczbaCalkowita(i, this.karty.length);
- let k = this.karty[i];
- this.karty[i] = this.karty[j];
- this.karty[j] = k;
- }
- }
- StolikDoGry.prototype.rozdajKarty = function(){
- let stolik = document.getElementById('stolik');
- for (let i=0; i<this.karty.length; ++i) {
- let elementKarty = document.createElement('div');
- elementKarty.stolikDoGry = this;
- elementKarty.obroc = function(){
- if ( contains(this.classList, 'odkryta') ){
- this.classList.remove('odkryta')
- }else{
- this.classList.add('odkryta')
- }
- }
- elementKarty.className = 'karta';
- elementKarty.onclick = obslugaKlikniecia(i);
- stolik.appendChild(elementKarty);
- let awers = document.createElement('img');
- awers.className = 'awers';
- awers.src = this.obrazki[this.karty[i]];
- elementKarty.appendChild(awers);
- let rewers = document.createElement('div');
- rewers.className = 'rewers';
- elementKarty.appendChild(rewers);
- }
- przygotujDaneGry(this.karty);
- }
- StolikDoGry.prototype.dodajKlikniecie = function(){
- this.iloscKlikniec++;
- }
- StolikDoGry.prototype.dodajKarteDoKolejki = function(karta){
- this.kolejkaObrazkow.push(karta);
- if ( this.kolejkaObrazkow.length > this.dlugoscKolejki){
- return this.kolejkaObrazkow.shift();
- }
- return null;
- }
- StolikDoGry.prototype.czyscKolejke = function(){
- this.kolejkaObrazkow = new Array();
- }
- function losowaLiczbaCalkowita(min, max) {
- let x = Math.random(); // Losowa liczba rzeczywista z zakresu [0, 1)
- x = x * (max-min); // Zakres [0, max-min)
- x = x + min; // Zakres [min, max)
- return Math.floor(x); // Zaokrąglamy w dół do liczby całkowitej, zakres wciąż [min, max)
- }
- function obslugaKlikniecia(nrKarty) {
- return function() {
- kliknietoKarte(nrKarty);
- };
- }
- function kliknietoKarte(nrKarty) {
- let karta = document.getElementsByClassName('karta')[nrKarty];
- stolikDoGry = karta.stolikDoGry;
- let akcja = uzytkownikKliknalNaKarte(nrKarty);
- switch(akcja){
- case "nic":
- return;
- case "obroc_aktualna_karte":
- karta.obroc();
- stolikDoGry.dodajKlikniecie()
- stolikDoGry.dodajKarteDoKolejki(karta)
- document.getElementById("status").innerHTML = "Gdzie może być kolejna karta?"
- break;
- case "obroc_aktualna_i_przedostatnia_karte":
- stolikDoGry.dodajKlikniecie()
- karta.obroc();
- var ostatnia = stolikDoGry.dodajKarteDoKolejki(karta);
- if ( ostatnia ){
- ostatnia.obroc()
- }
- document.getElementById("status").innerHTML = "Niestety to nie te."
- break;
- case "znaleziona_trojka":
- stolikDoGry.dodajKlikniecie()
- karta.obroc()
- stolikDoGry.czyscKolejke()
- document.getElementById("status").innerHTML = "Znalazłaś pasującą trójkę!"
- return;
- case "koniec":
- stolikDoGry.dodajKlikniecie()
- karta.obroc()
- document.getElementById("status").innerHTML = "Gratulacje! Koniec gry! Obróciłaś karty: "
- + stolikDoGry.iloscKlikniec + " razy.";
- break;
- default:
- alert("Zwrócono nieobsługiwaną wartość: " + akcja);
- break;
- }
- }
- function contains(a, obj) {
- var i = a.length;
- while (i--) {
- if (a[i] === obj) {
- return true;
- }
- }
- return false;
- }
- /**
- * Kod w tym pliku jest odpowiedzialny za dostarczenie możliwości logowania wyniku na ekranie
- */
- function Screen(){
- this.screenElement = document.createElement('pre')
- this.screenElement.style="color: white;"
- }
- Screen.prototype.log = function(wiadomosc){
- this.screenElement.innerHTML += wiadomosc + "\n"
- }
- Screen.prototype.clear = function(){
- this.screenElement.innerHTML = ''
- }
- Screen.prototype.embedd = function(){
- document.body.appendChild(this.screenElement)
- }
- var screen = new Screen();
- screen.embedd();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement