Редактирование: Лабиринт

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
 
==Описание==
 
==Описание==
  
Реализация компьютерной игры Лабиринт на языке программирования JavaScript
+
Реализация копьютерной игры Лабринт на языке программирования JavaScript
  
 
Правила игры:  
 
Правила игры:  
 
 
1. Перед пользователем появляется клетчатое поле, пустое окно для ввода чисел снизу и кнопка «Start»
 
1. Перед пользователем появляется клетчатое поле, пустое окно для ввода чисел снизу и кнопка «Start»
 
 
2.  Задача нарисовать лабиринт. Используя правую кнопку мыши, игрок нажимает на ребра сетки или около него, чтобы создать стенку в лабиринте. Повторное нажатие убирает, нарисованный объект. Далее игрок вводит число объектов (шаров), которое не должно превышать 25, в специальном поле, расположенным ниже лабиринта, и нажимает «Start», чтобы запустить игру.
 
2.  Задача нарисовать лабиринт. Используя правую кнопку мыши, игрок нажимает на ребра сетки или около него, чтобы создать стенку в лабиринте. Повторное нажатие убирает, нарисованный объект. Далее игрок вводит число объектов (шаров), которое не должно превышать 25, в специальном поле, расположенным ниже лабиринта, и нажимает «Start», чтобы запустить игру.
 
 
3. После старта частицы начинают двигаться, отталкиваясь от стенок лабиринта, самого поля и от друг друга абсолютно упруго. Игра заканчивается тогда, когда первая из частиц попадает в определенную область, произвольно генерирующуюся в поле и проявляющуюся на мониторе по окончании игры.
 
3. После старта частицы начинают двигаться, отталкиваясь от стенок лабиринта, самого поля и от друг друга абсолютно упруго. Игра заканчивается тогда, когда первая из частиц попадает в определенную область, произвольно генерирующуюся в поле и проявляющуюся на мониторе по окончании игры.
 
 
4. После окончание на экран игрока выводится слова о его победе и время движения выигравшей частицы.
 
4. После окончание на экран игрока выводится слова о его победе и время движения выигравшей частицы.
  
==Реализация==
 
  
Перечень функций, которые были использованы для написания программы:
+
Исполнители: Бутузова Е.С., Галанина Е.В.
 
 
• В основе визуализации каждого метода используется элемент <canvas>
 
 
 
• Для создания элементов управления используется форма <input>
 
 
 
• Код программы на языке JavaScript разбит на несколько основных поочередно вызываемых функций: ввод, подсчёты, рисование; используются различные циклы для проверки нажатия при построении лабиринта и нахождения частиц в поле.
 
 
 
==Авторы==
 
 
 
Разработчики: [[Бутузова Евдокия|Бутузова Евдокия]], [[Галанина Екатерина|Галанина Екатерина]]
 
  
 
Группа 3630103/90003
 
Группа 3630103/90003
Строка 36: Строка 21:
 
==Код программы==
 
==Код программы==
 
<div class="mw-collapsible mw-collapsed">
 
