Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 28.04.2017
Сообщений: 33

сделать чтобы игра заканчивалась если змейка ест саму себя

07.05.2017, 20:37. Показов 1379. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть скрипт игры змейка, как сделать чтобы игра заканчивалась если змейка ест саму себя

p.s. я не знаю javaSript но очень надо

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
/**
 * Namespace
 */
var Game      = Game      || {};
var Keyboard  = Keyboard  || {}; 
var Component = Component || {};
 
/**
 * Keyboard Map
 */
Keyboard.Keymap = {
  65: 'left',
  87: 'up',
  68: 'right',
  83: 'down'
};
 
/**
 * Keyboard Events
 */
Keyboard.ControllerEvents = function() {
  
  // Setts
  var self      = this;
  this.pressKey = null;
  this.keymap   = Keyboard.Keymap;
  
  // Keydown Event
  document.onkeydown = function(event) {
    self.pressKey = event.which;
  };
  
  // Get Key
  this.getKey = function() {
    return this.keymap[this.pressKey];
  };
};
 
/**
 * Game Component Stage
 */
Component.Stage = function(canvas, conf) {  
  
  // Sets
  this.keyEvent  = new Keyboard.ControllerEvents();
  this.width     = canvas.width;
  this.height    = canvas.height;
  this.length    = [];
  this.food      = {};
  this.score     = 0;
  this.direction = 'right';
  this.conf      = {
    cw   : 10,
    size : 30,
    fps  : 1000
  };
  
  // Merge Conf
  if (typeof conf == 'object') {
    for (var key in conf) {
      if (conf.hasOwnProperty(key)) {
        this.conf[key] = conf[key];
      }
    }
  }
  
};
 
/**
 * Game Component Snake
 */
Component.Snake = function(canvas, conf) {
  
  // Game Stage
  this.stage = new Component.Stage(canvas, conf);
  
  // Init Snake
  this.initSnake = function() {
    
    // Itaration in Snake Conf Size
    for (var i = 0; i < this.stage.conf.size; i++) {
      
      // Add Snake Cells
      this.stage.length.push({x: i, y:0});
        }
    };
  
  // Call init Snake
  this.initSnake();
  
  // Init Food  
  this.initFood = function() {
        
    // Add food on stage
    this.stage.food = {
            x: Math.round(Math.random() * (this.stage.width - this.stage.conf.cw) / this.stage.conf.cw), 
            y: Math.round(Math.random() * (this.stage.height - this.stage.conf.cw) / this.stage.conf.cw), 
        };
    };
  
  // Init Food
  this.initFood();
  
  // Restart Stage
  this.restart = function() {
    this.stage.length            = [];
    this.stage.food              = {};
    this.stage.score             = 0;
    this.stage.direction         = 'right';
    this.stage.keyEvent.pressKey = null;
    this.initSnake();
    this.initFood();
  };
};
 
/**
 * Game Draw
 */
Game.Draw = function(context, snake) {
  
  // Draw Stage
  this.drawStage = function() {
    
    // Check Keypress And Set Stage direction
    var keyPress = snake.stage.keyEvent.getKey(); 
    if (typeof(keyPress) != 'undefined') {
      snake.stage.direction = keyPress;
    }
    
    // Draw White Stage
        context.fillStyle = "white";
        
        context.fillRect(0, 0, snake.stage.width, snake.stage.height);
        
    // Snake Position
    var nx = snake.stage.length[0].x;
        var ny = snake.stage.length[0].y;
        
    // Add position by stage direction
    switch (snake.stage.direction) {
      case 'right':
        nx++;
        break;
      case 'left':
        nx--;
        break;
      case 'up':
        ny--;
        break;
      case 'down':
        ny++;
        break;
    }
    
    // Check Collision
    if (this.collision(nx, ny) == true) {
      snake.restart();
      return;
    }
    
    // Logic of Snake food
    if (nx == snake.stage.food.x && ny == snake.stage.food.y) {
      var tail = {x: nx, y: ny};
      snake.stage.score++;
      snake.initFood();
    } else {
      var tail = snake.stage.length.pop();
      tail.x   = nx;
      tail.y   = ny;    
    }
    snake.stage.length.unshift(tail);
    
    // Draw Snake
    for (var i = 0; i < snake.stage.length.length; i++) {
      var cell = snake.stage.length[i];
      this.drawCell(cell.x, cell.y);
    }
    
    // Draw Food
    this.drawCell(snake.stage.food.x, snake.stage.food.y);
    
    // Draw Score
    context.fillText('Score: ' + snake.stage.score, 20, (snake.stage.height - 5));
    
  };
  
  // Draw Cell
  this.drawCell = function(x, y) {
    context.fillStyle = 'rgb(0, 0, 0)'; // цвет змейки и score
    context.beginPath();
    context.arc((x * snake.stage.conf.cw + 6), (y * snake.stage.conf.cw + 6), 4, 0, 2*Math.PI, false); // (1-размер змейки)   
    context.fill();
  };
  
  // Check Collision with walls
  this.collision = function(nx, ny) {  
    if (nx == -1 || nx == (snake.stage.width / snake.stage.conf.cw) || ny == -1 || ny == (snake.stage.height / snake.stage.conf.cw)) {
      return true;
    }
    return false;    
    }
};
 
 
/**
 * Game Snake
 */
Game.Snake = function(elementId, conf) {
  
  // Sets
  var canvas   = document.getElementById(elementId);
  var context  = canvas.getContext("2d");
  var snake    = new Component.Snake(canvas, conf);
  var gameDraw = new Game.Draw(context, snake);
  
  // Game Interval
  setInterval(function() {gameDraw.drawStage();}, snake.stage.conf.fps);
};
 
 
/**
 * Window Load
 */
window.onload = function() {
  var snake = new Game.Snake('stage', {fps: 100, size: 5});
};
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.05.2017, 20:37
Ответы с готовыми решениями:

Игра "Змейка": чтобы змейка не съедала сама себя
Здравствуйте! Пишу змейку на VB 2010. Не получается составить условие того, что бы змейка не ползла в направлении обратному...

Как сделать, чтобы при достижении левого верхнего угла игра заканчивалась?
procedure TForm1.FormCreate(Sender: TObject); const c: array of TColor = (clMaroon, $0079BFFF); var i, j: Byte; begin for...

Как сделать чтобы змейка не проходила через себя?
Прошу помочь, нужно чтобы змея не могла пройти через саму себя, чтобы она не смогла изменить свое направление движения, например: она идет...

1
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
07.05.2017, 22:48
https://jsfiddle.net/a4m1hwwa/

HTML5
1
<canvas id="stage" width=500 height=500></canvas>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
/**
* Namespace
*/
var Game = Game || {};
var Keyboard = Keyboard || {}; 
var Component = Component || {};
 
/**
* Keyboard Map
*/
Keyboard.Keymap = {
65: 'left',
87: 'up',
68: 'right',
83: 'down'
};
 
/**
* Keyboard Events
*/
Keyboard.ControllerEvents = function() {
 
// Setts
var self = this;
this.pressKey = null;
this.keymap = Keyboard.Keymap;
 
// Keydown Event
document.onkeydown = function(event) {
self.pressKey = event.which;
};
 
// Get Key
this.getKey = function() {
return this.keymap[this.pressKey];
};
};
 
/**
* Game Component Stage
*/
Component.Stage = function(canvas, conf) { 
 
// Sets
this.keyEvent = new Keyboard.ControllerEvents();
this.width = canvas.width;
this.height = canvas.height;
this.length = [];
this.food = {};
this.score = 0;
this.direction = 'right';
this.conf = {
cw : 10,
size : 30,
fps : 1000
};
this.canRedraw = true;
// Merge Conf
if (typeof conf == 'object') {
for (var key in conf) {
if (conf.hasOwnProperty(key)) {
this.conf[key] = conf[key];
}
}
}
 
};
 
/**
* Game Component Snake
*/
Component.Snake = function(canvas, conf) {
 
// Game Stage
this.stage = new Component.Stage(canvas, conf);
 
// Init Snake
this.initSnake = function() {
 
// Itaration in Snake Conf Size
for (var i = this.stage.conf.size-1; i >= 0; i--) {
 
// Add Snake Cells
this.stage.length.push({x: i, y:0});
}
};
 
// Call init Snake
this.initSnake();
 
// Init Food 
this.initFood = function() {
 
// Add food on stage
this.stage.food = {
x: Math.round(Math.random() * (this.stage.width - this.stage.conf.cw) / this.stage.conf.cw), 
y: Math.round(Math.random() * (this.stage.height - this.stage.conf.cw) / this.stage.conf.cw), 
};
};
 
// Init Food
this.initFood();
 
// Restart Stage
this.restart = function() {
this.stage.length = [];
this.stage.food = {};
this.stage.score = 0;
this.stage.direction = 'right';
this.stage.keyEvent.pressKey = null;
this.initSnake();
this.initFood();
this.stage.canRedraw = true;
};
};
 
/**
* Game Draw
*/
Game.Draw = function(context, snake) {
 
// Draw Stage
this.drawStage = function() {
 
// Check Keypress And Set Stage direction
var keyPress = snake.stage.keyEvent.getKey(); 
 
if (typeof(keyPress) != 'undefined') {
if((snake.stage.direction == "right" && keyPress != "left") ||
(snake.stage.direction == "up" && keyPress != "down") ||
(snake.stage.direction == "left" && keyPress != "right") ||
(snake.stage.direction == "down" && keyPress != "up"))
snake.stage.direction = keyPress;
}
 
// Draw White Stage
context.fillStyle = "white";
 
context.fillRect(0, 0, snake.stage.width, snake.stage.height);
 
// Snake Position
var nx = snake.stage.length[0].x;
var ny = snake.stage.length[0].y;
 
// Add position by stage direction
 
switch (snake.stage.direction) {
case 'right':
nx++;
break;
case 'left':
nx--;
break;
case 'up':
ny--;
break;
case 'down':
ny++;
break;
}
 
// Check Collision
if (this.collision(nx, ny) == true || this.selfCollision() == true) {
snake.restart();
return;
}
 
// Logic of Snake food
if (nx == snake.stage.food.x && ny == snake.stage.food.y) {
var tail = {x: nx, y: ny};
snake.stage.score++;
snake.initFood();
} else {
var tail = snake.stage.length.pop();
tail.x = nx;
tail.y = ny;    
}
snake.stage.length.unshift(tail);
 
// Draw Snake
for (var i = 0; i < snake.stage.length.length; i++) {
var cell = snake.stage.length[i];
this.drawCell(cell.x, cell.y);
}
 
// Draw Food
this.drawCell(snake.stage.food.x, snake.stage.food.y);
 
// Draw Score
context.fillText('Score: ' + snake.stage.score, 20, (snake.stage.height - 5));
 
snake.stage.canRedraw = true;
};
 
// Draw Cell
this.drawCell = function(x, y) {
context.fillStyle = 'rgb(0, 0, 0)'; // цвет змейки и score
context.beginPath();
context.arc((x * snake.stage.conf.cw + 6), (y * snake.stage.conf.cw + 6), 4, 0, 2*Math.PI, false); // (1-размер змейки) 
context.fill();
};
 
// Check Collision with walls
this.collision = function(nx, ny) { 
if (nx == -1 || nx == (snake.stage.width / snake.stage.conf.cw) || ny == -1 || ny == (snake.stage.height / snake.stage.conf.cw)) {
return true;
}
return false; 
}
this.selfCollision = function() { 
for (var i = 1; i < snake.stage.length.length; i++) {
var cell = snake.stage.length[i];
if (snake.stage.length[0].x == cell.x && snake.stage.length[0].y == cell.y) {
return true;
}
}
return false; 
}
 
};
 
 
/**
* Game Snake
*/
var elementId = "stage";
Game.Snake = function(elementId, conf) {
 
// Sets
var canvas = document.getElementById(elementId);
var context = canvas.getContext("2d");
var snake = new Component.Snake(canvas, conf);
var gameDraw = new Game.Draw(context, snake);
 
// Game Interval
setInterval(function() {
if(snake.stage.canRedraw == true){
snake.stage.canRedraw = false;
gameDraw.drawStage();
}
}, snake.stage.conf.fps);
};
 
 
/**
* Window Load
*/
window.onload = function() {
var snake = new Game.Snake('stage', {fps: 100, size: 5});
};
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.05.2017, 22:48
Помогаю со студенческими работами здесь

Чтобы программа на c# перезапускала саму себя
Добрый день! Возможно ли из программы на c# полностью перезапустить саму себя? Как это проще всего реализовать? Добавлено через 6...

Игра Змейка, сделать меню!
Помогите пожалуйста сделать меню к программе, наподобие этого 1. О программе 2. Старт игры 3. Выход Исходный тест программы: ...

Игра "Змейка": как проверить если она врезалась
пишу игру типа змейка. она передвигается при наждатии на клавиши, нужно сделать проверку (если на ее пути стоит камень и она в него...

Если организовать цикл While - в результате белый экран (игра "змейка")
Пробую создать игру Змейка, уже пару часов у меня проблема - при отрисовке без цикла все нормально, змейка выводиться, при использовании...

Как сделать, чтобы при нажатии на миниатюру ссылка вела на саму картинку миниатюры
Помогите пожалуйста. В php я ни чего не понимаю. Стоит задача, чтобы из каталога при нажатии на картинку миниатюры ссылка вела на запись. И...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru