PasjaGSM.pl
  Jesteś w: Forum > [GRA] Mine Sweeper - Saper


[GRA] Mine Sweeper - Saper

Forum.PasjaGSM.pl » ...:Sprzęt:... » Nokia » DCT-3 » [DCT3] Modyfikacje HW i SW » NokiX » Gotowe aplikacje » [GRA] Mine Sweeper - Saper
Przesunięty przez: bubek3
2006-02-02, 18:28
Poprzedni temat «» Następny temat
Autor Wiadomość
 
druidbartek 
Expert



Telefon: DCT-3
Operator: Era
Pomógł: 39 razy
Wiek: 30
Dołączył: 13 Wrz 2005
Posty: 1006
Skąd: Wrocław
Wysłany: 2006-01-09, 06:09   

nie nie to ja źle pokazałem co chciałem powiedzieć : )
Kod:

   game->hmat[game->y][game->x]=game->mcount;   // robi pole odkryte
   if(game->mcount==0)                          // wokolo same puste pola
   {
       // ...
   }


skoro game->mcount jest ciągle 0 ( bo przy pierwszym obliczeniu dla game->x i game->y było 0 więc warunek if(...) jest ciągle prawdziwy : ]

właśnie sprawdziłem i działa : ]
jeszcze drobne poprawki. wielkie dzięki - bez Twojej pomocy by się nie obeszło
^
 
     
AdSense


jaras 
Nowicjusz



Telefon: Nokia 5110
Operator: Plus
Pomógł: 2 razy
Wiek: 43
Dołączył: 09 Kwi 2005
Posty: 62
Skąd: "LAC: 41008" ;-)
Wysłany: 2006-01-09, 06:13   

druidbartek napisał/a:
nie nie to ja źle pokazałem co chciałem powiedzieć : )
Wiem, tylko akurat wysłałem posta dokładnie wtedy (zobacz na godziny wysłania), gdy Ty dopisałeś, że znalazłeś błąd. ;-)

No tak. Nie zmienia się stan odkrywanego pola, więc któreś tam kolejne wywołanie rekurencyjne może na to pole trafić i próbować je ponownie odsłonić... i tak dalej... :-)

Cieszę się, że to rozwiązałeś. :-)

A ja swojego nie mogę rozwiązać :-/. Ale to już jak się wyśpię. ;-)

Dobranoc.
_________________
Jarosław Krasuski (jaras)
^
 
 
 
druidbartek 
Expert



Telefon: DCT-3
Operator: Era
Pomógł: 39 razy
Wiek: 30
Dołączył: 13 Wrz 2005
Posty: 1006
Skąd: Wrocław
Wysłany: 2006-01-09, 06:52   

noooo : ] działa wszystko... co do tej pory zrobiłem. do zrobienia pozostało:
  • timer ( błee, jak się za to zabrać??? ),
  • licznik min ( bo mi się nie chciało od razu :D ),
  • kursor zmienić ( na razie to czarny kwadrat - XOR-owany, coś jak invert_lcd ),
  • jakieś dźwięki ( raczej proste, wiem jak),
  • Easter Egs :D - pomysły już mam - 12 cheatów. wielkie podziękowania dla jarasa
za pomysł ; )
ale na razie zbieram się na wykład z analizy, potem ćwiczenia z chemii i jak wrócę to będę myślał dalej : ]

[ Dodano: 09-01-2006, 11:51 ]
no już po zajęciach. mam czas do 14:30 ciekawe co zdążę do tego czasu zrobić <lol>

[ Dodano: 09-01-2006, 12:37 ]
a to jeszcze ciepły screenshot prosto z 5510 :D liczniki na razie sztuczne - na stałe tam coś dałem żeby nie było tak pusto : ]

może jeszcze jakąś beta wersję dzisiaj wypuszcze ale wolałbym poczekać aż będzie wersja finalna. jeszcze zobaczę. na razie idę robić dalej. chyba wkońcu się rozkręcam z tym stuffem :D

[ Dodano: 09-01-2006, 12:39 ]
oczywiście min będzie więcej - tak tylko sobie testowałem. może uda mi się zrobić kilka poziomów, np. 10/15/20/25/30 min

[ Dodano: 09-01-2006, 14:03 ]
dodałem już dźwięki, zmieniłem ten kursor. Działa już poprawnie opcja continue. jeszcze vibre a reszta to cięższa sprawa - znaczy cheaty zostawiam sobie na deser :D

Ostatnio zmieniony przez druidbartek 2006-03-28, 21:32, w całości zmieniany 2 razy  
^
 
     
jaras 
Nowicjusz



Telefon: Nokia 5110
Operator: Plus
Pomógł: 2 razy
Wiek: 43
Dołączył: 09 Kwi 2005
Posty: 62
Skąd: "LAC: 41008" ;-)
Wysłany: 2006-01-09, 18:46   

Witaj.

druidbartek napisał/a:
  • timer ( błee, jak się za to zabrać??? ),
  • licznik min ( bo mi się nie chciało od razu :D ),
  • kursor zmienić ( na razie to czarny kwadrat - XOR-owany, coś jak invert_lcd ),
  • jakieś dźwięki ( raczej proste, wiem jak),
  • Easter Egs :D - pomysły już mam - 12 cheatów.
  • Licznik czasu będziesz musiał zrobić na timer'ach. Zajrzyj tutaj, aby się co nieco dowiedzieć. Ja Ci w tym nie pomogę, bo jeszcze sam tego nie zakumałem. Na razie wiem tylko tyle, że tworzy się jakiś timer (ale nie chodzi o licznik czasu w grze, tylko o pewien mechanizm systemowy), który potem do naszej aplikacji po ustalonym czasie prześle komunikat. Wtedy reagując ne ten komunikat wykonujemy co trzeba, a następnie ponownie ustawiamy timer, żeby znów po ustalonym czasie otrzymać komunikat. I tak dalej.

  • Licznik min musi zmniejszać się o jeden przy każdym zaznaczeniu pól flagą. Oczywiście, kiedy gracz zdecyduje się zdjąć flagę z jakiegoś pola - licznik z powrotem trzeba zwiększyć o jeden. Grę jednak wygrywa się nie wtedy, gdy licznik osiągnie zero, lecz wtedy, gdy prawidłowo odkryje się wszystkie pola, pozostawiając prawidłowo zaznaczone flagami pozostałe pola z minami.

  • Kursor możesz zrobić, tak jak napisałeś: zaXORowany kwadrat, ale o wielkości 6×6 pikseli, tak, żeby negował dodatkowo piksele pierwszego górnego rzędu dolnego i pierwszej lewej kolumny prawego sąsiednioego pola. A kiedy będziesz obługiwał timer'y (np. do zrobienia licznika czasu), wtedy możesz wywoływać zdarzenie timer'a co pół sekundy i teraz: w co drugim zdarzeniu liczyć sekundy dla licznika, a w każdym zdarzeniu mrugać kursorem - "zapalać" go i "gasić" (trzeba będzie wtedy jednak zapamiętywać "stan mrugnięcia": czy kursor jest "zgaszony" czy też "zapalony").

  • Jak na razie, dokumentacja do SDK niewiele opisuje na temat dźwięków. W pliku nagłówkowym sfx.h ponadto znalazłem dwie funkcje: play_tone() i stop_tone(), ale nie zostały udokumentowane, nie ma też źródeł dla funkcji dźwiękowych. Dlatego radzę tych funkcji teraz nie używać, a najprostsze dźwięki, niestety, trzeba będzie chyba robić jako dzwonki (ringtones). Ale... musiałby się @ yak wypowiedzieć jeszcze.

  • Generalną zasadą robienia cheat'ów jest to, żeby każde naciśnięcie klawisza zapamiętywać gdzieś na boku i sprawdzać, czy zapamiętana do tej pory sekwencja klawiszy odpowiada jakiemuś schematowi lub kombinacji (oczywiście nigdzie tego nie sygnalizując). Dopiero, gdy zostanie znaleziona odpowiadająca kombinacja lub sekwencja - trzeba wykonać kod realizujący cheat.
druidbartek napisał/a:
a to jeszcze ciepły screenshot prosto z 5510 :D liczniki na razie sztuczne - na stałe tam coś dałem żeby nie było tak pusto : ]
Jeśli zrobisz takie małe cyferki, jak na tym screenshocie, to jak zrobisz "zero" i "osiem"? I jak je bedziesz od siebie rozróżniał? ;-)

Na polu minowym, to owszem - tak może być, ale w licznikach chyba trzeba bedzie poprawić te cyferki.

druidbartek napisał/a:
oczywiście min będzie więcej - tak tylko sobie testowałem. może uda mi się zrobić kilka poziomów, np. 10/15/20/25/30 min
To byłby dobry pomysł.

Oryginalny Saper ma poziom Początkujący: 9×9 pól i 10 min oraz Średniozaawansowany: 16×16 pól i 40 min. Wymieniam tylko te dwa, bo Twoja gra będzie na poziomie pomiędzy tymi dwoma. Zatem, skoro u Ciebie jest 14×9 pól, to jest tak, jakby na poziomie "w połowie" pomiędzy wymienionymi w oryginalnym Saperze.

Myślę więc, że optymalna ilość min powinna być również mniej więcej "w połowie", czyli 25. Zatem poziomy z 10 i 15 minami będą "łatwe", z 20 i 25 minami - "średnie" ("normalne"), a z 30 minami - "trudne". Bardzo dobry pomysł.

Możesz też przetestować "poziom trudności" Twojej gry na oryginalnym Saperze. Wybierz poziom gry Niestandardowy i podając parametry: wysokość: 9, szerokość: 14, miny: 25 (albo 30). Ja już to sprawdziłem i rzeczywiście gra z 30 minami jest dość trudna. :-)

druidbartek napisał/a:
dodałem już dźwięki, zmieniłem ten kursor. Działa już poprawnie opcja continue. jeszcze vibre a reszta to cięższa sprawa - znaczy cheaty zostawiam sobie na deser :D
Zatem, życzę powodzenia przy dalszej pracy. :-)

Pozdrawiam Cię serdecznie.
_________________
Jarosław Krasuski (jaras)
^
 
 
 
druidbartek 
Expert



Telefon: DCT-3
Operator: Era
Pomógł: 39 razy
Wiek: 30
Dołączył: 13 Wrz 2005
Posty: 1006
Skąd: Wrocław
Wysłany: 2006-01-09, 20:32   

witam serdecznie

dziękuję Ci za kolejne jak obszerne wyjaśnienia. W czasie gdy je pisałeś ja... spałem! tak, to ta nocka. Ale usnąłem testując sapera już w telefonie więc jest OK. Spodobała mi się część dźwięków z Breakera - więc muszę jeszcze spytć YAka czy nie będzie miał nic przeciwko "porzyczeniu kilku" ; )

Dźwięki będą następujące - już testowałem i jest ok :-)
  • przy rozpoczęciu nowej gry/kontynuacji (spodobał mi się z Breakera rozpoczynający level)
  • podczas wygranej (standardowy z flasha)
  • podczas przegranej (j.w.)
  • podczas ruchu kursora[również jak w Breakerze]
  • podczas zaznaczania/odznaczania flagi
  • oraz poczas odsłaniania pola

