Symulator starć z OGame

0

Witam szanownych forumowiczów!

Właśnie próbuję skombinować sobie własny (wiem, że są dostępne na Necie) symulator walk w przeglądarkowaj grze www "OGame".

Co prawda nie jestem jeszcze za daleko... ;)

Robie to oczywiście w Pascal'u, środowisku FP.

Mam jednak pewien problem:
Chodzi raczej (przynajmniej m.in.) o ten fragment kodu:

"read(a[k]); -- linia 320
read(C);
writeln('OKOKO');
delay(984);
read(o[k]);
r:=readkey;" --linia 325

Program nie reaguje na te dwie komendy pobrania elementów tablic (linie 320 i 324). :-( Głupio, bo z kolei nie ignoruje czytanie klawisza i pobierania stirng'a. Wiem, że problem występuje w tym momencie, bo w czasie działenia wypisuje mi jeszcze owo "OKOKO" ;)

No i kiszka, bo nie wiem, dlaczego tak się dzieje. :-(
Proszę Was o pomoc.

P.S. Nieznajomość zasad gry raczej nie powinna Wam przeszkadzać w zrosumieniu kodu, uważam - na razie program powinien pobierać jedynie max 50 danych - nic więcej.

0

A zapomniałem dodać: ;)
Pełen kod programu jest na: http://odsiebie.com/pokaz/4000665---8222.html

Gdyby ktoś preferował inną formę jego udostępnienia - czekam na propozycje.

0

to masz ok wpisz sobie writeln(a[k], C); zamiast writeln('OKOKO');. Chciałem odpalić Twój kod, ale człowieku zlituj się, wiesz co to są procedury? i takie drugie pytanie może głupie ale ile razy wykona się ta pętla?:

for l:=(-1) downto 1 do begin

Kod wygodnie umieścić:
http://pastebin.4programmers.net/

0

A "Procedury"...? ;)
Tja, wiem, człowieku, o co chodzi. ;)
Rzeczywiście.
Jakoś ich sobie specjalnie nie wdrożyłem. ;)
Ale masz rację, jak coś jest czytelne dla mnie nie musi być dla innych.
Zamierzam coś z tym zrobić, a na razie umiećiłem kod tam, gdzie zaproponowałeś.

A co do pytania: nigdy jeszcze tego nie próbowałem, ale gdybym miał w ciemno obstawiać, to ani razu. :)

0

A no i może jeszcze link.
Nowa lokacja kodu to: http://pastebin.4programmers.net/284.

0

Dobra, zrozumiałem juz aluzję; tam miało być "(k-1)". ;)
Nowa wersja kodu z uwzględnieniem tego i przy okazji wklepaniem kilku już procedur (w tym i z obiektami :-) ) znajduje się na
http://pastebin.4programmers.net/287 .
Nawet fajnie się je stosowało no i cały kod wygląda raczej zgrabniej. ;) Dzieki za tą Twoja sugestię.
Zabawna sprawa: teraz owy, chyba trefny kawałek kodu jest w wersach 359-364. :-)
Ciekawe, czy chodzi o to, że procedury zwiększają ilość początkowego kodu, czy może ja źle je zastosowałem?

Jutro może jeszcze dołożę kilka procedur - dzisiaj już jestem trochę zmęczony. Z góry przepraszam za wszelkie głupie bugi (jak ten "for (-1) downto 1 do"). Wczoraj robiłem dość kompleskowe zmiany w tym kodzie i widać nie do końca go przejrzałem; dzisiaj może byc podobnie, bo nie miałem na to wiele czasu.

Jednak problem wciąż nierozwiązany. :-(

0

Dziwi mnie pomysl robienia tego w pascalu i wpisywania wszystkiego recznie. Osobiscie uwazam ze nowe rzeczy powinny byc lepsze od poprzednich a nie wrecz przeciwnie tak jak niektore porgramy sciagamy nowa wersje i sie cos sypie bo jest gorsza od poprzedniej. Ja osobiscie ostatnio napisalem fajnego boota dla wlasnej satysfakcji jest strasznie okrojony i raczej nie uzyteczny na wieksza skale ale jak bede mial ochote i czas to moge nad nim popracowac a co za tym idzie zrobic go duzo fajniejszym sprzymierzeńcem gracza.

0

No ja też to robię właśnie dla mojej satysfakcji. :) Zanim zacząłem pracę, domyślałem się, że w Delfi było by znacznie prościej, ale ono mnie jakoś nie pociąga - wolałem poćwiczyć Pascal'a, a akórat taki program wydał mi się ciekawy i fajny. :)

A no i nie chodzi mi o to, czy te komendy ("readln(a[k])") są poprawne, bo wiem, że są. sprawa jest taka: dlaczego program na nie nie reaguje? :(

0
Marian23 napisał(a)

No ja też to robię właśnie dla mojej satysfakcji. :) Zanim zacząłem pracę, domyślałem się, że w Delfi było by znacznie prościej, ale ono mnie jakoś nie pociąga - wolałem poćwiczyć Pascal'a, a akórat taki program wydał mi się ciekawy i fajny. :)

A no i nie chodzi mi o to, czy te komendy ("readln(a[k])") są poprawne, bo wiem, że są. sprawa jest taka: dlaczego program na nie nie reaguje? :(

Co znaczy nie reaguje? Przecież wartości w tablicy są poprawne, sorry ale dalej nie mogę sie połapać w Twoim kodzie. Zaletą pisania proceduralnego jest możliwość testowania samej procedury. Można ją sobie np samą wywołać, a w Twoim programie trzeba przejść 100 kroków żeby dojść do miejsca które Cie interesuje:/ Ja mimo wszystko polecam jakieś środowisko choćby turbo delphi 2005, jest za free i ma dobry przejrzysty debug-er.

0

No ja też nie wiem. :(
Po prostu dochodzi do właściwego momentu (wiem, bo oznaczyłem go przez wypisanie komunikatu "!!!!!UWAMGA - Tutaj program moim zdaniem "powinien" działać inaczej!!!!!!!!!!!") i nie oczekuje na rekord, wpisanie, klawiatury, mimo "readln(a[k]);". Może niedługo przerobię jeszcze kod na większą liczbę procedur.

0

Mam rozumieć że program przeskakuje te komendy i wykonuje sie dalej. Turbo burbo miał trochę błędów spróbuj wstawić tam inną zmienną, którą zadeklaruj na początku programu i daj znać co się dzieje.

0

No, dobrze rozumiałeś. :)
Ale całe szczęście zaułważyłem, że jak powtarzam w kodzie instrukcję 2 razy, to (mimo że 1 ignoruje - ciągle) drugą już wykonuje. A że nic specjalnie złego nie powinno się dziać przez (ewentualne - jeśli program by tak to "rozumiał") dwukrotne wgranie z keybord'a tej samej zmiennej, to takie rozwiązanie oczywiście jestem w stanie zaakceptować. Swoją drogą, to mi to też wygląda teraz na jakiś błąd kompilatora - wcześniej nie ważyłem się na takie osądzanie, bo jeszcze mało doświadczony w tym jestem...
A no i jeśli o kompilator chodzi to nie używam Turbo, tylko Free Pascal'a - jak pisałem wyżej.

No i temat uważam za nadający sie do zamknięcia.

Dziąki za zaangażowanie.

:)

0
Marian23 napisał(a)

No, dobrze rozumiałeś. :)
Ale całe szczęście zaułważyłem, że jak powtarzam w kodzie instrukcję 2 razy, to (mimo że 1 ignoruje - ciągle) drugą już wykonuje. A że nic specjalnie złego nie powinno się dziać przez (ewentualne - jeśli program by tak to "rozumiał") dwukrotne wgranie z keybord'a tej samej zmiennej, to takie rozwiązanie oczywiście jestem w stanie zaakceptować. Swoją drogą, to mi to też wygląda teraz na jakiś błąd kompilatora - wcześniej nie ważyłem się na takie osądzanie, bo jeszcze mało doświadczony w tym jestem...
A no i jeśli o kompilator chodzi to nie używam Turbo, tylko Free Pascal'a - jak pisałem wyżej.

No i temat uważam za nadający sie do zamknięcia.

Dziąki za zaangażowanie.

:)

To nie jest błąd kompilatora. To niestaty Twój błąd, dowód, sprawdz ile razy program zapyta Cie o podanie tekstu w takim wypadku:

var
  a,b,c,d : string;

begin
  read(a);
  read(b);
  readln(c);
  readln(d);
end.

a ile razy w takim:

var
  a,b,c,d : string;

begin
  readln(a);
  readln(b);
  readln(c);
  readln(d);
end.

Poczytaj czym różni sie funkcja się read do readln.

0

Ja nie muszę czytać :)
Read - odczytanie w bierzącej linii
ReadLn - przeskok do lini niżej :)

Hmm czyli prosty błąd a ja go nie zauważyłem hmm niedobrze.

0

Jestem jeszcze raz....

Eee, sprawdziłem Twoje kody, CYMES, i w pierwszym wypadku oczekuje 2 razy, a w drugim 4, ale tego pewnie się i tak spodziewałeś. Dadaję jeszcze, że w tym pierwszym czyta zmienną a i c - pierwszą z "read" i pierwszą z "readln", przynajmniej u mnie. Kłopot w tym, że nie wiem dlaczego. :(

Co do poczytania, to znalasłem tylko coą takiego:
<<Mała uwaga dla początkujących programistów: nie używajcie instrukcji read do ładowania informacji z klawiatury. Prowadzi to do nieoczekiwanych błędów. Lepiej używać instrukcji readln.>> (http://pl.wikibooks.org/wiki/Object_Pascal/Instrukcje_wej%C5%9Bcia_i_wyj%C5%9Bcia), ale nie uważam, że o to właśnie chodzi.

Mógłbyś mi to jakoś wytłumaczyć? Albo ktokolwiek, kto to rozumie?

0

Pomyliłem się - nie a i c, tylko a i d - pierwszą z "read" i drugą z "readln".

0

ja juz napisalem co o tym sądzę sam dawno temu bawiłem sie chyba jeszcze w QBasicu i wówczas przy pobieraniu danych w sytlu read(a,b,c) trzeba bylo podawac dane w sposob następujący: (np.) 1,5,1 jesli sie podalo np 1 to wynik uzyskany a=1 b=0 c=0 od tego czasu nie mialem do czynienia z konsolowka i bardzo sie ciesze chiciaz nie ma to jak gry tekstowe pisane w konsolowce dla konsolowki :)

0

Przed chwilą znów troche szukałem, próbujac znaleźć rozwiązanie tego problemu i nic konkretnego nie znalazłem.
Mam np. to, cytat z jakiegoś kursu: <<Procedura read używana jest głównie do czytania danych z plików (o których później), zaś jej użycie do wprowadzania danych z klawiatury może doprowadzić do niespodziewanych efektów, dlatego też na razie lepiej jej unikać.>>
A to link do jakiegoś forum, gdzie zamiana "read" na "reaadln" pomogła przy właśnie ignorancji instrucji, jesli dobrze zrozumiałem forumowicza, chyba też w IDE Fee Pascal:
http://forum.pcformat.pl/thread-127107.html

No ale problem u mnie nie występuje przy "read" ale właśnie "readln".
I tutaj link do forum, gdzie chyba było podobnie - tylko nie jestem pewien, czy tu problemem była ignorancja "read" czy "readln":
http://onanizm.pl/lofiversion/index.php?t3724.html
Tak czy tak znalazłem tutaj pewne wytłumaczenie ignorancji "realdn" bez argumentu, tuż przed read z argumentem. Oto one (cytat):

QUOTE(AKtor)

read(liczba);
readln;

read(liczba) odczyta z klawiatury to co wpisałeś, ale nie pobiera ENTER`a. Ale mimo wszystko musisz >nacisnąć ENTER, aby on zatwierdził, że to jest koniec pobierania tej liczby. Wtedy do drugiego readln >dociera ten zostawiony ENTER po poprzedniej komendzie i od razu wychodzi z tej procedury.
psr ma rację z zastosowaniem readln smile.gif

pozdrawiam

Tylko czy stosoawło by się ono też w stosunku do "readln" z argumentem, tuż przed writeln - jak u mnie - chyba nie, bo gby wstawiłem tam tuż przed coś innego, np. "clrscr" lub "write", nic nie pomogło. :(

Przy okazji zaułważyłem jeszcze coś innego - program nie reaguje na omawianą przeze mnie komendę tylko przy pierwszym przyjściu pętli ("for h:=1 to 22"). Pewnie ten związek determinuje uzależnienie argumentu, miejsca tablicy, "readln" od licznika przejść ("readln(a[h])").
Ale to nie wszystko. Postanowiłem go uniezaleznić i zamiast niego wstawiłem inną zmienną. I co mnie zadziwiło, przy typie integer program oczekiwał na wprwadzenie 2 razy, z przy string też 1 - pierwszą instrukcję zignorował.

Szczerze mówiąc, to aż korci mnie, żeby zapytać Cię, CYMES, czy nadal uważasz, że to mój błąd?

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