Jak wdrożyć w mojej grze system programowania, który jest zarówno dostępny, wydajny, jak i szybki do programowania?


15

Obecnie pracuję nad kosmiczną grą typu sandbox, która w dużym stopniu będzie oferować możliwość niestandardowego programowania systemów. Chcę to wdrożyć w sposób, który jest jednocześnie

  1. dostępny,
  2. potężny (absolutne minimum byłoby kompletnością Turinga)
  3. szybkie w kodowaniu.

Języki tekstowe zasadniczo spełniają tylko dwa ostatnie wymagania i chociaż nie jest trudno zaprojektować język wizualny, który spełnia dwa pierwsze, języki wizualne są trudne do zaprogramowania ze względu na konieczność intensywnego używania myszy. Chociaż istnieje kilka bardzo dostępnych języków tekstowych, chcę, aby kompletni nieprogramiści mogli ułatwić sobie programowanie.


Będę zaskoczony, jeśli ktoś da ci przykład. Ponieważ naprawdę uważam, że wymaga to dogłębnych badań (takich jak sposób, w jaki ludzie stosują logikę, a co nie, czynniki psychologiczne i wszystkie te skoncentrowane na ludziach rzeczy)
Sidar

2
Nikt nie wspomniał o zadrapaniu?
Russell

2
Nie zamierzam sugerować ścisłego głosowania, ale chcę zauważyć, że dość łatwo mieści się to w kategorii „Jeśli możesz sobie wyobrazić całą książkę, która odpowiada na twoje pytanie, zadajesz zbyt wiele” kategorii pytań, których nie należy zadawać z FAQ; jest to bardzo trudny problem i chociaż ludzie tutaj mogą udzielać porad, jest to problem, który prawdopodobnie leży poza granicami witryny SE do rozwiązania.
Steven Stadnicki

Warto zauważyć, że kompletność Turinga można osiągnąć dzięki grze Conwaya w życie , Minecraftowi i innym takim systemom nieprzeznaczonym do programowania.
Czy

Odpowiedzi:


10

Naprawdę jedynym sposobem na posiadanie wszystkich funkcji jest wdrożenie wielu interfejsów. Dostępne i potężne to często dwa końce spektrum. Najłatwiejszym sposobem na to jest wdrożenie potężnego systemu, który ma dodatkowy interfejs umożliwiający początkującym interakcję z systemem w intuicyjny sposób.

Pozwalając na system, który pozwala początkującym programować wizualnie, być może coś podobnego do narzędzi programistycznych Lego Mindstorms :

wprowadź opis zdjęcia tutaj

Gdzie są elementy przeciągnij / upuść. Komponenty mają wejścia i wyjścia. Elementy mogą być proste rzeczy, jak AND, lub ORbramy, lub bardziej skomplikowane jak test na pobliskich wrogów.

Najlepiej byłoby, gdyby reprezentacja wizualna kompilowała skrypt w języku pisanym w tle. Jest to także potężne narzędzie do nauki języka. Jeśli początkujący może „napisać” swój program wizualnie, to przeczytaj kod, który tworzy, o wiele bardziej prawdopodobne, że go zrozumie i będzie mógł zmodyfikować wygenerowany kod. W końcu jest w stanie napisać mocniejszy kod niż pozwalają na to same narzędzia wizualne. Spełnia to wymóg ułatwienia użytkownikom programowania.

Podstawą systemu jest oczywiście język pisany. Narzędzia wizualne mają po prostu dać użytkownikom szybki sposób na zaprogramowanie czegoś prostego i umożliwić początkującym rozpoczęcie pracy.

Język pisany pozwala zaawansowanym użytkownikom robić zaawansowane rzeczy. Możesz nawet pozwolić użytkownikom na tworzenie własnych komponentów, tworząc niestandardowe skrypty. Następnie mogą ponownie wykorzystać komponenty wykonane w szybkim i łatwym interfejsie do szybkiego programowania.

Powodzenia! Brzmi jak fajny projekt.


