Решение на Втора задача от Мартин Христов

Обратно към всички решения

Към профила на Мартин Христов

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 20 успешни тест(а)
  • 0 неуспешни тест(а)

Код

def move(snake, direction)
snake = grow(snake, direction)
snake.shift()
snake
end
def grow(snake, direction)
snake = snake.clone
snake_head = (0..1).map{|index| snake.last()[index] + direction[index]}
snake.push(snake_head)
end
def new_food(food, snake, dimensions)
food_x = rand(0..(dimensions[:width] - 1))
food_y = rand(0..(dimensions[:height] - 1))
while ((snake.include? [food_x, food_y]) ||
(food.include? [food_x, food_y])) do
food_x = rand(0..(dimensions[:width] - 1))
food_y = rand(0..(dimensions[:height] - 1))
end
[food_x, food_y]
end
def obstacle_ahead?(snake, direction, dimensions)
next_position = move(snake, direction).last()
if (next_position[0] > (dimensions[:width] - 1) ||
next_position[1] > (dimensions[:height] - 1) ||
(snake.include? next_position)) then
true
else
false
end
end
def danger?(snake, direction, dimensions)
position_ahead_snake = move(snake, direction)
if (obstacle_ahead?(snake, direction, dimensions)) then
true
elsif (obstacle_ahead?(position_ahead_snake, direction, dimensions))
true
else
false
end
end

Лог от изпълнението

....................

Finished in 0.01452 seconds
20 examples, 0 failures

История (1 версия и 1 коментар)

Мартин обнови решението на 16.10.2015 17:15 (преди над 9 години)

+def move(snake, direction)
+ snake = grow(snake, direction)
+ snake.shift()
+ snake
+end
+
+def grow(snake, direction)
+ snake = snake.clone
+ snake_head = (0..1).map{|index| snake.last()[index] + direction[index]}
+ snake.push(snake_head)
+end
+
+def new_food(food, snake, dimensions)
+ food_x = rand(0..(dimensions[:width] - 1))
+ food_y = rand(0..(dimensions[:height] - 1))
+
+ while ((snake.include? [food_x, food_y]) ||
+ (food.include? [food_x, food_y])) do
+ food_x = rand(0..(dimensions[:width] - 1))
+ food_y = rand(0..(dimensions[:height] - 1))
+ end
+
+ [food_x, food_y]
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ next_position = move(snake, direction).last()
+ if (next_position[0] > (dimensions[:width] - 1) ||
+ next_position[1] > (dimensions[:height] - 1) ||
+ (snake.include? next_position)) then
+ true
+ else
+ false
+ end
+end
+
+def danger?(snake, direction, dimensions)
+ position_ahead_snake = move(snake, direction)
+ if (obstacle_ahead?(snake, direction, dimensions)) then
+ true
+ elsif (obstacle_ahead?(position_ahead_snake, direction, dimensions))
+ true
+ else
+ false
+ end
+end

Потърси как можеш да обикаляш паралелно два масива за втората функция.

Във втората функция може да спестиш доста въртележки на цикъл, ако ограничиш къде търсиш.

Конструкцията if се използва без then. Освен понякога за едноредови случаи.

Изпускаш случай в една от функциите.

Имаш често повторение на

if a
  true
else
  false

Усещаш ли, че нещо е много излишно при нея?

Добра работа иначе, но се опитай да оправиш тези неща.