Well - to get the snake clamped to the tiles - I would suggest some good old fashioned bitshifting.
int Xi = (int)X;
Xi = (Xi >> 5) << 5;
And use Xi to render the sprite, rather than X.
What this does is first turn an X position of say 145.23 into an integer of 145. (if you're worried about proper rounding, do ((int)X+0.5f).
Then it takes the value 145 and divides it by 32. (shift the value right 5 times - use /32 instead if you don't know what it is and don't trust me.) You now end up with the value 4,53125 which will be rounded down to 4.
The next part of that line multiplies by 32 (shifts the value left 5 times - use *32 instead for the same reasons as above). You now end up with the value 128.
What all this does is make sure your snake will "jump" one tile at a time - while still maintaining float positioning internally.