gra w statki - koncepcja

gra w statki - koncepcja
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:3561
0
leonpro778 napisał(a):

Ale jakiego wyścigu? Chodzi o wykonanie skryptu zanim poprzedni się skończy?

Znów musimy odróżnić

  • wyścig na aktywną akcję (nalezy blokować użytkownikowi, który nie ma prawa wykonać ruchu)
  • asynchroniczne pobieranie / wyświetlanie - a niech sobie będzie ile chce jednocześnie
leonpro778 napisał(a):

To już musisz sobie sprawdzać po stronie serwera. Przykładowo - jest tura gracza A, w tym czasie co nie nacisnąłby gracz B to żaden endpoint mu "nie odpowie" poprawną odpowiedzią

I to jest ta wskazówka

szatkus napisał(a):

Możesz na razie iść w tym kierunku, w którym idziesz czyli wersja offline w JS. Jak już będziesz miał to gotowe to rozbij kod na część kliencką i serwerową (jakbyś zmienił PHP na JS to nawet nie musisz się przejmować różnicami w składni), a w punktach styku postaw obiekty do wysyłania/obsługi zapytań. Ma to taką wartość edukacyjną, że od razu wyjdzie, co sknociłeś w oryginalnym projekcie.

Potem zmień kawałek kodu do przechowywania stanu gry na bazę danych, a AI na człowieka grającego na innej przeglądarce.

Ja sam bym sie zakopał, jakbym zaczął od wesji single - JS only, nie objął bym myślą / intelektualnie
Być może właściwą radą jest może nawet i single, ale posiadające serwer (wtedy jeszcze jakiś uproszczony)

O ile bym znał jakiś inny język "serwerowy", bym w nim pisał nie (tylko) dlatego, że PHP nie lubię, ale PHP jest bardzo ubogi w strukturach danych, właściwie jedyną strukturą jest baza danych.
W Javie / C# / Pytnonie demon serwera gry by trzymał po prostu tablicę (gry by nie miały historii, ale robiłbyś lekką istotę algorytmu, a nie ciezką administrację)


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 1x, ostatnio: AnyKtokolwiek
K8
kosmonauta80
Niby PHP jest ubogi, a jednak mamy już PHP8 ;)
AK
Sama instytucja "wywołania skryptu" jest uboga, stary rodowód to ma. To jest jak seria pojedynczych strzałów. Oprogramowanie serwerowe z trwałą (np javowskie), zdefiniowaną częścią "rezydentną" ma dodatkowe ciekawe możlwiości
K8
kosmonauta80
Zgoda. Java odpada, jedynie .NET w moim przypadku wchodzi w grę. Tylko - przy moim doświadczeniu w C# - czy to nie będzie porywanie się z motyką na słońce? Inna sprawa, że JS cholernie mi pasuje i w tym chce się rozwijać.
AK
JA nie jestem pehapowy, wiec moje rady są w pełni nieobiektwyne
K8
K8
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
0

Dobra, dzięki za dyskusję. Teoretycznie da się to zrobić przy pomocy zaproponowanego stosu. Zanim jednak na poważnie się za to wezmę, to przeprowadzę kilka prób. Konkretnie sprawdzę, czy faktycznie to zadziała w systemie turowym.

AK
System turowy to .... daaaalece, dalece gdzie indziej, inny etap, wykończenie gry a nie początek
Sarrus
  • Rejestracja:około 14 lat
  • Ostatnio:4 dni
  • Postów:2512
0

Jeżeli chodzi o race condition, to żadnego tu nie widzę. Musisz zabezpieczyć przede wszystkim po stronie serwera, żeby gracz, którego nie jest kolej, nie mógł zmienić stanu planszy.

PHP jest najgorszym językiem w jakim przyszło mi pisać, ale jeżeli chcesz to jasne - da się. Będziesz jednak skazany na bazę danych do przechowywania. W sumie to nawet ciekawy problem.

Czy zastanawiałeś się już jak będziesz przechowywać dane? Ja bym widział dwa wyjścia, albo każde pole w postaci rekordu, albo cała plansza w jednej krotce. Może to być w postaci ciągu znaków. Ciąg taki miałby n*m znaków (wysokość i szerokość planszy) i każdy znak to np. 0 - puste, 1 - strzał, 2 - statek, 3 - statek zatopiony. W ten sposób ograniczysz operacje na bazie.

edytowany 1x, ostatnio: Sarrus
K8
K8
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
0

Nad przechowywaniem danych w bazie jeszcze pomyślę. Na pewno będą 2 tabele:
a) historia rozgrywek
b) aktualna rozgrywka i tutaj zawsze na początku byłoby polecenie Truncate

Co do alternatyw, to widzę tylko 2:
a) .NET
b) nodeJS

L7
  • Rejestracja:ponad 13 lat
  • Ostatnio:3 dni
  • Postów:433