więc zanim zasnąłem zakończyłem pracę na takim etapie:
  • umiem już co nieco stosować timery - zastosowałem już 2 przy wygraniu i przegranej
  • działa poprawnie licznik min - oczywiście wszystko zgodne z Twoimi sugestiami ; )
  • kursor jest XORowany i ma 6x6px ; )
  • dźwięki teraz to bułka z masłem - jak zawsze pomocne źródłą skryptów Yaka
  • chceaty będą działać właśnie na tej zasadzie jak mówisz - napisałem źe zostawiam to sobie na deser bo to będzie najprzjemniejsza część pracy - nie mam z "sekwencjami" klawiszy problemów - stosowałem już to z powodzeniem w moim pierwszym większym skrypcie - Periodic Table. na razie dużo nie zdradzę ; )

co do zrobienia??
  • skoro timery już umiem więc licznik sekund
  • poprawić drobny błąd - jeśli nadęptnę na minę a gdzieś flaga była źle ustawiona to pojawić się powinien jakiś krzyżyk, prosty błąd
  • poziomy trudności - od razu wiąże się to z problemem najlepszego wyniku - trudno porównywać czas osiągnięty z 10 czy 30 minami ; )
  • pozostałe opcje wymieniane ( głównie przez Ciebie) a o których zapomniałem tutaj napisać - ale wszystkie mam już napisane, w zeszycie ale mam : ]

na razie to tyle

[ Dodano: 09-01-2006, 20:53 ]
zamieszczam przykładowe intro. mam nadzieję że się podoba bo się nad nim męczyłem chyba z 20 sekund :D na rziem nic lepszego do głowy mi nie przychodzi

[ Dodano: 09-01-2006, 21:01 ]
jaras, chciałem podziękować Ci za jeszcze jedno
jaras napisał/a:
Pomyśl więc dokładnie, co chcesz zrobić - i to zrób. ;-)

aż do dzisiejszego ranka nie szło mi to coś - a to co chwilę jakiś błąd a to coś tam znowu. aż zdałem sobie sprawę o co chodzi. więc postawiłem się na miejscu CPU i analizowałem pokolei cały kod - przez kilkadziesiąt minut z kartką czystego papieru i wydrukiem kodu zrobiłem więcej niż do tej pory co się męczyłem (i przy okazji Ciebie)
dziękuję raz jeszcze : )

[ Dodano: 09-01-2006, 21:16 ]
jaras napisał/a:
Jeśli zrobisz takie małe cyferki, jak na tym screenshocie, to jak zrobisz "zero" i "osiem"? I jak je bedziesz od siebie rozróżniał? ;-)

Na polu minowym, to owszem - tak może być, ale w licznikach chyba trzeba bedzie poprawić te cyferki.


oczywiście uwzględniłem to - ten screenshot to te cyferki na stałem na planszy były narysowane żeby tam pusto - normalnie cyfry liczników będą czytelne. 3x5 pikseli. Już je testowałem i są odpowiednie

Ostatnio zmieniony przez druidbartek 2006-03-28, 21:34, w całości zmieniany 2 razy  
^
 
     
jaras 
Nowicjusz



Telefon: Nokia 5110
Operator: Plus
Pomógł: 2 razy
Wiek: 43
Dołączył: 09 Kwi 2005
Posty: 62
Skąd: "LAC: 41008" ;-)
Wysłany: 2006-01-09, 21:20   

To jeszcze nie koniec moich obszernych wyjaśnień. ;-)

Każdy program, czym bliżej jest do jego ukończenia, trzeba coraz dokładniej "dostrajać" - podobnie jak układ elektroniczny lub telewizor w fabryce. Nasz (Twój ;-) Saper bedzie chyba wymagał tego samego. :-)

OK, pograłem sobie trochę w Windowsowego Sapera i mam jeszcze pewne uwagi co do niego. Ustawiłem sobie planszę 14×9 najpierw z 30 (bardzo trudna gra!), potem z 25 minami (też nie jest zbyt łatwo ;-).

