gra w statki - koncepcja

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.

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.

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.

0

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

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?

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).
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.

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.

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.

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.

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".

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.

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...

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

0

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

0

I się wyjaśniło.

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

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.

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 :)

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.

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

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 :)

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?

0

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

0

Tak.

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ą

0

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

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

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 :)

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.

0

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

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.

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