Редактирование: Игра "Змейка"

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
 
== Описание ==
 
== Описание ==
В этой игре пользователь управляет змейкой, которая ползает по плоскости, ограниченной стенками, и собирает еду, избегая столкновения с собственным хвостом и краями игрового поля.
+
Игра, в которой игрок управляет змейкой, которая ползает по плоскости, ограниченной стенками, и собирает еду, избегая столкновения с собственным хвостом и краями игрового поля.
  
Исполнители: [http://tm.spbstu.ru/%D0%94%D0%B5%D0%BC%D0%B8%D0%BD%D0%B0_%D0%9A%D1%81%D0%B5%D0%BD%D0%B8%D1%8F Демина К.В.], [http://tm.spbstu.ru/%D0%9F%D1%80%D0%BE%D1%85%D0%BE%D1%80%D0%B5%D0%BD%D0%BA%D0%BE%D0%B2%D0%B0_%D0%98%D1%80%D0%B8%D0%BD%D0%B0 Прохоренкова И.Г.], [http://tm.spbstu.ru/%D0%9C%D0%B0%D0%BB%D1%8B%D1%88%D0%B5%D0%B2%D0%B0_%D0%92%D0%B5%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%B0 Малышева В.Н.]
+
Исполнители: [http://tm.spbstu.ru/%D0%94%D0%B5%D0%BC%D0%B8%D0%BD%D0%B0_%D0%9A%D1%81%D0%B5%D0%BD%D0%B8%D1%8F Демина Ксения], [http://tm.spbstu.ru/%D0%9F%D1%80%D0%BE%D1%85%D0%BE%D1%80%D0%B5%D0%BD%D0%BA%D0%BE%D0%B2%D0%B0_%D0%98%D1%80%D0%B8%D0%BD%D0%B0 Прохоренкова И.Г.], [http://tm.spbstu.ru/%D0%9C%D0%B0%D0%BB%D1%8B%D1%88%D0%B5%D0%B2%D0%B0_%D0%92%D0%B5%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%B0 Малышева В.Н.]
  
 
Группа 13632/1 Кафедра Теоретической механики.
 
Группа 13632/1 Кафедра Теоретической механики.
Строка 11: Строка 11:
 
Поле представляет собой прямоугольник, в пределах которого движется зеленая ячейка, являющаяся змейкой, и красные, синие и желтые ячейки, которые представляют собой еду для нее.
 
Поле представляет собой прямоугольник, в пределах которого движется зеленая ячейка, являющаяся змейкой, и красные, синие и желтые ячейки, которые представляют собой еду для нее.
 
== Визуализация ==
 
== Визуализация ==
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Demina_KV/zmeika.html |width=1100|height=800|border=0 }}
+
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Demina_KV/zmeika.html |width=1100|height=2000|border=0 }}
== Код программы ==
 
<div class="mw-collapsible mw-collapsed">
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
window.addEventListener("load",main,false);
 
