From 05b7b7f2db4f811c5a30915286ceed2db904d004 Mon Sep 17 00:00:00 2001 From: Roman Shchekin Date: Mon, 4 Jul 2022 20:49:23 +0300 Subject: [PATCH] plugins: snake: simplification in direction calculation (#1361) Co-authored-by: hedger --- applications/snake_game/snake_game.c | 43 ++++------------------------ 1 file changed, 5 insertions(+), 38 deletions(-) diff --git a/applications/snake_game/snake_game.c b/applications/snake_game/snake_game.c index bb9e207de25..1a4bf812629 100644 --- a/applications/snake_game/snake_game.c +++ b/applications/snake_game/snake_game.c @@ -29,6 +29,8 @@ typedef enum { GameStateGameOver, } GameState; +// Note: do not change without purpose. Current values are used in smart +// orthogonality calculation in `snake_game_get_turn_snake`. typedef enum { DirectionUp, DirectionRight, @@ -195,44 +197,9 @@ static bool } static Direction snake_game_get_turn_snake(SnakeState const* const snake_state) { - switch(snake_state->currentMovement) { - case DirectionUp: - switch(snake_state->nextMovement) { - case DirectionRight: - return DirectionRight; - case DirectionLeft: - return DirectionLeft; - default: - return snake_state->currentMovement; - } - case DirectionRight: - switch(snake_state->nextMovement) { - case DirectionUp: - return DirectionUp; - case DirectionDown: - return DirectionDown; - default: - return snake_state->currentMovement; - } - case DirectionDown: - switch(snake_state->nextMovement) { - case DirectionRight: - return DirectionRight; - case DirectionLeft: - return DirectionLeft; - default: - return snake_state->currentMovement; - } - default: // case DirectionLeft: - switch(snake_state->nextMovement) { - case DirectionUp: - return DirectionUp; - case DirectionDown: - return DirectionDown; - default: - return snake_state->currentMovement; - } - } + // Sum of two `Direction` lies between 0 and 6, odd values indicate orthogonality. + bool is_orthogonal = (snake_state->currentMovement + snake_state->nextMovement) % 2 == 1; + return is_orthogonal ? snake_state->nextMovement : snake_state->currentMovement; } static Point snake_game_get_next_step(SnakeState const* const snake_state) {