Advertisement
Guest User

Untitled

a guest
Feb 27th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Tablica w której pod kolejnymi indeksami przechowujemy identyfikaty kart.
  2. // Jeśli tablica ma elementy [0,1,2,0,1,2] to znaczy, że karta 0 powtarza się
  3. // pod indeksami 0 i 3, karta 1 pod indeksami 1 i 4, karta 2 pod indeksami 2 i 5.
  4. var zawartoscKart;
  5.  
  6. // Indeks ostatniej (ostatnia_karta_1) i przedostatniej (ostatnia_karta_2)
  7. // klikniętej karty. Potrzebny aby sprawdzać, czy obecnie kliknięta karta
  8. // jest taka sama jak poprzednie dwie.
  9. var ostatnia_karta_1;
  10. var ostatnia_karta_2;
  11.  
  12. // Tablica wartości logicznych (typu "Boolean"). Pod indeksem 'i' pamiętamy, czy karta
  13. // numer i (zawartoscKart[i]) została już odsłonięta na stałe (jeśli tak to
  14. // pamiętamy wartość 'true', w przeciwnym przypadku wartość 'false')
  15. var znalezioneObrazki;
  16. /**
  17.  * Funkcja wywoływana na początku gry.
  18.  *
  19.  * @karty - tablica zawierająca rozłożenie obrazków w grze
  20.  */
  21. function przygotujDaneGry(karty){
  22.   zawartoscKart = karty;
  23.   ostatnia_karta_1 = null;
  24.   ostatnia_karta_2 = null;
  25.   znalezioneObrazki = new Array(karty.length).fill(false);
  26.   screen.clear();
  27.   screen.log("Początek gry!");
  28. }
  29.  
  30. /**
  31.  * Funkcja przyjmuje parametry:
  32.  * @indeks - indeks klikniętej karty
  33.  *
  34.  * dozwolone zwracane wartości:
  35.  * nic - brak akcji po stronie GUI
  36.  * obroc_aktualna_karte - obraza aktualnie klikniętą kartę
  37.  * obroc_aktualna_i_przedostatnia_karte - obraca aktualnie klikniętą kartę oraz przedostatnio odwróconą kartę
  38.  * znaleziona_trojka - jeśli kliknięto znalezioną trójkę pasujących kart
  39.  * koniec - koniec gry
  40.  */
  41. function uzytkownikKliknalNaKarte(indeks){
  42.   if(uzytkownikKliknalNaTaSamaKarteCoPoprzednio(indeks)===true || uzytkownikKliknalNaJuzZnalezionymObrazku(indeks)===true){
  43.     return "nic"
  44.   }
  45.   else{
  46.   screen.log("uzytkownikKliknalNaKarte " + indeks + ", poprzednio: "+ostatnia_karta_1 + ","+ostatnia_karta_2);
  47.   // Jesli uzytkownik kliknal na karte juz odsłoniętą  ("na stałe" lub nie)
  48.   // chcemy zwrócić "nic"
  49.  
  50.   }
  51.   // Jeśli odwrócona jest tylko jedna lub zero kart (ostatnia_karta_2 jest
  52.   // równa "null" i być może także ostatnia_karta_1 jest równa "null")
  53.   // chcemy zwrócić "obroc_aktualna_karte" i zmienić kolejność zapamiętanych
  54.   // kart (odpowiednio wypełnić zmienne ostatnia_karta_2, ostatnia_karta_1).
  55.    if(ostatnia_karta_2===null){
  56.         if(ostatnia_karta_1===null){
  57.           ostatnia_karta_1=indeks;
  58.         }
  59.         else if(ostatnia_karta_1 !== null){
  60.           ostatnia_karta_2 = ostatnia_karta_1;
  61.           ostatnia_karta_1 = indeks;
  62.         }
  63.         return "obroc_aktualna_karte";
  64.    }
  65.  
  66.   // Jeśli wszystkie trzy obrazki są takie same powinniśmy zaznaczyć, że są
  67.   // one już znalezione oraz zapamiętać, że żadne karty nie są odwrócone
  68.   // "na chwilę" (ostatnia_karta_2, ostatnia_karta_1 powinny zostać 'null'-ami).
  69.   // Jeśli odwrócono już wszystkie trójki kart, powinniśmy zwrócić "koniec", w
  70.   // przeciwnym przypadku powinniśmy zwrócić 'znaleziona_trojka'.
  71.      if(saTrzyTeSameObrazki(indeks, ostatnia_karta_1, ostatnia_karta_2)){
  72.         zaznaczZnalezioneObrazki(indeks, ostatnia_karta_1, ostatnia_karta_2);
  73.         if(znalezioneObrazki.every(isTrue)===true){
  74.           return "koniec";
  75.         }
  76.         else{
  77.           ostatnia_karta_2= null;
  78.           ostatnia_karta_1= null;
  79.           return "znaleziona_trojka";
  80.         }
  81.   }
  82.   // Wreszcie jeśli trzy ostatnio odwrócone karty nie są takie same, chcemy
  83.   // uaktualnić wartości ostatnia_karta_2, ostatnia_karta_1 i zwrócić
  84.   // "obroc_aktualna_i_przedostatnia_karte"
  85.         ostatnia_karta_2 = ostatnia_karta_1;
  86.         ostatnia_karta_1 = indeks;
  87.         return"obroc_aktualna_i_przedostatnia_karte";
  88.   // TODO Kod poniżej jest błędny, musisz napisać go od nowa (wzoruj się na
  89.   // funkcji 'uzytkownikKliknalNaKarte' w zadaniu 2a).
  90. }
  91.  
  92. function saTrzyTeSameObrazki(indeks1,indeks2,indeks3){
  93.   return zawartoscKart[indeks1] === zawartoscKart[indeks2] && zawartoscKart[indeks2] === zawartoscKart[indeks3];
  94. }
  95.  
  96. function uzytkownikKliknalNaTaSamaKarteCoPoprzednio(indeks){
  97.   return ostatnia_karta_1 === indeks || ostatnia_karta_2 === indeks;
  98. }
  99.  
  100. function uzytkownikKliknalNaJuzZnalezionymObrazku(indeks){
  101.   return znalezioneObrazki[indeks];
  102. }
  103.  
  104. function zaznaczZnalezioneObrazki(indeks,indeks1,indeks2){
  105.   znalezioneObrazki[indeks] = true;
  106.   znalezioneObrazki[indeks1] = true;
  107.   znalezioneObrazki[indeks2] = true;
  108. }
  109. function isTrue(checkedItem){
  110.   if(checkedItem===true){
  111.     return true;
  112.   }else{
  113.     return false;
  114.   }
  115. }
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140. function StolikDoGry(){
  141.   this.obrazki = [];
  142.   this.karty = [];
  143.   this.dlugoscKolejki=2;
  144.   this.kolejkaObrazkow = new Array();
  145.   this.iloscKlikniec = 0;
  146. }
  147.  
  148. StolikDoGry.prototype.dodajObrazek = function(url){
  149.   this.karty.push(this.obrazki.length);
  150.   this.karty.push(this.obrazki.length);
  151.   this.karty.push(this.obrazki.length);
  152.   this.obrazki.push(url);
  153. }
  154.  
  155. StolikDoGry.prototype.potasuj = function(){
  156.   for (let i=0; i < this.karty.length-1; ++i) {
  157.     let j = losowaLiczbaCalkowita(i, this.karty.length);
  158.     let k = this.karty[i];
  159.     this.karty[i] = this.karty[j];
  160.     this.karty[j] = k;
  161.   }
  162. }
  163.  
  164. StolikDoGry.prototype.rozdajKarty = function(){
  165.   let stolik = document.getElementById('stolik');
  166.  
  167.   for (let i=0; i<this.karty.length; ++i) {
  168.     let elementKarty = document.createElement('div');
  169.     elementKarty.stolikDoGry = this;
  170.     elementKarty.obroc = function(){
  171.       if ( contains(this.classList, 'odkryta') ){
  172.         this.classList.remove('odkryta')
  173.       }else{
  174.         this.classList.add('odkryta')
  175.       }
  176.     }
  177.     elementKarty.className = 'karta';
  178.     elementKarty.onclick = obslugaKlikniecia(i);
  179.     stolik.appendChild(elementKarty);
  180.  
  181.     let awers = document.createElement('img');
  182.     awers.className = 'awers';
  183.     awers.src = this.obrazki[this.karty[i]];
  184.     elementKarty.appendChild(awers);
  185.    
  186.     let rewers = document.createElement('div');
  187.     rewers.className = 'rewers';
  188.     elementKarty.appendChild(rewers);
  189.   }
  190.  
  191.   przygotujDaneGry(this.karty);
  192. }
  193.  
  194. StolikDoGry.prototype.dodajKlikniecie = function(){
  195.   this.iloscKlikniec++;
  196. }
  197. StolikDoGry.prototype.dodajKarteDoKolejki = function(karta){
  198.   this.kolejkaObrazkow.push(karta);
  199.   if ( this.kolejkaObrazkow.length > this.dlugoscKolejki){
  200.     return this.kolejkaObrazkow.shift();
  201.   }
  202.   return null;
  203. }
  204. StolikDoGry.prototype.czyscKolejke = function(){
  205.   this.kolejkaObrazkow = new Array();
  206. }
  207.  
  208. function losowaLiczbaCalkowita(min, max) {
  209.   let x = Math.random();  // Losowa liczba rzeczywista z zakresu [0, 1)
  210.   x = x * (max-min);  // Zakres [0, max-min)
  211.   x = x + min;  // Zakres [min, max)
  212.   return Math.floor(x);  // Zaokrąglamy w dół do liczby całkowitej, zakres wciąż [min, max)
  213. }
  214.  
  215.  
  216. function obslugaKlikniecia(nrKarty) {
  217.   return function() {
  218.     kliknietoKarte(nrKarty);
  219.   };
  220. }
  221.  
  222.  
  223. function kliknietoKarte(nrKarty) {
  224.   let karta = document.getElementsByClassName('karta')[nrKarty];
  225.   stolikDoGry = karta.stolikDoGry;
  226.   let akcja = uzytkownikKliknalNaKarte(nrKarty);
  227.   switch(akcja){
  228.     case "nic":
  229.       return;
  230.     case "obroc_aktualna_karte":
  231.       karta.obroc();
  232.       stolikDoGry.dodajKlikniecie()
  233.       stolikDoGry.dodajKarteDoKolejki(karta)
  234.       document.getElementById("status").innerHTML = "Gdzie może być kolejna karta?"
  235.       break;
  236.     case "obroc_aktualna_i_przedostatnia_karte":
  237.       stolikDoGry.dodajKlikniecie()
  238.       karta.obroc();
  239.       var ostatnia = stolikDoGry.dodajKarteDoKolejki(karta);
  240.       if ( ostatnia ){
  241.         ostatnia.obroc()
  242.       }
  243.       document.getElementById("status").innerHTML = "Niestety to nie te."
  244.       break;
  245.     case "znaleziona_trojka":
  246.       stolikDoGry.dodajKlikniecie()
  247.       karta.obroc()
  248.       stolikDoGry.czyscKolejke()
  249.       document.getElementById("status").innerHTML = "Znalazłaś pasującą trójkę!"
  250.       return;
  251.     case "koniec":
  252.       stolikDoGry.dodajKlikniecie()
  253.       karta.obroc()
  254.       document.getElementById("status").innerHTML = "Gratulacje! Koniec gry! Obróciłaś karty: "
  255.         + stolikDoGry.iloscKlikniec + " razy.";
  256.       break;
  257.     default:
  258.       alert("Zwrócono nieobsługiwaną wartość: " + akcja);
  259.       break;
  260.   }
  261.  
  262. }
  263.  
  264.  
  265.  
  266. function contains(a, obj) {
  267.     var i = a.length;
  268.     while (i--) {
  269.        if (a[i] === obj) {
  270.            return true;
  271.        }
  272.     }
  273.     return false;
  274. }
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298. /**
  299.  * Kod w tym pliku jest odpowiedzialny za dostarczenie możliwości logowania wyniku na ekranie
  300.  */
  301. function Screen(){
  302.     this.screenElement = document.createElement('pre')
  303.     this.screenElement.style="color:  white;"
  304. }
  305.  
  306. Screen.prototype.log = function(wiadomosc){
  307.   this.screenElement.innerHTML += wiadomosc + "\n"
  308. }
  309.  
  310. Screen.prototype.clear = function(){
  311.   this.screenElement.innerHTML = ''
  312. }
  313.  
  314. Screen.prototype.embedd = function(){
  315.     document.body.appendChild(this.screenElement)
  316. }
  317.  
  318. var screen = new Screen();
  319. screen.embedd();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement