Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Turbo Pascal] Obliczenia do gry.

soulhudson 27 Sty 2010 21:55 2074 15
  • #1 27 Sty 2010 21:55
    soulhudson
    Poziom 12  

    Mam jeszcze jeden problem z dużo większą aplikacją, jest to aplikacja do gry plemiona obliczająca czy wystarczy nam surowców na budowę danego budynku, zawiera informacje dotyczące każdego poziomu każdego budynku, kiedy dodawałem 10 z 16 budynków wyskoczył błąd:
    ERROR 124 Statement too large i dotyczył 1092 z 1100 linijki, która jest napisana poprawnie.

    Nie wiem czy nie uznacie tego za SPAM, ale wrzucam może cos wymyśliłem. Poczytałem o tym trochę w necie i znalazłem, że mój błąd polega na zbyt częstym użyciu jakiejś komendy. Czy ta się to jakoś uprościć?
    W aplikacji chodzi o to, że najpierw podajemy ilości surowców i godzinną produkcje oraz czas, następnie komputer oblicza le surowców będziemy mieli za podany czas. Teraz wybieramy jaki budynek chcemy, a następnie wybieramy który poziom (surowce nie rosną równomiernie!) i program oblicza ile surowców nam zostanie po budowie (jeżeli wynik będzie ujemny znaczy że zabraknie)

    Post podzieliłem. Przeniosłem kod do pliku. - arnoldziq

    0 15
  • #2 28 Sty 2010 09:14
    PanBo
    Poziom 16  

    Tak się nie pisze programów. Poczytaj o typach 'array' i 'record' w Pascalu. Zamiast robić miliony skoków umieść odejmowane wartości w tablicach (array). Na n-tym miejscu w każdej tablicy wartości odpowiadające n-temu levelowi.
    Będzie to bardziej czytelne i łatwiejsze w rozbudowie a error powinien zniknąć.

    0
  • #3 28 Sty 2010 11:24
    arnoldziq
    Moderator Programowanie

    Muszę się całkowicie zgodzić z kolegą PanBo.
    Instrukcja GoTo, którą tak chętnie wykorzystujesz, to przeżytek pozostały z pierwszych wersji języka Basic 8)
    Twój program czyta się jak kod asemblera, a nawet gorzej, bo mnemoniki asemblera coś znaczą, a twój kod to jeden wielki mętlik.
    Nie obraź się, ale ujmę to jednym słowem : koszmar.

    Ok 5 minut zajęło mi napisanie takiego oto kodu.
    Umieściłem w tablicy dane jednego budynku, czyli jego zapotrzebowanie na surowce na odpowiednim poziomie. Dane są kompletnie zmyślone, bo nie znam wspominanej gry, ale schemat programu, po zmianie wartości, można zastosować do dowolnej gry tego typu.
    Obliczenia są zawarte w jednej pętli! 95% programu to procedury pobierające i wyświetlające dane. Można by zastosować pętle do pobierania danych i wyświetlania wyniku, wtedy program byłby zawarty w 15-20 liniach! Ale to już twoje zadanie 8)

    Code:
    Program Obliczenia_do_gry;
    
    uses crt;
    const
      Max_poziom_budynku = 5;
      Ilosc_typow_surowcow = 3;
      Budynek_tab : array[1..Max_poziom_budynku,1..Ilosc_typow_surowcow] of longint =
      ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200));
    Var
     sur1_h,sur2_h,sur3_h,
     poziom_budynku,
     ilosc_minut            : integer;
     sur1_prod,sur2_prod,sur3_prod : real;
    begin
     Clrscr;
     Write('Podaj godzinna produkcje surowca nr1 : ');
     readln(sur1_h);
     Write('Podaj godzinna produkcje surowca nr2 : ');
     readln(sur2_h);
     Write('Podaj godzinna produkcje surowca nr3 : ');
     readln(sur3_h);
     Write('Podaj poziom budynku : ');
     readln(poziom_budynku);
     ilosc_minut:=0; sur1_prod:=0; sur2_prod:=0; sur3_prod:=0;
     repeat
      ilosc_minut:=ilosc_minut+1;
      sur1_prod:=sur1_prod+(sur1_h/60);
      sur2_prod:=sur2_prod+(sur2_h/60);
      sur3_prod:=sur3_prod+(sur3_h/60);
     until (sur1_prod >= Budynek_tab[Poziom_budynku,1]) and
           (sur2_prod >= Budynek_tab[Poziom_budynku,2]) and
           (sur3_prod >= Budynek_tab[Poziom_budynku,3]);

     Writeln('Poziom surowcow osiagniemy za ',ilosc_minut div 60,' godzin i ',ilosc_minut mod 60,' minut.');
     Writeln('Surowiec 1 : ',sur1_prod:10:2,' z wymaganych : ',Budynek_tab[Poziom_budynku,1]);
     Writeln('Surowiec 2 : ',sur2_prod:10:2,' z wymaganych : ',Budynek_tab[Poziom_budynku,2]);
     Writeln('Surowiec 3 : ',sur3_prod:10:2,' z wymaganych : ',Budynek_tab[Poziom_budynku,3]);
    end.

    0
  • #4 28 Sty 2010 16:11
    soulhudson
    Poziom 12  

    Wszystko cacy, ale nie rozumiem tego:

    Code:
     ilosc_minut:=0; sur1_prod:=0; sur2_prod:=0; sur3_prod:=0; 


    Dodano po 2 [minuty]:

    Ok, ale ja bym chciał umieścic tu 16 budynków po 30 poziomów, a zapotrzebowanie na surowce nie rośnie równomiernie, już sprawdzałem i nie jest od niczego zależne

    0
  • #5 28 Sty 2010 16:16
    arnoldziq
    Moderator Programowanie

    To tylko taki zapis; cztery zerowania w jednej linii, żeby na forum listing się nie rozciągał.
    Ponieważ w pętli masz :

    Code:
    zmienna := zmienna + x;
    To chcąc od zera startować, musisz zmienne wyzerować 8) (Kurde, wiersze zacznę chyba pisać.)
    Możesz tam zamiast zera dać np jakieś wartości startowe twoich surowców.
    Pokombinuj.
    Oczywiście wartość zliczanych minut, raczej sugeruję wyzerować, przed każdym obliczeniem.
    Jeżeli chcesz dać 16 budynków, to wartości dla poszczególnych poziomów musisz wprowadzić ręcznie do 16 tablic, albo lepiej zostaw je w pliku TXT, na zewnątrz programu. Łatwo je wtedy zmienić, a z tego co wiem, takie gierki lubią zmieniać ilość surowców dla poszczególnych budynków.

    --Edit--
    Masz tu poprzedni kod, zmodyfikowany na 16 budynków których dane są na stałe wprowadzone do programu.
    Code:
    Program Obliczenia_do_gry;
    
    uses crt;
    const
      Max_poziom_budynku = 5;
      Ilosc_typow_surowcow = 3;
      Ilosc_budynkow = 16;
      Tabela_budynkow : array[1..Ilosc_budynkow] of
                        array[1..Max_poziom_budynku,1..Ilosc_typow_surowcow] of longint =
      (
       ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200)),
       ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200)),
       ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200)),
       ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200)),
       ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200)),
       ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200)),
       ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200)),
       ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200)),
       ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200)),
       ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200)),
       ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200)),
       ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200)),




       ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200)),
       ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200)),
       ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200)),
       ((10,20,30),(24,40,50),(32,48,51),(40,80,130),(200,200,200))
      )
      ;
    Var
     sur1_h,sur2_h,sur3_h,
     poziom_budynku,
     numer_budynku,
     ilosc_minut            : integer;
     sur1_prod,sur2_prod,sur3_prod : real;
    begin
     Clrscr;
     Write('Podaj godzinna produkcje surowca nr1 : ');
     readln(sur1_h);
     Write('Podaj godzinna produkcje surowca nr2 : ');
     readln(sur2_h);
     Write('Podaj godzinna produkcje surowca nr3 : ');
     readln(sur3_h);
     Write('Podaj numer budynku : ');
     readln(numer_budynku);
     Write('Podaj poziom budynku : ');
     readln(poziom_budynku);

     ilosc_minut:=0; sur1_prod:=0; sur2_prod:=0; sur3_prod:=0;

     repeat
      ilosc_minut:=ilosc_minut+1;
      sur1_prod:=sur1_prod+(sur1_h/60);
      sur2_prod:=sur2_prod+(sur2_h/60);
      sur3_prod:=sur3_prod+(sur3_h/60);
     until (sur1_prod >= Tabela_budynkow[Numer_budynku][Poziom_budynku,1]) and
           (sur2_prod >= Tabela_budynkow[Numer_budynku][Poziom_budynku,2]) and
           (sur3_prod >= Tabela_budynkow[Numer_budynku][Poziom_budynku,3]);

     Writeln('Poziom surowcow osiagniemy za ',ilosc_minut div 60,' godzin i ',ilosc_minut mod 60,' minut.');
     Writeln('Surowiec 1 : ',sur1_prod:10:2,' z wymaganych : ',Tabela_budynkow[Numer_budynku][Poziom_budynku,1]);
     Writeln('Surowiec 2 : ',sur2_prod:10:2,' z wymaganych : ',Tabela_budynkow[Numer_budynku][Poziom_budynku,2]);
     Writeln('Surowiec 3 : ',sur3_prod:10:2,' z wymaganych : ',Tabela_budynkow[Numer_budynku][Poziom_budynku,3]);
    end.

    0
  • #6 28 Sty 2010 17:10
    soulhudson
    Poziom 12  

    Czyli tak:
    każda linijka to inny budynek
    każdy słupek to inny poziom
    pierwsze cyfry nawiasu to pierwszy surowiec, drugie drugi, a trzecie trzeci?

    Dodano po 57 [sekundy]:

    Jeszcze mógł byś mi wyjaśnić co oznacza ta część kodu...

    Code:
    const 
    
      Max_poziom_budynku = 5;
      Ilosc_typow_surowcow = 3;
      Ilosc_budynkow = 16;
      Tabela_budynkow : array[1..Ilosc_budynkow] of
                        array[1..Max_poziom_budynku,1..Ilosc_typow_surowcow] of longint =

    0
  • #7 28 Sty 2010 17:28
    arnoldziq
    Moderator Programowanie

    Tak, tak i tak :)

    const - oznacza że deklarujesz stałe.
    Max_poziom_budynku = 5; - Tu ustawieasz maksymalny poziom budynków.
    Ilosc_typow_surowcow = 3; - Tu ustawiasz ilość rodzajów surowców.
    Ilosc_budynkow = 16; - To jest chyba oczywiste. :)
    Tabela_budynkow : array[1..Ilosc_budynkow] of - tablica z (w tym przypadku) 16 elementów, tyle ile ma być budynków.
    array[1..Max_poziom_budynku,1..Ilosc_typow_surowcow] of longint - tablica dwuwymiarowa opisująca ilość poszczególnych surowców przypadających na konkretny poziom budynku. Wartości w tej tablicy to longint, bo zgaduję, że niektóre wartości przekroczą 32767, które może pomieścić zwykły integer.

    Zauważ, że w tym kodzie znajduje się coś co raczej rzadko można w Pascalu zobaczyć, a mianowicie tablica tablic.

    Życzę powodzenia w przeróbkach.

    0
  • #8 28 Sty 2010 17:29
    soulhudson
    Poziom 12  

    I jeszcze prosze o wyjaśnienie jak lokalizować komórki tablei żeby np. wyswietlić zapotrzebowanie na surowe dla piatego poziomu, trzeciego budynku

    0
  • #9 28 Sty 2010 17:40
    arnoldziq
    Moderator Programowanie

    soulhudson napisał:
    I jeszcze prosze o wyjaśnienie jak lokalizować komórki tablei żeby np. wyswietlić zapotrzebowanie na surowe dla piatego poziomu, trzeciego budynku

    Code:
    Tabela_budynkow[Numer_budynku][Poziom_budynku,Numer_Surowca]

    Co za tym idzie, dla trzeciego budynku, piątego poziomu, pierwszy surowiec :
    Code:
    Tabela_budynkow[3][5,1]
    drugi surowiec :
    Code:
    Tabela_budynkow[3][5,2]
    itd.

    0
  • #10 28 Sty 2010 21:56
    soulhudson
    Poziom 12  

    Rozumiem, i jeszcze ostatnie (mam taką nadzieję) pytanie
    czy moge zrobić tak:
    budynek1 - 30 poziomów
    budynek2 - 30 poziomów
    budynek3 - 15 poziomów
    budynek4 - 30 poziomów
    budynek5 - 1 poziomów
    itd.?

    Dodano po 2 [godziny] 11 [minuty]:

    Wszystko działa dobrze, jednak gdy napisałem całą tabele, i pierwszy budynek ma 30 poziomów wyskoczył mi błąd, że linia jest zadługa, wg. kodu jest dobrej długości.
    Co mam zrobić??
    Może podzielić budynek na dwie linijki po 15 poziomów??

    0
  • #11 28 Sty 2010 23:33
    arnoldziq
    Moderator Programowanie

    Co do pierwszego pytania, jeżeli masz budynki np maksymalnie 16-ty poziom i inny z maksymalnym poziomem 30, to jeżeli chcesz użyć tablic jak w zamieszczonym kodzie, tablica musi mieć 30 elementów. Dla mniejszego budynku wypełnij ją do końca wartościami najwyższego poziomu, lub zerami.
    Co do dzielenia tablicy, to nie bardzo rozumiem co masz na myśli. Zamieść to co napisałeś i zobaczymy w czym problem.

    0
  • #12 29 Sty 2010 16:04
    soulhudson
    Poziom 12  

    Problem wyglada tak:
    w wytłuszczonym miejscu wyskakuje błąd, że linia jest zbyt długa, wklejam fragment kodu
    Bład dotyczy tego konkretnie pierwszego ",":

    Code:
    (720,712,560),


    Code:
    USES CRT;
    
    CONST;
    maxlvl = 30;
    rodzajesurowcow = 3;
    budynki = 16;
    tabela : array[1..budynki] of
    array[1..maxlvl,1..rodzajesurowcow] of real =
    (
    ((90,80,70),(113,102,88),(143,130,111),(180,166,140),(227,211,176),(286,270,222),(360,344,280),(454,438,353),(572,559,445),(720,712,560),(908,908,706),(1144,1158,890),(1441,1476,1211),(1816,1882,1412),(2288,2400,1779),(2883,3060,2242),(3632,3902,2825),(4577,4975,3560),(5767,6343,4485),(7266,8087,5651),(9155,10311,7120),(11535,13146,8972),(14534,16762,11304),(18313,21371,14244),(23075,27248,17947),(29074,34741,22613),(36633,44295,28493),(46158,56476,35901),(58159,72007,45235),(73280,91809,56996)),

    0
  • #13 29 Sty 2010 16:30
    arnoldziq
    Moderator Programowanie

    Ok, już łapię.
    W IDE Turbo Pascal jest ograniczenie co do długości linii w programie.
    Gdy taki błąd wystąpi, to każdą komendę, grupę danych itd. możesz przenieść do następnej linii.
    Może to dziwne, ale możesz napisać np coś takiego:

    Code:
    x
    
    :=y;

    Co za tym idzie, możesz ten kod zapisać w ten sposób, grupując je np po 3 w rzędzie :
    Code:
    tabela : array[1..budynki] of
    
    array[1..maxlvl,1..rodzajesurowcow] of real =
    (
    ((90,80,70),  (113,102,88), (143,130,111),
    (180,166,140),(227,211,176),(286,270,222),
    (360,344,280),(454,438,353),(572,559,445),
    (720,712,560),(908,908,706),(1144,1158,890),
    (1441,1476,1211),(1816,1882,1412)
    itd.

    0
  • #14 29 Sty 2010 18:12
    soulhudson
    Poziom 12  

    No, to zmienia postac rzeczy

    0
  • #15 30 Sty 2010 15:32
    soulhudson
    Poziom 12  

    Wklejam kod, bo mam kilka problemów.
    wg. mnie i kompilatora niema błędów jednak:

    Code:
    write('Za ',czas:10:2);
    
    writeln(' godzin, bedziesz mial:');
    writeln(wyn1:10:2 ,' jednostek drewna');
    writeln(wyn2:10:2 ,' jednostek gliny');
    writeln(wyn3:10:2 ,' jednostek zelaza');

    aplikacja nie wyswietla dwóch pierwszych linijek tej częsci kodu, a także boliczenia nie działają poprawnie czyli
    obliczają się tylko wyn1, wyn2, wyn3, zb1, zb2 i zb3 reszta wyników wyświetla się bez zmian wzgledem zb1, zb2 i zb3

    0
  • #16 01 Lut 2010 11:52
    arnoldziq
    Moderator Programowanie

    Drogi kolego,
    wróżę koledze w przyszłości karierę doskonałego polityka.
    Na czy opieram swoją wróżbę? Na tym, że najprostszą rzecz potrafi kolega skomplikować w niewyobrażalnym stopniu.
    Za pomocą pięciu instrukcji LABEL, skomplikował kolega, dość prosty program do granic niemożliwości. Proszę o wybaczenie, ale nie mam siły, aby prześledzić gdzie te skoki się kończą a gdzie zaczynają.
    Kolejny, moim zdaniem, błąd :

    Code:
    writeln('h - huty zelaza');
    
    writeln('z - zagrody');
    writeln('sp - spichlerza');
    writeln('sh - schowka');
    writeln('m - muru');
    readln(budynek);
    IF budynek='rz' THEN bud:=1;
    IF budynek='kr' THEN bud:=2;
    IF budynek='st' THEN bud:=3;
    IF budynek='w' THEN bud:=4;
    IF budynek='pl' THEN bud:=5;
    IF budynek='pc' THEN bud:=7;
    Skoro chce kolega otrzymać w zmiennej bud jakąś wartość liczbową, to po co pobierać jakieś rz czy kr, skoro można tę wartość pobrać bezpośrednio z klawiatury?
    Code:
    writeln('12. - huty zelaza');
    
    writeln('13. - zagrody');
    writeln('14. - spichlerza');
    writeln('15. - schowka');
    writeln('16. - muru');
    repeat
      readln(bud);
    until (bud>0) and (bud<=16);

    Poza tym, wyżej wspomniany kod, znajduje się w programie trzy razy. Aż się prosi o zrobienie procedury, która będzie to 'menu' wyświetlać. Zmniejszyłoby to długość kodu o 40-50%.

    0
  Szukaj w 5mln produktów