-
Notifications
You must be signed in to change notification settings - Fork 0
/
class_cell.js
132 lines (101 loc) · 3.34 KB
/
class_cell.js
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
class Cell{
// These are hte possible status's the cell can have
// CELL STATUS {
// 'unopened',
// 'bomb',
// 'flagged',
// 'empty'
// }
//
//
// PROPERTIES
xPos // (int) the x position of this cell in the boardspace
yPos // (int) the y position of this cell in the boardspace
DOMElement // (object) the DOM object that represents this cell to the html webpage
bomb // (boolean) whether or not this cell contains a bomb
//
//
// METHODS
constructor(xPos, yPos, DOMElement, chanceOfBomb)
{
this.xPos = xPos
this.yPos = yPos
this.DOMElement = DOMElement // we manipulate the dom element attached to each cell in order to faciliate displaying it to the screen.
DOMElement.dataset.status = 'unopened'
this.bomb = this.rand_setBomb(chanceOfBomb)
// if(this.bomb){
// console.log(this.xPos + " : " + this.yPos + " BOMB:"+ this.bomb)
// }
}
get status() {
return this.DOMElement.dataset.status
}
set status(value) {
this.DOMElement.dataset.status = value
}
get bomb() {
return this.bomb
}
// opens itself.
// the game must be active
// the cell must be either unopened or a question-mark to be eligable to be opened
openCell(board, gameStatus){
if(gameStatus === true && (this.status === 'unopened' || this.status === '?')){
if(this.bomb){
this.status = 'bomb'
return 'bomb'
}
// if the tile was not a bomb.. we need to figure out how bombs are next to this tile.
const adjacentCells = this.neighboringCells(board)
// and now we need to figure out if there are bombs next to this cell..
// so we want to search through the adjacentCells array and see if any are mines.
// we will use Array.prototype.filer in order to only return the array elements that are bombs
const bombs = adjacentCells.filter(c => c.bomb)
const num_adjacentBombs = bombs.length
if(num_adjacentBombs === 0){
this.status = 'empty'
// if there are no bombs adjacent, recursivley open all adjacent cells.
adjacentCells.forEach(cell => cell.openCell(board, gameStatus))
} else {
this.status = num_adjacentBombs.toString()
}
return
}
}
flagCell(gameStatus){
if(gameStatus === true && (this.status === 'unopened' || this.status === 'flagged'|| this.status === '?')){
// otherwise we need to set the status to flagged.
if(this.status === 'unopened'){
this.status = 'flagged'
return
}
// if the cell is already flagged, we want to unflag it.
if(this.status === 'flagged'){
this.status = '?'
return
}
// or if its a ? we want to make it a flag again...
if(this.status === '?'){
this.status = 'flagged'
}
}
}
rand_setBomb(chanceOfBomb) {
let randomNumber = Math.floor(Math.random()*100) // generates a random integer between 0-100
let bombThreashold = Math.floor(chanceOfBomb*100)
return(randomNumber < bombThreashold)
}
neighboringCells(board){
const neighbors = []
// we need to get the cells within 1 of this cell.
for(let x=-1; x<=1 ; x++){
for(let y=-1 ; y<=1 ; y++){
// we need to grab the cell that is at the the designated position and add it to the neighbors array
// .? is optional chaining syntax
const cell = board[this.xPos + x]?.[this.yPos + y] // means if there is an element available, then grab the y element.
if(cell) {neighbors.push(cell)}
}
}
return neighbors
}
}