<div class="mw-collapsible mw-collapsed">
'''Код программы на языке JavaScript:''' <div class="mw-collapsible-content">
+
'''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content">
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
  
Строка 282: Строка 267:
 
}
 
}
  
 
</syntaxhighlight>
 
</div>
 
 
<div class="mw-collapsible mw-collapsed">
 
'''Код подпрограммы на языке JavaScript:''' <div class="mw-collapsible-content">
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
 
function is_in(arr, x1, y1) {
 
for (var i = 0; i < arr.length; i++) {
 
if (arr[i].x == x1 && arr[i].y == y1) {
 
return true;
 
}
 
}
 
return false;
 
}
 
 
function Particles_generate(edge_vert, edge_hor) {
 
var fps = 120;
 
var dt = 1 / fps;
 
var ctx = canvas_example.getContext('2d');
 
var w = canvas_example.width;
 
var h = canvas_example.height;
 
/*максимум может быть 25 частиц, поэтому возвращаем остаток от деления на 25
 
если пользователь ввел число больше 25*/
 
var N = parseInt(document.getElementById('n').value);
 
if(N % 25 == 0 && N != 0){
 
N = 25;
 
}
 
else if (N == 0){
 
N = 0;
 
}
 
else {
 
N = N%25;
 
}
 
var particles = [];
 
var r = 4;
 
var cells = 12;
 
var small_cells = 5;
 
var r_max = 5;
 
var that_2 = this;
 
 
that_2.stopped = false;
 
 
function abs(x)
 
{
 
if(x < 0){
 
return -x;
 
}
 
else{
 
return x;
 
}
 
}
 
//проверка столкновений
 
function standoff (part1, part2 )
 
{
 
if((part1.x - part2.x)*(part1.x - part2.x) +
 
(part1.y - part2.y)*(part1.y - part2.y) <= 4*r*r )
 
{
 
var m = part1.vx;
 
var t = part1.vy;
 
part1.vx = part2.vx;
 
part1.vy = part2.vy;
 
part2.vx = m;
 
part2.vy = t;
 
}
 
}
 
//проверка столкновений с ребрами
 
function Edge_standoff( arr1, arr2, arr3){
 
for ( var i = 0; i < arr1.length; i++){
 
for ( var j = 0; j < arr2.length; j++){
 
if( abs(arr1[i].x - arr2[j].beg.x) <= r &&
 
arr1[i].y < Math.max(arr2[j].beg.y, arr2[j].end.y) &&
 
arr1[i].y > Math.min(arr2[j].beg.y, arr2[j].end.y) )
 
{
 
arr1[i].vx = -arr1[i].vx;
 
}
 
if(Math.min((arr1[i].x - arr2[j].beg.x)*(arr1[i].x - arr2[j].beg.x) +
 
(arr1[i].y - arr2[j].beg.y)*(arr1[i].y - arr2[j].beg.y),
 
(arr1[i].x - arr2[j].end.x)*(arr1[i].x - arr2[j].end.x) +
 
(arr1[i].y - arr2[j].end.y)*(arr1[i].y - arr2[j].end.y)) <= r*r &&
 
(arr1[i].y >= Math.max(arr2[j].beg.y, arr2[j].end.y) ||
 
arr1[i].y <= Math.min(arr2[j].beg.y, arr2[j].end.y) ))
 
 
{
 
arr1[i].vx = -arr1[i].vx;
 
arr1[i].vy = -arr1[i].vy;
 
}
 
}
 
for( var j = 0; j < arr3.length; j++)
 
{
 
if( abs(arr1[i].y - arr3[j].beg.y) <= r &&
 
arr1[i].x < Math.max(arr3[j].beg.x, arr3[j].end.x) &&
 
arr1[i].x > Math.min(arr3[j].beg.x, arr3[j].end.x) )
 
{
 
arr1[i].vy = -arr1[i].vy;
 
}
 
 
}
 
 
}
 
 
}
 
 
that_2.get_fps = function() {
 
return fps;
 
};
 
 
that_2.Particle = function(x , y , vx , vy ) {
 
this.x = x;
 
this.y = y;
 
this.vx = vx;
 
this.vy = vy;
 
var that = this;
 
 
this.info = function() {
 
console.log(
 
'Position: (' + that.x + ', ' + that.y + ')\nVelocity: (' + that.vx +
 
',' + that.vy + ')');
 
};
 
//движение+ проверка стокновений с границами
 
this.move = function() {
 
 
if( that.x >= w-r || that.x <= r){
 
that.vx = -that.vx;
 
}
 
if( that.y >= h-r || that.y <= r){
 
that.vy = -that.vy;
 
}
 
that.x += that.vx * dt;
 
that.y += that.vy * dt;
 
};
 
 
this.draw = function() {
 
ctx.strokeStyle="green";
 
ctx.beginPath();
 
ctx.arc(that.x, that.y, r, 0, 2 * Math.PI);
 
ctx.stroke();
 
}
 
};
 
 
that_2.generate = function() {
 
return (Math.floor(Math.random() * small_cells * small_cells) % (small_cells * small_cells));
 
};
 
 
that_2.Phys = function() {
 
for (var i = 0; i < particles.length; i++) {
 
particles[i].move();
 
}
 
};
 
 
that_2.draw = function() {
 
//ctx.clearRect(0, 0, w, h);
 
for (var i = 0; i < particles.length; i++) {
 
// console.log(particles.length);
 
particles[i].draw();
 
}
 
};
 
 
that_2.Check_standoff = function (){
 
console.log(particles);
 
for (var i = 0; i < particles.length; i++){
 
for (var j = i+1; j < particles.length; j++){
 
standoff (particles[i], particles[j]);
 
}
 
}
 
Edge_standoff( particles, edge_vert,edge_hor);
 
}
 
that_2.control = function() {
 
that_2.Phys();
 
that_2.draw();
 
console.log(N);
 
};
 
//проверка попала ли частица в выигрышную область, завершение игры
 
that_2.win = function (){
 
for( var i = 0; i < particles.length; i++){
 
if( particles[i].x > 500 + r && particles[i].y > 500 + r){
 
particles.splice(i,1);
 
var end = new Date().getTime();
 
console.log(start);
 
console.log(end);
 
var time = end - start;
 
var time_sec = time/1000;
 
console.log(time);
 
ctx.fillRect(500,500,100,100);
 
that_2.stopped = true;
 
ctx.fillStyle = "blue";
 
setTimeout(function() {
 
alert('You have won!\n Your time is '+time_sec+'sec');
 
ctx.clearRect(0,0,
 
 
 
 
w, h);
 
}, 15);
 
break;
 
}
 
}
 
}
 
 
//генерируем частицы
 
for (var j = 0; j < N; j++) {
 
var fi = Math.random() * Math.PI * 2;
 
var i = that_2.generate();
 
if (!is_in(
 
particles, r_max + 2*r_max * (i % 5),
 
r_max + 2*r_max * Math.floor(i / 5))) {
 
particles.push(new that_2.Particle(
 
r_max + 2*r_max * (i % 5),
 
r_max + 2*r_max * Math.floor(i / 5), 75 * Math.cos(fi),
 
75 * Math.sin(fi)))
 
}
 
else
 
{
 
i1 = i;
 
offset = 1;
 
while(true)
 
{
 
i1 += offset;
 
if(i1 == small_cells*small_cells)
 
{
 
i1 = i - 1;
 
offset = -1;
 
}
 
if(!is_in(particles,r_max + 2*r_max * (i1 % 5),
 
r_max+ 2*r_max * Math.floor(i1 / 5)))
 
{
 
particles.push(new that_2.Particle(
 
r_max + 2*r_max * (i1 % 5),
 
r_max + 2*r_max * Math.floor(i1 / 5),
 
100 * Math.cos(fi),
 
100 * Math.sin(fi)
 
))
 
break;
 
}
 
}
 
}
 
}
 
}
 
 
</syntaxhighlight>
 
</div>
 
 
<div class="mw-collapsible mw-collapsed">
 
'''Код программы на языке HTML:''' <div class="mw-collapsible-content">
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
 
<html>
 
<head>
 
<meta charset='utf-8'>
 
<title>ЛАБИРИНТ</title>
 
<script src='project.js'></script>
 
<script src='particles_generate.js'> </script>
 
</head>
 
<body>
 
<canvas id='canvas_example' width=600 height=600 style='border: 1px solid #000000'></canvas>
 
<div align ='left'>
 
<input id='n'type='number'><br/>
 
<input type = 'button' id= 'button_start' value='Start'>
 
</div>
 
</body>
 
</html>
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 
</div>
 
</div>
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)
Источник — «http://tm.spbstu.ru/Лабиринт»