Propozycje dotyczące mechanizmów jednoosobowej gry Madżong

0

Witam, jestem nowy na forum i początkującym programistą w Turbo Pascalu. Mam za zadanie napisać grę w madżong. Zastanawiam się nad ogólną mechaniką tej gry, pętlami i warunkami. Chciałbym dodać tutaj obsługę myszki (w sumie to jest konieczne). Liczę na jakieś porady ze strony forumowiczów jak podejść do tworzenia tej gry. Przede wszystkim myślałem nad tym żeby klocki były rekordami, które będą miały następujące pola: x1,y1,x2,y2:integer, zaznaczone,gora,lewo,prawo:boolean(czy jest zaznaczony przez myszkę i czy jest wolne z lewej, prawej i na górze), wartosc:byte (na początku będzie około 40 różnych klocków i każda będzie miała przypisany numer). Rysowanie planszy będzie zaprogramowane na sztywno i wydaje mi się, że bloczki też powinny mieć przypisane wszystkie pola na sztywno oprócz pola wartość która będzie losowana. Jeżeli plansza będzie na 80 klocków to będzie losowanych 40 a następne 40 będzie losowanych ze zbioru który będzie stworzony z tych pierwszych 40 wylosowanych wartości i losowanie będzie bez zwracania.

Ogólnie najgorzej mi idzie z obsługą myszy bo rozwiązanie na które wpadłem wymagałoby ode mnie napisania tylu warunków if ile jest klocków na planszy a to raczej nie będzie dobre rozwiązanie. Co zatem proponujecie? Bardzo proszę o pomoc i wyrozumiałość.

Pozdrawiam

0

Jedyne co mogę polecić zanim cokolwiek dalej będziesz kombinował, to jeżeli już modzić chcesz to w konsoli, a nie w postaci okienkowej aplikacji pod na przykład darmowym Lazarusem, to użyj raczej FPC. A nie środowiska rodem z czasów DOS'a. Chyba, że gra ma koniecznie dzialać przede wszystkim tylko pod DOS'em. Ale to nawet DOS'owy FPC będzie do tego celu lepszy. Nie bawiłem się w nim w obsługę myszki, ale prościej takie rzeczy na pewno zawsze robi się, jeżeli docelowym systemem będzie Windows.

0

A jeszcze mam problem ze sprecyzowanie warunków jakie muszą zajść żeby pole 'góra' rekordu mogło zostać zmienione na TRUE czyli że żadna płytka nie pokrywa od góry tej danej płytki... Od boków wiem jak to zrobić mniej więcej.

0

Chyba, że gra ma koniecznie dzialać przede wszystkim tylko pod DOS'em

Nie wyobrażam sobie mahjonga w trybie tekstowym (ok, widziałem kiedyś brydża w trybie tekstowym...), a DOS-owa grafika nie ruszy pod Vistą i nowszymi (chyba że pod DOSboksem).

Ściągnij FreePascala (FPC), i to windowsowego.

I to mówię ja, który wczoraj pół dnia spędził nad DOS-owym asemblerem ;-)

0

@Azarien: no dokładnie. Ale skoro spędziłeś pól dnia nad DOS'owym ASM'em, to dlaczego ja jeszcze nie widzę odpowiedzi na zapomniany już dawno temat http://4programmers.net/Forum/Newbie/231489-kolejny_klopot_z_dosem_i_tasmem_-_usprawnienie_kodu_loadera?p=1022188#id1022188 - co? ;) Przecież szybciej wrócimy wszyscy do czasów DOS'a, bo historia zatoczy koło. Niż autor oryginalnego kodu loadera odpisze mi na kolejne maile. Człowiek był bardzo pomocny, ale i zajęty chyba. Gdyż w dzisiejszych czasach jeżeli przez ponad pięć dni nie doczekujemy się odpowiedzi na nasze pytanie. A ktoś podał namiary do siebie to chyba nie za bardzo chce się mu odpowiadać albo pracuje tak, że po zmianie mu sił nie starcza na sprawdzenie własnej poczty.

0

Używam Turbo Pascala i nie robię tego w trybie tekstowym tylko w trybie graficznym 320x200 256 kolorów. Odpowie ktoś na moje pytania?

2

Załóżmy, że ilość warstw kamieni jest stała lub ograniczona.
Musisz napisać funkcję, która na podstawie współrzędnych myszy wyliczy współrzędne kamienia, który przypada w danym miejscu.
Dla każdej warstwy będzie to liczone trochę inaczej.
Mając współrzędne kliknięcia po kolei warstwami od góry do dołu obliczasz współrzędne kamienia. Jeśli na danej warstwie jest kamień w tym miejscu, to przerywasz dalsze szukanie i to jest właśnie kliknięty kamień.
Dalej trzeba sprawdzić, czy jest on wolny. Boki sprawdzić łatwo, a czy go coś przykrywa - to już sprawdzasz na warstwie wyżej, czy okoliczne kamienie istnieją.

Tyle moich przemyśleń, nigdy tej gry nie implementowałem.

0
  1. Nie używaj turbo pascala. FPC też ma moduł Graph tylko z wiele większymi możliwościami.
  2. Pisanie grafiki generowanej przez procesor jest niewydajne zainteresuj się OpenGL (przy okazji łatwiej zaprogramować działania myszą).
0

