TicTacToe - połączenie dwóch graczy

0

Cześć.
Tworzę grę TicTacToe ale w ten sposób żeby połączyć ze sobą dwóch graczy przez sieć. Wymyśliłem to w ten sposób że ajaxem co sekundę pobieram z bazy stan gry i jeśli się zmienił to aktualizuje planszę. Ogólnie działa to bez problemu ale zastanawiam się jak pominąć bezsensowne pobieranie danych co sekundę gdy np. drugi gracz myśli nad ruchem minutę.

function startGame() {
    $("#game").css("display", "block");
    player["host"] = new Player(player1Name);
    player["host"].mark = "O";
    player["join"] = new Player(player2Name);
    player["join"].mark = "X";
    checkStatus();
    setInterval(checkStatus, 1000);
  }

  function checkStatus() {
    $.ajax({
      url: "check_status_game.php",
      method: "POST",
      data: {
        id: id,
      },
      dataType: "json",
      success: function (data) {
        newStatus = data[0]["status"];
        if (previousStatus != newStatus) {
          drawBoard(newStatus);
          if (step >= 5) {
            checkWin();
          }
          previousStatus = newStatus;
        }
      },
      error: function (xhr, status, error) {
        console.error(xhr.responseText);
      },
    });
  }

reszty kodu nie piszę bo wszystko działa. Po prostu chciałbym się dowiedzieć jak pobrać z bazy stan gry tylko wtedy kiedy trzeba a nie co sekundę jak teraz?

3

Można wykorzystać WebSocket, ale musiałbyś poczytać jak to działa.

1
specjal1990 napisał(a):

Tworzę grę TicTacToe ale w ten sposób żeby połączyć ze sobą dwóch graczy przez sieć. Wymyśliłem to w ten sposób że ajaxem co sekundę pobieram z bazy stan gry i jeśli się zmienił to aktualizuje planszę. Ogólnie działa to bez problemu ale zastanawiam się jak pominąć bezsensowne pobieranie danych co sekundę gdy np. drugi gracz myśli nad ruchem minutę.

Czyli tak na prawdę chcesz dostać powiadomienie z serwera.

Jest na to kilka sposobów:

  • Albo to co teraz robisz, pooling, czyli co jakiś interwał sprawdzasz stan
  • Albo są hackerskie sposoby, jak "commet"/ajax; w której przeglądarka rozpoczyna połączenie, i server specjalnie go nie zamyka przez jakiś czas, a w momencie w którym jest zdarzenie, to odsyła response - zachowuje się to tak powiadomienie. Ciężko to dosyć zakodzić dobrze (bez odpowiedniego ogrania to jest dosyć awaryjne, bo przeglądarka musi ponowić żądanie po timeout'cie, ale przynajmniej raz na minutę, nie co sekundę)
  • Albo websocket, tak jak pisał przedmówca.

Zdecydowanie ostatnia opcja jest najlepsza.

3

@Riddle środkowa metoda jest przestarzała (delikatnie mówiąc) i jej ustandaryzowana od lat wersja nazywa się EventSource - na stronie MDN wypisane są potencjalne problemy, ale ponawianie requestu w razie przerwania jest ogarnięte w standardzie.

Ale nie polecam ofc.

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.