gra w statki - koncepcja

gra w statki - koncepcja
K8
K8
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
0

Przymierzam się do napisania projektu zaliczeniowego. Uznałem, że gra w statki będzie odpowiednia. Z jednej strony spełnia wymagania co do złożoności projektu, z drugiej strony dużo można się nauczyć. Stos przy pomocy którego zamierzam to zrealizować, to HTML/CSS/JS/PHP. I moje pytanie dotyczy tego ostatniego.
Chcę zrobić to tak, że gra będzie umieszczona na jakimś serwerze. Każdy chętny loguje się i może rozpocząć grę. Założenie jest jednak takie, że gra może odbyć się tylko wtedy, gdy w danym momencie zalogują się 2 osoby. Czyli odpalam to przeglądarką w normalnym trybie oraz incognito.
Czy takie coś da się zrealizować w gołym PHP? O ile mechanikę gry (reakcja na naciśnięcie, zliczanie punktów itp zrealizuję w JS), to pozostałą część może zrobić tylko serwer.

masterc
czyli jak sie zaloguja 3 osoby w danym momencie lub wiecej niz 2 to nikt nie bedzie mogl grac tak?
K8
kosmonauta80
Na razie takie jest założenie.
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 godzin
  • Postów:3516
3

Oczywiście możesz to zrobić i w gołym PHP i w ubranym też.
Zliczenia punktów i tego typu rzeczy też powinieneś zrobić po stronie serwera.

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

Gdyby to była gra stworzona jako program do grania z "komputerem", to sprawa wydaje się prosta. Ale im więcej myślę, tym bardziej mam wrażenie, że webowa wersja tej gry jest trudniejsza w implementacji. Już nie mówiąc o tym, że to ma być dla 2 fizycznych graczy. No i właśnie, jak zrobić, by gracze korzystali z tej samej planszy? Wychodzi na to, że po stronie serwera potrzebna jest jakaś baza danych typu tablica 10x10. A po stronie przeglądarki jakieś automatyczne odświeżanie planszy po ruchu przeciwnika. Ewentualnie utworzyć 2 tablice dla każdego gracza.

edytowany 1x, ostatnio: kosmonauta80
AK
Tak, myślę że początkowej trudności troszkę niedoceniłeś
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 godzin
  • Postów:3516
0

Jeśli chcesz trzymać wyniki gier, czy historię to tak. Jeśli nie to wystarczy tworzyć kolejne instancje klasy Board.

Sarrus
W php nie jestem na bieżąco, ale czy przypadkiem php nie jest bezstanowy? W sensie, że nie możesz współdzielić obiektu pomiędzy sesjami.
jurek1980
Normalnie jest :)
K8
K8
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
0

Kolejna konkluzja: klasa Board to tak naprawdę kod HTML wyświetlający tabelę 10x10, gdzie każda komórka to element typu form, którego wartość za każdym razem wysyłam POSTem. Dobrze myślę, czy można prościej?

AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:3561
1
kosmonauta80 napisał(a):

Kolejna konkluzja: klasa Board to tak naprawdę kod HTML wyświetlający tabelę 10x10, gdzie każda komórka to element typu form, którego wartość za każdym razem wysyłam POSTem. Dobrze myślę, czy można prościej?

I tak, i nie. Widzę, ze słowo "tablica" u ciebie zmienia znaczenia.
Rzeczywiście jest znaczeń kilka.

  • tablica - widok, View, w jakimś sensie jest prawdą, że tworzysz dwie, i że jest to HTML, bo View jest per-user, i ostatecznie rzecz biorąc jest w jego przeglądarce.
  • tablica - Model, struktura danych (baza) na serwerze, która odwzorowuje stan gry. Elementy (maszty statków) maja właściciela, i dla tego drugiego są niewidoczne (do chwili trafienia).

Bo C to najlepszy język, każdy uczeń ci to powie
K8
K8
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
0

Zgadza się, pisząc tablica mam na myśli to co widać oraz to, co generuje sam PHP.
Zastanawiam się teraz, czy JS jest tu potrzebny, skoro każde kliknięcie tak naprawdę to wywołanie skryptu php.
Jedyne zastosowanie JS jakie widzę, to gra z "komputerem". Bo mogę zrobić grę w wersji 1-osobowej, oraz 2-osobowej.
Niby proste z początku, a jednak złożoność narasta liniowo :) W sumie dobrze, bo to ma być na zaliczenie semestru.

AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:3561
2

JS i tak użyjesz, aby w ludzki sposób odświeżać ekran po ruchu przeciwnika (bo nie jakieś pragrmy refresh sprzed 30 lat).

A skoro już mamy JS, to nie wiem, czy 10*10* Form (sumbit = post) to dobra wizja (bo jakaś wizja to na pewno jest).
Czy może JavaScriptowy OnClick ?

Dynamikę możesz uzyskać na sposób REST/SPA (dominująca rola frameworku client-side) albo nieco więcej angażującą PHP metodą na AJAX (produkcja świeżego fragmentu / tablicy View na serwerze). Tradeof m.in w którym języku się lepiej czujesz.

