Zaczynając od samej rozgrywki: gra się bardzo przyjemnie, oprawa audiowizualna jest dobrze dobrana, całość tworzy naprawdę miłe wrażenie. Z punktu widzenia gracza byłoby chyba lepiej, gdyby waż na początku poruszał się trochę wolniej.
Z punktu widzenia kodu też jest dobrze (a nawet bardzo dobrze, patrząc na to co można znaleźć w projektach innych użytkowników). Najbardziej bolesne z punktu widzenia osoby, która próbuje zrozumieć kod, jest to, że nie używasz żadnego zbiornika na zasoby.
Powinieneś napisać klasę, której głównym zadaniem jest wczytywanie zasobów oraz dzielenie się nimi z innymi obiektami. Wtedy twój kod zyskałby bardzo mocno na czytelności, gdyż nie byłoby w nim elementów, które zarządzałyby obiektami klasy sf::Texture i sf::SoundBuffer.
Zauważ, że np. metoda Menu::createBackground() byłaby o połowę krótsza, gdyby przyjmowała gotowe do użycia tekstury.
Z drugiej strony zapomniałeś napisać malutkiego kawałka kodu dla obsługi zdarzenia sf::Event::Closed, przez co Twojej gry nie można wyłączyć klikając w krzyżyk znajdujący się w prawym górnym rogu.
W wielu miejscach korzystasz z "magicznych" liczb, które mi kompletnie nic nie mówią. Ustawiasz np. jakiś kolor i podajesz tylko jego wartości w formacie RGBA. Byłoby dużo lepiej, gdybyś zdefiniował swoje kolory wcześniej (np. w postaci zmiennych statycznych) nadając im określone nazwy, np. kolor łososiowy. Wtedy w kodzie odwołujesz się do koloru łosiowego, a nie 4 magicznych liczb, które mówią mi niewiele.
Poza tym proponuję, abyś spróbował rozbudować grę, dodając chociażby więcej możliwych stanów (poza menu i właściwą grą, np. tablica wyników), być może wtedy dostrzeżesz potrzebę przebudowania mechanizmów związanych z zarządzaniem tego typu stanami.
Podsumowując, jest dobrze, ale wciąż może być lepiej. Ważne, żebyś dalej poznawał język (zainteresuj się chociażby standardem 11 C++, jest tam wiele ciekawych rzeczy, które ułatwiają / przyspieszają pracę).