Изтрит обнови решението на 14.10.2015 01:58 (преди около 10 години)
+def move(snake, direction)
+  snake.drop(1) << ahead_of_snake(snake, direction, 1)
+end
+
+def grow(snake, direction)
+  snake.dup << ahead_of_snake(snake, direction, 1)
+end
+
+def new_food(food, snake, dimensions)
+  food_candidate = [rand(dimensions[:width]), rand(dimensions[:height])]
+  while food == food_candidate or snake.include? food_candidate
+    food_candidate = [rand(dimensions[:width]), rand(dimensions[:height])]
+  end
+
+  food_candidate
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+  obstacle_ahead_of_snake?(snake, direction, dimensions, 1)
+end
+
+def danger?(snake, direction, dimensions)
+  obstacle_ahead_of_snake?(snake, direction, dimensions, 2)
+end
+
+def ahead_of_snake(snake, direction, steps)
+  head_x, head_y = snake[-1]
+  dir_x, dir_y = direction
+  [head_x + dir_x * steps, head_y + dir_y * steps]
+end
+
+def obstacle_ahead_of_snake?(snake, direction, dimensions, steps)
+  ahead = ahead_of_snake(snake, direction, steps)
+  ahead_x, ahead_y = ahead
+
+  snake.include? ahead or
+    not ahead_x.between?(0, dimensions[:width] - 1) or
+    not ahead_y.between?(0, dimensions[:height] - 1)
+end
- В new_food,foodе масив от позиции като змята. Също не прави така цикъла можеш да използвашloop. Иначе ако искаш може да измислиш по-хитър начин да намираш случайното празно поле.
loop do
  n = rand(10)
  break if n = 3
end
- 
danger?и то не отговаря на условието, ако има нещо точно пред змията няма да го засече.
- В obstacle_ahead_of_snake?аз бих използвайл!вместоnot, а и в този случай||вместоor. Виж тази тема от форума.
