Решение на Втора задача от Милена Дренска

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

Към профила на Милена Дренска

Резултати

  • 5 точки от тестове
  • 0 бонус точки
  • 5 точки общо
  • 18 успешни тест(а)
  • 2 неуспешни тест(а)

Код

def move(snake, direction)
snake = add_new_head(snake, direction)
snake.shift()
return snake
end
def grow(snake, direction)
add_new_head(snake, direction)
end
def new_food(food, snake, dimensions)
# available_positions = get_all_coordinates(dimensions) - food - snake
# new_food = available_positions.shuffle[0]
positions_taken = food.concat(snake)
new_position = get_random_position(dimensions)
while positions_taken.include? new_position
new_position = get_random_position(dimensions)
end
new_position
end
def obstacle_ahead?(snake, direction, dimensions)
next_position = get_next_position(snake, direction)
snake_reached = snake.include?(next_position)
x_wall_reached = !((0...dimensions[:width]).include? next_position[0])
y_wall_reached = !((0...dimensions[:height]).include? next_position[1])
snake_reached or x_wall_reached or y_wall_reached
end
def danger?(snake, direction, dimensions)
direction = direction.dup
next_direction = direction.dup[direction.index(direction.max)] += 1
in_danger = obstacle_ahead?(snake, direction, dimensions) \
or obstacle_ahead?(snake, next_direction, dimensions)
in_danger ? true : false
end
def get_next_position(snake, direction)
snake[-1].map.with_index { |x, i| x + direction[i] }
end
def get_random_position(dimensions)
random_x = Random.new.rand(0...dimensions[:width])
random_y = Random.new.rand(0...dimensions[:height])
random_position = [random_x, random_y]
end
def add_new_head(snake, direction)
snake = snake.dup()
new_head = get_next_position(snake, direction)
snake.push(new_head)
end

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

...........F.....F..

Failures:

  1) #new_food does not mutate the given arguments
     Failure/Error: expect { new_food(food, snake, dimensions) }.not_to change { food }
       result should not have changed, but did change from [[0, 0], [0, 2], [2, 0], [0, 1], [1, 1], [2, 1], [2, 2]] to [[0, 0], [0, 2], [2, 0], [0, 1], [1, 1], [2, 1], [2, 2], [0, 1], [1, 1], [2, 1], [2, 2]]
     # /tmp/d20151026-15631-15qgso5/spec.rb:74:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  2) #danger? returns true if obstacle in two turns
     Failure/Error: expect(danger?([[6, 6], [7, 6], [8, 6]], [1, 0], dimensions)).to eq true
       
       expected: true
            got: false
       
       (compared using ==)
     # /tmp/d20151026-15631-15qgso5/spec.rb:113:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.01967 seconds
20 examples, 2 failures

Failed examples:

rspec /tmp/d20151026-15631-15qgso5/spec.rb:72 # #new_food does not mutate the given arguments
rspec /tmp/d20151026-15631-15qgso5/spec.rb:112 # #danger? returns true if obstacle in two turns

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

Милена обнови решението на 19.10.2015 00:17 (преди над 9 години)

+def move(snake, direction)
+ snake = add_new_head(snake, direction)
+ snake.shift()
+ return snake
+end
+
+def grow(snake, direction)
+ add_new_head(snake, direction)
+end
+
+def new_food(food, snake, dimensions)
+ # available_positions = get_all_coordinates(dimensions) - food - snake
+ # new_food = available_positions.shuffle[0]
+ positions_taken = food.concat(snake)
+ new_position = get_random_position(dimensions)
+ while positions_taken.include? new_position
+ new_position = get_random_position(dimensions)
+ end
+
+ new_position
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ next_position = get_next_position(snake, direction)
+ snake_reached = snake.include?(next_position)
+ x_wall_reached = !((0...dimensions[:width]).include? next_position[0])
+ y_wall_reached = !((0...dimensions[:height]).include? next_position[1])
+
+ snake_reached or x_wall_reached or y_wall_reached
+end
+
+def danger?(snake, direction, dimensions)
+ direction = direction.dup
+ next_direction = direction.dup[direction.index(direction.max)] += 1
+ in_danger = obstacle_ahead?(snake, direction, dimensions) \
+ or obstacle_ahead?(snake, next_direction, dimensions)
+
+ in_danger ? true : false
+end
+
+def get_next_position(snake, direction)
+ snake[-1].map.with_index { |x, i| x + direction[i] }
+end
+
+def get_random_position(dimensions)
+ random_x = Random.new.rand(0...dimensions[:width])
+ random_y = Random.new.rand(0...dimensions[:height])
+ random_position = [random_x, random_y]
+end
+
+def add_new_head(snake, direction)
+ snake = snake.dup()
+ new_head = get_next_position(snake, direction)
+ snake.push(new_head)
+end