Dziękuję za wyjaśnienie. Właściwie to myślałem o zrobieniu czegoś takiego jak NXT-G, ale z doświadczenia wiem, jak trudno jest tworzyć skomplikowane programy w takim języku. Uwielbiam pomysł konwertowania programów wizualnych na kod, umożliwiając graczom cofanie się i edycję tekstową programów, gdy są bardziej doświadczeni, więc prawdopodobnie z tego skorzystam.
Dimitriye98

1
Uważaj, że łatwo jest wygenerować kod skryptu z graficznych reprezentacji, ale bardzo trudno jest wygenerować (znaczącą i czytelną) graficzną reprezentację ze skryptu. Prawdopodobnie skończysz z bardzo ograniczoną własną składnią skryptową.
Imi

1
Z tego powodu nie jest prawdopodobne, abyś wdrożył skrypt-> wizualny. Trzymaj się wizualnie> skrypt.
MichaelHouse

Makro-bloki (bloki, które zapewniają wejścia / wyjścia i możliwość umieszczania bloków pamięciowych w środku) mogą być użyte do zapewnienia hierarchii, enkapsulacji i ponownego wykorzystania w celu ułatwienia tworzenia złożonych programów. Tylko upewnij się, że nie możesz umieszczać makr wewnątrz makr lub wykryjesz takie przypadki ... Znam co najmniej jeden program, który nie wykrywa takich nieskończonych pętli.
Exilyth,

5

Możesz rzucić okiem na blokadę Google , łączą elementy wizualne z rozpoznawalnymi warunkami programowania, zachowując dość przyzwoity poziom dostępności.

wprowadź opis zdjęcia tutaj

Możesz zobaczyć inspirację w wersji demo Maze , wielu moich nieprogramowych przyjaciół było w stanie przejść przez łamigłówki, spełniając przynajmniej niektóre z twoich kryteriów.


Ciekawy język z punktu widzenia dostępności, jednak programowanie w nim jest bardzo wolne (właśnie próbowałem) ...
Pasha

@PashaS Rzeczywiście jest, tak sądzę, że jest to część ceny, którą musisz zapłacić, aby spróbować uzyskać jak najlepszy z obu światów.
Quetzalcoatl

4

Dziwię się, że nie wspomniano o tym wcześniej, ale Scratch MIT wykorzystuje interfejs blokowy, który można szybko kodować. Pozwala użytkownikom tworzyć własne funkcje i może być zaskakująco skomplikowany dla języka, który został zbudowany, aby uczyć dzieci, jak kod.

Stencyl to kolejny przykład kodowania blokowego, który robi coś bardziej podobnego do tego, czego chcesz. Kodowanie za pomocą takich bloków jest o wiele bardziej wydajne i mniej czasochłonne niż wizualne interfejsy programowania, takie jak te używane przez Lego NXT. Stencyl pozwala użytkownikom kodować w ActionScript lub blokach.

Przepraszam za brak zdjęć, nie mam jeszcze wystarczającej reputacji, aby zamieszczać zdjęcia.


2

Język programowania BPEL ma reprezentację wizualną i wiele współpracujących z nim narzędzi. Jest to język przepływu pracy, a nie język programowania, ale jest on kompletny. Jest pełny, ale łatwo jest pisać zarówno dla programistów, jak i biznesmenów i łatwo można go przełożyć z formy wizualnej na tekstową. Nie sądzę, żeby był dobrym językiem gry, ale może być źródłem inspiracji. Biorąc pod uwagę ilość silników i narzędzi BPEL, powinno być możliwe ponowne wykorzystanie niektórych pomysłów i / lub kodu.

Język podobny do BPEL nie będzie przypominał programowania, a bardziej systemów routingu i łączenia. Możesz więc mieć system celowania podłączony do systemu broni z logiką pomiędzy nimi.


+1: Chociaż nie byłbym zwolennikiem samego BPEL, jego podejście jest dokładnie odpowiedzią, której bym udzielił. Bardzo regularny język, który jest łatwy do przedstawienia w tekście lub wizualnie i który bardziej koncentruje się na kierowaniu / reagowaniu na zdarzenia niż na bardziej „normalnych” paradygmatach programowania.
Sean Middleditch

