Методи обнови решението на 13.10.2015 22:35 (преди над 9 години)
+def game_board(dimensions)
+ game_board_list = (0...dimensions[:width]).to_a
+ game_board_list.product((0...dimensions[:height]).to_a)
+end
+
+def move(snake, direction)
+ grow(snake, direction)[1..(-1)]
+end
+
+def grow(snake, direction)
+ snake + [snake.last.zip(direction).map { |n| n.inject(:+) }]
+end
+
+def new_food(food, snake, dimensions)
+ (game_board(dimensions) - food - snake).first
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ next_move_snake = move(snake, direction)
+ inside_board = (next_move_snake - game_board(dimensions)).empty?
+ snake_bitten = next_move_snake[0..(-2)].member? next_move_snake.last
+ (not inside_board) or snake_bitten
+end
+
+def danger?(snake, direction, dimensions)
+ next_move_snake = move(snake, direction)
+ first_move_danger = obstacle_ahead?(snake, direction, dimensions)
+ second_move_danger = obstacle_ahead?(next_move_snake, direction, dimensions)
+ first_move_danger or second_move_danger
+end
-
[snake.last.zip(direction).map { |n| n.inject(:+) }]
. Yay. Искаше[x1 + x2, y1 + y2]
. Опрости го малко. - Това да вземеш цялата мръднала змия и от нея да махнеш всички квадратчета на дъската не ти ли изглежда малко наобратно? Можеше да имаш метод, който да ти връща следващото квадратче и да го използваш навсякъде.
- От описанието
game_board_list
не се разбира какво има вътре. Ако адресираш горната точка няма и да ти се налага да му мислиш адекватно име. - Поровичкай още из
Array
документацията. Със сигурност ще намериш методи за всичко без първия/всичко без последния/произволен елемент/etc. - Поради някаква причина в
grow
си индентирал с 3 space-a.
Като изключим горните, решението е доста кратко и чисто. Харесва ми.