Игра сапер — различия между версиями
(→Описание) |
(пр) |
||
Строка 7: | Строка 7: | ||
Группа 13632/1 Кафедра Теоретической механики | Группа 13632/1 Кафедра Теоретической механики | ||
− | Файл:[[ | + | Файл:[[https://csspbstu-my.sharepoint.com/:w:/r/personal/aminov_aa_edu_spbstu_ru/_layouts/15/Doc.aspx?sourcedoc=%7BEF238257-C9D8-4B60-ADD7-189C322F50FF%7D&file=Dokument7_2.docx&action=edit&mobileredirect=true&wdNewAndOpenCt=1560805013007&wdPreviousSession=34062615-05a7-4188-996d-a7e4d1b2eb69&wdOrigin=office%2Ecom]] |
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Aminov_AA/kyrsah.html |width=1000 |height=1100 |border=0 }} | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Aminov_AA/kyrsah.html |width=1000 |height=1100 |border=0 }} |
Версия 23:58, 17 июня 2019
Описание
Реализация и визуализация компьютерной игры Сапер
Исполнитель: Аминов Андрей Черницына Анна
Группа 13632/1 Кафедра Теоретической механики
Файл:[[1]]
Код программы
Текст программы на языке JavaScript:
<HTML>
<HEAD>
<TITLE>Сапер</TITLE><style>body{scrollbar-base-color: #4444FF}</style></HEAD>
Меняем цвет фона
<BODY BGCOLOR="#333333" onContextMenu="return false;">
Создаем таблицу
Создаем функции для визуализации победы и поражения
<FORM>
<BUTTON STYLE="{font-size:24px;background-color:#002040;border-width:0;color:red" onClick="NewGameForSer()">НОВАЯ ИГРА</BUTTON>
</FORM>
<style>
.result {
display: none;
position: 50% 50%;
position: fixed;
top: 50%;
left: 0%;
font-size: 300;
z-index: 1;
background-color: pink;
margin-top: -150px;
width: 100%;
opacity: 0.7;
}
</style>
<SCRIPT>
var massivA = new Array (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
Дополнительный массив для поиска пути
var massivB = new Array (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
var Nomer = 0;
var inGame = false;
function createGameField()
{
var table = document.getElementById("GameField");
for (var x = 0; x < 9; ++x)
{ var tr = document.createElement("tr");
for (var y = 0; y < 9; ++y)
{
var img = document.createElement("img");
img.src = "Saper/POLE.jpg";
var item = document.createElement("a");
item.href = "#";
item.name = x * 9 + y + 1;
item.appendChild(img);
var args = "(" + y + ", " + x + ")";
item.setAttribute("onClick", "Move" + args);
item.setAttribute("onContextMenu", "setFlag" + args);
var td = document.createElement("td");
td.appendChild(item);
tr.appendChild(td);
}
table.appendChild(tr);
}
}
createGameField();
Вызов новой игры
NewGameForSer();
function setFlag(x, y)
{
if (massivB[ 9 * y + x]!=0 || !inGame) return;
var flagImg = 'Saper/FLAG.jpg'; var field = document.images[ 9 * y + x ];
if (field.src.match(flagImg))
field.src = 'Saper/POLE.jpg';
else
field.src = 'Saper/FLAG.jpg';
}
Задаем функцию прорисовки клетки
function Draw(x1, y1)
{
if (massivA[ 9 * y1 + x1]>19)
{
}
else
document.images[ 9 * y1 + x1 ].src='Saper/'+massivA[ 9 * y1 + x1]+'.jpg';
}
Функция для новой игры
function NewGameForSer()
{
inGame = true;
document.getElementById("WinResult").style="";
document.getElementById("GameOverResult").style=""
Nomer = 0; Очистка массивов
for (var x = -2; x<= 11; x++)
for (var y = -2; y<= 11; y++)
{
massivA[ 9 * y + x ] = 0;
massivB[ 9 * y + x ] = 0;
}
for (var x = 0; x<= 8; x++)
for (var y = 0; y<= 8; y++)
document.images[ 9 * y + x ].src = 'Saper/POLE.jpg';
Расстановка мин на поле
var i = 1;
while (i<14)
{
x = Math.floor(Math.random()*9);
y = Math.floor(Math.random()*9);
if (massivA[ 9 * y + x ]==20) continue;
massivA[ 9 * y + x ] = 20;
i++;
}
Расстановка цифр вокруг мин
for (x = 0; x<=8; x++)
for (y = 0; y<=8; y++)
if (massivA[ 9 * y + x ]>19) {
if ((x - 1 >= 0) && ( x - 1 <=8 ))
massivA[ 9 * y + x -1 ]++;
if ((x - 1 >= 0) && ( x - 1 <=8 ) && (y - 1 >= 0) && (y - 1 <= 8))
massivA[ 9 * (y - 1) + x -1 ]++;
if ((y - 1 >= 0) && ( y - 1 <=8 ))
massivA[ 9 * (y - 1) + x ]++;
if ((x + 1 >= 0) && ( x + 1 <=8 ) && (y - 1 >= 0) && (y - 1 <= 8))
massivA[ 9 * (y - 1) + x + 1 ]++;
if ((x + 1 >= 0) && (x + 1 <=8 ))
massivA[ 9 * y + x + 1 ]++;
if ((x + 1 >= 0) && ( x + 1 <=8 ) && (y + 1 >= 0) && (y + 1 <= 8))
massivA[ 9 * (y + 1) + x + 1 ]++;
if ((y + 1 >= 0) && (y + 1 <=8 ))
massivA[ 9 * (y + 1) + x ]++;
if ((x - 1 >= 0) && ( x - 1 <=8 ) && (y + 1 >= 0) && (y + 1 <= 8))
massivA[ 9 * (y + 1) + x - 1 ]++;
}
}Выбор клетки
function Move(x1,y1)
{
if (!inGame) return;
if (massivA[ 9 * y1 + x1]>19)
{
GameOver();
}
else
{
if (massivB[ 9 * y1 + x1 ] == 0 )
{
massivB[ 9 * y1 + x1 ] = 1;
Nomer++;
Draw(x1, y1);
if (Nomer==68) GamesWin();
if (massivA[ 9 * y1 + x1 ] == 0 ) FindZero(x1, y1);
}
}
}
Функция для поиска пустоты
function FindZero(x1, y1)
{for (var Colonka = x1 - 1; Colonka <= x1 + 1; Colonka++)
for (var Stolbik = y1 - 1; Stolbik <= y1 + 1; Stolbik++)
{
if (Nomer==68) GamesWin();
if ((Colonka >= 0) && (Colonka <9) && (Stolbik >= 0)
&& (Stolbik <9) && (massivB[ 9 * Stolbik + Colonka ]==0))
{
if ((Colonka == x1-1) && (Stolbik == y1-1) && (massivA[ 9 * (y1 - 1) + x1 -1 ] == 0)) continue;
if ((Colonka == x1+1) && (Stolbik == y1-1) && (massivA[ 9 * (y1 - 1) + x1 + 1] == 0)) continue;
if ((Colonka == x1+1) && (Stolbik == y1+1) && (massivA[ 9 * (y1 + 1) + x1 + 1 ] == 0)) continue;
if ((Colonka == x1-1) && (Stolbik == y1+1) && (massivA[ 9 * (y1 + 1) + x1 - 1 ] == 0)) continue;
if (massivA[ 9 * Stolbik + Colonka ]==0)
{
Draw(Colonka, Stolbik);
Nomer++;
massivB[ 9 * Stolbik + Colonka ] = 1;
FindZero(Colonka, Stolbik);
}
else
{
Nomer++;massivB[ 9 * Stolbik + Colonka ] = 1;
Draw(Colonka, Stolbik);
}
}
}
}
Обработка выигрыша
function GamesWin()
{
for (var i=0; i<9*9; i++)
if (massivA[i]>19)
document.images[i].src = 'Saper/FLAG.jpg';
document.getElementById("WinResult").style.display="initial";
inGame = false;
}
function GameOver()
{
for (var i=0; i<9*9; ++i)
if (massivA[i]>19)
document.images[i].src='Saper/MINE.jpg'document.getElementById("GameOverResult").style.display="initial";
inGame = false;
}
</SCRIPT>
</BODY>
</HTML>