I might be wrong but I'd say - try to decouple your Tetris logic and SFML input/graphic code.
Have one class that does all the logic (falling blocks, walls, collisions, creating random new block from the list of tetrominos, game start/end, ect.) and has very nice and simple interface to send to it the input (left, right, up, down), make it go forward a frame/step, query the points count and how large the play field is and what each block is (what color, full or not, part of the falling block or part of already fallen one or wall, ect.).
Then your SFML code will become as simple as just querying that logic class a little to pass it the input or advance and receive game state and draw it, no game logic mixed in it.
That's what I did in my PacMan clone in old uni and I'd say it helped me finish that project (on time
).
It almost felt as if my logic code is a library and I'm just gluing it to SFML for input and display in the end.
The split is not super clear (makeWallsMap function) and the code is a mess, but I think it illustrates well what I mean:
https://github.com/FRex/Man/blob/master/src/GameState.cpphttps://github.com/FRex/Man/blob/master/src/PacEngine.hhttps://github.com/FRex/Man/blob/master/src/PacEngine.cpp