Oto moje spostrzeżenia:
  • 199 sekund, to jednak jest trochę za mało. Bierzmy pod uwagę to, że w Windows gracz posługuje się myszą przesuwając kursor i klikając na pola, na komórce trzeba będzie używać klawiszy do przesuwania kursora i "klikania" pól - zatem jest tu trochę trudniej (i dłużej).

    Dlatego licznik czasu trzeba będzie jakoś jednak przerobić na w pełni trzycyfrowy (do 999). Zaproponuj lub wymyśl coś, bo szkoda by było dla jednej cyfry licznika zmniejszać pole gry do 13×9 - niech już by sobie było te 14×9.

  • Licznik min musi też uwzględniać liczby ujemne. Flag bowiem możesz sobie postawić na polach, ile tylko chcesz, a samych min jest przecież tylko kilkadziesiąt. Kiedy postawisz tyle flag, ile jest min (choć nieważne jest, gdzie postawisz flagi) - licznik zmniejszy się do zera, a kiedy postawisz kolejną flagę - licznik zmienia się na "-1", kolejną - na "-2" itd.

    Zatem licznik min też trzeba zrobić trzycyfrowy - to znaczy tak, aby wskazywał maksymalnie dwie cyfry oraz ewentualny znak minus przed nimi. To jedna sprawa.

    Kolejna sprawa jest taka, że do licznika min nie można już użyć typu bajt (unsigned char), bo jest to wartość liczby bez znaku (od 0 do 255).

    Jakiego typu użyć?

    Policzmy: plansza ma 14×9 pól, czyli razem 126. W kierunku dodatnich liczb potrzebujemy, żeby licznik pamiętał wartość aż do 30 (bo tyle min maksymalnie może być). Do jakiej wartości jednak musi pamiętać ewentualne ujemne liczby? Powiedzmy, że min jest tylko 10, a użytkownik poustawiał na wszystkich polach flagi. Wtedy licznik powinien pamiętać liczbę -116 (choć na ekranie może wskazywać np. "-99" albo dwie ostatnie cyfry liczby, albo też samą trzycyfrową liczbę bez znaku "-", żeby wystarczyło miejsca przeznaczonego na trzy cyfry licznika).

    Znamy więc zakres wartości dla naszego licznika (od -116 do 30), zatem jakiego typu dla niego użyjemy? Odpowiedź brzmi: signed char (typ bajtowy ze znakiem), który ma zakres od -128 do 127. Tej nazwy "ze znakiem" nie zrozum źle: nie chodzi o znak jako o znak ASCII (na co by mogła wskazywać nazwa char), tylko o znak liczby, czyli "+" albo "-". Możesz więc dla licznika zdefiniować sobie typ:
    Kod:
    typedef signed char bajtlicz;
    (nazwa bajtlicz oczywiście jest przykładowa, użyj dowolnej, ale takiej, żeby nie pomyliła Ci się z nazwą bajt albo z jakąś zmienną programu)

  • Pisałem już o tym wcześniej, że miny na polu gry nie są losowane zaraz po uruchomieniu gry, tylko po pierwszym odkryciu jakiegoś pola. Dzięki temu nigdy nie zdarzy się, że pierwsze kliknięcie trafi na minę. Byłaby to niemiła niespodzianka dla kogoś grającego pierwszy raz i nie do końca zorientowanego o co chodzi w grze.

    Licznik czasu również powinien ruszać dopiero po tym pierwszym "kliknięciu".

    OK, zajmijmy się tym losowaniem min po pierwszym ruchu gracza.

    Z powyższego wynika, że wywołanie funkcji losującej miny trzeba będzie przenieść tam, gdzie realizowane są czynności po "kliknięciu" jakiegoś pola (ale nie do wnętrza odkryj_pole()!!!). Trzeba będzie więc zrobić w programie jakąś zmienną (znacznik? pole bitowe? albo wartość logiczną?) która po uruchomieniu nowej gry zostanie ustawiona, powiedzmy, na TRUE (albo 1), a przy odkrywaniu pola będzie ustawiana na FALSE (albo 0).

    Wróćmy do naszego schematu gry. Nieco go przerobimy:
    Kod:
    if (<na_polu_x_y_jest_mina>)
    {
        <pokaz_wszystkie_miny>;
        <smutna_mordka>;
        <game_over>;
    }
    else
    {
        if (znacznik==TRUE)
        {
            losuj_miny(x, y);   // użyj swojej funkcji, którą losujesz miny
            znacznik=FALSE;
        }
        odkryj_pole(x, y);
        <rysuj_wszystkie_pola>;
        <rysuj_kursor>;
    }

    Heh, z pewnością zadajesz sobie i mi dwa dość ważne pytania. ;-)

    Po co funkcja losuj_miny() (to znaczy taka, jakiej tam teraz używasz w Twoim programie; func_rand(), o ile dobrze pamiętam) ma teraz jakieś argumenty?

    I skąd będzie wiadomo w miejscu if (<na_polu_x_y_jest_mina>), czy na polu (x, y) faktycznie jest mina?

    Hehe, to proste. Bezpośrednio po uruchomieniu gry, oprócz ustawienia wspomnianego wcześniej znacznika na TRUE, wypełnimy też nasze pole gry tak, aby nie zawierało ANI JEDNEJ miny. Dzięki temu po wybraniu i poleceniu odsłonięcia pola (x, y) ten pierwszy if nas przepuści do odkrywania pola, bo nie ma jeszcze min. Teraz losujemy sobie miny tak, żeby ich nie postawić w polu (x, y) i kasujemy znacznik (ustawiamy na FALSE). OK, dalej bedzie się wszystko już wykonywało "po staremu", bo gdy znacznik będzie FALSE, to nie będą ponownie losowane miny, tylko od razu będzie odkrywane pole (być może już z miną ;-).

    Treść funkcji func_rand() trzeba będzie więc poprawić:
    Kod:
    void func_rand(bajt x, bajt y)
    {
       for(app.z=1; app.z<=10; app.z++)
       {
          do
          {
             game->x = rand()%8;
             game->y = rand()%8;
          }
          while (((game->x==x) && (game->y==y)) || (game->mmat[game->y][game->x]==1));
          game->mmat[game->y][game->x]=1;
       }
    }
    Tyle tam jest nawiasów, gdyż lepiej będzie obliczany warunek kontynuacji pętli losującej współrzędne stawianej miny.

    Można by treść tej funkcji wyrazić następującymi słowami:

    JEŚLI:
    • wylosowane x (czyli game->x) jest równe x (z argumentu funkcji) ORAZ
    • wylosowane y (czyli game->y) jest równe y (z argumentu funkcji)

      LUB

    • na polu o wylosowanych współrzędnych (game->x, game->y) jest mina

    WTEDY powtórz losowanie współrzędnych.

    Pełna treść warunku wraz z zewnętrznymi nawiasami go otaczającymi w tym while brzmi:
    Kod:
    (((game->x==x) && (game->y==y)) || (game->mmat[game->y][game->x]==1))

    Na pozór wygląda to trochę może skomplikowanie, ale jeśli się skupisz i pomyślisz - jest to proste jak drut. :-)
No, to do dzieła, Panie Programisto. Pomyśl i zrób. ;-)

Na koniec pewna offtopiczna ciekawostka. :-)

Ten niby cheat z klawiszem Esc w oryginalnym Saperze został omówiony w... samej pomocy do programu :-D. Wybierz menu "Pomoc"->"Spis treści", a w pomocy temat: "Strategie i porady" (ostatni akapit). :-)

