You could do it with a Tilemap still. Draw a head upwards and put that as image 3 and one pointing to the right as image 4. In the code, you would set the newhead tile to one of the types and flip it depending on direction with code something like this:
if self.dir.y > 0 or self.dir.y < 0 then
local flip_horizontally = (self.dir.y < 0)
tilemap.set_tile("#grid", "layer1", newhead.x, newhead.y, 3, flip_horizontally, false)
else
local flip_vertically = (self.dir.x < 0)
tilemap.set_tile("#grid", "layer1", newhead.x, newhead.y, 4, false, flip_vertically)
end
Something similar could be done with the last self.segment entry to get a tail.
And if you make three different body sizes, you would just switch out 2-index in the loop over self.segment and replace that with a dynamic number based on how many different sizes of body width you have.
I hope that helps you a bit on the way! Good luck