Текущая версия |
Ваш текст |
Строка 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%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=1000|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>
| |