forked from ZeroCho/webgame-lecture
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path지뢰찾기.js
176 lines (171 loc) · 6.7 KB
/
지뢰찾기.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
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
var dataset = [];
var tbody = document.querySelector('#table tbody');
var 중단플래그 = false;
var 열은칸 = 0;
var 코드표 = {
연칸: -1,
물음표: -2,
깃발: -3,
깃발지뢰: -4,
물음표지뢰: -5,
지뢰: 1,
보통칸: 0,
};
document.querySelector('#exec').addEventListener('click', function() {
// 내부 먼저 초기화
tbody.innerHTML = '';
document.querySelector('#result').textContent = '';
dataset = [];
열은칸 = 0;
중단플래그 = false;
var hor = parseInt(document.querySelector('#hor').value);
var ver = parseInt(document.querySelector('#ver').value);
var mine = parseInt(document.querySelector('#mine').value);
// 지뢰 위치 뽑기
var 후보군 = Array(hor * ver)
.fill()
.map(function (요소, 인덱스) {
return 인덱스;
});
var 셔플 = [];
while (후보군.length > hor * ver - mine) {
var 이동값 = 후보군.splice(Math.floor(Math.random() * 후보군.length), 1)[0];
셔플.push(이동값);
}
console.log(셔플);
// 지뢰 테이블 만들기
for (var i = 0; i < ver; i += 1) {
var arr = [];
var tr = document.createElement('tr');
dataset.push(arr);
for (var j = 0; j < hor; j += 1) {
arr.push(코드표.보통칸);
var td = document.createElement('td');
td.addEventListener('contextmenu', function (e) {
e.preventDefault();
if (중단플래그) {
return;
}
var 부모tr = e.currentTarget.parentNode;
var 부모tbody = e.currentTarget.parentNode.parentNode;
var 칸 = Array.prototype.indexOf.call(부모tr.children, e.currentTarget);
var 줄 = Array.prototype.indexOf.call(부모tbody.children, 부모tr);
if (dataset[줄][칸] === 코드표.연칸) { // 이미 연 칸은 오른쪽 눌러도 효과 없게
return;
}
if (e.currentTarget.textContent === '' || e.currentTarget.textContent === 'X') {
e.currentTarget.textContent = '!';
e.currentTarget.classList.add('flag');
if (dataset[줄][칸] === 코드표.지뢰) {
dataset[줄][칸] = 코드표.깃발지뢰;
} else {
dataset[줄][칸] = 코드표.깃발;
}
} else if (e.currentTarget.textContent === '!') {
e.currentTarget.textContent = '?';
e.currentTarget.classList.remove('flag');
e.currentTarget.classList.add('question');
if (dataset[줄][칸] === 코드표.깃발지뢰) {
dataset[줄][칸] = 코드표.물음표지뢰;
} else {
dataset[줄][칸] = 코드표.물음표;
}
} else if (e.currentTarget.textContent === '?') {
e.currentTarget.classList.remove('question');
if (dataset[줄][칸] === 코드표.물음표지뢰) {
e.currentTarget.textContent = 'X';
dataset[줄][칸] = 코드표.지뢰;
} else {
e.currentTarget.textContent = '';
dataset[줄][칸] = 코드표.보통칸;
}
}
});
td.addEventListener('click', function (e) {
if (중단플래그) {
return;
}
var 부모tr = e.currentTarget.parentNode;
var 부모tbody = e.currentTarget.parentNode.parentNode;
var 칸 = Array.prototype.indexOf.call(부모tr.children, e.currentTarget);
var 줄 = Array.prototype.indexOf.call(부모tbody.children, 부모tr);
if ([코드표.연칸, 코드표.깃발, 코드표.깃발지뢰, 코드표.물음표지뢰, 코드표.물음표].includes(dataset[줄][칸])) {
return;
}
// 클릭했을때
e.currentTarget.classList.add('opened');
열은칸 += 1;
if (dataset[줄][칸] === 코드표.지뢰) { // 지뢰 클릭
e.currentTarget.textContent = '펑';
document.querySelector('#result').textContent = '실패 ㅠㅠ';
중단플래그 = true;
} else { // 지뢰가 아닌 경우 주변 지뢰 개수
var 주변 = [
dataset[줄][칸-1], dataset[줄][칸+1],
];
if (dataset[줄-1]) {
주변 = 주변.concat([dataset[줄-1][칸-1], dataset[줄-1][칸], dataset[줄-1][칸+1]]);
}
if (dataset[줄+1]) {
주변 = 주변.concat([dataset[줄+1][칸-1], dataset[줄+1][칸], dataset[줄+1][칸+1]]);
}
var 주변지뢰개수 = 주변.filter(function(v) {
return [코드표.지뢰, 코드표.깃발지뢰, 코드표.물음표지뢰].includes(v);
}).length;
// 거짓인 값: false, '', 0, null, undefined, NaN
e.currentTarget.textContent = 주변지뢰개수 || '';
dataset[줄][칸] = 코드표.연칸;
if (주변지뢰개수 === 0) {
console.log('주변을 엽니다');
var 주변칸 = [];
if (tbody.children[줄-1]) {
주변칸 = 주변칸.concat([
tbody.children[줄 - 1].children[칸 - 1],
tbody.children[줄 - 1].children[칸],
tbody.children[줄 - 1].children[칸 + 1],
]);
}
주변칸 = 주변칸.concat([
tbody.children[줄].children[칸 - 1],
tbody.children[줄].children[칸 + 1],
]);
if (tbody.children[줄+1]) {
주변칸 = 주변칸.concat([
tbody.children[줄 + 1].children[칸 - 1],
tbody.children[줄 + 1].children[칸],
tbody.children[줄 + 1].children[칸 + 1],
]);
}
주변칸.filter(function (v) {
return !!v;
}).forEach(function(옆칸) {
var 부모tr = 옆칸.parentNode;
var 부모tbody = 옆칸.parentNode.parentNode;
var 옆칸칸 = Array.prototype.indexOf.call(부모tr.children, 옆칸);
var 옆칸줄 = Array.prototype.indexOf.call(부모tbody.children, 부모tr);
if (dataset[옆칸줄][옆칸칸] !== 코드표.연칸) {
옆칸.click();
}
});
}
}
console.log(열은칸, hor * ver - mine);
if (열은칸 === hor * ver - mine) {
중단플래그 = true;
document.querySelector('#result').textContent = '승리 ^^';
}
});
tr.appendChild(td);
}
tbody.appendChild(tr);
}
// 지뢰 심기
for (var k = 0; k < 셔플.length; k++) { // 예 60
var 세로 = Math.floor(셔플[k] / ver); // 예 7 -> 6
var 가로 = 셔플[k] % ver; // 예 0 -> 0
console.dir(tbody);
console.log(세로);
tbody.children[세로].children[가로].textContent = 'X';
dataset[세로][가로] = 코드표.지뢰;
}
});