Игра сапер
Материал из Department of Theoretical and Applied Mechanics
Описание[править]
Реализация и визуализация компьютерной игры Сапер
Исполнитель: Аминов Андрей Черницына Анна
Группа 13632/1 Кафедра Теоретической механики
Файл:[[1]]
Код программы[править]
Текст программы на языке JavaScript:
1 <HTML>
2
3 <HEAD>
4
5 <TITLE>Сапер</TITLE><style>body{scrollbar-base-color: #4444FF}</style></HEAD>
6
7 Меняем цвет фона
8
9 <BODY BGCOLOR="#333333" onContextMenu="return false;">
10
11 <CENTER>
12
13 <BR>
14
15 Создаем таблицу
16
17 <TABLE id="GameField" BGCOLOR=#CCCCAA BORDER=1></TABLE>
18
19 <BR>
20
21 Создаем функции для визуализации победы и поражения
22
23 <div id="GameOverResult" class="result">Game Over</div>
24
25 <div id="WinResult" class="result">WIN</div>
26
27 <FORM>
28
29 <BUTTON STYLE="{font-size:24px;background-color:#002040;border-width:0;color:red" onClick="NewGameForSer()">НОВАЯ ИГРА</BUTTON>
30
31 </FORM>
32
33 </CENTER>
34
35 <style>
36
37 .result {
38
39 display: none;
40
41 position: 50% 50%;
42
43 position: fixed;
44
45 top: 50%;
46
47 left: 0%;
48
49 font-size: 300;
50
51 z-index: 1;
52
53 background-color: pink;
54
55 margin-top: -150px;
56
57 width: 100%;
58
59 opacity: 0.7;
60
61 }
62
63 </style>
64
65 <SCRIPT>
66
67 var massivA = new Array (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
68
69 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
70
71 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
72
73 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
74
75 Дополнительный массив для поиска пути
76
77 var massivB = new Array (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
78
79 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
80
81 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
82
83 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
84
85 var Nomer = 0;
86
87 var inGame = false;
88
89 function createGameField()
90
91 {
92
93 var table = document.getElementById("GameField");
94
95 for (var x = 0; x < 9; ++x)
96
97 {
98 var tr = document.createElement("tr");
99
100 for (var y = 0; y < 9; ++y)
101
102 {
103
104 var img = document.createElement("img");
105
106 img.src = "Saper/POLE.jpg";
107
108 var item = document.createElement("a");
109
110 item.href = "#";
111
112 item.name = x * 9 + y + 1;
113
114 item.appendChild(img);
115
116 var args = "(" + y + ", " + x + ")";
117
118 item.setAttribute("onClick", "Move" + args);
119
120 item.setAttribute("onContextMenu", "setFlag" + args);
121
122 var td = document.createElement("td");
123
124 td.appendChild(item);
125
126 tr.appendChild(td);
127
128 }
129
130 table.appendChild(tr);
131
132 }
133
134 }
135
136 createGameField();
137
138 Вызов новой игры
139
140 NewGameForSer();
141
142 function setFlag(x, y)
143
144 {
145
146 if (massivB[ 9 * y + x]!=0 || !inGame) return;
147
148 var flagImg = 'Saper/FLAG.jpg';
149 var field = document.images[ 9 * y + x ];
150
151 if (field.src.match(flagImg))
152
153 field.src = 'Saper/POLE.jpg';
154
155 else
156
157 field.src = 'Saper/FLAG.jpg';
158
159 }
160
161 Задаем функцию прорисовки клетки
162
163 function Draw(x1, y1)
164
165 {
166
167 if (massivA[ 9 * y1 + x1]>19)
168
169 {
170
171 }
172
173 else
174
175 document.images[ 9 * y1 + x1 ].src='Saper/'+massivA[ 9 * y1 + x1]+'.jpg';
176
177 }
178
179 Функция для новой игры
180
181 function NewGameForSer()
182
183 {
184
185 inGame = true;
186
187 document.getElementById("WinResult").style="";
188
189 document.getElementById("GameOverResult").style=""
190
191 Nomer = 0;
192 Очистка массивов
193
194 for (var x = -2; x<= 11; x++)
195
196 for (var y = -2; y<= 11; y++)
197
198 {
199
200 massivA[ 9 * y + x ] = 0;
201
202 massivB[ 9 * y + x ] = 0;
203
204 }
205
206 for (var x = 0; x<= 8; x++)
207
208 for (var y = 0; y<= 8; y++)
209
210 document.images[ 9 * y + x ].src = 'Saper/POLE.jpg';
211
212 Расстановка мин на поле
213
214 var i = 1;
215
216 while (i<14)
217
218 {
219
220 x = Math.floor(Math.random()*9);
221
222 y = Math.floor(Math.random()*9);
223
224 if (massivA[ 9 * y + x ]==20) continue;
225
226 massivA[ 9 * y + x ] = 20;
227
228 i++;
229
230 }
231
232 Расстановка цифр вокруг мин
233
234 for (x = 0; x<=8; x++)
235
236 for (y = 0; y<=8; y++)
237
238 if (massivA[ 9 * y + x ]>19)
239 {
240
241 if ((x - 1 >= 0) && ( x - 1 <=8 ))
242
243 massivA[ 9 * y + x -1 ]++;
244
245 if ((x - 1 >= 0) && ( x - 1 <=8 ) && (y - 1 >= 0) && (y - 1 <= 8))
246
247 massivA[ 9 * (y - 1) + x -1 ]++;
248
249 if ((y - 1 >= 0) && ( y - 1 <=8 ))
250
251 massivA[ 9 * (y - 1) + x ]++;
252
253 if ((x + 1 >= 0) && ( x + 1 <=8 ) && (y - 1 >= 0) && (y - 1 <= 8))
254
255 massivA[ 9 * (y - 1) + x + 1 ]++;
256
257 if ((x + 1 >= 0) && (x + 1 <=8 ))
258
259 massivA[ 9 * y + x + 1 ]++;
260
261 if ((x + 1 >= 0) && ( x + 1 <=8 ) && (y + 1 >= 0) && (y + 1 <= 8))
262
263 massivA[ 9 * (y + 1) + x + 1 ]++;
264
265 if ((y + 1 >= 0) && (y + 1 <=8 ))
266
267 massivA[ 9 * (y + 1) + x ]++;
268
269 if ((x - 1 >= 0) && ( x - 1 <=8 ) && (y + 1 >= 0) && (y + 1 <= 8))
270
271 massivA[ 9 * (y + 1) + x - 1 ]++;
272
273 }
274
275 }Выбор клетки
276
277 function Move(x1,y1)
278
279 {
280
281 if (!inGame) return;
282
283 if (massivA[ 9 * y1 + x1]>19)
284
285 {
286
287 GameOver();
288
289 }
290
291 else
292
293 {
294
295 if (massivB[ 9 * y1 + x1 ] == 0 )
296
297 {
298
299 massivB[ 9 * y1 + x1 ] = 1;
300
301 Nomer++;
302
303 Draw(x1, y1);
304
305 if (Nomer==68) GamesWin();
306
307 if (massivA[ 9 * y1 + x1 ] == 0 ) FindZero(x1, y1);
308
309 }
310
311 }
312
313 }
314
315 Функция для поиска пустоты
316
317 function FindZero(x1, y1)
318
319 {for (var Colonka = x1 - 1; Colonka <= x1 + 1; Colonka++)
320
321 for (var Stolbik = y1 - 1; Stolbik <= y1 + 1; Stolbik++)
322
323 {
324
325 if (Nomer==68) GamesWin();
326
327 if ((Colonka >= 0) && (Colonka <9) && (Stolbik >= 0)
328
329 && (Stolbik <9) && (massivB[ 9 * Stolbik + Colonka ]==0))
330
331 {
332
333 if ((Colonka == x1-1) && (Stolbik == y1-1) && (massivA[ 9 * (y1 - 1) + x1 -1 ] == 0)) continue;
334
335 if ((Colonka == x1+1) && (Stolbik == y1-1) && (massivA[ 9 * (y1 - 1) + x1 + 1] == 0)) continue;
336
337 if ((Colonka == x1+1) && (Stolbik == y1+1) && (massivA[ 9 * (y1 + 1) + x1 + 1 ] == 0)) continue;
338
339 if ((Colonka == x1-1) && (Stolbik == y1+1) && (massivA[ 9 * (y1 + 1) + x1 - 1 ] == 0)) continue;
340
341 if (massivA[ 9 * Stolbik + Colonka ]==0)
342
343 {
344
345 Draw(Colonka, Stolbik);
346
347 Nomer++;
348
349 massivB[ 9 * Stolbik + Colonka ] = 1;
350
351 FindZero(Colonka, Stolbik);
352
353 }
354
355 else
356
357 {
358
359 Nomer++;massivB[ 9 * Stolbik + Colonka ] = 1;
360
361 Draw(Colonka, Stolbik);
362
363 }
364
365 }
366
367 }
368
369 }
370
371 Обработка выигрыша
372
373 function GamesWin()
374
375 {
376
377 for (var i=0; i<9*9; i++)
378
379 if (massivA[i]>19)
380
381 document.images[i].src = 'Saper/FLAG.jpg';
382
383 document.getElementById("WinResult").style.display="initial";
384
385 inGame = false;
386
387 }
388
389 function GameOver()
390
391 {
392
393 for (var i=0; i<9*9; ++i)
394
395 if (massivA[i]>19)
396
397 document.images[i].src='Saper/MINE.jpg'document.getElementById("GameOverResult").style.display="initial";
398
399 inGame = false;
400
401 }
402
403 </SCRIPT>
404
405 </BODY>
406
407 </HTML>