Przynajmniej u mnie, w Windows 2000 tak jest. :-)

Tak to jest, jak się nie czyta dokumentacji - to się nie wie o takich rzeczach. ;-)

Pozdrowionka.

PS. Intro jest bardzo ładne! Świetna robota! :-)
_________________
Jarosław Krasuski (jaras)
^
 
 
 
druidbartek 
Expert



Telefon: DCT-3
Operator: Era
Pomógł: 39 razy
Wiek: 30
Dołączył: 13 Wrz 2005
Posty: 1006
Skąd: Wrocław
Wysłany: 2006-01-09, 23:44   

właśnie flashuje fonika juz z jakimś lamerskim licznikiem sekundek. zobaczę co z tego wyjdzie. ale będzie trzeba go jakoś kiedyś zoptymalizować. zaraz pochwale się co z tego wyszło - jeśli działa to zostały już tylko cheaty : )

[ Dodano: 09-01-2006, 23:50 ]
pierwsze podejście nie udane. jestem w trakcie drugiego : )
zrobiłem błąd powodujący że dispatcher wkółko wysyłał do siebie wiadomości : /

[ Dodano: 10-01-2006, 00:31 ]
no niestety nie działa timer :/ zwiesza fon

a robie to tak:
definicja wiadomosci:
Kod:
#define MSG_LICZNIK              (0x1F12)

funkcja rysująca cyferki:
Kod:
void draw_timer(bajt timer)
{
   // ... rysuj cyferki
   own_timer_create(TICKS_PER_SECOND,TT_MESSAGE,MSG_LICZNIK);
}

a tu naszsa wiadomosc
Kod:
case MSG_LICZNIK:
{
  while(game->ile_sekund<1000)
  {
     game->ile_sekund++;
     draw_timer();
  }
  break;
}

pierwsze wywołanie licznika jest w wypadku naciśnięcia 0 lub 5 ale tylko po raz pierwszy, np:
Kod:
case KEY_0: // mark/unmark pole
{
   if(game->znacznik==TRUE) // nowa gra. losujemy miny
   {
      rand_mines(game->y,game->x);
      own_timer_create(TICKS_PER_SECOND,TT_MESSAGE,MSG_LICZNIK);
   }
   mark_field();
   draw_mleft();
   if((game->mright==ILE_MIN)&&(game->mleft==0)) game_won();
   break;
}

kolejne wywoływane są z wnętrza funkcji draw_timer()
jeśli kontynuujemy grę odbywa sie to na innej zasadzie. no i gdzie ten błąd?? : )
może jutro pomyślę o tym

[ Dodano: 10-01-2006, 01:51 ]
chyba już wiem co jest przyczyną błędu - zaraz sprawdzę

[ Dodano: 10-01-2006, 01:59 ]
BTW nie sądziłem że Nokia siedzi na takim dobrym procku. ciekawią mnie jego bliższe parametry techniczne. muszę poszukać
^
 
     
jaras 
Nowicjusz



Telefon: Nokia 5110
Operator: Plus
Pomógł: 2 razy
Wiek: 43
Dołączył: 09 Kwi 2005
Posty: 62
Skąd: "LAC: 41008" ;-)
Wysłany: 2006-01-10, 02:06   

I znowu kombinuję tu i kombinuję, ale nic mi nie wychodzi z tego kombinowania. :-/

Pokazany przez Ciebie kod wygląda na poprawny (o ile dobrze zrozumiałem działanie mechanizmu timer'ów).

druidbartek napisał/a:
no niestety nie działa timer :/ zwiesza fon
druidbartek napisał/a:
kolejne wywoływane są z wnętrza funkcji draw_timer()
jeśli kontynuujemy grę odbywa sie to na innej zasadzie. no i gdzie ten błąd?? : )
może jutro pomyślę o tym
Za mało "danych". ;-)

Co to znaczy "zawiesza fon"? Przy uruchomieniu gry? A może przy kontynuacji? Albo jeszcze w innym momencie?

Rozpisz się trochę, żeby można było pomyśleć. Ja nie widzę tego, co Ty widzisz na ekranie swego tela. ;-)

Aha i jeszcze drobna sugestia, co do działania programu. Przyjrzyj się oryginalnemu Saperowi i zauważ, że licznik czasu wcale nie rusza, kiedy zaznacza się tylko flagi na początku gry - on rusza dopiero wtedy, gdy odkryjesz pierwsze pole. Z tego wniosek jest taki, że nie trzeba nawet losować min, kiedy naciśnie się klawisz zaznaczający pole flagą. Dopiero i tylko wtedy, gdy naciśnie się klawisz odkrywający pole.

No i na koniec, popraw małego errora. Wiem, że to nie dotyczy timerów, ale "error is error" i trzeba go poprawić ;-).

Nagłówek funkcji:
Kod:
void draw_timer(bajt timer)
Wywołanie tej funkcji:
Kod:
draw_timer();
Zdefiniowałeś argument dla funkcji, a w wywołaniu go nie ma.

druidbartek napisał/a:
chyba już wiem co jest przyczyną błędu - zaraz sprawdzę
Czekam na rezultaty. ;-)

druidbartek napisał/a:
BTW nie sądziłem że Nokia siedzi na takim dobrym procku. ciekawią mnie jego bliższe parametry techniczne. muszę poszukać
Tutaj masz opisany nieco ten procek, gdzieś tam jest chyba też cała jego specyfikacja. :-)

Pozdrawiam Cię.
_________________
Jarosław Krasuski (jaras)
^
 
 
 
druidbartek 
Expert



Telefon: DCT-3
Operator: Era
Pomógł: 39 razy
Wiek: 30
Dołączył: 13 Wrz 2005
Posty: 1006
Skąd: Wrocław
Wysłany: 2006-01-10, 02:14   

