Strona 1 z 2 12 OstatniOstatni
Pokaż wyniki od 1 do 10 z 12

Wątek: System zadań w grze.

  1. #1
    Zarejestrowany
    Dołączył
    May 2012
    Posty
    4

    Domyślnie System zadań w grze.

    Hej

    Zastanawiam się w jaki sposób napisać system zadań, który zminimalizowałby edycję kodu gry.

    Tzn. dodawanie nowego zadania nie wiązałoby sie z edycją plików - nie mówie tutaj o zupełnym braku, ale wolałbym, żeby ingerencja była jak najmniejsza.

    Pewnie trzeba zrobić w bazie tabele z zadaniami i Npc'tami.

    Ale co dalej? Dzięki z góry za pomoc. Nie oczekuje kodu, wystarczy tylko teoria.

  2. #2
    Zasłużony Awatar Rodkan
    Dołączył
    Mar 2011
    Posty
    1,465

    Domyślnie

    Zależy jakie zadania i do jakiej gry. Jednak raczej do każdego zadania musisz mieć przygotowane "zaplecze", tzn. kod który będzie coś podliczał, sprawdzał etc. Nie da się (albo ja jestem za głupi) zrobić żadnego konkretnego zadania nie ingerując w kod gry. Np. zniszcz 3 statki. I co z tego że będziesz miał w bazie dane ile statków ma zniszczyć i ile zniszczył jak kod nie będzie po zniszczeniu statku podliczał zniszczone_statki+=1, a potem nie będzie sprawdzał czy zniszczone_statki==3...

  3. #3
    Aktywny
    Dołączył
    Jul 2008
    Posty
    866

    Domyślnie

    Zależy od systemu zadań. Jeżeli chodzi o zadania w stylu Gladiatus to np:

    ID gracza
    ID zadania [short int, 1 to np "Zabij" 2 to "Zdobądź".. //może to też być proste słowo "KILL"/"BRING"/"TALK" potem sprawdzasz switch/case czy jak sobie chcesz..
    Licznik / Warunek
    Czas rozpoczęcia [możliwość zadań czasowych, patrzysz na aktualny czas i porównujesz ile minęło, czy się spóźnił czy nie].

    Licznik nie musi być liczbą, może być czymś w stylu: 1-0-1-0-0-1;
    Co można łatwo rozdzielić [np. funkcja explode w PHP] i nam daje tablicę:
    {1, 0, 1, 0, 0, 1}
    co możemy interpretować jako prawda/fałsz, spełnienie określonego warunku lub też jako konkretne liczby.

    Roboty w plikach i tak zawsze będzie, ale im więcej potworów/przedmiotów/zadań ma własne ID tym lepiej, bo potem można z tego korzystać w prosty sposób.

    Ogólnie sposobów jest wiele, to też zależy od tego jak skomplikowane, rozbudowane są zadania. O tych, o których mówię - nie jest trudne wykonanie, bo nie wymaga fabuły.

  4. #4
    Zarejestrowany
    Dołączył
    Dec 2007
    Posty
    241

    Domyślnie

    Jak już pisano - to zależy od struktury twoich zadań.
    Jeśli twoje zadania są z jednego szablonu tzn. zabij - x y - razy i przynieś z sztuk w to każde zadanie możesz sprowadzić do jednego rekordu w bazie danych. Jedna tabele na potopy zadań, a druga na rozpoczęte zadania dla każdego z graczy. Wady: brak jakiejkolwiek elastyczności.

    Jeśli zadania potrafisz przedstawić w postaci drzewa, gdzie węzłami są kolejne rozgałęzienia w drzewie "decyzji". Do takich wezłów dołączasz z innych tabel wymagania by osiągnąć dany cel. Możesz sobie takie drzewo zmapować do relacyjnej bazy danych Jest to dość dobrze opisane, choć nie takie trywialne jak poprzedni punku. Wady: średnia elastyczność (wszystkie cele muszą być jednego typu lub bardzo podobne), duża elegancja. Możesz też pokombinować z typami celów i np. dziesiątkami tabel dla dziesiątków typów celów (słaba wydajność zewnętrznego złączania tylu tabel). Ewentualnie trzymać jakieś dodatkowe informacje rozróżniające "udaj się do karczmy" od "wytnij wrogów x". Jeszcze większą swobodę da ci baza no-sql (jakaś grafowa), która pozwoli ci bardzo łatwo łączyć zadania z cegiełek i pozwoli na zapętlenia (w relacyjnych bazach bardzo źle się symuluje grafy cykliczne, ale jest to możliwe). Wady: ciężko znaleźć coś "dla opornych" na ten temat.

    Pamiętaj, że możesz używać serializacji i funkcji eval. Dzięki temu możesz wygodni zapisywać obiekt zadania i przywracać go kiedy będzie ci potrzebny. Będziesz wtedy mógł trzymać w bazie obiekty zadań poskładane z fragmentów zaimpelmentowanych w kodzie. De facto oddzielisz w ten sposób kod zadań od kodu programu jednocześnie mając pełną swobodę. Moim zdaniem bardzo wygodnie rozwiązanie do zapamiętywania "postępów" graczy, ale nieelegancie do tworzenia w ten sposób zadań. Wady: niemożliwe (bardzo trudne) wyciąganie wniosków o tym kto jak daleko doszedł i co mu zostało z poziomu bazy danych.
    Ostatnio edytowane przez matips ; 19-12-2012 o 23:55
    Respice post te hominem memento te cave ne cadas

  5. #5
    Zasłużony Awatar karer
    Dołączył
    Apr 2008
    Posty
    2,554

    Domyślnie

    matips albo moze po prostu zrobic sposobem ktory opisales jako "brak jakiejkolwiek elastyczności" ale zrobic to madrzej niz ty przedstawiles i dzieki nieszablonowemu mysleniu uzyskac elastycznosc tego sposobu. Blednie okresliles ten sposob i blednie zinterpretowales pojecie tabeli w tym wypadku. Brak elastycznosci wprowadzaja pozostale rozwiazania ktore podales.

    Radze uzywac rozwiazania numer jeden poniewaz jest BARDZO ELASTYCZNE wlasnie ze wzgledu na zwolnienie bazy danych z roznorakich zadan laczenia tabel. Tworzenie nowych typow zadan dzieki temu byloby bardzo latwe i w zasadzie przyjemne poniewaz nie posiadamy wtedy zadnych narzucen odgornych ze strony bazy danych. W zasadzie mamy kontener na nasze dane jakiego tylko chcemy typu

  6. #6
    Zarejestrowany
    Dołączył
    Dec 2007
    Posty
    241

    Domyślnie

    Czy to "nieszablonowe" myślenie polega na trzymaniu w bazie, w każdej entce typu zadania oraz listy argumentów dla konstruktora? Mi się to wydaje nieelastyczne, bo co jeśli będziemy chcieli wymyślić zadnie o 10 parametrach, a w bazie mamy tylko 7 kolumn? Wtedy będziemy musieli zrobić dodatkowe 3 i mieć dużo pustych pól w pozostałych rekordach. Jeśli nie takie rozwiązanie, to w jednym polu tekstowym trzymasz zserializowaną tablicę argumentów.
    Po drugie nie jesteś w stanie takiej tabeli łączyć z czymś innym - co jeśli w polu parameter1 masz liczbę 13 to bez przeanalizowania pola taskType nie wiesz czy powinieneś wyciągąć dane potwora o id = 13, czy może chodzi o gracza o id = 13. Z drugiej strony widziłem już rozwiązania gdzie dla każdego pola było pole z nazwą tabeli do której jest "kluczem" obcym.
    Ostatnio edytowane przez matips ; 20-12-2012 o 11:04
    Respice post te hominem memento te cave ne cadas

  7. #7
    Zasłużony Awatar karer
    Dołączył
    Apr 2008
    Posty
    2,554

    Domyślnie

    Sam sobie odpowiadasz na pytania i mnozysz problemy ponad norme.

    Jak masz 7 kolumn a potrzebujesz 10 to dodajesz 3 kolumny. Mozesz zastosowac system cachowanie w tym wypadku i jesli bedzie za duzo pustych pol w tabeli to trzymasz te pola zserializowane w ostatniej kolumnie tabeli. Nic nie stoi na przeszkodzie zeby struktura takiej tablicy byla dynamicznie dostosowywana do ilosci roznorakich zadan.

    Po drugie nie jesteś w stanie takiej tabeli łączyć z czymś innym - co jeśli w polu parameter1 masz liczbę 13 to bez przeanalizowania pola taskType nie wiesz czy powinieneś wyciągąć dane potwora o id = 13
    Od czego mamy pliki php?

    I tabela powinna miec strukture "par1, par2, par3... parN" dzieki czemu to kontroler zajmuje sie tym ktory parametr czemu odpowiada.

  8. #8
    Zarejestrowany
    Dołączył
    Dec 2007
    Posty
    241

    Domyślnie

    Tak, ale wtedy nie potrzebujesz rozdzielać zmiennych na par1, ... parN. Jeśli par1 jest to np. dla zadnai zabij_coś par1 to ID_potwora, to by wyświetlić użytkownikowi informacje o potworze musisz najpierw wyciągać ten rekord, zinterpretować typ zadania i dopiero wtedy możesz dopytywać bazę danych o opis potwora. Nie widzę żadnej przewagi takiego rozwiązania nad polem z kodem PHP trzymającego coś w stylu: new tajemneZadanie("jakiś opis", 13, 998, 43)
    Respice post te hominem memento te cave ne cadas

  9. #9
    Zasłużony Awatar karer
    Dołączył
    Apr 2008
    Posty
    2,554

    Domyślnie

    Jesli nie widzisz przewagi to nie wiem dlaczego to napisales zamiast poczytac pare kursow. Masz racje, po co komu baza danych ^^

  10. #10
    Aktywny
    Dołączył
    Jul 2008
    Posty
    866

    Domyślnie

    Par1 może być varcharem.

    K-356-4-7

    $obv = explode("-"; "K-356-4-7)
    switch.. case.. K = kill, zabij; F = fetch, find, przynieś; T = talk, porozmawiaj..
    getMonsterById(356) - > name;
    echo Pokonano: getMonsterById($obv[2]) - > name; $obv[3] . "z" . $obv[4]

    Coś w tym stylu. ;d
    Zabij getMonsterById(356)


    explode ftw, funkcja przeciwna to implode, więc nie ma problemu z zapisaniem tego znowu do bazy danych..
    zależy od stopnia skomplikowania zadań..


    NIGDY nie trzymaj potworów w bazie danych.. To idiotyzm. W bazie danych nie trzymałbym stałych rzeczy, po co Ci zbędne zapytania..

Strona 1 z 2 12 OstatniOstatni

Informacje o wątku

Użytkownicy przeglądający ten wątek

Aktualnie 1 użytkownik(ów) przegląda ten wątek. (0 zarejestrowany(ch) oraz 1 gości)

Podobne wątki

  1. System zadań
    Przez zabka229 w dziale Budowa gry via www
    Odpowiedzi: 23
    Ostatni post / autor: 24-03-2012, 11:08
  2. Tworzymy system budnyków w grze MMORTS
    Przez Kemsan w dziale Budowa gry via www
    Odpowiedzi: 4
    Ostatni post / autor: 15-03-2010, 14:59
  3. [1.0.9] Tło w grze
    Przez TeRoQ w dziale Support Vallheru
    Odpowiedzi: 2
    Ostatni post / autor: 12-10-2008, 11:08
  4. Tło w grze :)
    Przez PICHU w dziale Support Vallheru
    Odpowiedzi: 2
    Ostatni post / autor: 27-04-2008, 19:50
  5. Złoto w grze
    Przez matips w dziale Problemy przy tworzeniu własnej gry
    Odpowiedzi: 1
    Ostatni post / autor: 09-12-2007, 20:20

Zakładki

Uprawnienia umieszczania postów

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •