-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.js
More file actions
162 lines (131 loc) · 4.25 KB
/
Copy pathapp.js
File metadata and controls
162 lines (131 loc) · 4.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
const cards = [
'hog-rider',
'valkyrie',
'wizard',
'golem',
'witch',
'dragon'
]
window.addEventListener('load', onLoad);
// - click event on 'new game' button
// - click event on 'play' button
function onLoad() {
const $newGameButton = document.querySelector('#new-game');
const $playButton = document.querySelector('#play');
// deal a game on 'new game'
$newGameButton.addEventListener('click', newGame);
// play game on 'play'
$playButton.addEventListener('click', playGame);
}
function newGame() {
// create game-ID
let gameID = 1;
let numberOfPositions = cards.length * 2;
// loop through cards and add random unique position 0-9
let positions = generatePositions(numberOfPositions);
let randomPositions = randomizeArray(positions);
// create tiles and assign cards to positions
let tiles = createTiles(cards, randomPositions);
// render new game
renderGame(tiles);
// convert game positions to JSON and save to local storage
let board = JSON.stringify(tiles);
localStorage.board = board;
}
function generatePositions(numberOfPositions) {
let positions = [];
for (i = 0; i < numberOfPositions; i++) {
positions.push(i);
}
return positions;
}
function randomizeArray(array) {
let currentIndex = array.length, temporaryValue, randomIndex;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
function createTiles(cards, positions) {
// deal each card twice to respective index in positions
let tiles = [];
cards.forEach((card) => {
[0,1].forEach(() => {
tiles.push({
card: card,
position: positions.shift()
})
})
})
return tiles;
}
// render game
function renderGame(tiles) {
let boardElement = document.querySelector('#board');
boardElement.innerHTML = "";
boardElement.classList.remove('board--active');
boardElement.classList.add('board--shuffle');
// order tiles based on random position
let orderedTiles = tiles.sort((a, b) => a.position - b.position);
// create dom elements for each tile
orderedTiles.forEach((tile) => {
// create containing tile element
let tileElement = document.createElement('div');
tileElement.classList.add('board__tile');
// add card and invisible as classnames
tileElement.classList.add(`board__tile--${tile.card}`);
// create flipper element and append to tile
let flipperElement = document.createElement('div');
flipperElement.classList.add('board__tile__flipper');
tileElement.appendChild(flipperElement);
// create and append front to flipper
let frontElement = document.createElement('div');
frontElement.classList.add('board__tile__front');
frontElement.style.backgroundImage = `url(images/${tile.card}.png)`;
// todo: remove later (add content text for clarity)
frontElement.textContent = tile.card;
flipperElement.appendChild(frontElement);
// create and append back to flipper
let backElement = document.createElement('div');
backElement.classList.add('board__tile__back');
flipperElement.appendChild(backElement);
// add to dom
boardElement.appendChild(tileElement);
})
}
function playGame() {
// - timer starts
// - turn count 1++
let boardElement = document.querySelector('#board');
boardElement.classList.add('board--active');
let tileElements = document.querySelectorAll('.board__tile');
tileElements.forEach(function(el) {
el.addEventListener("click", turnTile);
})
}
function turnTile() {
this.classList.toggle('board__tile--visible');
}
// click event on active tile
// - 1st: open card
// - 2nd:
// - open card
// - compare cards
// - if equal: capture
// - remove card from position
// - set card statusses to 'captured'
// - score count 1++
// - check if no uncaptured cards are left: game over
// - else: close both cards
// - turn count 1++
// - game over:
// - timer stops
// - display time & turn count
// - close game button