tak miałem rację i ty również - po prostu wskazany przeze mnie fragment kodu jest całkowicie poprawny. Niepotrzebnie użyłem zamiast
Kod:
if(ilosc_sekund<1000) //...

tego
Kod:
while(ilosc_sekund<1000) // ...

phrr, jak to zobaczyłem to myślałem że ze śmiechu pęknę. co mnie ... że tam while dałem?

ale timer juz działa poprawnie. jeszcze uwzględnię to co napisałeś że timer startuje tylko po odkryciu miny. tego nie wiedziałem. musze częściej pograć w tego Sapera ; )

wielkie dzięki również za link do tej strony o procku - interesujące rzeczy tam czytam : )
^
 
     
jaras 
Nowicjusz



Telefon: Nokia 5110
Operator: Plus
Pomógł: 2 razy
Wiek: 43
Dołączył: 09 Kwi 2005
Posty: 62
Skąd: "LAC: 41008" ;-)
Wysłany: 2006-01-10, 02:33   

druidbartek napisał/a:
tak miałem rację i ty również - po prostu wskazany przeze mnie fragment kodu jest całkowicie poprawny.
(...)
phrr, jak to zobaczyłem to myślałem że ze śmiechu pęknę. co mnie ... że tam while dałem?
Ale, że i ja tego nie zauważyłem... ;-D

Na swoje wytłumaczenie mogę powiedzieć tylko to, że siedzę też tutaj nad swoim kodem i też kombinuję jak "koń pod górkę". A po za tym, patrząc na Twój kod bardziej się skupiłem nad tymi timer'ami (czy wszystko w nich "gra"), niż nawet nad poprawnością semantyczną kodu. :-)

Może ja już też przemęczony jestem? ;-)

druidbartek napisał/a:
ale timer juz działa poprawnie.
Cieszy mnie to. :-)

druidbartek napisał/a:
jeszcze uwzględnię to co napisałeś że timer startuje tylko po odkryciu miny. tego nie wiedziałem. musze częściej pograć w tego Sapera ; )
Odnośnie mojej wypowiedzi:
jaras napisał/a:
Aha i jeszcze drobna sugestia, co do działania programu. Przyjrzyj się oryginalnemu Saperowi i zauważ, że licznik czasu wcale nie rusza, kiedy zaznacza się tylko flagi na początku gry - on rusza dopiero wtedy, gdy odkryjesz pierwsze pole. Z tego wniosek jest taki, że nie trzeba nawet losować min, kiedy naciśnie się klawisz zaznaczający pole flagą. Dopiero i tylko wtedy, gdy naciśnie się klawisz odkrywający pole.
Właśnie sprawdziłem takie coś: wybrałem poziom Niestandardowy i podałem parametry: szerokość i wysokość: 9 (to są minimalne wartości), miny: 64 (to jest maksymalna liczba).

Utworzyłem więc duże prawdopodobieństwo, że odkrywając drugie pole trafię na minę (bo pierwsze, jak wcześniej pisałem, nigdy nie odkrywa miny). Zrobiłem na tych ustawieniach doświadczenie: pozaznaczałem flagami wszystkie pola, oprócz jednego. I nigdy, kiedy na nie klikałem, żeby je odkryć - nie pojawiła się na nim mina (z tego wniosek, że stawianie flag nie rozpoczęło jeszcze losowania min). Potem odznaczałem jakieś przypadkowe pole z flagą i je odkrywałem, i... prawie zawsze trafiałem na minę. A doświadczenie to powtórzyłem kilkakrotnie, zatem teraz jestem już pewny tego stwierdzenia.

Jak napisałem wcześniej, mimo, że zaznaczałem pola flagami, licznik czasu "stał w miejscu" i ruszył dopiero, kiedy odkryłem to ostatnie, niezaznaczone flagą pole.

A więc powtarzam, co pisałem wcześniej: miny są losowane tylko wtedy, gdy odkrywasz jakieś pole, ale nie wtedy, gdy stawiasz flagi. Licznik czasu też rusza dopiero, gdy odkrywasz pole, ale nie wtedy, gdy zaznaczasz flagi.

druidbartek napisał/a:
wielkie dzięki również za link do tej strony o procku - interesujące rzeczy tam czytam : )
No wiesz, podobnie, jak warto wiedzieć, jaki ma się silnik pod maską bryczki, którą się jeździ - warto też wiedzieć, jaki ma się "silnik" pod obudową tela, którego się używa. ;-)

Pozdrowienia.
_________________
Jarosław Krasuski (jaras)
^
 
 
 
druidbartek 
Expert



Telefon: DCT-3
Operator: Era
Pomógł: 39 razy
Wiek: 30
Dołączył: 13 Wrz 2005
Posty: 1006
Skąd: Wrocław
Wysłany: 2006-01-10, 06:15   

heh, myślę że już wszystkie wspominane założenia działają i są poprawnie wykonywane - właśnie zacząłem bawić się z cheatami ale nie mam siły kończyć tego teraz. idę spać ale myślę że dzisiaj już spokojnie mogę wypuścić to co mam - może uda mi się wszystkie cheaty zrobić do tego czasu bo mam ich 12 więc troszkę roboty mam ; )

aha już wiem co chciałem zapytać. nie wiem co robić podczas wygrania/przegrania. bo narazie jeśli się wygra to jest grana melodyjka i tyle a jeśli przegramy to podobnie + odsłonięcie min. i nie wiem czy po tym powinno nas do menu gry wywalić czy jak? czy dopiero po naciśnięciu C. nie wiem jak to kończyć