1
kosmonauta80 napisał(a):

b) aktualna rozgrywka i tutaj zawsze na początku byłoby polecenie Truncate

Eeee? Mogę wiedzieć po cholerę Tobie truncate?

edytowany 1x, ostatnio: leonpro778
AK
@leonpro778: w pełni zgadzam się. @kosmonauta80 zacznij od najprostszej gry, potem zrobić wszechświatowy serwis gier
K8
K8
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
0

Zaczynam grę, tworzę planszę, czyli tabelę o układzie, który wymaga jeszcze przemyślenia.
A co ze startą? Pasuje skasować, nie jest potrzebna. Truncate jest szybsze niż Delete. Ponadto Truncate tak naprawdę robi "reset" tabeli.

L7
  • Rejestracja:ponad 13 lat
  • Ostatnio:3 dni
  • Postów:433
3

Ok, nie obraź się teraz ale lepiej rzeczywiście zacznij od czegoś prostszego. Zapomnij o multiplayer tylko zacznij od kółko i krzyżyk w przeglądarce. Będzie łatwiej.

Zobacz pozostały 1 komentarz
L7
Czemu skrótów myślowych, po prostu jak zobaczyłem truncate do tego projektu to zobaczyłem, że dążysz do tego złą drogą :) Podpowiem też jeszcze jedno, w stworzeniu kółko i krzyżyk też nie używaj truncate :)
K8
kosmonauta80
Też prawda, to nie baza danych licząca 1000000 rekordów :)
L7
No właśnie, nadal nie rozumiesz :) Podpowiem tylko, po co używać truncate skoro w tabeli games możesz trzymać WSZYSTKIE gry (nie ma znaczenia czy trwające czy zakończone) i tam automatycznie będziesz miał tworzoną historię.
K8
kosmonauta80
Po co trzymać w tabeli informację w postaci układu planszy powiedzmy 10x10 pól? Pisałem o 2 tabelach: na historię wyników i bieżącą rozgrywkę. Podczas rozgrywki gdzieś muszę przechowywać aktualny stan planszy. Potem zliczam punkty, zapisuję w 2 tabeli, a planszę kasuję.
L7
@kosmonauta80: Weź sobie sytuację, że grają sobie DWIE osoby, zaczęły o 12:00. O godzinie 12:10 wchodzą INNE dwie osoby, naciskają NEW GAME i... jak myślisz co się wtedy dzieje (biorąc pod uwagę oczywiście, że Twoje truncate działa). No właśnie, nie dali tamtym skończyć :) Druga opcja, nie "czyścimy" tej tabeli. Mamy wówczas historię PLANSZ (tak, plansza to nie to samo co gra), jesteśmy w stanie odtworzyć przebieg całej rozgrywki (jeżeli do tego dodamy logowanie wszystkich ruchów) a także wyświetlenie planszy w dowolnym jej momencie.
Delor
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
0

Po co trzymać w tabeli informację w postaci układu planszy powiedzmy 10x10 pól? Pisałem o 2 tabelach: na historię wyników i bieżącą rozgrywkę. Podczas rozgrywki gdzieś muszę przechowywać aktualny stan planszy. Potem zliczam punkty, zapisuję w 2 tabeli, a planszę kasuję.

Zapisz stan początkowy i historię ruchów w rozgrywce.
Stan aktualny wyliczysz z powyższych. To zapewni pełną historię.
Nie oszczędzaj miejsca w bazie.

EDIT: Doczytałem i widzę że ciągle myślisz jakby cały serwer był zarezerwowany wyłącznie na aktualną rozgrywkę dwóch osób. Wymyśl jak sprawić aby serwer był w stanie obsługiwać naraz wiele par graczy.

edytowany 4x, ostatnio: Delor
K8
kosmonauta80
Serio myślicie, że od początku nie miałem świadomości tego ograniczenia? :)
Delor
To ograniczenie oznacza że nie potrzebujesz serwera. Wystarczy bezpośrednie połączenie pomiędzy dwoma graczami. A to wypacza trochę sens tego o co cały czas pytałeś.
L7
@kosmonauta80: No właśnie takie wrażenie odniosłem. Szczególnie jak napisałeś truncate :)
K8
kosmonauta80
Pisałem coś o skrótach myślowych... ;)
Delor
W wątku jest prawie 40 postów. Najwyższy czas te skróty już rozwinąć.
K8
K8
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
1

Zacząłem w ramach rozgrzewki wersję single player w czystym JS. Jak zakończę, to pokażę w dziale Code Review. Wykorzystane doświadczenia wykorzystam też do podjęcia decyzji co dalej.
A na razie umownie zamknijmy wątek. Wiem już mniej więcej, na co się porywam.

K8
K8
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
0

Oto wersja singleplayer napisana w JS:
gra w statki - single player (szybki projekt)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.