Игра "Змейка"

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск

Описание[править]

В этой игре пользователь управляет змейкой, которая ползает по плоскости, ограниченной стенками, и собирает еду, избегая столкновения с собственным хвостом и краями игрового поля.

Исполнители: Демина К.В., Прохоренкова И.Г., Малышева В.Н.

Группа 13632/1 Кафедра Теоретической механики.

Файл: Текст курсового проекта

Математическая модель[править]

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

Визуализация[править]

Код программы[править]

  1  window.addEventListener("load",main,false);
  2  function main_code(){
  3  var ctx = SnakeS.getContext("2d");
  4  var h = SnakeS.height;
  5  var w = SnakeS.width;
  6  var n = 45;
  7  var intervalID;
  8  var direction = "left";
  9  var ms =200;
 10  var score = 0;
 11  var wCode = 87;
 12  var aCode = 65;
 13  var sCode = 83;
 14  var dCode = 68;
 15  var upCode = 38;
 16  var leftCode = 37;
 17  var downCode = 40;
 18  var rightCode = 39;
 19  var pause = false;
 20  function get_mouse_coords(e){ 
 21  var m = {};
 22  var rect = SnakeS.getBoundingClientRect();
 23  m.x = e.clientX - rect.left;
 24  m.y = e.clientY - rect.top;
 25  return m;
 26  }
 27  SnakeS.onclick = function(e){
 28   var m = get_mouse_coords(e);
 29   console.log(m.x, m.y);
 30   if ((m.x>(w/2-95))&&(m.x<(w/2+95))&&(m.y>(h/2+30))&&(m.y<(h/2+70))) {
 31    console.log(1);
 32    location.reload();
 33   }
 34  }
 35  var sl=1;
 36  var nofood = false;
 37  var nofoodno = false;
 38  var x = w/n;
 39  var y = h/n;
 40  console.log(x,y);
 41  function box(){
 42   this.conteins = "empty";		
 43  }
 44  function Snake(){
 45   this.head = null;
 46   this.tail = null;
 47   this.body = [];
 48   this.length = 1;
 49  }
 50  var field = [];
 51  for (var i=0; i<n; i++) {
 52   var m = [];
 53   for (var j=0; j<n; j++){
 54    m.push(new box());
 55   }
 56   field.push(m);
 57  }
 58  var snake = new Snake();
 59  function finish() {
 60   ctx.textAlign = 'center';
 61   ctx.font = '30px Georgia';
 62   pause = true;
 63   console.error("Вы проиграли");
 64   clearInterval(intervalID);
 65   ctx.fillStyle = 'rgb(180, 234, 255)';
 66   ctx.fillRect(0.25*w, 0.25*h, 0.5*w, 0.5*h);
 67   ctx.strokeStyle = 'black';
 68   ctx.strokeRect(0.25*w, 0.25*h, 0.5*w, 0.5*h);
 69   ctx.fillStyle = 'black';
 70   ctx.fillText('Вы проиграли!', w/2, h/2-40);
 71   ctx.fillText('Ваш счет: '+score, w/2, h/2);
 72   ctx.fillStyle = 'rgb(14, 151, 184)';
 73   ctx.fillRect(w/2-95, h/2+30, 190, 40);
 74   ctx.strokeRect(w/2-95, h/2+30, 190, 40);
 75   ctx.fillStyle = 'black';
 76   ctx.fillText('Сыграть еще', w/2, h/2+60);
 77   console.info('rtr');
 78  }
 79  function CreateItem(item){
 80   var i=Math.round(Math.random()*(n - 1));
 81   var j=Math.round(Math.random()*(n - 1));
 82   while (field [i][j].conteins != "empty"){
 83     var i=Math.round(Math.random()*(n - 1));
 84     var j=Math.round(Math.random()*(n - 1));
 85    }
 86   field [i][j].conteins = item;
 87  }
 88  function Init(){
 89    var i=Math.round(Math.random()*(n - 1));
 90    var j=Math.round(Math.random()*(n - 1));
 91    field [i][j].conteins = "food";
 92    var i=Math.round(Math.random()*(n - 1));
 93    var j=Math.round(Math.random()*(n - 1));
 94    while (field [i][j].conteins == "food"){
 95     var i=Math.round(Math.random()*(n - 1));
 96     var j=Math.round(Math.random()*(n - 1));
 97    }
 98    field [i][j].conteins = "snake";
 99    snake.head = {x: i, y: j};
100    snake.tail = {x: i, y: j};
101    snake.body.push({x: i, y: j}) ;
102    console.log(direction, snake.body, snake.head);
103    CreateItem('nofood');
104  }
105  function Draw() {
106   for (var i=0; i<n; i++) {
107    for (var j=0; j<n; j++){
108     if (field[i][j].conteins == "empty") {
109     ctx.fillStyle = 'white';
110     ctx.fillRect(x*i, y*j, x, y);
111     }
112     if (field[i][j].conteins == "food") {
113     ctx.fillStyle = 'red';
114     ctx.fillRect(x*i, y*j, x, y);
115     ctx.strokeStyle = 'black';
116     ctx.strokeRect(x*i, y*j, x, y);
117     }
118     if (field[i][j].conteins == "snake") {
119     ctx.fillStyle = 'green';
120     ctx.fillRect(x*i, y*j, x, y);
121     ctx.strokeStyle = 'black';
122     ctx.strokeRect(x*i, y*j, x, y);
123     }
124     if (field[i][j].conteins == "nofood") {
125     ctx.fillStyle = 'blue';
126     ctx.fillRect(x*i, y*j, x, y);
127     ctx.strokeStyle = 'black';
128     ctx.strokeRect(x*i, y*j, x, y);
129     }
130     if (field[i][j].conteins == "nofoodno") {
131     ctx.fillStyle = 'yellow';
132     ctx.fillRect(x*i, y*j, x, y);
133     ctx.strokeStyle = 'black';
134     ctx.strokeRect(x*i, y*j, x, y);
135     }
136    }
137   }
138   document.getElementById('scre').innerHTML = score;
139  }
140  window.onkeydown = function(evt) { 
141  evt = evt || window.event;
142  var charCode = evt.keyCode || evt.which;
143  console.log(charCode); 
144  if (((charCode == wCode)||(charCode == upCode)) && direction != "down") {
145   direction = "up";
146  }
147  if (((charCode == sCode)||(charCode == downCode)) && direction != "up") {
148   direction = "down"; 
149  }
150  if (((charCode == aCode)||(charCode == leftCode)) && direction != "right") {
151   direction = "left";
152  }
153  if (((charCode == dCode)||(charCode == rightCode)) && direction != "left") {
154   direction = "right";
155  }
156  }
157  function CheckLength() {
158   if ((score == 3) && (sl != 2)){
159    sl = 2;
160    ms = ms-100;
161    clearInterval(intervalID);
162    intervalID = setInterval(control, ms);
163    return ;
164   }
165   if ((score == 5 ) && (sl != 3)){
166    sl = 3;
167    ms = ms-50;
168    clearInterval(intervalID);
169    intervalID = setInterval(control, ms);
170   }
171  }
172  function Calcul(){
173   var next 
174   try {
175   if (direction == "left") {
176    next = {x: snake.head.x-1, y: snake.head.y}
177   }
178   if (direction == "right") {
179    next = {x: snake.head.x+1, y: snake.head.y}
180   }
181   if (direction == "up") {
182    next = {x: snake.head.x, y: snake.head.y-1}
183   }
184   if (direction == "down" && snake.length == 1) {
185    next = {x: snake.head.x, y: snake.head.y+1}
186   }
187   if (direction == "down" && snake.length > 1) {
188    next = {x: snake.head.x, y: snake.head.y}
189   }
190   if (score > 5) {
191    if (next.x<0) {
192     next.x = n-1
193     console.log('TP')
194     }
195    if (next.y<0) {
196     next.y = n-1
197     console.log('TP')
198     
199    if (next.x>n-1) {
200     next.x = 0
201     console.log('TP')
202     }
203    if (next.y>n-1) {
204     next.y = 0
205     console.log('TP')
206      }	
207   } else {
208    if (next.x<0) {
209     finish();
210     return;
211     }
212    if (next.y<0) {
213     finish();
214     return;
215     }
216    if (next.x>n-1) {
217     finish();
218     return;
219     }
220    if (next.y>n-1) {
221     finish();
222     return;
223     }	
224   }
225   if (field[next.x][next.y].conteins == "snake") {
226    finish();
227    return;
228   }
229   if (field[next.x][next.y].conteins == "food") {
230    snake.body.push({x:next.x, y:next.y});
231    snake.head = {x:next.x, y:next.y};
232    field[next.x][next.y].conteins = "snake";
233    CreateItem ('food');
234    score++;
235   }
236   if (field[next.x][next.y].conteins == "nofoodno") {
237    snake.body.push({x:next.x, y:next.y});
238    snake.head = {x:next.x, y:next.y};
239    field[next.x][next.y].conteins = "snake";
240    field[snake.body[0].x][snake.body[0].y].conteins = "empty";
241    snake.body.shift();
242    if(snake.body.length!=1)
243     field[snake.body[0].x][snake.body[0].y].conteins = "empty";
244     snake.body.shift();
245    score++;
246    nofoodno=false;
247   }
248   if (field[next.x][next.y].conteins == "nofood") {
249    snake.body.push({x:next.x, y:next.y});
250    snake.head = {x:next.x, y:next.y};
251    field[next.x][next.y].conteins = "snake";
252    field[snake.body[0].x][snake.body[0].y].conteins = "empty";
253    snake.body.shift();
254    score++;
255    nofood=false;
256   }
257   if (field[next.x][next.y].conteins == "empty") {
258    snake.body.push({x:next.x, y:next.y});
259    snake.head = {x:next.x, y:next.y};
260    field[next.x][next.y].conteins = "snake";
261    field[snake.body[0].x][snake.body[0].y].conteins = "empty";
262    snake.body.shift();
263   }
264   } catch (err){
265    console.error("Что то пошло не так; X=", next.x, "Y=", next.y);
266    clearInterval(intervalID);
267   }
268   if (((score+1) % 5 == 0)&&(!nofood)){
269    CreateItem ('nofood');
270    nofood=true;
271   }
272   if (((score+1) % 8 == 0)&&(!nofoodno)){
273    CreateItem ('nofoodno');
274    nofoodno=true;
275   }
276  }
277  function control (){
278   if (!pause)
279    Calcul ();
280   if (!pause)
281    Draw();
282   CheckLength();
283  }
284  Init();
285  Draw ();
286  intervalID = setInterval(control, ms);
287 }