Kod:
void game_lost(void)
{
  freegfx_begin(false);
  own_draw_bitmap(&bmap_dead,74,20,DM_SET);
  for(app.x=0; app.x<=MAT_SZER-1; app.x++)
  {
    for(app.y=0; app.y<=MAT_WYS-1; app.y++)
    {
      if((game->hmat[app.y][app.x]==11)||(game->hmat[app.y][app.x]==12)) // rysuj mine
      else if(game->hmat[app.y][app.x]==10) // rysuj X
    }
  }
  freegfx_end(false);
  buzz(&tone_game_lost);
  game->znacznik=GAME_OVER;
}

void game_won(void)
{
   buzz(&tone_game_won);
   game->znacznik=GAME_OVER;
}


z góry dzięki za pomoc ; )
^
 
     
jaras 
Nowicjusz



Telefon: Nokia 5110
Operator: Plus
Pomógł: 2 razy
Wiek: 43
Dołączył: 09 Kwi 2005
Posty: 62
Skąd: "LAC: 41008" ;-)
Wysłany: 2006-01-10, 06:30   

druidbartek napisał/a:
heh, myślę że już wszystkie wspominane założenia działają i są poprawnie wykonywane - właśnie zacząłem bawić się z cheatami ale nie mam siły kończyć tego teraz. idę spać ale myślę że dzisiaj już spokojnie mogę wypuścić to co mam - może uda mi się wszystkie cheaty zrobić do tego czasu bo mam ich 12 więc troszkę roboty mam ; )
Mam nadzieję, że zdajesz sobie sprawę z tego, że nic a nic Ci przy tych cheat'ach nie pomogę? ;-)

Nie dlatego, że nie chcę, lecz dlatego, że nie znam (i nie chcę znać) szczegółów. ;-)

druidbartek napisał/a:
aha już wiem co chciałem zapytać. nie wiem co robić podczas wygrania/przegrania. bo narazie jeśli się wygra to jest grana melodyjka i tyle a jeśli przegramy to podobnie + odsłonięcie min. i nie wiem czy po tym powinno nas do menu gry wywalić czy jak? czy dopiero po naciśnięciu C. nie wiem jak to kończyć
Myślę, że zarówno po wygranej, jak i przegranej trzeba będzie pozostawić na ekranie obraz pola gry, dlatego, że:
  • Kiedy wygrasz - zapewne zechcesz "nacieszyć oczy" tym faktem ;-).
  • Kiedy przegrasz - zapewne zechcesz przeanalizować, gdzie zrobiłeś błąd. ;-)
Dopiero, kiedy już wszystko obejrzysz - naciskasz C i wychodzisz do menu.

Można to też zrobić inaczej, podobnie do tego, jak jest w oryginalnych grach w telefonie. Tyle, że z tym pewnie byłoby trochę roboty. Mam na myśli polecenie w menu: "Ostatni widok", w którym oglądasz sobie ekran gry. Jeśli tak umiesz zrobić (ja nie - więc też Ci w tym nie pomogę ;-), to wtedy po ukończeniu lub przegraniu gry, można wywalać gracza od razu do menu.

Chociaż... ja bym jednak preferował ten pierwszy sposób: oglądam sobie ekran i naciskam C, aby wyjść.

Ja już też idę spać. Dobrej nocki. :-)
_________________
Jarosław Krasuski (jaras)
^
 
 
 
druidbartek 
Expert



Telefon: DCT-3
Operator: Era
Pomógł: 39 razy
Wiek: 30
Dołączył: 13 Wrz 2005
Posty: 1006
Skąd: Wrocław
Wysłany: 2006-01-10, 16:03   

URAAAAAA!!! :D

udało mi się zrobić poziomy trudności - teraz mamy do wyboru różne poziomy gry od 10 min w najłatwiejszym do 30 w najtrudniejszym : )

nie wiem jeszcze jak interpretować uzyskiwany wynik bo każdy się zgodzi że 30s na poziomie 1≠30s na poziomie 5 : )

może jakiś przelicznik zastosuję który końcowy rezultat sekund ( w wypadku wygranej) będzie przeliczał na punkty uwzględniając poziom?

natknąłem za to na inny problem do rozwiązania - te cheaty będą na zasadzie podobnej do wielu gier np. ( to tylko przykład ;-] ) #stopclock# mogło by oznaczać zatrzymanie zegara ( odpowiednik Esc z sapera w win 2000). A problem dotyczy N5510 - bo o ile w innych telefonach taki kod uzyskamy po naciśnięciu #786725625# czyli na zasadzie wklepywania słowa jak się pisze smsa ze słownikiem ale w 5510 chciałbym się pokusić żeby dało się literki wklepywać : ) - i na razie z tym problem.

więc pierwsza wersja którą wypuszczę będzie bez cheatów i zapamiętywania najlepszego czasu ( czy też punktów )

[ Dodano: 10-01-2006, 16:05 ]
BTW dobrze że jest coś takiego jak partial flasher bo gdybym miał tyle razy zmieniać cały flash w N5510 to by miesiąca brakło <lol>
^
 
     
jaras 
Nowicjusz



Telefon: Nokia 5110
Operator: Plus
Pomógł: 2 razy
Wiek: 43
Dołączył: 09 Kwi 2005
Posty: 62
Skąd: "LAC: 41008" ;-)
Wysłany: 2006-01-10, 17:54   

Cześć.

druidbartek napisał/a:
udało mi się zrobić poziomy trudności - teraz mamy do wyboru różne poziomy gry od 10 min w najłatwiejszym do 30 w najtrudniejszym : )

nie wiem jeszcze jak interpretować uzyskiwany wynik bo każdy się zgodzi że 30s na poziomie 1≠30s na poziomie 5 : )

