My approach
The intelectual challange of coming up with how I'd be able to get the unique movement of Snake in such a short period of time was actually quite fun. My first iteration of Snake movement ended up having all parts of the snake move in the same directions at the same time. I realized instantly that I'd have to think a little outside the box for this one. Since when thinking about Snake, the movement almost cascades down the snake in a way. For example, if you are moving up and move to the right its almost as if the head of the snake drops a kind of "beacon" that tells future parts of the snake, that get to it's location, that they need to also move to the right.
That way of thinking is how I approached the issue. I essentially made a queue of "directions" inside my player object. This queue (which really was just an array) held info at each element for where the direction was changed, what direction was actually pressed and most importantly how many player cells the direction has affected. This way, each time the player went to move this queue got checked, and whichever player cell was at that location then that cell got its direction changed to the new direction and so on providing the cascade effect. Then when the number of effected player cells for that direction becomes equal to the number of cells in the player that direction can be deleted since it no longer needs to be used. The end result looks something like this:
As you can tell this sort of movement algorithm that I came up with on the fly provided the perfect solution to the issue that I was having. There are lots more details that are definitely worth checking out too! All the way from how the snake grows after eating food to how the actual tile objects themselves are handled with being player owned or not and each tile having its own independent direction which I actually mentioned briefly above.