SnakeASCII, czyli kultowy "wąż" w specyficznej tekstowej formie

1

Z racji tej, że zarwałem kilka wcześniejszych nocek, co przyczyniło się do kompletnego rozregulowania mojego zegara biologicznego, ostatnią noc spędziłem przy komputerze; A że pora nie sprzyjała kończeniu pracy nad moim projektem formatu TreeStructInfo, postanowiłem przysiąść nad czymś przyjemnym, ale nie wymagającym wilekiego skupienia i główkowania;

Zawsze ciągło mnie do napisania kultowej gry Snake w trybie tekstowym, ale w nieco inny sposób, niż wyświetlanie węża zbudowanego ze znaków np. X; Miałem w końcu czas na zapisanie czegoś na kształ odwiecznych ciągotek;

Tak narodził się pomysł stworzenia symulatora gry Snake w trybie tekstowym, który miałby służyć do przetestowania algorytmów zarówno sterowania wężem, jak i jego wyświetlania na ekranie; Ale głównym założeniem było wyświetlanie węża, złożonego ze specjalnych znaków ASCII, służących do budowania rozmaitych ramek okien itd., tak aby wąż był wyświetlany jako jedna, łamana, podwójna linia, gdzie "zakrętami" węża były by znaki rogów ów ramek okien; Wąż także miałby być wyświetlany w różnych kolorach dla różnych jego modułów, a także umożliwiać zjadanie wyświetlanych na ekranie "kropek" (ja nazwałem je "złotem", choć to niezbyt trafne określenie);

I tak udało się stworzyć taki symulator, w całości zaimplementowany w Lazarusie; Nie jest to cudo algorytmiki - kod pisałem po prostu "na pałę", bez wcześniejszego zaprojektowania aplikacji; Nie jest to jednak jeden wielki WTF - zarówno wąż, jak i właściwa gra posiadają osobne klasy, udostępniające określone metody, potrzebne do prowadzenia symulacji; Całość pisałem z rozwagą i przemyśleniem, a kod jest zakomentowany, aby mniej więcej było wiadomo do czego służą dane jego elementy;

Jego przybliżona funkcjonalność:

  • sterowanie wężem za pomocą klawiszy strzałek,
  • resetowanie stanu symulacji, przez skrócenie długości węża do długości początkowej oraz jego ustawienie w domyślnych koordynatach,
  • możliwość przerwania symulacji i zamknięcia programu,
  • możliwość poruszania się po określonym obszarze planszy,
    *wykrywanie kolizji głowy węża z jego ciałem oraz barierkami planszy i blokowanie w takim przypadku ruchu,
  • wyświetlanie "złota" w randomowych miejscach planszy, z wykluczeniem pojawienia się złota poza planszą, na barierce planszy lub na ciele węża,
  • zjadanie "złota" i wydłużanie ciała węża,
  • malowanie węża w dwóch kolorach - głowa i czubek ogona na żółto, a ciało węża na zielono;
    Z głównych funkcji to chyba tyle, choć mogłem o czymś zapomnieć;

Klawiszologia:

klawisz funkcja opis
strzałka w górę MoveUp ruch węża w górę lub skręcenie w górę
Down MoveDown ruch węża w dół lub skręcenie w dół
Left MoveLeft ruch węża w lewo lub skręcenie w lewo
Right MoveRight ruch węża w prawo lub skręcenie w prawo
R Reset przywrócenie długości i pozycji węża do wartości domyślnych
E Exit zakończenie symulacji i wyjście z programu

W najbliższym czasie, jeśli tylko znów znajdę chwilę czasu, to z symulatora poruszania się węża zrobię pełną grę, z możliwością:

  • automatycznego poruszania się węża,
  • możliwość szybszego poruszania się w danym kierunku, przez przytrzymanie klawisza strzłaki,
  • obsługi różnych plansz, nie tylko pustych w środku, ale także "labiryntów",
  • zmianę koloru modułu węża, na którym znajdowało się zjedzone "złotko",
  • liczniki zjedzonych "złotek",
  • prowadzenie rankingu najlepszych wyników + możliwość podania nazwy gracza,
  • plansze wczytywane ze specjalnych plików (pewnie Ini, bo fajnie będzie je można tworzyć ręcznie),
  • różne inne funkcje, dzięki którym gra będzie ciekawa i jakoś może będzie przyciągać;
    Póki co uddaję do dyspozycji sam symulator, który posiada wcześniej opisaną funkcjonalność; Poniżej zrzut ekranu konsoli z uruchomioną symulacją:

snake_simulation.png

Pełne źródła symulatora oraz osobny plik wykonywalny oczywiście udostępniam, dlatego że nie ma sensu ukrywania go przed światem - raczej na nim nie zarobię; A nóż widelec komuś się przyda, lub zainspiruje do programowania; Źródła dołączone do posta w załączniku, w formie archiwum zip;

Zachęcam do przetestowania symulatora węża, a jeśli ma ktoś jakieś sugestie lub propozycje na przyszłość - walcie śmiało; Wszelka krytyka oczywiście także mile widziana; Miejcie jednak na uwadze fakt, iż to dopiero początek - żeby z symulatora zrobić ciekawą grę - jeszcze sporo pracy i modyfikacji istnijącego kodu.

2

Trochę offtop, ale:

Kto pamięta edytor tekstu TAG? (Bodajże polskie dzieło)
DOS-owy edytor tekstowy, z własnym formatem plików, bodajże siedmioma czcionkami - ale bardzo fajny edytorek.

Miał on tryb rysowania ramek w dokumencie. Polegało to na tym, że momentu uaktywnienia tej funkcji - w dokumencie rysowały się ramki w miejscu, gdzie podążyliśmy strzałkami. Gdy do jakiegoś punktu docieraliśmy drugi raz (albo we wszystkich kierunkach) to właśnie używało tych takich przecinających się znaków. Można było używać podwójnych i pojedynczych linii.

Zawsze mnie to fascynowało i smuciło, że żaden inny edytor tego nie miał.

U Ciebie @furious programming nie ma przecinania, ani dołączania trzech kierunków - szkoda :P

BTW: Strona kodowa 852 (jedyna słuszna dla polskich znaków pod DOS?) nie posiadała znaku , bo im brakło 255 znaków :P TAG chyba działał ponad ASCII, więc to śmigało (i chyba miał export do txt gdzie ten znaczek zmieniał się na ý)

0

Tak, TAG był polskim dziełem. Jeszcze był do tego MiniTAG, z tego co pamiętam, jakaś tańsza, uboższa wersja.

0

Nie znam edytora TAG, ale coś sobie poczytam :]

@dzek69 - uwierz mi, że nad przecinaniem także się zastanawiałem; Ba, nawet na początku tworzenia metody TSnake.CanMove nie było jeszcze zaimplementowanej metody TSnake.IsFreeModulePosition, stąd wąż elegancko przechodził "po sobie"; Dodanie rysowania odpowiedniego znaku krzyżyka w miejscu łączenia było by wtedy bardzo proste, ale w takim przypadku nie było by praktycznie możliwości zablokowania węża, stąd i wcześniejszego zakończenia gry; Gra musiałaby trwać aż do zajęcia przez węża wszystkich pól planszy, a to raczej nie o to chodzi;


No dobra, widzę że póki co Wam nie dogodziłem, więc będę musiał wprowadzić jeszcze sporo ficzerów :D

Co jakiś czas będę wrzucał nowe źródła jako małe commity, zawierające kolejne małe poprawki; W każdej bardzo wolnej chwili będę rozwijał Snakea, jako malutki projekt, nie wymagający wielkiego skupienia; Nie wiem kiedy uznam, że czas zokończyć nad nim pracę, ale na pewno nie nastąpi to prędko;

W takim razie pierwszy commit:

  • rysowanie na jasnozielono modułu węża, który znajduje się na pozycji wchłoniętego złota - nie dotyczy modułów głowy i ogonka węża;

Zrzut:

snake.png

Nie wiem jaka funkcja będzie następna, ale będzie ich jeszcze mnóstwo; A jeśli ktoś ma jakieś propozycje, to piszcie śmiało :]

1

Kolejny update - wprowadziłem sporo zmian, jednak nadal jest to symulator, jeszcze nie można pograć;