function main_code(){
 
var ctx = SnakeS.getContext("2d");
 
var h = SnakeS.height;
 
var w = SnakeS.width;
 
var n = 45;
 
var intervalID;
 
var direction = "left";
 
var ms =200;
 
var score = 0;
 
var wCode = 87;
 
var aCode = 65;
 
var sCode = 83;
 
var dCode = 68;
 
var upCode = 38;
 
var leftCode = 37;
 
var downCode = 40;
 
var rightCode = 39;
 
var pause = false;
 
function get_mouse_coords(e){
 
var m = {};
 
var rect = SnakeS.getBoundingClientRect();
 
m.x = e.clientX - rect.left;
 
m.y = e.clientY - rect.top;
 
return m;
 
}
 
SnakeS.onclick = function(e){
 
  var m = get_mouse_coords(e);
 
  console.log(m.x, m.y);
 
  if ((m.x>(w/2-95))&&(m.x<(w/2+95))&&(m.y>(h/2+30))&&(m.y<(h/2+70))) {
 
  console.log(1);
 
  location.reload();
 
  }
 
}
 
var sl=1;
 
var nofood = false;
 
var nofoodno = false;
 
var x = w/n;
 
var y = h/n;
 
console.log(x,y);
 
function box(){
 
  this.conteins = "empty";
 
}
 
function Snake(){
 
  this.head = null;
 
  this.tail = null;
 
  this.body = [];
 
  this.length = 1;
 
}
 
var field = [];
 
for (var i=0; i<n; i++) {
 
  var m = [];
 
  for (var j=0; j<n; j++){
 
  m.push(new box());
 
  }
 
  field.push(m);
 
}
 
var snake = new Snake();
 
function finish() {
 
  ctx.textAlign = 'center';
 
  ctx.font = '30px Georgia';
 
  pause = true;
 
  console.error("Вы проиграли");
 
  clearInterval(intervalID);
 
  ctx.fillStyle = 'rgb(180, 234, 255)';
 
  ctx.fillRect(0.25*w, 0.25*h, 0.5*w, 0.5*h);
 
  ctx.strokeStyle = 'black';
 
  ctx.strokeRect(0.25*w, 0.25*h, 0.5*w, 0.5*h);
 
  ctx.fillStyle = 'black';
 
  ctx.fillText('Вы проиграли!', w/2, h/2-40);
 
  ctx.fillText('Ваш счет: '+score, w/2, h/2);
 
  ctx.fillStyle = 'rgb(14, 151, 184)';
 
  ctx.fillRect(w/2-95, h/2+30, 190, 40);
 
  ctx.strokeRect(w/2-95, h/2+30, 190, 40);
 
  ctx.fillStyle = 'black';
 
  ctx.fillText('Сыграть еще', w/2, h/2+60);
 
  console.info('rtr');
 
}
 
function CreateItem(item){
 
  var i=Math.round(Math.random()*(n - 1));
 
  var j=Math.round(Math.random()*(n - 1));
 
  while (field [i][j].conteins != "empty"){
 
    var i=Math.round(Math.random()*(n - 1));
 
    var j=Math.round(Math.random()*(n - 1));
 
  }
 
  field [i][j].conteins = item;
 
}
 
function Init(){
 
  var i=Math.round(Math.random()*(n - 1));
 
  var j=Math.round(Math.random()*(n - 1));
 
  field [i][j].conteins = "food";
 
  var i=Math.round(Math.random()*(n - 1));
 
  var j=Math.round(Math.random()*(n - 1));
 
  while (field [i][j].conteins == "food"){
 
    var i=Math.round(Math.random()*(n - 1));
 
    var j=Math.round(Math.random()*(n - 1));
 
  }
 
  field [i][j].conteins = "snake";
 
  snake.head = {x: i, y: j};
 
  snake.tail = {x: i, y: j};
 
  snake.body.push({x: i, y: j}) ;
 
  console.log(direction, snake.body, snake.head);
 
  CreateItem('nofood');
 
}
 
function Draw() {
 
  for (var i=0; i<n; i++) {
 
  for (var j=0; j<n; j++){
 
    if (field[i][j].conteins == "empty") {
 
    ctx.fillStyle = 'white';
 
    ctx.fillRect(x*i, y*j, x, y);
 
    }
 
    if (field[i][j].conteins == "food") {
 
    ctx.fillStyle = 'red';
 
    ctx.fillRect(x*i, y*j, x, y);
 
    ctx.strokeStyle = 'black';
 
    ctx.strokeRect(x*i, y*j, x, y);
 
    }
 
    if (field[i][j].conteins == "snake") {
 
    ctx.fillStyle = 'green';
 
    ctx.fillRect(x*i, y*j, x, y);
 
    ctx.strokeStyle = 'black';
 
    ctx.strokeRect(x*i, y*j, x, y);
 
    }
 
    if (field[i][j].conteins == "nofood") {
 
    ctx.fillStyle = 'blue';
 
    ctx.fillRect(x*i, y*j, x, y);
 
    ctx.strokeStyle = 'black';
 
    ctx.strokeRect(x*i, y*j, x, y);
 
    }
 
    if (field[i][j].conteins == "nofoodno") {
 
    ctx.fillStyle = 'yellow';
 
    ctx.fillRect(x*i, y*j, x, y);
 
    ctx.strokeStyle = 'black';
 
    ctx.strokeRect(x*i, y*j, x, y);
 
    }
 
  }
 
  }
 
  document.getElementById('scre').innerHTML = score;
 
}
 
window.onkeydown = function(evt) {
 
evt = evt || window.event;
 
var charCode = evt.keyCode || evt.which;
 
console.log(charCode);
 
if (((charCode == wCode)||(charCode == upCode)) && direction != "down") {
 
  direction = "up";
 
}
 
if (((charCode == sCode)||(charCode == downCode)) && direction != "up") {
 
  direction = "down";
 
}
 
if (((charCode == aCode)||(charCode == leftCode)) && direction != "right") {
 
  direction = "left";
 
}
 
if (((charCode == dCode)||(charCode == rightCode)) && direction != "left") {
 
  direction = "right";
 
}
 
}
 
function CheckLength() {
 
  if ((score == 3) && (sl != 2)){
 
  sl = 2;
 
  ms = ms-100;
 
  clearInterval(intervalID);
 
  intervalID = setInterval(control, ms);
 
  return ;
 
  }
 
  if ((score == 5 ) && (sl != 3)){
 
  sl = 3;
 
  ms = ms-50;
 
  clearInterval(intervalID);
 
  intervalID = setInterval(control, ms);
 
  }
 
}
 
function Calcul(){
 
  var next
 
  try {
 
  if (direction == "left") {
 
  next = {x: snake.head.x-1, y: snake.head.y}
 
  }
 
  if (direction == "right") {
 
  next = {x: snake.head.x+1, y: snake.head.y}
 
  }
 
  if (direction == "up") {
 
  next = {x: snake.head.x, y: snake.head.y-1}
 
  }
 
  if (direction == "down" && snake.length == 1) {
 
  next = {x: snake.head.x, y: snake.head.y+1}
 
  }
 
  if (direction == "down" && snake.length > 1) {
 
  next = {x: snake.head.x, y: snake.head.y}
 
  }
 
  if (score > 5) {
 
  if (next.x<0) {
 
    next.x = n-1
 
    console.log('TP')
 
    }
 
  if (next.y<0) {
 
    next.y = n-1
 
    console.log('TP')
 
   
 
  if (next.x>n-1) {
 
    next.x = 0
 
    console.log('TP')
 
    }
 
  if (next.y>n-1) {
 
    next.y = 0
 
    console.log('TP')
 
    }
 
  } else {
 
  if (next.x<0) {
 
    finish();
 
    return;
 
    }
 
  if (next.y<0) {
 
    finish();
 
    return;
 
    }
 
  if (next.x>n-1) {
 
    finish();
 
    return;
 
    }
 
  if (next.y>n-1) {
 
    finish();
 
    return;
 
    }
 
  }
 
  if (field[next.x][next.y].conteins == "snake") {
 
  finish();
 
  return;
 
  }
 
  if (field[next.x][next.y].conteins == "food") {
 
  snake.body.push({x:next.x, y:next.y});
 
  snake.head = {x:next.x, y:next.y};
 
  field[next.x][next.y].conteins = "snake";
 
  CreateItem ('food');
 
  score++;
 
  }
 
  if (field[next.x][next.y].conteins == "nofoodno") {
 
  snake.body.push({x:next.x, y:next.y});
 
  snake.head = {x:next.x, y:next.y};
 
  field[next.x][next.y].conteins = "snake";
 
  field[snake.body[0].x][snake.body[0].y].conteins = "empty";
 
  snake.body.shift();
 
  if(snake.body.length!=1)
 
    field[snake.body[0].x][snake.body[0].y].conteins = "empty";
 
    snake.body.shift();
 
  score++;
 
  nofoodno=false;
 
  }
 
  if (field[next.x][next.y].conteins == "nofood") {
 
  snake.body.push({x:next.x, y:next.y});
 
  snake.head = {x:next.x, y:next.y};
 
  field[next.x][next.y].conteins = "snake";
 
  field[snake.body[0].x][snake.body[0].y].conteins = "empty";
 
  snake.body.shift();
 
  score++;
 
  nofood=false;
 
  }
 
  if (field[next.x][next.y].conteins == "empty") {
 
  snake.body.push({x:next.x, y:next.y});
 
  snake.head = {x:next.x, y:next.y};
 
  field[next.x][next.y].conteins = "snake";
 
  field[snake.body[0].x][snake.body[0].y].conteins = "empty";
 
  snake.body.shift();
 
  }
 
  } catch (err){
 
  console.error("Что то пошло не так; X=", next.x, "Y=", next.y);
 
  clearInterval(intervalID);
 
  }
 
  if (((score+1) % 5 == 0)&&(!nofood)){
 
  CreateItem ('nofood');
 
  nofood=true;
 
  }
 
  if (((score+1) % 8 == 0)&&(!nofoodno)){
 
  CreateItem ('nofoodno');
 
  nofoodno=true;
 
  }
 
}
 
function control (){
 
  if (!pause)
 
  Calcul ();
 
  if (!pause)
 
  Draw();
 
  CheckLength();
 
}
 
Init();
 
Draw ();
 
intervalID = setInterval(control, ms);
 
}
 
</syntaxhighlight>
 
</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:

Отменить | Справка по редактированию  (в новом окне)