Gra pt. "Zjedz Owoca"

3

Chciałem przedstawić wam owoc mej dzisiejszej pracy (nie tylko mojej, ale i waszej, polegającej na odpowiadaniu na moje pytania). http://chomikuj.pl/DarkSlayerPL
Sterowanie to wsad i esc (do wyjścia z gry).

0

Hmmm.... No nie napiszę, że zaszalałeś, ale przynajmniej działa :>

Plusy:

  • działa...

Minusy:

  • staroświecka konsola,
  • tryb tekstowy,
  • brak ekranu powitalnego, menu i panelu jakichkolwiek konfiguracji (np. sterowania),
  • słabo dopracowana plansza (brak wykorzystania znaków specjalnych do budowania ramek, tabeli itd),
  • mała ilość informacji podczas grania,
  • owoc to nie owoc, zwykły ampersand,
  • odświeżanie całego ekranu po każdym ruchu (prawdopodobnie, bo kodu nima...),
  • najprawdopodobniej ta "gra" nie ma końca...,
  • itd., itp.;

Ogólnie pisząc - bida... Szkoda, że nie spróbowałeś czegoś więcej zaimplementować w tej grze; Także lipa - brak kodu = brak wskazówek odnośnie algorytmów;

Popracuj jeszcze i napisz coś konkretnego i ciekawszego, bo tym programem nie postawisz forum na głowie; Ale gratulacje, przynajmniej działa; Teraz bierz się do roboty i napisz coś mądrzejszego;

0

"- odświeżanie całego ekranu po każdym ruchu (prawdopodobnie, bo kodu nima...)," Z tym się męczyłem najdłużej. Około pół sekundy ekran się rysował po ruchu. Ekran powitalny jest, na sekundę pojawia się napis "Zjedz owoca By DarkSlayer". Na razie myślałem około pół godziny jak przerobić to na snake i chyba wymyśliłem, okaże się. Wspomnę że to moja pierwsza gra w pascalu. Chciałem sterowanie strzałkami zrobić ale trzeba było dwa readkeye dać.

0
DarkSlayer napisał(a)

"- odświeżanie całego ekranu po każdym ruchu (prawdopodobnie, bo kodu nima...)," Z tym się męczyłem najdłużej. Około pół sekundy ekran się rysował po ruchu.

Nic nie wytłumaczyłeś... Czyli odświeżasz cały ekran, czy zmieniłeś to...? Jeśli dobrze pomyślisz to zmiana położenia "zjadacza" nie będzie trwała ani 0,1 sek - zastanów się co trzeba zrobić;

DarkSlayer napisał(a)

Chciałem sterowanie strzałkami zrobić ale trzeba było dwa readkeye dać.

Nie trzeba - w Pascal'u strzałkom masz przypisane znaki liter:

  • do góry - H,
  • w dół - P,
  • w lewo - K,
  • w prawo - M,
    więc wystarczy jeden UpCase(ReadKey()) i instrukcja wyboru (lub zwykłe warunki); A wystarczyło zapytać Google...
0

@furious programming, moze i swiata tym nie podbije, ale jak na poczatek to wg. mnie calkiem niezle. Ja jestem ciekawy bardziej jak wyglada kod zrodlowy. Na poczatku dobrze jak ktos Ci da konstruktywna krytyke kodu, czyli: powie co przekombinowales :P

0
krwq napisał(a)

u mnie nie widac tego odswiezania, musisz miec niezly komputer :D

A u mnie tak, mam 10-letniego dziadziusia i programy mogę debugować oczami :>

krwq napisał(a)

@Furious Programming, moze i swiata tym nie podbije, ale jak na poczatek to wg. mnie calkiem niezle. Ja jestem ciekawy bardziej jak wyglada kod zrodlowy.

No coś tam bąknąłem wcześniej o kodzie, ale widać autor się chyba wstydzi pokazać zjedzony owoc swojego wysiłku;

krwq napisał(a)

Na poczatku dobrze jak ktos Ci da konstruktywna krytyke kodu, czyli: powie co przekombinowales :P

No tak, dlatego też chciałbym zobaczyć kod gry i udzielić ewentualnie jakichś wskazówek :)

0

Nie chciałem go dodać bo miałem zamiar coś do niego dodać, ale już jest razem z grą w pierwszym linku.

0

Nie uruchamiałem jeszcze samej gry, tylko spojrzałem na kod:

 kolejnaa:byte;
 kolejna:byte;
 szerbo:byte;
 wysbo:byte;
 czytaj:byte;
 losx:byte;
 losy:byte;

Niepotrzebnie dodajesz cały czas :byte, wymieniaj zmienne po przecinku (kolejnaa, kolejna [...]: byte).

  Repeat
  Begin

Niepotrzebne begin...end.

Rysowanie za każdym razem całej planszy nie jest świetnym pomysłem...

Zasada DRY w funkcji Ruch.

zjowoc:=zjowoc+1;

Zamiast tego lepiej jest pisać:

inc(zjowoc);

lub - jeżeli piszesz w Free Pascalu - :

zjowoc += 1;

Zamiast zmiennych cośtamX,cośtamY zrób sobie rekord.