Nowości:

  • stworzenie klasy pojedynczej planszy, zawierająca podstawowe informacje;
  • możliwość ładowania planszy z pliku - obecnie z pliku Ini;
  • możliwość tworzenia plansz o dowolnych kształtach,
  • określenie w pliku planszy takich informacji, jak nazwa i poziom trudności, pozycja startowa i kierunek węża, mapa planszy jako macierz znaków (łatwa do modyfikacji czy tworzenia), sekcje "dziur", w których nie będą pojawiać się złotka;
  • rysowanie barierek plansz znakami pojedynczej linii;
  • możliwość tworzenia ozdobnych kępek trawy, poza powierzchnią roboczą planszy;
  • "animowane" rysowanie zawartości planszy;
  • poprawione sterowanie węża;
  • ustawienie ikonki aplikacji i informacji o wersji programu;
    I jeszcze kilka pomniejszych, mniej istotnych poprawek; Przykładowy zrzut aplikacji:

screen.png

Coraz więcej nowych rzeczy, ale do końca jeszcze daleko; Teraz przynajmniej można tworzyć ręcznie pliki plansz, nadając im dowolne kształty i upiększając kępkami trawy; Poprawne zapisanie współrzędnych "dziur" w pliku planszy uniemożliwia pojawienie się złotka w miejscu, do którego wąż nie dojdzie; Opis tworzenia pliku planszy zawarty jest w pliku levels\Levels Creating.txt;

Plansze póki co trzeba tworzyć ręcznie, ale na pewno dorobię edytorek, oczywiście w trybie tekstowym, aby dużo łatwiej i szybciej móc tworzyć nowe plansze; Na razie to początki, jak tylko skończę funkcjonalność węża oraz plansz, to zrobię w końcu automatyczne poruszanie się wężem (czyli normalną pętlę obsługującą FPSy), tak że będzie można już coś pograć

Jeśli chodzi o sterowanie wężem - planuję wprowadzić tryb turbo, dzięki któremu proste odcinki będzie można pokonać dużo szybciej;

Następny update wkrótce, a w załącznikach źródło projektu oraz sam plik wykonywalny.

0

uuu , a u mnie:

An unhandled exception occurred at $00419ABE :
EAccessViolation : Access violation
  $00419ABE  READLEVELINFO,  line 255 of Level.pp
  $0041943C  TLEVEL__LOADFROMFILE,  line 331 of Level.pp
  $00419142  TLEVEL__CREATE,  line 175 of Level.pp
  $0040F382  TGAME__CREATE,  line 63 of Game.pp
  $0040166A  main,  line 14 of SnakeASCII.lpr
0

@szalonyfacet - zobacz do pliku levels\0.lvl (otwórz notatnikiem, to zwykły Ini) jak wygląda sekcja INFO; Powinna wyglądać tak:

[INFO]
Name=Space   ; tutaj nie ma znaczenia
Difficulty=A ; możliwa literka od A do D

Rozumiem, że u Ciebie wywala się na linii:

FDifficulty := LetterToLevelDiff(strDifficulty[1]);

U mnie wszystko gra - "konwersja" jest poprawna; Żeby coś móc poradzić, potrzebowałbym więcej informacji.

1

hmm dziwnie prawisz o jakims pliku w folderze, jak ja mam tylko exeka bez folderow i dodatkowych plikow. Poobralem plik z zalacznika SnakeASCII_Exe.zip, otworzylem i odpalilem w konsoli.

I ten blad wyrzuca mi w konsoli.

Notabene nie tylko u mnie na kompie.

0

Ha, @szalonyfacet - racja, przecież do archiwum z plikiem wykonywalnym nie dołączyłem katalogu z levelami... :D

Oczywiście exe nie ma prawa działać poprawnie, bo brakuje mu pliku levels\0.lvl; Już poprawiam - dołączę ten katalog do archiwum w poprzednim poście;


@dzek69 - dzięki za czujność; A tak poza tym, wcześniej wspomniałeś o edytorze TAG, który pozwalał na rysowanie tabel w dokumentach; Nie używałem tego edytora, więc nie sprawdzę jak tę funkcję się używało, w każdym razie w edytorze poziomów na pewno zaimplementuję taką funkcję - do rysowania barierek poziomów, kępek trawy oraz regionów "dziur", w których nie będą się pojawiać kropki do zbierania;

Dzięki Panowie za informacje - mały fail nigdy nie zaszkodzi :]

1

A gdzie generator losowych mapek? ;>

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