A mógłbyś mi podesłać jakieś według Ciebie ciekawe publikacje wyjaśniające działanie tego OpenGL pod Pascalem?

0

Mam taki problem. Chce wylosować dla połowy płytek i przypisać wartości od 0 do 9 a następnie dla drugiej połowy płytek wylosować ten sam zakres wartości ale tak żeby po wszystkim płytki miały parzystą liczbę każdej wartości czyli np. żeby bylo 20 płytek z wartością 4, 6 z wartością 3, 2 z wartością 1. Pod tymi wartościami przypisywanymi płytką program będzie rozpoznawał wygląd płytki i musi być parzysta ilość żeby można było je połączyć zgodnie z zasadami gry Mahjong. Mam nadzieję że dobrze to wyjaśniłem.

0

NIe znam zasad Mahjonga i nie chcę się w nie zagłębiać. Ale nie bardzo mogę zrozumieć z czym konkretnie jest problem. Przechowuj płytki w tablicy jako jakieś obiekty. Losowanie wykonasz, wiadomo funkcją Random, po wcześniejszym jednorazowym wywołaniu Randomize. Jeżeli chcesz mieć pewność, że wylosujesz tylko parzyste liczby, to masz dwa rozwiązania. Losować liczbę do skutku, aż wylosowana liczba spełni warunek mod 2 = 0. Choćby w pętli repeat ... until. Albo jeśli zakresu liczb do losowania jest nie za dużo. To stworzyć tablicę const i w jej elemntach przechowywać tylko parzyste liczby. Ewentualnie w pętli wypełnić taką tablicę, ale jako zmienną, zwiększąjąc wartość innej zmiennej, którą podstawisz pod kolejne wartości elementów tablicy, o dwa. Tak ja bym kombinował.

0

Najprościej było by zrobić taką wersję gry, w której jeden kamień może "leżeć" na tylko jednym kamieniu; Dzięki temu zaprojektowanie bufora do przechowywania rozmieszczenia kamieni sprowadzałoby się do utworzenia tylko dwuwymiarowych tablic, ile warst kamieni ma gra obsługiwać;

Pojedynczy kamień będzie musiał zawierać jedynie informacje o swoim typie/kolorze/numerze - nie wiem jak to nazwać, w każdym razie jakiś numerek będzie musiał mieć, który posłuży do porównania z numerkiem innego, wybranego kamienia;

Klikając na ekranie wystarczy przeliczyć współrzędne kursora na indeks elementu w macierzy, po czym w pętli sprawdzać od najwyższej warstwy, czy pod tym indeksem istnieje jakiś kamień, jeśli nie - sprawdzamy niższą warstwę, i tak aż do napotkania kamienia w którejść warstie albo do napotkania stołu/podłoża;

To by w sumie tyle wystarczyło, bo czy kamień można zabrać/porównać, wystarczy sprawdzić sąsiednie elementy macierzy - prawy i lewy; Jeśli oba są zajęte przez inne kamienie - nie można więc go podnieść/użyć/porównać;

Jak już oprogramujesz sobie np. klasę do wypełniania kamieniami tablic i do ich rysowania, to reszta będzie już błahostką.

0

Mógłby mi ktoś powiedzieć czemu to nie działa?

procedure laduj_plytke(var obrazek:obraz; sciezka:string);
  var
    plik:file;
    licznik,wynik:word;
    licznik_odczytu:word;
  begin
    assign(plik,sciezka);
    reset(plik,1);
    obrazek.szerokosc:=14;
    obrazek.wysokosc:=20;
    obrazek.rozmiar:=20*14;
    getmem(obrazek.wsk_obrazu,obrazek.rozmiar);
    licznik:=obrazek.szerokosc;
    for licznik_odczytu:=0 to 19 do begin
      blockread(plik,obrazek.wsk_obrazu^[(19-licznik_odczytu)*14],licznik,wynik);
    end;
    close(plik);
  end;

procedure wyswietl_plytke(kamien:plytka);
  var
    wzor_plytki:obraz;
    poczatek,i,j,k:integer;
  begin
    case kamien.wartosc of
      0: wzor_plytki:=kamien1;
    end;
    poczatek:=(kamien.y*320)+kamien.x;
    for j:=0 to 19 do begin
      for i:=0 to 13 do begin
        mem[$A000:poczatek]:=wzor_plytki.wsk_obrazu^[k];
        poczatek:=poczatek+1;
        k:=k+1;
      end;
      poczatek:=poczatek+306;
    end;
  end;

Dla jasności wstawiam też typy:

type
  plytka=record
    x,y:integer;
    wartosc:byte;
    zaznaczony:boolean;
    istnieje:boolean;
    lewe:boolean;
    prawe:boolean;
    gora:boolean;
    dol:boolean;
  end;

  tablica = array[0..279] of byte;

  obraz=record
    szerokosc:word;
    wysokosc:word;
    wsk_obrazu:^tablica;
    rozmiar:word;
  end;

Wyswietla mi coś takiego: http://naforum.zapodaj.net/7b806a39e6d1.jpg.html

0

Przede wszystkim wstaw to w odpowiednie znaczniki. I sformatuj kod (jeżeli nie umiesz albo się Tobie nie chce, to pogoogluj za gotowymi rozwiązaniami). Wtedy pewnie ktoś spojrzy.

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