fix: correct tail collision logic in SnakeGame and Snake

This commit is contained in:
Heller
2026-06-17 19:04:32 +00:00
parent 0d9710965c
commit 7330880c96
2 changed files with 9 additions and 5 deletions

View File

@@ -55,8 +55,13 @@ public sealed class Snake
return newHead;
}
public bool Occupies(Position position) =>
_segments.Contains(position);
public bool Occupies(Position position, bool excludeTail = false)
{
if (excludeTail && _segments.Last is { } last && last.Value == position)
return false;
return _segments.Contains(position);
}
private static Position DirectionToOffset(Direction direction) =>
direction switch

View File

@@ -39,14 +39,13 @@ public sealed class SnakeGame
return GameTickResult.GameOver;
var newHead = Snake.PeekNextHead();
var ateFood = newHead == Food.Position;
if (!Board.IsWithinBounds(newHead) || Snake.Occupies(newHead))
if (!Board.IsWithinBounds(newHead) || Snake.Occupies(newHead, excludeTail: !ateFood))
{
IsGameOver = true;
return GameTickResult.GameOver;
}
var ateFood = newHead == Food.Position;
Snake.Move(grow: ateFood);
if (ateFood)