1. Start a snake project of your own.
2. Post it in works in progress.
Here's my snake-game. I didn't post it in WIP because i probably won't do anything else with it.
I use a grid (2D array) to note where the snake is located on the field and in this grid i write a number (from 0 to 3) to represent the direction the snake went through this particular location on the grid. Then i have a head and a tail object. The head (controlled by the player) writes to the grid as it moves along, while the tail (controlled by the content of the grid) clears the grid while it moves along. When the head finds the food, i set the tail to pause for a little while (making the snake longer).
I did get to thinking that placing the food would take a long time when the snake got very long, but it turns out that lets say the snake is so long that it fills 3/4ths of the game-field, then on average it would take 4 attempts to randomly find a square not occupied by the snake. This means randomizing the food 4 times every time it is eaten. That's not so bad.
About your moving smoothly… It is not so do-able with the snake-body in blocks as it is because in turns the blocks will overlap a little. I don't think it will look so good. If you really want to do it, there are two ways:
1) In my game, i have 100ms between loops. So the snake moves at a speed of 1square pr. 100ms. To make it move smoothly one could calculate how much time has passed between movements, i.e.:
timeThisFrame = ( TotalTimePassed mod snakeSpeed ) / snakeSpeed
or for my game:
timeThisFrame = ( TotalTimePassed mod 100 ) / 100
This will give a number between 0 and 1 representing how far along the snake is to reaching the next square. You use this value to render the snake, not exactly on the square, but timeThisFrame in percent between the current square and the snake's target square. I hope this is understandable.
2) Another way of doing a smooth moving snake is just dividing the time into smaller slices and then logically consider one snake-move as x-loopins and only allow the snake to turn on these x sized intervals.