If losx=szerbo then if losy=wysbo then ZjedzOwoc;

Z tego można zrobić jeden warunek.

Pisanie raz If a raz if wygląda wg.mnie nie najlepiej...

If czytaj=100

Robisz ord(ReadKey) i utrudniasz sobie życie.
Istnieje przecież typ char...

a:array[1..78,1..20]of string;

+5 do marnowania pamięci.
Nie wystarczy zamiast string użyć char?

No i zamiast pętli repeat możesz używać for...


Ogólnie - jak na początkującego, nie jest najgorzej ;)
0

Plansza nie rysuje się za każdym razem. Tylko za pierwszym razem. Potem jeżeli poruszy się "postacią" to jej byłe miejsce się zamazuje. A to jest praca dwu dniowej nauki, dwóch pytań tutaj i googlowania. Char czyli pojedyńczy znak? Mi łatwiej z repeat</code> to zrobić. "Niepotrzebne <code>begin...end</code>." tego nie rozumiem, ani tego " Zasada <code>DRY</code> w funkcji Ruch.". O <code>inc</code> słyszałem, ale nie wiedziałem jak użyć. Do odejmowania to dec? Co to rekord? Z tym <code>if</code> miałem największe problemy (między innymi zadałem dwa pytania na forum). <code>ord(ReadKey) zostało po innym programie, a kod jest taki ,ponieważ pierwsza wersja rysowała całą planszę od nowa(co ruch).

0

Zamiast:

Repeat
Begin
End;
Until (warunek);

Wystarczy zrobić:

Repeat
Until (warunek);

DRY - Don't Repeat Yourself.

 If czytaj=119 then If wysbo<>4 then
 Begin
  GotoXY(szerbo,wysbo);
  Writeln(' ');
  wysbo:=wysbo-1;
  ruchy:=ruchy+1;
  
 End;
 If czytaj=115 then If wysbo<>23 then
 Begin
  GotoXY(szerbo,wysbo);
  Writeln(' ');
  wysbo:=wysbo+1;
  ruchy:=ruchy+1;
 End;
 If czytaj=97 then If szerbo<>2 then
 Begin
  GotoXY(szerbo,wysbo);
  Writeln(' ');
  szerbo:=szerbo-1;
  ruchy:=ruchy+1;
 End;
 If czytaj=100 then If szerbo<>78 then
 Begin
  GotoXY(szerbo,wysbo);
  Writeln(' ');
  szerbo:=szerbo+1;
  ruchy:=ruchy+1;
 End;

Można by zamienić na:

 czytaj:=ord(Readkey);
 GotoXY(szerbo,wysbo);
 Writeln(' ');
  
 If czytaj=119 then If wysbo<>4 then
 Begin
  wysbo:=wysbo-1;
  ruchy:=ruchy+1;
 End;
 If czytaj=115 then If wysbo<>23 then
 Begin
  wysbo:=wysbo+1;
  ruchy:=ruchy+1;
 End;
 If czytaj=97 then If szerbo<>2 then
 Begin
  szerbo:=szerbo-1;
  ruchy:=ruchy+1;
 End;
 If czytaj=100 then If szerbo<>78 then
 Begin
  szerbo:=szerbo+1;
  ruchy:=ruchy+1;
 End;
 If czytaj=27 then halt

Mniej kodu, a i czytelniejsze.

Składnia inc (w przypadku dec to samo, tylko że odejmuje):

Inc(Zmienna); // Zmienna := Zmienna + 1
lub
Inc(Zmienna, Wartość); // Zmienna := Zmienna + Wartość

w przypadku wskaźników zmienia ich adres

Zamiast dwóch zmiennych:

Var PozycjaX, PozycjaY: Integer;

Można zrobić rekord:

Type TPozycja = Record
 X, Y: Integer;
End;

Var Pozycja: TPozycja;
(...)
Pozycja.X := cośtam;
Pozycja.Y := cośtam;

Jak poczytasz o rekordach, zrozumiesz ich działanie i zastosowanie.

0

A rozumiem, bo powtórzyłem 4 razy

 GotoXY(szerbo,wysbo);
 Writeln(' ');

Dałem nowszą wersję z Twoimi poradami z Twojego pierwszego postu (ord usunąłem, if są pojedyńcze itp itd.). A to to to rekordy. Czytałem o tym, ale nie wiedziałem że to to. Dodałem wersję bez zbędnych begin, end;, i wyeliminowałem te powtórzenia w procedurze ruchu.

0
 If czytaj=119 then If wysbo<>4 then

W tym waszym Delphi nie ma and, czy sam się powtarzasz i mówisz innym by nie nadkładali składni?

0

Następna wersja z rekordem. Jeżeli o mnie chodzi Monk to zapomniałem za pierwszym razem :P A jeżeli chodzi o Patryka to może pomyślał "Chcesz tak? To masz tak!", albo też zapomniał. "W tym waszym Delphi" ja piszę w Pascalu (kompilator Free Pascal).

0

Wyszła nowa wersja! Dodano menu główne i opcje. Po menu porusza się enterem i ws. Opcja wczytaj nie działa. Wyszła nowa wersja! Z trybem multiplayer.

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