To takie luźne myśli z dystansu, od faceta, który tego nie uprawia.


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 2x, ostatnio: AnyKtokolwiek
K8
K8
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
0

Generalnie to głowię się nad tym, jak za każdym razem wyświetlić aktualny stan tablicy. Gdzieś ona musi być przechowywana. Jeżeli dobrze rozumiem co piszecie, to można to uzyskać BEZ bazy danych na serwerze.

Delor
Dane gdzieś musisz trzymać. W bazie często jest najwygodniej.
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 godzin
  • Postów:3516
0

Możesz mieć przecież klasę Gra/Game.
Która zawiera klasy User - dwa takie pola bo dwóch graczy. Klasa Game ma też pole Board/tablica.
Za każdym razem jak rozpoczyna się nowa gra tworzysz po prostu nową instancję klasy Game i dodajesz ja sobie do jakiejś listy obecnie trwających gier.
Dane o tym gdzieś rozlokowane są statki i czy jakiś jest już zatopiony trzymasz w klasie Board. Na upartego niczego nigdzie nie zapisujesz.

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

Tylko gdzie i jak długo będzie istniał obiekt klasy tablica? W przypadku programu -> w pamięci komputera, w przypadku serwera - jeżeli dobrze rozumuję - klasa czy zmienna istnieją tylko podczas wykonywania skryptu.

Chodzi o to, żeby na 2 przeglądarkach pokazywało się to samo "źródło".

edytowany 1x, ostatnio: kosmonauta80
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 godzin
  • Postów:3516
0

No to masz zmienne globalne które jak nazwa wskazuje działają globalnie.
Lista/tablica/array (opis żebyś nie mylił z tablicą samej gry) gier może być wtedy taką zmienna globalną.
Wszystko jest trzymane w pamięci serwera.
https://www.php.net/manual/en/language.variables.scope.php
Żeby nie było, że zalecam takie działanie ale rozmowa poszła w tym kierunku.

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

Teraz ma to sens. Zupełnie zapomniałem o takich zmiennych - uroki aplikacji webowych :)
Nie wiem jeszcze, czy w tym kierunku to pójdzie, ale tak czy inaczej trochę się dowiedziałem. Czyli albo zmienna globalna, albo baza danych i AJAX.
Dodam, że chcę to napisać nie stosując frameworków.

edit a może jednak nie...

edytowany 1x, ostatnio: kosmonauta80
Sarrus
  • Rejestracja:około 14 lat
  • Ostatnio:4 dni
  • Postów:2512
0

@jurek1980: Nie mam pewności, ale z tego co wiem to PHP jest bezstanowe. Nawet globalne zmienne nie zachowają wartości. W źródle które podałeś, nie ma o tym słowa. Czy jesteś tego pewien? Sprawdzałeś to w jakiś sposób?

EDIT: Tu ktoś zadał takie pytanie i odpowiedź potwierdza mój punkt widzenia:
https://stackoverflow.com/questions/1435959/reading-and-writing-global-variables-across-scripts-in-php

edytowany 2x, ostatnio: Sarrus
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 godzin
  • Postów:3516
0

@Sarrus: tak.
Trochę źle zrozumiałem pytanie. Masz rację.
@kosmonauta80 tak musisz gdzieś sobie zapisywać gry w bazie/Pliku.

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

I się wyjaśniło.

Jak teraz zrealizować odświeżanie? Myślałem o:

Kopiuj
header('refresh: x;');

Czyli co sekundę zaciągamy dane (układ planszy, czyja tura, ile strzałów) z bazy danych. Dobre/złe rozwiązanie? Oczywiście przed każdą rozrywką Truncate danej tabeli.

AK
To jest archaiczne -> użyj AJAX
K8
kosmonauta80
Czyli co sekundę JS by sprawdzał, czy moja tura? Układ planszy to jedno (zmienia się po kliknięciu), ale jeszcze jest oczekiwanie na moją kolejkę. Wychodzi na to, że JS powinien okresowo sprawdzać flagę mojej tury i na podstawie tego odblokowywać możliwość klinkięcia.
Delor
Zrób w ten sposób. Jak już będziesz miał działającą aplikację możesz popatrzeć na https://en.wikipedia.org/wiki/WebSocket lub https://en.wikipedia.org/wiki/Server-sent_events.
Sarrus
  • Rejestracja:około 14 lat
  • Ostatnio:4 dni
  • Postów:2512
1

@kosmonauta80: Proponuję tobie podzielić problem na części:

Najpierw musisz zastanowić się jak będziesz przechowywać dane gry i kiedy je czyścić. W przypadku PHP zostaje baza danych, ale może poszukać innych technologii? Może ASP.NET, Node.js albo inne (Python?).

Drugą sprawą jak wymieniać klient-serwer. Możesz albo zastosować API RESTowe, albo jakiś endpoint do którego będziesz wysyłać obiekty z danymi. Tak czy owak po stronie klienta odświeżaniem powinien się zajmować JS.