1

Rozważ to podejście:

  1. Upewnij się, że logika skryptu jest wyrażalna w prostej mechanice opartej na regułach. Na przykład masz „Wyzwalacz” występujący podczas gry związany z „Warunkami”, które muszą zostać wypełnione, a następnie wykonywane są „Akcje” (bezwstydnie skradzione z edytora Starcraft 2).
  2. Następnie podaj interfejs, w którym możesz przeciągać i upuszczać określone predefiniowane akcje / warunki / wyzwalacze, a tym samym konstruować 90% przypadków użycia, które ludzie zazwyczaj chcą robić.
  3. Teraz uzyskaj potężny i popularny silnik skryptowy zintegrowany, taki jak Lua, Python lub C #
  4. Na koniec sam napisz kilkadziesiąt tych działań / warunków / wyzwalaczy w tym języku. Upewnij się, że dostosowujący użytkownik może łatwo kopiować-wklejać, edytować i integrować te i nowe akcje w edytorze przeciągnij i upuść.
  5. Prawdopodobnie chcesz sparametryzować swoje wyzwalacze, warunki i akcje, więc potrzebujesz kilku prymitywów więcej niż te trzy, np. „GameObject”, „Position”, „Number” lub „String”. W interfejsie użytkownika będziesz potrzebować kilku okien dialogowych, aby przypisać te parametry, ale nadal jest to o wiele mniej pracy niż gdybyś był w stanie konstruować całe skrypty za pomocą operacji interfejsu użytkownika.

To jest najszybszy sposób, w jaki mogę wymyślić wszystkie cukierki bez zbytniego bólu. Dostajesz noobów click'n'drag, a także vim-maniaków na pokładzie. A jeśli utrzymasz prostotę mechaniki (np. Trigger -> Condition -> Action), nie będziesz musiał spędzać wielu lat na opracowywaniu interfejsu użytkownika dla wydajnego i wciąż łatwego w użyciu edytora skryptów graficznych.

Kilka przykładów, aby wyjaśnić, co mam na myśli:

  • Wyzwalaczem może być: „Inicjalizacja frameworka gry”, „Gra załadowana”, „Jednostka utworzona”, „Jednostka zniszczona”, „Gracz uszkodzony” i tak dalej. Wyzwalacze zwykle mają pewne parametry (np. Utworzona jednostka dostaje utworzony obiekt GameObject)
  • Wszystkie warunki to standardowe logiczne i podstawowe warunki arytmatyczne (i / lub / nie / równa / większa ...) oraz niektóre typowe warunki, które można znaleźć w grze, takie jak „Jednostka jest w pełni zdrowa” lub „Przynajmniej dwóch graczy jest podłączonych”. Warunki zwykle mają parametr, który użytkownik musi wypełnić (za pomocą interfejsu użytkownika)
  • Działania to skrypty, które również mogą przyjmować prosty parametr. takich jak „Przesuń kamerę do XXX”, „Zabij jednostkę Y”, „Koniec gry”, „Uruchom wyzwalacz” i „Wywołaj akcje X, Y, Z ... w sekwencji”

Pamiętaj, że programowanie dotyczy komputerów w grze, a nie wtyczek. W każdym razie dziękuję.
Dimitriye98

Rozumiem ... to brzmi jak ciekawe podejście do gry;). Czy szukałeś podobnych gier, takich jak „Code Hero” lub „Garry's Mod”, które starają się zapewnić możliwości kodowania bez przerywania zanurzenia w grze? W każdym razie nadal możesz uratować moją podstawową radę i podzielić problem na skrypty i części interfejsu użytkownika. Powodzenia w grze. :)
Imi

Cóż, kodowanie będzie wykonywane na konsolach komputerowych w grze, co nie powinno zbytnio przerywać zanurzenia. Chociaż użytkownicy, którzy chcą, będą mogli kodować poza grą, to zaimportuj kod do swojego zapisu lub serwera, na którym grają.
Dimitriye98
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.