Редактирование: Игра "Змейка"
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 2: | Строка 2: | ||
В этой игре пользователь управляет змейкой, которая ползает по плоскости, ограниченной стенками, и собирает еду, избегая столкновения с собственным хвостом и краями игрового поля. | В этой игре пользователь управляет змейкой, которая ползает по плоскости, ограниченной стенками, и собирает еду, избегая столкновения с собственным хвостом и краями игрового поля. | ||
− | Исполнители: [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%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 Кафедра Теоретической механики. | ||
Строка 13: | Строка 13: | ||
{{#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=800|border=0 }} | ||
== Код программы == | == Код программы == | ||
− | + | window.addEventListener("load", main_code, 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); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | |||
− |