Advertisement
Guest User

Untitled

a guest
Feb 27th, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.93 KB | None | 0 0
  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