Игра сапер

Материал из 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>