Ostatnia sprawa to prezentowanie elementów dynamicznych na stronie (statki, strzały) - tutaj jeżeli nie znasz frameworków to czysty js ewentualnie jQuery (nie krzyczeć). Albo jeżeli chcesz się uczyć to możesz zastosować Vue.js.

EDIT: pytanie ile masz na to czasu? Bo jak się porządnie za to zabrać to miesiąc może być mało :)

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

Owszem, zagadnienie dzielę na etapy. Na przykład widzę już, że grę z "komputerem" można zrealizować po stronie przeglądarki i do tego wystarczy JS. Z tym sobie poradzę.

Jeżeli chodzi o AJAX, to w tym temacie mam takie doświadczenia:

  • odczyt JSON na innym serwerze
  • odczyt endopinta z nierelacyjnej bazy danych

Co do czasy, to do końca września chciałem to ogarnąć. Także spokojnie.

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

Baza danych musi być tak czy inaczej: raz wymagania do projektu, dwa gdzieś muszę trzymać dane typu hasło/login użytkownika, czy historia wyników.

A może tym tropem pójść?
Filtrowanie danych z MySQL i generowanie JSON

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

Sam pomysł stworzenia takiej gry jest dość ciekawy, szczególnie w trybie "multiplayer" (osobiście nie bawiłbym się w tryb single :) ). Tak naprawdę to do stworzenia czegoś takiego potrzebujesz:

  1. JS na front
  2. Punkty API (chyba najlepsza opcja komunikacji front + backEnd)
  3. Baza MySQL

Oczywiście sposób komunikacji to moim zdaniem tylko JSON :)

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

Klikam na planszę -> JS wywołuje skrypt PHP -> skrypt PHP odczytuje/zapisuje bazę danych (MySQL na chwilę obecną) -> skrypt PHP generuje JSON -> JSON odczytuje JS i uaktualnia planszę.

Może tu wystąpić problem wyścigu, czy przesadzam?

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

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

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

Tak.

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

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ą

masterc
  • Rejestracja:około 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:425
0

zdrknij jak w jednym pliku zrobila to LIZA xD haah sory ze zniszczylem ci ego: https://gist.github.com/lizparody/528badd08958943a7d309195b824f25d


Wymyśliłem, że nie chce mi się.
K8
K8
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
0

Tak jak pisałem, wersja 1-osobowa jest do ogarnięcia w samym JS. Tymczasem mnie interesuje wersja 2-osobowa oraz logowanie historii rozgrywek.

Zacząłem już nawet eksperyment z JS :)

Screenshot-1

edytowany 2x, ostatnio: kosmonauta80
L7
  • Rejestracja:ponad 13 lat
  • Ostatnio:3 dni
  • Postów:433
0

@masterc: Ale to nawet nie jest to o czym tutaj pisaliśmy. Rozmowa była o trybie player vs comp a tutaj...strzelamy i patrzymy czy coś trafiliśmy także sorki ale do "zniszczenia ego" to jeszcze sporo zabrakło.

@kosmonauta80: jeżeli chodzi o sam projekt to kiedyś pisałem sobie takie coś (żeby przetestować angulara). https://github.com/leonpro778/simpleGame - bez php :)

K8
kosmonauta80
Bez serwera nodeJS tego nie odpalę, prawda?
L7
Czemu? http://luk-star.pl/simplegame/ wersja live na normalnym hostingu. Pamiętaj, tutaj nie ma PHP :)
masterc
  • Rejestracja:około 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:425
0

Algorytm jest prosty bardzo

1 Zaczyna gracz A
2. Do planszy w tabeli rozgrywki (games) jest wpisanych dwoch graczy id gracza A oraz id gracza B oraz flaga ruchu

Tabela Boards
id | public_name | owner_id
---------------- | -------------------
1 | graz z lamusem | 3

czyli gracz nr 3 stworzył gre i zaprasza użytkownika teraz tabela uzytkownikow

Tabela Games
id | board_id | player_id | move
---------------- | -------------------
1 | 1 | 3 | true
1 | 1 | 8 | false

i to wszystko. jesli gracz A ma flage move to graczowi B blokujesz mozliwosc klikania, ub jesli kliknie to tez nic sie nie stanie bo API odrzuci jesli ma flage move = false jak zrobisz to na nodeJS to lepiej bo w tle nie trzeba bedzie odswiezac AJAXEM zapyatani czyj ruch.


Wymyśliłem, że nie chce mi się.
edytowany 3x, ostatnio: masterc
K8
K8
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
0

A wiecie jak to skomplikować? Zezwolić na ręczne rozmieszczanie statków :)

masterc
wiemy ale to twoj projekt i nikt za cb nie bedzi episal tego. wiec wroc z kodem i zadaj pytanie
K8
kosmonauta80
czy ja napisałem, że oczekuję kodu?
szatkus
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 3 lata
  • Postów:227
0

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.


𐤃𐤐𐤀
masterc
Albo zlec na useme zeby ci ktos napisal a ty przeANALizujesz kod

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.