Игра сапер

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск

Описание

Реализация и визуализация компьютерной игры Сапер

Исполнитель: Аминов Андрей Черницына Анна

Группа 13632/1 Кафедра Теоретической механики

Файл:[[1]]

Код программы

Текст программы на языке JavaScript:


<HTML>

<HEAD>

<TITLE>Сапер</TITLE><style>body{scrollbar-base-color: #4444FF}</style></HEAD>

Меняем цвет фона

<BODY BGCOLOR="#333333" onContextMenu="return false;">


Создаем таблицу


Создаем функции для визуализации победы и поражения

Game Over
WIN

<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>