Ожидание ввода игрока с помощью Node JS - PullRequest
0 голосов
/ 09 февраля 2020

Я создал многопользовательскую игру в покер для Facebook, используя HTML5 (клиент) и Node (сервер).

Я нахожусь в процессе написания кода сервера, чтобы позволить игроку коллировать, рейзить, сбрасывать и т.д. c. Сервер отправляет сообщение клиенту HTML5 с запросом вызова конкретного игрока, рейз и т. Д. c, но природа Javascript заключается в том, что он не блокируется. Мне нужно заставить узел ждать ответа игрока, прежде чем перейти к следующему игроку за столом.

Я посмотрел на setTimeout, обещания, анонимную функцию, и я полностью потерян.

Ответы [ 3 ]

0 голосов
/ 09 февраля 2020

Я думаю, что лучший подход - использовать веб-сокет.

С помощью WS вы можете открыть соединение между клиентом и сервером.

Это соединение остается открытым, пока что-то не закроется. отправлять и получать сообщения на сокете

Сервер может отправлять сообщения клиентам, а клиенты могут отправлять сообщения на сервер

0 голосов
/ 26 марта 2020

Мне удалось найти решение своей проблемы. Мне нужно было подождать, пока пользователь сделает ставку, прежде чем код Javascript продолжится. Я достиг этого, используя Javascript обещание и таймеры.

  let bet_marker = false;

  // socket.io response from client
  socket.on('bet', function() {
      bet_marker = true;
  });


  const aPromise = new Promise((accept, reject) => {

    setTimeout(function() {
        clearInterval(sI1);
        reject();
    }, 1000);

    let sI1 = setInterval(function() {
        if(bet_marker == true)
        {
            clearInterval(sI1);
            accept();
        }
    }, 500);
});
try {
    console.log("User Bet");
    await aPromise;
} 
catch(e)
{   
    console.log("Time Ran Out);
    console.log(")
}

В своем коде я создаю обещание, setInterval и setTimeout. Оператор await aPromise ожидает обещания вызвать оператор accept (), прежде чем продолжить. Функция setInterval просматривает каждые 500 мс, чтобы увидеть, изменилась ли переменная bet_marker. Это изменяется только тогда, когда ставка получена от клиента. После изменения мы знаем, что ставка была получена, и функция accept () вызывается для завершения обещания. У меня также есть оператор setTimeout в коде, который будет вызывать, который отклонит обещание после 10000 мс (10 с). Это дает игроку 10 секунд, чтобы ответить своей ставкой, но автоматически сбрасывает пользователя, если за это время не было получено ни одной ставки.

Надеюсь, это имеет смысл, поскольку я не профессиональный программист ...

0 голосов
/ 09 февраля 2020

Я бы просто вызвал функцию запуска следующего игрока после того, как текущий игрок сделал свой ход.

Нет необходимости в обещаниях или анонимных функциях.

...