Мартин обнови решението на 17.10.2015 15:11 (преди над 9 години)
+def move(snake, direction)
+ new_snake = snake.drop(1)
+ grow(new_snake, direction)
+end
+
+def grow(snake, direction)
+ new_head = snake.last.dup
+ new_head.map!.with_index { |element, index| element + direction[index] }
+ snake + [new_head]
+end
+
+def new_food(food, snake, dimensions)
+ xs = (0..dimensions[:width] - 1).to_a
+ ys = (0..dimensions[:height] - 1).to_a
+ grid = xs.product(ys)
+ (grid - (food + snake)).sample
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ next_step = snake.last.dup
+ next_step.map!.with_index { |element, index| element + direction[index] }
+ if snake.include?(next_step)
+ true
+ elsif next_step[0] == dimensions[:width] or
+ next_step[1] == dimensions[:height]
+ true
+ else
+ false
+ end
+end
+
+def danger?(snake, direction, dimensions)
+ obstacle_ahead?(snake, direction, dimensions) or
+ obstacle_ahead?(move(snake, direction), direction, dimensions)
+end
Няколко забележки:
-
move
може да се опрости до:def move(snake, direction) grow(snake.drop(1), direction) end
(0..dimensions[:width] - 1)
<=>(0...dimensions[:width])
- Имаш повтаряща се логика в
move
иobstacle_ahead
(заnew_head
става въпрос). Добре е да бъде изкарана в отделна функция. -
Следното:
if snake.include?(next_step) true elsif next_step[0] == dimensions[:width] or next_step[1] == dimensions[:height] true else false end
се свежда до:
snake.include?(next_step) or next_step[0] == dimensions[:width] or next_step[1] == dimensions[:height]
ПП: Това не е пълната проверка, която трябва да направиш.
-
danger?
трябва да се подравни така:def danger?(snake, direction, dimensions) obstacle_ahead?(snake, direction, dimensions) or obstacle_ahead?(move(snake, direction), direction, dimensions) end