Advertisement
Guest User

Untitled

a guest
Feb 27th, 2017
101
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. // Tablica pamiętająca odsłonięte "nie na stałe" karty, w kolejności ich odsłaniania.
  6. // ostatnieKarty[0] to indek najstarszej odsłoniętej karty, ostatnieKarty[1] drugiej
  7. // najstarszej itd.
  8. var ostatnieKarty;
  9. // Tablica wartości logicznych (typu "Boolean"). Pod indeksem 'i' pamiętamy, czy karta
  10. // numer i (zawratoscKart[i]) została już odsłonięta na stałe (jeśli tak to
  11. // pamiętamy wartość 'true', w przeciwnym przypadku wartość 'false')
  12. var znalezioneObrazki;
  13. // N.
  14. var iloscJednakowychKart;
  15.  
  16. /**
  17.  * Funkcja wywoływana na początku gry. Upewnij się, że czyścisz w niej wszystkie wykorzystywane zmienne.
  18.  *
  19.  * @karty - tablica zawierająca rozłożenie obrazków w grze
  20.  */
  21. function przygotujDaneGry(karty,pIloscJednakowych){
  22.   zawartoscKart = karty;
  23.   ostatnieKarty = [];
  24.   iloscJednakowychKart = pIloscJednakowych;
  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.  * Zwracane wartości:
  35.  * nic - brak akcji po stronie GUI <zrobione>
  36.  * obroc_aktualna_karte - obraza aktualnie klikniętą kartę <zrobione>
  37.  * obroc_dwie_karty - obraca aktualnie klikniętą kartę oraz najstarszą pokazaną kartę
  38.  * znaleziony_zestaw - jeśli kliknięto znaleziony zestaw kart
  39.  * koniec - koniec gry
  40.  */
  41. function uzytkownikKliknalNaKarte(indeks){
  42.   var debugMsg ='';
  43.   for(var i=0;i<ostatnieKarty.length;++i){
  44.     debugMsg += ostatnieKarty[i]+",";
  45.   }
  46.   if(uzytkownikKliknalNaTaSamaKarteCoPoprzednio(indeks)===true || uzytkownikKliknalNaJuzZnalezionymObrazku(indeks)===true){
  47.     return "nic";
  48.    
  49.   }
  50.   screen.log("klik: " + indeks + ", ostatnie: " +debugMsg);
  51.   if(uzytkownikKliknalNaTaSamaKarteCoPoprzednio(indeks)===false || uzytkownikKliknalNaJuzZnalezionymObrazku(indeks)===false){
  52.     ostatnieKarty.push(indeks);
  53.     if(ostatnieKarty.length===N){
  54.  
  55.       if(saTeSameObrazki()===true){
  56.         zaznaczZnalezioneObrazki();
  57.         if(znalezioneObrazki.every(isTrue)===true){
  58.           return "koniec";
  59.         }
  60.       else{  
  61.         zaznaczZnalezioneObrazki()
  62.        ostatnieKarty.length = 0;
  63.  
  64.         return "znaleziony_zestaw";
  65.       }
  66.       }
  67.       ostatnieKarty.shift();
  68.       return "obroc_dwie_karty";
  69.       }
  70.     return "obroc_aktualna_karte";
  71.     }
  72.  
  73.  
  74.   // TODO Kod poniżej jest błędny, musisz napisać go od nowa (wzoruj się na
  75.   // funkcji 'uzytkownikKliknalNaKarte' w zadaniu 2a).
  76.   // weź pod uwagę, że funkcje poniżej mogą ułatwić Ci implementację rozwiązania
  77. }
  78.  
  79. function saTeSameObrazki(){
  80.   if ( ostatnieKarty.length===0){
  81.     return false;
  82.   }
  83.   var first = zawartoscKart[ostatnieKarty[0]];
  84.   var theSame = true;
  85.   screen.log("check: "+first);
  86.   for(var i=1;theSame && i<ostatnieKarty.length;++i){
  87.     theSame = theSame && (first === zawartoscKart[ostatnieKarty[i]]);
  88.   }
  89.   return theSame;
  90. }
  91.  
  92. function uzytkownikKliknalNaTaSamaKarteCoPoprzednio(indeks){
  93.   for(var i=0;i<ostatnieKarty.length;++i){
  94.     if ( indeks === ostatnieKarty[i]){
  95.       return true;
  96.     }
  97.   }
  98.   return false;
  99. }
  100.  
  101. function uzytkownikKliknalNaJuzZnalezionymObrazku(indeks){
  102.   return znalezioneObrazki[indeks];
  103. }
  104.  
  105. function zaznaczZnalezioneObrazki(){
  106.   for(var i=0;i<ostatnieKarty.length;++i){
  107.     znalezioneObrazki[ostatnieKarty[i]] = true;
  108.   }
  109. }
  110. function isTrue(checkedItem){
  111.   if(checkedItem===true){
  112.     return true;
  113.   }else{
  114.     return false;
  115.   }
  116. }
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138. function StolikDoGry(iloscJednakowychKart){
  139.   this.obrazki = [];
  140.   this.karty = [];
  141.   this.dlugoscKolejki=iloscJednakowychKart-1;
  142.   this.kolejkaObrazkow = [];
  143.   this.iloscJednakowychKart = iloscJednakowychKart;
  144.   this.iloscKlikniec = 0;
  145. }
  146.  
  147. StolikDoGry.prototype.dodajObrazek = function(url){
  148.   for(var i=0;i<this.iloscJednakowychKart;i++){
  149.   this.karty.push(this.obrazki.length);
  150.   }
  151.   this.obrazki.push(url);
  152. };
  153.  
  154. StolikDoGry.prototype.potasuj = function(){
  155.   // Odkomentuj ponizsza linie aby karty byly zawsze tak samo potasowane.
  156.   // return
  157.   for (let i=0; i < this.karty.length-1; ++i) {
  158.     let j = losowaLiczbaCalkowita(i, this.karty.length);
  159.     let k = this.karty[i];
  160.     this.karty[i] = this.karty[j];
  161.     this.karty[j] = k;
  162.   }
  163. };
  164.  
  165. StolikDoGry.prototype.rozdajKarty = function(){
  166.   let stolik = document.getElementById('stolik');
  167.  
  168.   for (let i=0; i<this.karty.length; ++i) {
  169.     let elementKarty = document.createElement('div');
  170.     elementKarty.stolikDoGry = this;
  171.     elementKarty.obroc = function() {
  172.       if ( contains(this.classList, 'odkryta') ){
  173.         this.classList.remove('odkryta')
  174.       }else{
  175.         this.classList.add('odkryta')
  176.       }
  177.     }
  178.     elementKarty.className = 'karta';
  179.     elementKarty.onclick = obslugaKlikniecia(i);
  180.     stolik.appendChild(elementKarty);
  181.  
  182.     let awers = document.createElement('img');
  183.     awers.className = 'awers';
  184.     awers.src = this.obrazki[this.karty[i]];
  185.     elementKarty.appendChild(awers);
  186.    
  187.     let rewers = document.createElement('div');
  188.     rewers.className = 'rewers';
  189.     elementKarty.appendChild(rewers);
  190.   }
  191.  
  192.   przygotujDaneGry(this.karty, this.iloscJednakowychKart);
  193. }
  194.  
  195. StolikDoGry.prototype.dodajKlikniecie = function(){
  196.   this.iloscKlikniec++;
  197. }
  198. StolikDoGry.prototype.dodajKarteDoKolejki = function(karta){
  199.   this.kolejkaObrazkow.push(karta);
  200.   if ( this.kolejkaObrazkow.length > this.dlugoscKolejki){
  201.     return this.kolejkaObrazkow.shift();
  202.   }
  203.   return null;
  204. }
  205. StolikDoGry.prototype.czyscKolejke = function(){
  206.   this.kolejkaObrazkow = new Array();
  207. }
  208.  
  209. function losowaLiczbaCalkowita(min, max) {
  210.   let x = Math.random();  // Losowa liczba rzeczywista z zakresu [0, 1)
  211.   x = x * (max-min);  // Zakres [0, max-min)
  212.   x = x + min;  // Zakres [min, max)
  213.   return Math.floor(x);  // Zaokrąglamy w dół do liczby całkowitej, zakres wciąż [min, max)
  214. }
  215.  
  216.  
  217. function obslugaKlikniecia(nrKarty) {
  218.   return function() {
  219.     kliknietoKarte(nrKarty);
  220.   };
  221. }
  222.  
  223.  
  224. function kliknietoKarte(nrKarty) {
  225.   let karta = document.getElementsByClassName('karta')[nrKarty];
  226.   stolikDoGry = karta.stolikDoGry;
  227.   let akcja = uzytkownikKliknalNaKarte(nrKarty);
  228.   switch(akcja){
  229.     case "nic":
  230.       return;
  231.     case "obroc_aktualna_karte":
  232.       karta.obroc();
  233.       stolikDoGry.dodajKlikniecie()
  234.       stolikDoGry.dodajKarteDoKolejki(karta)
  235.       document.getElementById("status").innerHTML = "Gdzie może być kolejna karta?"
  236.       break;
  237.     case "obroc_dwie_karty":
  238.       stolikDoGry.dodajKlikniecie()
  239.       karta.obroc();
  240.       var ostatnia = stolikDoGry.dodajKarteDoKolejki(karta);
  241.       if ( ostatnia ){
  242.         ostatnia.obroc()
  243.       }
  244.       document.getElementById("status").innerHTML = "Niestety to nie te."
  245.       break;
  246.     case "znaleziony_zestaw":
  247.       stolikDoGry.dodajKlikniecie()
  248.       karta.obroc()
  249.       stolikDoGry.czyscKolejke()
  250.       document.getElementById("status").innerHTML = "Znalazłaś pasujące karty!"
  251.       return;
  252.     case "koniec":
  253.       stolikDoGry.dodajKlikniecie()
  254.       karta.obroc()
  255.       document.getElementById("status").innerHTML = "Gratulacje! Koniec gry! Obróciłaś karty: "
  256.         + stolikDoGry.iloscKlikniec + " razy.";
  257.       break;
  258.     default:
  259.       alert("Zwrócono nieobsługiwaną wartość: " + akcja);
  260.       break;
  261.   }
  262.  
  263. }
  264.  
  265.  
  266.  
  267. function contains(a, obj) {
  268.     var i = a.length;
  269.     while (i--) {
  270.        if (a[i] === obj) {
  271.            return true;
  272.        }
  273.     }
  274.     return false;
  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.  
  300. /**
  301.  * Kod w tym pliku jest odpowiedzialny za dostarczenie możliwości logowania wyniku na ekranie
  302.  */
  303. function Screen(){
  304.     this.screenElement = document.createElement('pre')
  305.     this.screenElement.style="color:  white;"
  306. }
  307.  
  308. Screen.prototype.log = function(wiadomosc){
  309.   this.screenElement.innerHTML += wiadomosc + "\n"
  310. }
  311.  
  312. Screen.prototype.clear = function(){
  313.   this.screenElement.innerHTML = ''
  314. }
  315.  
  316. Screen.prototype.embedd = function(){
  317.     document.body.appendChild(this.screenElement)
  318. }
  319.  
  320. var screen = new Screen();
  321. screen.embedd();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement