Snake - Wasze opinie i uwagi

0

Witam,

Jest to moja druga gierka napisana w c# w konsoli (poprzednia to kółko i krzyżyk, również wstawiałem ją tutaj na forum i udzielaliście mi WIELU przydatnych informacji, także postanowiłem pokazać Wam i ten projekcik).

Gra na razie nie ma żadnego menu, tylko od razu się uruchamia i poruszamy się klawiszami WSAD. Ale uważam, że jest grywalna, ponieważ wszystkie możliwe kolizje zostały sprawdzone (jeśli o czymś zapomniałem to proszę dajcie mi znać). Oczywiście pisząc ją starałem się pisać ją w pełni obiektowo. Miałem całkiem spory problem, by jakoś inaczej wybrnąć z kwestii wydłużania się węża przy zjedzeniu jabłuszka. Wiem, że rozwiązałem to w sposób bardzo prymitywny i niezgodny z zasadą programowania obiektowego, ale inaczej po prostu nie potrafiłem tego zrobić. W kodzie jest dość obszerny komentarz w tym miejscu z dokładniejszym wyjaśnieniem.

Chciałbym bardzo, abyście wytknęli mi wszelkie błędy i dali pomocne wskazówki, jeśli to tylko możliwe.

PS. i jeszcze jedno. Jak można obejść inaczej te czyszczenie ekrany, żeby tak wszystko nie migało?

W załączeniu przesyłam swój projekt (kod źródłowy + exe).

Pozdrawiam

2

Takie odświeżanie okna jest fatalnym pomysłem :/ w moim przypadku już po jakiś 15 sekundach gry czas pomiędzy naciśnięciem klawisza a reakcją trwało jakieś 2 sekundy. Konsola nie nadążała (albo za dużo razy naciskałem kierunek w którym idzie wąż, mając złudną nadzieję że trochę przyspieszy?) Poza tym jakieś okno z pomocą przed rozpoczęciem gry też by nie zaszkodziło, najpierw dwukrotnie próbowałem poruszyć się za pomocą strzałek, co kończyło się crashem całej aplikacji. Nie da się również uruchomić binarki z release ( patrz załącznik ). Wynik od razu znika, a jabłka zawsze pojawiają się w tych samych miejscach. Przynajmniej 3 pierwsze po uruchomieniu gry, dłużej nie udało mi się wyczekać.

A co do kodu.
Funkcja Move ma ponad 100 linijek, zdecydowanie nie mieści się na ekranie! :P
Zamiast przerysowywać całą mapę(tj. najpierw zerować, potem rysować) spróbuj inaczej, albo (gorsza opcja) do czyszczenia konsoli skorzystaj z wbudowanej funkcji. POWINNA taka być (sam nie znam, ale mało robiłem w C#), i POWINNA działać szybciej. A jeszcze lepiej, zmieniaj tylko te elementy co się rzeczywiście zmieniły, tj. jabłko i ogon snake'a.
Kolejnym krokiem, według mnie słusznym, ale może niech się ktoś mądrzejszy też wypowie, byłoby oddzielenie logiki od interfejsu. Np. to że zderzenie z wężem sprawdzasz poprzez porównanie znaków na mapie, może to sprawić problemy przy dalszej rozbudowie (może nie koniecznie w tym projekcie,ale jak będziesz planował dodać jakieś niekonsolowe UI, wtedy na pewno będziesz musiał to zmienić). Ale jak już wspomniałem nie wiem czy jest to w tym przypadku tak bardzo potrzebne...

1

Oraz jak wyżej StackOverFlow musiałem rozpakować wpierw :D

Narysuj mapę raz a położenie węża i wyskakujących rzeczy rysuj za pomocą Console.SetCursorPosittion...

Nie mogę grać za każdym razem gdy odpalam i spróbuję się ruszyć to koniec:
Snake1.png

0
nerf napisał(a):

Nie mogę grać za każdym razem gdy odpalam i spróbuję się ruszyć to koniec:

Pewnie dlatego że ruszasz strzałkami, a nie mam ustawionego zabezpieczenia, jeśli ktoś wciśnie inny klawisz niż WSAD ;/ Tak jak mówiłem, to jest projekt dopiero co tworzony także będę naprawiał błędy które mi piszecie na bieżąco.

nerf napisał(a):

Narysuj mapę raz a położenie węża i wyskakujących rzeczy rysuj za pomocą Console.SetCursorPosittion...

Okej dzisiaj wieczorkiem przysiądę do tego i zobaczę jak to działa. Dzięki.

Zellus napisał(a)

Poza tym jakieś okno z pomocą przed rozpoczęciem gry też by nie zaszkodziło, najpierw dwukrotnie próbowałem poruszyć się za pomocą strzałek, co kończyło się crashem całej aplikacji.

Tak jak pisałem, nie ma nawet menu, ale zamierzam zrobić oczywiście wraz z legendą i opisem jak grać itd. Może jakiś ranking top10 punktowy zapisujący do pliku, ale to w swoim czasie. Na razie chcę, aby sam snake działał poprawnie. Dzięki wielkie za szybką odpowiedź i postaram się zoptymalizować kod w tej metodzie Move, bo rzeczywiście jest ona za duża.

0

SNAKE ver. 1.1

  • ulepszone rysowanie mapy (brak odświeżania konsoli)
  • dodany dźwięk przy zjedzeniu jabłuszka oraz przy zginięciu
  • dodane menu gry

Jeszcze brakuje zabezpieczenia przed naciśnięciem innego klawisza podczas gry. Więc jeśli coś, grajcie WSAD :)

0

Zerknąłem na kod i na razie mam dwie uwagi:

  1. W .NET istnieje klasa Point, raczej nie potrzebujesz definiować własnej
  2. Masz klasę mapy, która ma pewne rozmiary, ale potem w sprawdzaniu kolizji ze ścianą z tego nie korzystasz. Nie ma z tym problemu dopóki nie będziesz chciał zmienić jej rozmiaru. W takim przypadku będziesz musiał przeglądać cały kod
0

Np. klasa InteractionUser - metoda Move ma milion linijek kodu, do tego jest metoda RemoveTail, która oczywiście powinna być w Snake.
Klasa Point jest 5 razy dłuższa niż powinna być. Od jakichś 6 lat można używać automatycznych właściwości: http://msdn.microsoft.com/en-us/library/bb384054.aspx

W programowaniu obiektowym nie chodzi o to, żeby mieć jak najwięcej klas, tylko o to, żeby te klasy miały sens. W tej grze klas jest milion, i na moje oko połowa z nich jest niepotrzebna, a 3/4 mają źle podzielone odpowiedzialności.
Klasy w wężu wersja 0.1:

  1. Snake - reprezentuje węża, jego współrzędne, ma metody do dodawania i skrócania długości węża, skręcania (czyli zmiany współrzędnych).
  2. Map - plansza do gry, ma swój rozmiar i to chyba wszystko.
  3. Apple - jabłko, ma swój rozmiar (no chyba, że jest stały) i współrzędne, ewentualnie liczbę punktów (jeśli nie jest stała).
  4. MapGenerator - dostaje Map, Snake i kolekcję Apple, i rysuje je na konsoli.
  5. UserInteraction - (średnio fajna nazwa, ale nie mam pomysłu na lepszą) czyta z klawiatury, a informację o tym, co odczytało przekazuje do Game. To Game zna zasady gry i wie, w którą stronę powinien skręcić wąż. I każe mu skręcić, ale to Snake ma metody TurnLeft/TurnRight. W końcu ma być obiektowo!
  6. Game - gra jako taka, składa się z Map oraz Snake, posiada generator losowych przedmiotów i potrafi stwierdzić, czy wąż wpadł na jabłko/ścianę/grabie, czy cokolwiek innego. Ma referencję także do MapGeneratora i UserInteraction.
  7. Program - punkt startu aplikacji konsolowej z menu i obsługą klawiatury.
0

i może wrzucić kod na github?

1 użytkowników online, w tym zalogowanych: 0, gości: 1