Андрея обнови решението на 19.10.2015 11:48 (преди над 9 години)
+def move(snake, direction)
+ grow(snake, direction).drop(1)
+end
+
+def grow(snake, direction)
+ new_snake = snake.dup
+ new_snake << next_element(snake.last, direction)
+end
+
+def next_element(head, direction)
+ [head[0] + direction[0], head[1] + direction[1]]
+end
+
+def new_food(food, snake, dimensions)
+ width_array = (0..(dimensions[:width] - 1)).to_a
+ height_array = (0..(dimensions[:height] - 1)).to_a
+ grid = width_array.product height_array
+ (grid - snake - food).sample
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ next_element = next_element(snake.last, direction)
+ x_hit = next_element[0] < 0 || next_element[0] >= dimensions[:width]
+ y_hit = next_element[1] < 0 || next_element[1] >= dimensions[:height]
+ is_wall_hit = x_hit || y_hit
+ is_wall_hit or snake.include? next_element
+end
+
+def danger?(snake, direction, dimensions)
+ # If we hit the wall in 2 moves, we will definitely hit it in 1, so...
+ obstacle_ahead?(grow(snake, direction), direction, dimensions)
+end