Николай обнови решението на 14.10.2015 23:59 (преди над 9 години)
+def sum_arrays(array_a, array_b)
+ result_array = []
+ array_a.each_with_index do |element, index|
+ result_array[index] = element + array_b[index]
+ end
+ result_array
+end
+
+def move(snake, direction)
+ moved_snake = grow(snake, direction)
+ moved_snake.shift
+ moved_snake
+end
+
+def grow(snake, direction)
+ grown_snake = snake.clone
+ grown_snake << sum_arrays(grown_snake.last, direction)
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ next_position = sum_arrays(snake.last, direction)
+ wall_ahead?(next_position, dimensions) or snake.include?(next_position)
+end
+
+def wall_ahead?(next_position, dimensions)
+ next_position.all? { |x| x < 0 } or
+ next_position.first >= dimensions[:width] or
+ next_position.last >= dimensions[:height]
+end
+
+def danger?(snake, direction, dimensions)
+ obstacle_ahead?(snake, direction, dimensions) or
+ obstacle_ahead(grow(snake, direction), direction, dimensions)
+end
+
+def new_food(food, snake, dimensions)
+ invalid_points = food + snake
+ new_food_coordinates = [Random.rand(0...dimensions[:width]),
+ Random.rand(0...dimensions[:height])]
+ unless valid_food_position?(new_food_coordinates, invalid_points, dimensions)
+ new_food_coordinates = new_food(food, snake, dimensions)
+ end
+ new_food_coordinates
+end
+
+def valid_food_position?(new_food_coordinates, invalid_points, dimensions)
+ not invalid_points.include?(new_food_coordinates) and
+ point_on_field(new_food_coordinates, dimensions)
+end
+
+def point_on_field(point, dimensions)
+ point.all? { |x| x >= 0 } and point.first < dimensions[:width] and
+ point.last < dimensions[:height]
+end
Надявам се възможно най-скоро да имам възможността да рефакторирам части от кода. Също така изцяло ще пренапиша new_food
, но докато проверявах, дали skeptic ще измрънка за нещо подобно, забелязах че това минава и реших да го споделя с вас.
Всъщност ок решение, има няколко забележки поне:
sum_arrays
, може да ползваш по-елегантен метод от each_with_index
и пълнене на масив, ако искаш да ти описва n-мерен случай(макар че тук е достатъчно просто да събереш двата координата, понякога по-ясното решение е по-добро).
Това събиране на масиви го правиш в точно определен случай, за да получиш една и съща информация. Замисли се коя е тя и изнеси направо нея в helper.