Павел обнови решението на 16.10.2015 23:50 (преди над 9 години)
+def grow(snake, direction)
+ new_snake = snake.clone
+ new_snake << [new_snake[-1][0] + direction[0], new_snake[-1][1] + direction[1]]
+end
+
+def move(snake, direction)
+ new_snake = grow(snake, direction)
+ new_snake.delete_at(0)
+ new_snake
+end
+
+def new_food(food, snake, dimensions)
+ position = food[0].clone
+ width = dimensions[:width]
+ height = dimensions[:height]
+ while (food.include? position or snake.include? position) do
+ position = [rand(0...width), rand(0...height)]
+ end
+ position
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ position = snake[-1][0] + direction[0], snake[-1][1] + direction[1]
+ x = position[0]
+ y = position[1]
+ width = dimensions[:width]
+ height = dimensions[:height]
+ snake.include? position or x < 0 or x >= width or y < 0 or y >= height
+end
+
+def danger?(snake, direction, dimensions)
+ moved_snake = snake.clone
+ moved_snake.delete_at(0)
+ return true if obstacle_ahead? moved_snake, direction, dimensions
+
+ new_snake = move(snake, direction)
+ new_snake.delete_at(0)
+ return true if obstacle_ahead? new_snake, direction, dimensions
+ false
+end
Не оставяй табове в кода
Настрой си редактора да ти слага 2 space-a на всеки таб за Ruby code. Ако не предаваш правилно идентиран код, ще взимаме точки.
new_snake.delete_at(0)
<=> new_snake.shift
Друг вариант е директно да ползваш .drop(1)
moved_snake.delete_at(0)
Защо правиш това? Излишно е, и ако го изпуснеш, можеш да комбинираш condition-ите си в много по-кратко решение.
Защото края на опашката на змията не ме интересува в случая. В момента, в който змията се премести, тя вече няма да е там. Премахвам я от масива за да избегна false positives за колизии.