może jakiś przelicznik zastosuję który końcowy rezultat sekund ( w wypadku wygranej) będzie przeliczał na punkty uwzględniając poziom?
Jeśli chcesz, to tak zrób - dla mnie w grze Saper jest już sporą satysfakcją to, że ukończę grę na trudnym poziomie :-). Owszem, mogłoby sobie być zapamiętywanie rekordów, ale nie musi. Ale to, powtarzam, jest tylko moje zdanie. ;-)

druidbartek napisał/a:
natknąłem za to na inny problem do rozwiązania - te cheaty będą na zasadzie podobnej do wielu gier np. ( to tylko przykład ;-] ) #stopclock# mogło by oznaczać zatrzymanie zegara ( odpowiednik Esc z sapera w win 2000). A problem dotyczy N5510 - bo o ile w innych telefonach taki kod uzyskamy po naciśnięciu #786725625# czyli na zasadzie wklepywania słowa jak się pisze smsa ze słownikiem ale w 5510 chciałbym się pokusić żeby dało się literki wklepywać : ) - i na razie z tym problem.
Eee... ja nie widzę problemu. Zrób każdy cheat tak, żeby dał się wpisywać zarówno przez cyfry, jak i przez litery. Telefony, które nie mają liter na klawiaturze, nie będą miały możliwości wklepania kodu literami, ale będą miały możliwość wklepania go cyframi. To jeden pomysł.

Drugi pomysł jest taki, że musiałbyś doczytać w dokumentacji do SDK oraz w źródłach na temat skryptu *.nrx. Chodzi o to, że można by było napisać osobne moduły w języku C z cheat'ami dla N5510 i pozostałych (które nie mają liter), a potem, w zależności od wartości Rexxowej funkcji locate("firmware_type"). Coś w rodzaju:
Kod:
if locate("firmware_type")="NPM-5" then ...
else ...
(oczywiście to jest kod Rexx w skrypcie NokiX'a)

Co do samych sekwencji klawiszy w cheat'ach. Postaraj się, żeby sekwencje te nie miały w sobie klawisza 5, czyli tego, którego używa się do odkrywania pola. Niestety, wówczas słowa do wklepania nie będą mogły mieć w sobie liter "j", "k" i "l", ale lepsze to, niż odkrycie pola z miną, w czasie wpisywania cheat'a ;-). Chyba, że to jakoś inaczej rozwiążesz. No, na upartego, jedna z tych liter jeszczy by mogła być, bo jeśli by się włączyło grę, to, jak wcześniej rozmawialiśmy, pierwsze odkrycie pola nie odkrywa miny (ale uruchamia licznik czasu!). :-)

druidbartek napisał/a:
więc pierwsza wersja którą wypuszczę będzie bez cheatów i zapamiętywania najlepszego czasu ( czy też punktów )
No, ja już odebrałem od kumpla swojego flasherka, a zrobiłem to tylko po to, żeby móc obejrzeć na własne oczy Twojego Sapera :-). Nie każ mi więc zbyt długo czekać. ;-)

Pozdrawiam Cię.

PS. Przez jakiś cza było zrąbane forum, dlatego tak długo nie odpisywałem.
_________________
Jarosław Krasuski (jaras)
^
 
 
 
druidbartek 
Expert



Telefon: DCT-3
Operator: Era
Pomógł: 39 razy
Wiek: 30
Dołączył: 13 Wrz 2005
Posty: 1006
Skąd: Wrocław
Wysłany: 2006-01-10, 19:19   

witam,
jaras napisał/a:
Co do samych sekwencji klawiszy w cheat'ach. Postaraj się, żeby sekwencje te nie miały w sobie klawisza 5, czyli tego, którego używa się do odkrywania pola. Niestety, wówczas słowa do wklepania nie będą mogły mieć w sobie liter "j", "k" i "l", ale lepsze to, niż odkrycie pola z miną, w czasie wpisywania cheat'a ;-). Chyba, że to jakoś inaczej rozwiążesz. No, na upartego, jedna z tych liter jeszczy by mogła być, bo jeśli by się włączyło grę, to, jak wcześniej rozmawialiśmy, pierwsze odkrycie pola nie odkrywa miny (ale uruchamia licznik czasu!). :-)

oczywiście wziąłem to pod uwagę. Obecnie jestem na takim etapie. w zmiennej game->znacznik jest przechowywana wartość TRUE jeśli nie było jeszcze losowania min, FALSE jeśli losowanie min było. Jeśli wygramy bądź przegramy game->znacznik ustawia swoją wartość na GAME_OVER o wartości 2.
Naciskając dowolny klawisz jest wykonywany następujący kod:
Kod:
if(game->znacznik<GAME_OVER) // tryb gry
else if(game->znacznik>GAME_OVER) // wpisujemy cheat

Jeśli natomiast naciśniemy # game->znacznik zwiększa swoją wartość o 3 jeśli był tryb gry bądź zmniejsza jeśli aktywny był tryb wpisywani cheata. w ten sposób wpisując cheat możemy uzywać wszystkich klawiszy a w tym czasie kursor nie zmienia swojego położenia, nie możemy odkrywać pól ani ustawiać flag oraz timer się zatrzymuje. Aby zakonczyć wpisywanie cheata naciskamy ponownie # przez co game->znacznik wraca do swojej poprzedniej wartości. Następnie w zależności od wprowadzonego kodu wykonywany jest odpowiedni kod jeśli wprowadzony kod jest poprawny ; )
Cytat:
No, ja już odebrałem od kumpla swojego flasherka, a zrobiłem to tylko po to, żeby móc obejrzeć na własne oczy Twojego Sapera :-). Nie każ mi więc zbyt długo czekać. ;-)

obiecuję dzisiaj dać co mam. oczywiście w przystępnej godzinie ; )
^
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do: