Изтрит обнови решението на 14.10.2015 01:58 (преди над 9 години)
+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
. Виж тази тема от форума.